📄 httpform.cxx
字号:
if (orderedArray) {
if (fld > 0)
options.AppendString(ArrayControlMoveUp);
if (fld < size-1)
options.AppendString(ArrayControlMoveDown);
if (fld > 0)
options.AppendString(ArrayControlToTop);
if (fld < size-1)
options.AppendString(ArrayControlToBottom);
}
}
return options;
}
void PHTTPFieldArray::AddArrayControlBox(PHTML & html, PINDEX fld) const
{
PStringList options = GetArrayControlOptions(fld, fields.GetSize()-1, orderedArray);
html << PHTML::Select(fields[fld].GetName() + ArrayControlBox);
for (PINDEX i = 0; i < options.GetSize(); i++)
html << PHTML::Option(i == 0 ? PHTML::Selected : PHTML::NotSelected) << options[i];
html << PHTML::Select();
}
void PHTTPFieldArray::GetHTMLTag(PHTML & html) const
{
html << PHTML::TableStart("border=1 cellspacing=0 cellpadding=8");
baseField->GetHTMLHeading(html);
for (PINDEX i = 0; i < fields.GetSize(); i++) {
html << PHTML::TableRow() << PHTML::TableData("NOWRAP");
fields[i].GetHTMLTag(html);
html << PHTML::TableData("NOWRAP");
if (canAddElements)
AddArrayControlBox(html, i);
}
html << PHTML::TableEnd();
}
void PHTTPFieldArray::ExpandFieldNames(PString & text, PINDEX start, PINDEX & finish) const
{
PString original = text(start, finish);
PINDEX origFinish = finish;
PINDEX finalFinish = finish;
PINDEX fld = fields.GetSize();
while (fld > 0) {
fields[--fld].ExpandFieldNames(text, start, finish);
PINDEX pos,len;
static PRegularExpression RowNum("<?!--#form[ \t\r\n]+rownum[ \t\r\n]*-->?",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
while (text.FindRegEx(RowNum, pos, len, start, finish))
SpliceAdjust(psprintf("%u", fld+1), text, pos, len, finish);
static PRegularExpression SubForm("<?!--#form[ \t\r\n]+subform[ \t\r\n]*-->?",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
while (text.FindRegEx(SubForm, pos, len, start, finish)) {
PString fmt = fullName;
if (fmt.Find("%u") == P_MAX_INDEX)
fmt += " %u";
SpliceAdjust("subformprefix=" + PURL::TranslateString(psprintf(fmt, fld+1), PURL::QueryTranslation),
text, pos, len, finish);
}
static PRegularExpression RowControl("<?!--#form[ \t\r\n]+rowcontrol[ \t\r\n]*-->?",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
while (text.FindRegEx(RowControl, pos, len, start, finish)) {
PHTML html(PHTML::InForm);
if (canAddElements)
AddArrayControlBox(html, fld);
SpliceAdjust(html, text, pos, len, finish);
}
static PRegularExpression RowCheck("<?!--#form[ \t\r\n]+row(add|delete)[ \t\r\n]*(-?[^-])*-->?",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
while (text.FindRegEx(RowCheck, pos, len, start, finish)) {
PStringStream checkbox;
if (canAddElements) {
PINDEX titlepos = text.Find("row", start)+3;
BOOL adding = text[titlepos] == 'a';
if (( adding && fld >= fields.GetSize()-1) ||
(!adding && fld < fields.GetSize()-1)) {
titlepos += adding ? 3 : 6;
PINDEX dashes = text.Find("--", titlepos);
PString title = text(titlepos, dashes-1).Trim();
if (title.IsEmpty() && adding)
title = "Add";
checkbox << title
<< "<INPUT TYPE=checkbox NAME=\""
<< fields[fld].GetName()
<< ArrayControlBox
<< "\" VALUE="
<< (adding ? ArrayControlAdd : ArrayControlRemove)
<< '>';
}
}
SpliceAdjust(checkbox, text, pos, len, finish);
}
static PRegularExpression SelectRow("<select[ \t\r\n][^>]*name[ \t\r\n]*=[ \t\r\n]*\"!--#form[ \t\r\n]+rowselect[ \t\r\n]*--\"[^>]*>",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
static PRegularExpression SelEndRegEx("</select[^>]*>",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
PINDEX begin, end;
while (FindSpliceBlock(SelectRow, SelEndRegEx, text, 0, pos, len, begin, end)) {
PStringList options = GetArrayControlOptions(fld, fields.GetSize()-1, orderedArray);
AdjustSelectOptions(text, begin, end, options[0], options, finish);
static PRegularExpression RowSelect("!--#form[ \t\r\n]+rowselect[ \t\r\n]*--",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
if (text.FindRegEx(RowSelect, pos, len, pos, begin))
SpliceAdjust(fields[fld].GetName() + ArrayControlBox, text, pos, len, finish);
}
finalFinish += finish - origFinish;
if (fld > 0) {
text.Splice(original, start, 0);
finish = origFinish;
finalFinish += finish - start;
}
}
finish = finalFinish;
}
static int SplitArraySizeKey(const PString & fullName,
PString & section, PString & key)
{
static const char ArraySize[] = "Array Size";
PINDEX pos = fullName.Find("%u");
if (pos == P_MAX_INDEX)
return SplitConfigKey(fullName & ArraySize, section, key);
PINDEX endPos = fullName.GetLength() - 1;
if (fullName[endPos] == '\\')
endPos--;
return SplitConfigKey(fullName.Left(pos) & ArraySize & fullName(pos+2, endPos), section, key);
}
void PHTTPFieldArray::LoadFromConfig(PConfig & cfg)
{
if (canAddElements) {
PString section, key;
switch (SplitArraySizeKey(fullName, section, key)) {
case 1 :
SetSize(cfg.GetInteger(key, GetSize()));
break;
case 2 :
SetSize(cfg.GetInteger(section, key, GetSize()));
}
}
PHTTPCompositeField::LoadFromConfig(cfg);
}
void PHTTPFieldArray::SaveToConfig(PConfig & cfg) const
{
if (canAddElements) {
PString section, key;
switch (SplitArraySizeKey(fullName, section, key)) {
case 1 :
cfg.SetInteger(key, GetSize());
break;
case 2 :
cfg.SetInteger(section, key, GetSize());
}
}
PHTTPCompositeField::SaveToConfig(cfg);
}
void PHTTPFieldArray::SetArrayFieldName(PINDEX idx) const
{
PString fmt = fullName;
if (fmt.Find("%u") == P_MAX_INDEX)
fmt += " %u";
fields[idx].SetName(psprintf(fmt, idx+1));
}
void PHTTPFieldArray::SetAllValues(const PStringToString & data)
{
PHTTPFieldList newFields;
newFields.DisallowDeleteObjects();
PINDEX i;
for (i = 0; i < fields.GetSize(); i++)
newFields.Append(fields.GetAt(i));
BOOL lastFieldIsSet = FALSE;
PINDEX size = fields.GetSize();
for (i = 0; i < size; i++) {
PHTTPField * fieldPtr = &fields[i];
PINDEX pos = newFields.GetObjectsIndex(fieldPtr);
fieldPtr->SetAllValues(data);
PString control = data(fieldPtr->GetName() + ArrayControlBox);
if (control == ArrayControlMoveUp) {
if (pos > 0) {
newFields.SetAt(pos, newFields.GetAt(pos-1));
newFields.SetAt(pos-1, fieldPtr);
}
}
else if (control == ArrayControlMoveDown) {
if (size > 2 && pos < size-2) {
newFields.SetAt(pos, newFields.GetAt(pos+1));
newFields.SetAt(pos+1, fieldPtr);
}
}
else if (control == ArrayControlToTop) {
newFields.RemoveAt(pos);
newFields.InsertAt(0, fieldPtr);
}
else if (control == ArrayControlToBottom) {
newFields.RemoveAt(pos);
newFields.Append(fieldPtr);
}
else if (control == ArrayControlAddTop) {
if (i == size-1) {
newFields.RemoveAt(pos);
newFields.InsertAt(0, fieldPtr);
lastFieldIsSet = TRUE;
}
}
else if (control == ArrayControlAddBottom || control == ArrayControlAdd) {
if (i == size-1) {
newFields.RemoveAt(pos);
newFields.Append(fieldPtr);
lastFieldIsSet = TRUE;
}
}
else if (control == ArrayControlIgnore) {
newFields.RemoveAt(pos);
newFields.Append(fieldPtr);
}
else if (control == ArrayControlRemove)
newFields.RemoveAt(pos);
}
fields.DisallowDeleteObjects();
for (i = 0; i < newFields.GetSize(); i++)
fields.Remove(newFields.GetAt(i));
fields.AllowDeleteObjects();
fields.RemoveAll();
for (i = 0; i < newFields.GetSize(); i++) {
fields.Append(newFields.GetAt(i));
SetArrayFieldName(i);
}
if (lastFieldIsSet && canAddElements)
AddBlankField();
}
PINDEX PHTTPFieldArray::GetSize() const
{
PINDEX size = fields.GetSize();
PAssert(size > 0, PLogicError);
if (canAddElements)
size--;
return size;
}
void PHTTPFieldArray::AddBlankField()
{
fields.Append(baseField->NewField());
SetArrayFieldName(fields.GetSize()-1);
}
PStringArray PHTTPFieldArray::GetStrings(PConfig & cfg)
{
LoadFromConfig(cfg);
PStringArray values(GetSize());
for (PINDEX i = 0; i < GetSize(); i++)
values[i] = fields[i].GetValue(FALSE);
return values;
}
void PHTTPFieldArray::SetStrings(PConfig & cfg, const PStringArray & values)
{
SetSize(values.GetSize());
for (PINDEX i = 0; i < values.GetSize(); i++)
fields[i].SetValue(values[i]);
SaveToConfig(cfg);
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPStringField
PHTTPStringField::PHTTPStringField(const char * name,
PINDEX siz,
const char * initVal,
const char * help)
: PHTTPField(name, NULL, help),
value(initVal != NULL ? initVal : ""),
initialValue(value)
{
size = siz;
}
PHTTPStringField::PHTTPStringField(const char * name,
const char * title,
PINDEX siz,
const char * initVal,
const char * help)
: PHTTPField(name, title, help),
value(initVal != NULL ? initVal : ""),
initialValue(value)
{
size = siz;
}
PHTTPField * PHTTPStringField::NewField() const
{
return new PHTTPStringField(baseName, title, size, initialValue, help);
}
void PHTTPStringField::GetHTMLTag(PHTML & html) const
{
if (size < 128)
html << PHTML::InputText(fullName, size, value);
else
html << PHTML::TextArea(fullName, (size+79)/80, 80) << value << PHTML::TextArea(fullName);
}
void PHTTPStringField::SetValue(const PString & newVal)
{
value = newVal;
}
PString PHTTPStringField::GetValue(BOOL dflt) const
{
if (dflt)
return initialValue;
else
return value;
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPPasswordField
PHTTPPasswordField::PHTTPPasswordField(const char * name,
PINDEX siz,
const char * initVal,
const char * help)
: PHTTPStringField(name, siz, initVal, help)
{
}
PHTTPPasswordField::PHTTPPasswordField(const char * name,
const char * title,
PINDEX siz,
const char * initVal,
const char * help)
: PHTTPStringField(name, title, siz, initVal, help)
{
}
PHTTPField * PHTTPPasswordField::NewField() const
{
return new PHTTPPasswordField(baseName, title, size, initialValue, help);
}
void PHTTPPasswordField::GetHTMLTag(PHTML & html) const
{
html << PHTML::InputPassword(fullName, size, value);
}
static const PTEACypher::Key PasswordKey = {
{
103, 60, 222, 17, 128, 157, 31, 137,
133, 64, 82, 148, 94, 136, 4, 209
}
};
void PHTTPPasswordField::SetValue(const PString & newVal)
{
value = Decrypt(newVal);
}
PString PHTTPPasswordField::GetValue(BOOL dflt) const
{
if (dflt)
return initialValue;
PTEACypher crypt(PasswordKey);
return crypt.Encode(value);
}
PString PHTTPPasswordField::Decrypt(const PString & pword)
{
PString clear;
PTEACypher crypt(PasswordKey);
return crypt.Decode(pword, clear) ? clear : pword;
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPIntegerField
PHTTPIntegerField::PHTTPIntegerField(const char * nam,
int lo, int hig,
int initVal,
const char * unit,
const char * help)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -