📄 httpform.cxx
字号:
return 0;
return 2;
}
void PHTTPField::LoadFromConfig(PConfig & cfg)
{
PString section, key;
switch (SplitConfigKey(fullName, section, key)) {
case 1 :
SetValue(cfg.GetString(key, GetValue(TRUE)));
break;
case 2 :
SetValue(cfg.GetString(section, key, GetValue(TRUE)));
}
}
void PHTTPField::SaveToConfig(PConfig & cfg) const
{
PString section, key;
switch (SplitConfigKey(fullName, section, key)) {
case 1 :
cfg.SetString(key, GetValue());
break;
case 2 :
cfg.SetString(section, key, GetValue());
}
}
BOOL PHTTPField::Validated(const PString &, PStringStream &) const
{
return TRUE;
}
PStringList PHTTPField::GetAllNames() const
{
PStringList list;
list.DisallowDeleteObjects();
list.AppendString(fullName);
return list;
}
void PHTTPField::SetAllValues(const PStringToString & data)
{
if (!baseName && data.Contains(fullName))
SetValue(data[fullName]);
}
BOOL PHTTPField::ValidateAll(const PStringToString & data, PStringStream & msg) const
{
if (data.Contains(fullName))
return Validated(data[fullName], msg);
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPCompositeField
PHTTPCompositeField::PHTTPCompositeField(const char * nam,
const char * titl,
const char * hlp)
: PHTTPField(nam, titl, hlp)
{
}
void PHTTPCompositeField::SetName(const PString & newName)
{
for (PINDEX i = 0; i < fields.GetSize(); i++) {
PHTTPField & field = fields[i];
PString firstPartOfName = psprintf(fullName, i+1);
PString subFieldName;
if (field.GetName().Find(firstPartOfName) == 0)
subFieldName = field.GetName().Mid(firstPartOfName.GetLength());
else
subFieldName = field.GetName();
firstPartOfName = psprintf(newName, i+1);
if (subFieldName[0] == '\\' || firstPartOfName[firstPartOfName.GetLength()-1] == '\\')
field.SetName(firstPartOfName + subFieldName);
else
field.SetName(firstPartOfName & subFieldName);
}
PHTTPField::SetName(newName);
}
const PHTTPField * PHTTPCompositeField::LocateName(const PString & name) const
{
if (fullName == name)
return this;
for (PINDEX i = 0; i < fields.GetSize(); i++) {
const PHTTPField * field = fields[i].LocateName(name);
if (field != NULL)
return field;
}
return NULL;
}
PHTTPField * PHTTPCompositeField::NewField() const
{
PHTTPCompositeField * fld = new PHTTPCompositeField(baseName, title, help);
for (PINDEX i = 0; i < fields.GetSize(); i++)
fld->Append(fields[i].NewField());
return fld;
}
void PHTTPCompositeField::GetHTMLTag(PHTML & html) const
{
for (PINDEX i = 0; i < fields.GetSize(); i++) {
if (i != 0)
html << PHTML::TableData("NOWRAP");
fields[i].GetHTMLTag(html);
}
}
PString PHTTPCompositeField::GetHTMLInput(const PString & input) const
{
return input;
}
void PHTTPCompositeField::ExpandFieldNames(PString & text, PINDEX start, PINDEX & finish) const
{
static PRegularExpression FieldName( "!--#form[ \t\r\n]+[^-]*[ \t\r\n]+[^-]*[ \t\r\n]*)?--"
"|"
"<[a-z]*[ \t\r\n][^>]*name[ \t\r\n]*=[ \t\r\n]*\"[^\"]*\"[^>]*>",
PRegularExpression::IgnoreCase);
PString name;
PINDEX pos, len;
while (start < finish && FindSpliceFieldName(text, start, pos, len, name)) {
if (pos > finish)
break;
for (PINDEX fld = 0; fld < fields.GetSize(); fld++) {
if (fields[fld].GetBaseName() == name) {
SpliceAdjust(fields[fld].GetName(), text, pos, len, finish);
break;
}
}
start = pos + len;
}
}
void PHTTPCompositeField::GetHTMLHeading(PHTML & html) const
{
html << PHTML::TableRow();
for (PINDEX i = 0; i < fields.GetSize(); i++)
html << PHTML::TableData() << fields[i].GetTitle();
}
PString PHTTPCompositeField::GetValue(BOOL dflt) const
{
PStringStream value;
for (PINDEX i = 0; i < fields.GetSize(); i++)
value << fields[i].GetValue(dflt) << '\n';
return value;
}
void PHTTPCompositeField::SetValue(const PString &)
{
PAssertAlways(PLogicError);
}
void PHTTPCompositeField::LoadFromConfig(PConfig & cfg)
{
for (PINDEX i = 0; i < GetSize(); i++)
fields[i].LoadFromConfig(cfg);
}
void PHTTPCompositeField::SaveToConfig(PConfig & cfg) const
{
for (PINDEX i = 0; i < GetSize(); i++)
fields[i].SaveToConfig(cfg);
}
PStringList PHTTPCompositeField::GetAllNames() const
{
PStringList list;
list.DisallowDeleteObjects();
for (PINDEX i = 0; i < GetSize(); i++) {
PStringList sublist = fields[i].GetAllNames();
for (PINDEX j = 0; j < sublist.GetSize(); j++)
list.AppendString(sublist[j]);
}
return list;
}
void PHTTPCompositeField::SetAllValues(const PStringToString & data)
{
for (PINDEX i = 0; i < fields.GetSize(); i++)
fields[i].SetAllValues(data);
}
BOOL PHTTPCompositeField::ValidateAll(const PStringToString & data,
PStringStream & msg) const
{
for (PINDEX i = 0; i < fields.GetSize(); i++)
if (!fields[i].ValidateAll(data, msg))
return FALSE;
return TRUE;
}
PINDEX PHTTPCompositeField::GetSize() const
{
return fields.GetSize();
}
void PHTTPCompositeField::Append(PHTTPField * fld)
{
fields.Append(fld);
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPSubForm
PHTTPSubForm::PHTTPSubForm(const PString & subForm,
const char * name,
const char * title,
PINDEX prim,
PINDEX sec)
: PHTTPCompositeField(name, title, NULL),
subFormName(subForm)
{
primary = prim;
secondary = sec;
}
PHTTPField * PHTTPSubForm::NewField() const
{
PHTTPCompositeField * fld = new PHTTPSubForm(subFormName, baseName, title, primary, secondary);
for (PINDEX i = 0; i < fields.GetSize(); i++)
fld->Append(fields[i].NewField());
return fld;
}
void PHTTPSubForm::GetHTMLTag(PHTML & html) const
{
PString value = fields[primary].GetValue();
if (value.IsEmpty())
value = "New";
html << PHTML::HotLink(subFormName +
"?subformprefix=" + PURL::TranslateString(fullName, PURL::QueryTranslation))
<< value << PHTML::HotLink();
if (secondary != P_MAX_INDEX)
html << PHTML::TableData("NOWRAP") << fields[secondary].GetValue();
}
void PHTTPSubForm::GetHTMLHeading(PHTML &) const
{
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPFieldArray
PHTTPFieldArray::PHTTPFieldArray(PHTTPField * fld, BOOL ordered)
: PHTTPCompositeField(fld->GetName(), fld->GetTitle(), fld->GetHelp()),
baseField(fld)
{
orderedArray = ordered;
AddBlankField();
}
PHTTPFieldArray::~PHTTPFieldArray()
{
delete baseField;
}
void PHTTPFieldArray::SetSize(PINDEX newSize)
{
while (fields.GetSize() > newSize)
fields.RemoveAt(fields.GetSize()-1);
while (fields.GetSize() <= newSize)
AddBlankField();
}
PHTTPField * PHTTPFieldArray::NewField() const
{
return new PHTTPFieldArray(baseField->NewField(), orderedArray);
}
static const char ArrayControlBox[] = " Array Control";
static const char ArrayControlKeep[] = "Keep";
static const char ArrayControlRemove[] = "Remove";
static const char ArrayControlMoveUp[] = "Move Up";
static const char ArrayControlMoveDown[] = "Move Down";
static const char ArrayControlToTop[] = "To Top";
static const char ArrayControlToBottom[] = "To Bottom";
static const char ArrayControlIgnore[] = "Ignore";
static const char ArrayControlAddTop[] = "Add Top";
static const char ArrayControlAddBottom[] = "Add Bottom";
static const char ArrayControlAdd[] = "Add";
static PStringList GetArrayControlOptions(PINDEX fld, PINDEX size, BOOL orderedArray)
{
PStringList options;
if (fld >= size) {
options.AppendString(ArrayControlIgnore);
if (size == 0 || !orderedArray)
options.AppendString(ArrayControlAdd);
else {
options.AppendString(ArrayControlAddTop);
options.AppendString(ArrayControlAddBottom);
}
}
else {
options.AppendString(ArrayControlKeep);
options.AppendString(ArrayControlRemove);
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();
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");
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);
AddArrayControlBox(html, fld);
SpliceAdjust(html, 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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -