📄 httpform.cxx
字号:
return PHTTPField::GetHTMLInput(input);
}
void PHTTPBooleanField::SetValue(const PString & val)
{
value = toupper(val[0]) == 'T' || toupper(val[0]) == 'y' ||
val.AsInteger() != 0 || val.Find("TRUE") != P_MAX_INDEX;
}
PString PHTTPBooleanField::GetValue(BOOL dflt) const
{
return ((dflt ? initialValue : value) ? "True" : "False");
}
void PHTTPBooleanField::LoadFromConfig(PConfig & cfg)
{
PString section, key;
switch (SplitConfigKey(fullName, section, key)) {
case 1 :
value = cfg.GetBoolean(key, initialValue);
break;
case 2 :
value = cfg.GetBoolean(section, key, initialValue);
}
}
void PHTTPBooleanField::SaveToConfig(PConfig & cfg) const
{
PString section, key;
switch (SplitConfigKey(fullName, section, key)) {
case 1 :
cfg.SetBoolean(key, value);
break;
case 2 :
cfg.SetBoolean(section, key, value);
}
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPRadioField
PHTTPRadioField::PHTTPRadioField(const char * name,
const PStringArray & valueArray,
PINDEX initVal,
const char * help)
: PHTTPField(name, NULL, help),
values(valueArray),
titles(valueArray),
value(valueArray[initVal]),
initialValue(value)
{
}
PHTTPRadioField::PHTTPRadioField(const char * name,
const PStringArray & valueArray,
const PStringArray & titleArray,
PINDEX initVal,
const char * help)
: PHTTPField(name, NULL, help),
values(valueArray),
titles(titleArray),
value(valueArray[initVal]),
initialValue(value)
{
}
PHTTPRadioField::PHTTPRadioField(const char * name,
PINDEX count,
const char * const * valueStrings,
PINDEX initVal,
const char * help)
: PHTTPField(name, NULL, help),
values(count, valueStrings),
titles(count, valueStrings),
value(valueStrings[initVal]),
initialValue(value)
{
}
PHTTPRadioField::PHTTPRadioField(const char * name,
PINDEX count,
const char * const * valueStrings,
const char * const * titleStrings,
PINDEX initVal,
const char * help)
: PHTTPField(name, NULL, help),
values(count, valueStrings),
titles(count, titleStrings),
value(valueStrings[initVal]),
initialValue(value)
{
}
PHTTPRadioField::PHTTPRadioField(const char * name,
const char * groupTitle,
const PStringArray & valueArray,
PINDEX initVal,
const char * help)
: PHTTPField(name, groupTitle, help),
values(valueArray),
titles(valueArray),
value(valueArray[initVal]),
initialValue(value)
{
}
PHTTPRadioField::PHTTPRadioField(const char * name,
const char * groupTitle,
const PStringArray & valueArray,
const PStringArray & titleArray,
PINDEX initVal,
const char * help)
: PHTTPField(name, groupTitle, help),
values(valueArray),
titles(titleArray),
value(valueArray[initVal]),
initialValue(value)
{
}
PHTTPRadioField::PHTTPRadioField(const char * name,
const char * groupTitle,
PINDEX count,
const char * const * valueStrings,
PINDEX initVal,
const char * help)
: PHTTPField(name, groupTitle, help),
values(count, valueStrings),
titles(count, valueStrings),
value(valueStrings[initVal]),
initialValue(value)
{
}
PHTTPRadioField::PHTTPRadioField(const char * name,
const char * groupTitle,
PINDEX count,
const char * const * valueStrings,
const char * const * titleStrings,
PINDEX initVal,
const char * help)
: PHTTPField(name, groupTitle, help),
values(count, valueStrings),
titles(count, titleStrings),
value(valueStrings[initVal]),
initialValue(value)
{
}
PHTTPField * PHTTPRadioField::NewField() const
{
return new PHTTPRadioField(*this);
}
void PHTTPRadioField::GetHTMLTag(PHTML & html) const
{
for (PINDEX i = 0; i < values.GetSize(); i++)
html << PHTML::RadioButton(fullName, values[i],
values[i] == value ? PHTML::Checked : PHTML::UnChecked)
<< titles[i]
<< PHTML::BreakLine();
}
PString PHTTPRadioField::GetHTMLInput(const PString & input) const
{
PString inval;
PINDEX before, after;
if (FindInputValue(input, before, after))
inval = input(before+1, after-1);
else
inval = baseName;
if (inval != value)
return input;
return "<input checked" + input.Mid(6);
}
PString PHTTPRadioField::GetValue(BOOL dflt) const
{
if (dflt)
return initialValue;
else
return value;
}
void PHTTPRadioField::SetValue(const PString & newVal)
{
value = newVal;
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPSelectField
PHTTPSelectField::PHTTPSelectField(const char * name,
const PStringArray & valueArray,
PINDEX initVal,
const char * help)
: PHTTPField(name, NULL, help),
values(valueArray)
{
initialValue = initVal;
if (initVal < values.GetSize())
value = values[initVal];
}
PHTTPSelectField::PHTTPSelectField(const char * name,
PINDEX count,
const char * const * valueStrings,
PINDEX initVal,
const char * help)
: PHTTPField(name, NULL, help),
values(count, valueStrings)
{
initialValue = initVal;
if (initVal < count)
value = values[initVal];
}
PHTTPSelectField::PHTTPSelectField(const char * name,
const char * title,
const PStringArray & valueArray,
PINDEX initVal,
const char * help)
: PHTTPField(name, title, help),
values(valueArray)
{
initialValue = initVal;
if (initVal < values.GetSize())
value = values[initVal];
}
PHTTPSelectField::PHTTPSelectField(const char * name,
const char * title,
PINDEX count,
const char * const * valueStrings,
PINDEX initVal,
const char * help)
: PHTTPField(name, title, help),
values(count, valueStrings)
{
initialValue = initVal;
if (initVal < values.GetSize())
value = values[initVal];
}
PHTTPField * PHTTPSelectField::NewField() const
{
return new PHTTPSelectField(baseName, title, values, initialValue, help);
}
void PHTTPSelectField::GetHTMLTag(PHTML & html) const
{
html << PHTML::Select(fullName);
for (PINDEX i = 0; i < values.GetSize(); i++)
html << PHTML::Option(values[i] == value ? PHTML::Selected : PHTML::NotSelected)
<< values[i];
html << PHTML::Select();
}
PString PHTTPSelectField::GetValue(BOOL dflt) const
{
if (dflt)
if (initialValue < values.GetSize())
return values[initialValue];
else
return PString();
else
return value;
}
void PHTTPSelectField::SetValue(const PString & newVal)
{
value = newVal;
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPForm
PHTTPForm::PHTTPForm(const PURL & url)
: PHTTPString(url),
fields("")
{
}
PHTTPForm::PHTTPForm(const PURL & url, const PHTTPAuthority & auth)
: PHTTPString(url, auth),
fields("")
{
}
PHTTPForm::PHTTPForm(const PURL & url, const PString & html)
: PHTTPString(url, html),
fields("")
{
}
PHTTPForm::PHTTPForm(const PURL & url,
const PString & html,
const PHTTPAuthority & auth)
: PHTTPString(url, html, auth),
fields("")
{
}
static BOOL FindSpliceAccepted(const PString & text,
PINDEX offset,
PINDEX & pos,
PINDEX & len,
PINDEX & start,
PINDEX & finish)
{
static PRegularExpression Accepted("<?!--#form[ \t\r\n]+accepted[ \t\r\n]*-->?",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
return FindSpliceBlock(Accepted, text, offset, pos, len, start, finish);
}
static BOOL FindSpliceErrors(const PString & text,
PINDEX offset,
PINDEX & pos,
PINDEX & len,
PINDEX & start,
PINDEX & finish)
{
static PRegularExpression Errors("<?!--#form[ \t\r\n]+errors[ \t\r\n]*-->?",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
return FindSpliceBlock(Errors, text, offset, pos, len, start, finish);
}
static BOOL FindSpliceField(const PRegularExpression & startExpr,
const PRegularExpression & endExpr,
const PString & text,
PINDEX offset,
const PHTTPField & rootField,
PINDEX & pos,
PINDEX & len,
PINDEX & start,
PINDEX & finish,
const PHTTPField * & field)
{
field = NULL;
if (!FindSpliceBlock(startExpr, endExpr, text, offset, pos, len, start, finish))
return FALSE;
PINDEX endBlock = start != finish ? (start-1) : (pos+len-1);
PINDEX namePos, nameEnd;
if (FindSpliceName(text, pos, endBlock, namePos, nameEnd))
field = rootField.LocateName(text(namePos, nameEnd));
return TRUE;
}
void PHTTPForm::OnLoadedText(PHTTPRequest & request, PString & text)
{
PINDEX pos, len, start, finish;
const PHTTPField * field;
// Remove the subsections for POST command
pos = 0;
while (FindSpliceAccepted(text, pos, pos, len, start, finish))
text.Delete(pos, len);
pos = 0;
while (FindSpliceErrors(text, pos, pos, len, start, finish))
text.Delete(pos, len);
// See if are a subform, set root composite field accordingly
PString prefix = request.url.GetQueryVars()("subformprefix");
if (!prefix) {
static PRegularExpression SubFormPrefix("<?!--#form[ \t\r\n]+subformprefix[ \t\r\n]*-->?",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
while (text.FindRegEx(SubFormPrefix, pos, len))
text.Splice("subformprefix=" +
PURL::TranslateString(prefix, PURL::QueryTranslation),
pos, len);
field = fields.LocateName(prefix);
if (field != NULL) {
finish = P_MAX_INDEX;
field->ExpandFieldNames(text, 0, finish);
}
}
// Locate <!--#form array name--> macros and expand them
static PRegularExpression ArrayRegEx("<!--#form[ \t\r\n]+array[ \t\r\n]+[^-]+-->",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
static PRegularExpression EndBlock("<?!--#form[ \t\r\n]+end[ \t\r\n]+[^-]+-->?",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
pos = len = 0;
while (FindSpliceField(ArrayRegEx, EndBlock, text, pos+len, fields, pos, len, start, finish, field)) {
if (start != finish && field != NULL)
field->ExpandFieldNames(text, start, finish);
}
// Have now expanded all field names to be fully qualified
static PRegularExpression HTMLRegEx("<!--#form[ \t\r\n]+html[ \t\r\n]+[^-]+-->",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
while (FindSpliceField(HTMLRegEx, "", text, 0, fields, pos, len, start, finish, field)) {
if (field != NULL) {
PHTML html(PHTML::InForm);
field->GetHTMLTag(html);
text.Splice(html, pos, len);
}
}
pos = len = 0;
static PRegularExpression ValueRegEx("<!--#form[ \t\r\n]+value[ \t\r\n]+[^-]+-->",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -