📄 httpform.cxx
字号:
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;
}
static const char ListFieldDeleteBox[] = "List Row Delete ";
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 list name--> macros and expand them
static PRegularExpression ListRegEx("<!--#form[ \t\r\n]+listfields[ \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 (FindSpliceBlock(ListRegEx, EndBlock, text, pos+len, pos, len, start, finish)) {
if (start != finish) {
PString repeat = text(start, finish);
PINDEX namePos, nameEnd;
PRegularExpression fieldsRegEx;
if (FindSpliceName(text, pos, start-1, namePos, nameEnd))
fieldsRegEx.Compile(text(namePos, nameEnd), PRegularExpression::Extended|PRegularExpression::IgnoreCase);
else
fieldsRegEx.Compile(".*");
PString insert;
for (PINDEX f = 0; f < fields.GetSize(); f++) {
if (fields[f].GetName().FindRegEx(fieldsRegEx) != P_MAX_INDEX) {
PString iteration = repeat;
PINDEX npos, nlen;
static PRegularExpression FieldNameRegEx("<?!--#form[ \t\r\n]+fieldname[ \t\r\n]*-->?",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
while (iteration.FindRegEx(FieldNameRegEx, npos, nlen))
iteration.Splice(fields[f].GetName(), npos, nlen);
static PRegularExpression RowDeleteRegEx("<?!--#form[ \t\r\n]+rowdelete[ \t\r\n]*-->?",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
while (iteration.FindRegEx(RowDeleteRegEx, npos, nlen)) {
PHTML html(PHTML::InForm);
html << PHTML::CheckBox(ListFieldDeleteBox + fields[f].GetName());
iteration.Splice(html, npos, nlen);
}
insert += iteration;
}
}
text.Splice(insert, pos, len);
}
}
// Locate <!--#form array name--> macros and expand them
static PRegularExpression ArrayRegEx("<!--#form[ \t\r\n]+array[ \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);
while (FindSpliceField(ValueRegEx, "", text, pos+len, fields, pos, len, start, finish, field)) {
if (field != NULL)
text.Splice(field->GetValue(), pos, len);
}
pos = len = 0;
static PRegularExpression InputRegEx("<input[ \t\r\n][^>]*name[ \t\r\n]*=[ \t\r\n]*\"[^\"]*\"[^>]*>",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
while (FindSpliceField(InputRegEx, "", text, pos+len, fields, pos, len, start, finish, field)) {
if (field != NULL) {
static PRegularExpression HiddenRegEx("type[ \t\r\n]*=[ \t\r\n]*\"?hidden\"?",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
PString substr = text.Mid(pos, len);
if (substr.FindRegEx(HiddenRegEx) == P_MAX_INDEX)
text.Splice(field->GetHTMLInput(substr), pos, len);
}
}
pos = len = 0;
static PRegularExpression SelectRegEx("<select[ \t\r\n][^>]*name[ \t\r\n]*=[ \t\r\n]*\"[^\"]*\"[^>]*>",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
static PRegularExpression SelEndRegEx("</select[^>]*>",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
while (FindSpliceField(SelectRegEx, SelEndRegEx, text, pos+len, fields, pos, len, start, finish, field)) {
if (field != NULL)
text.Splice(field->GetHTMLSelect(text(start, finish)), start, finish-start+1);
}
pos = len = 0;
static PRegularExpression TextRegEx("<textarea[ \t\r\n][^>]*name[ \t\r\n]*=[ \t\r\n]*\"[^\"]*\"[^>]*>",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
static PRegularExpression TextEndRegEx("</textarea[^>]*>", PRegularExpression::IgnoreCase);
while (FindSpliceField(TextRegEx, TextEndRegEx, text, pos+len, fields, pos, len, start, finish, field)) {
if (field != NULL)
text.Splice(field->GetValue(), start, finish-start+1);
}
}
PHTTPField * PHTTPForm::Add(PHTTPField * fld)
{
if (PAssertNULL(fld) == NULL)
return NULL;
PAssert(!fieldNames[fld->GetName()], "Field already on form!");
fieldNames += fld->GetName();
fields.Append(fld);
return fld;
}
void PHTTPForm::BuildHTML(const char * heading)
{
PHTML html(heading);
BuildHTML(html);
}
void PHTTPForm::BuildHTML(const PString & heading)
{
PHTML html(heading);
BuildHTML(html);
}
void PHTTPForm::BuildHTML(PHTML & html, BuildOptions option)
{
if (!html.Is(PHTML::InForm))
html << PHTML::Form("POST");
html << PHTML::TableStart("cellspacing=8");
for (PINDEX fld = 0; fld < fields.GetSize(); fld++) {
PHTTPField & field = fields[fld];
if (field.NotYetInHTML()) {
html << PHTML::TableRow()
<< PHTML::TableData("align=right")
<< field.GetTitle()
<< PHTML::TableData("align=left")
<< "<!--#form html " << field.GetName() << "-->"
<< PHTML::TableData()
<< field.GetHelp();
field.SetInHTML();
}
}
html << PHTML::TableEnd();
if (option != InsertIntoForm)
html << PHTML::Paragraph()
<< ' ' << PHTML::SubmitButton("Accept")
<< ' ' << PHTML::ResetButton("Reset")
<< PHTML::Form();
if (option == CompleteHTML) {
html << PHTML::Body();
string = html;
}
}
BOOL PHTTPForm::Post(PHTTPRequest & request,
const PStringToString & data,
PHTML & msg)
{
//PString prefix = request.url.GetQueryVars()("subformprefix");
const PHTTPField * field = NULL;
//if (!prefix)
// field = fields.LocateName(prefix);
//if (field == NULL)
field = &fields;
PStringStream errors;
if (field->ValidateAll(data, errors)) {
((PHTTPField *)field)->SetAllValues(data);
if (msg.IsEmpty()) {
msg << PHTML::Title() << "Accepted New Configuration" << PHTML::Body()
<< PHTML::Heading(1) << "Accepted New Configuration" << PHTML::Heading(1)
<< PHTML::HotLink(request.url.AsString()) << "Reload page" << PHTML::HotLink()
<< " "
<< PHTML::HotLink("/") << "Home page" << PHTML::HotLink();
}
else {
PString block;
PINDEX pos = 0;
PINDEX len, start, finish;
while (FindSpliceAccepted(msg, pos, pos, len, start, finish))
msg.Splice(msg(start, finish), pos, len);
pos = 0;
while (FindSpliceErrors(msg, pos, pos, len, start, finish))
msg.Delete(pos, len);
}
}
else {
if (msg.IsEmpty()) {
msg << PHTML::Title() << "Validation Error in Request" << PHTML::Body()
<< PHTML::Heading(1) << "Validation Error in Request" << PHTML::Heading(1)
<< errors
<< PHTML::Paragraph()
<< PHTML::HotLink(request.url.AsString()) << "Reload page" << PHTML::HotLink()
<< " "
<< PHTML::HotLink("/") << "Home page" << PHTML::HotLink();
}
else {
PINDEX pos = 0;
PINDEX len, start, finish;
while (FindSpliceAccepted(msg, pos, pos, len, start, finish))
msg.Delete(pos, len);
BOOL appendErrors = TRUE;
pos = 0;
while (FindSpliceErrors(msg, pos, pos, len, start, finish)) {
PString block = msg(start, finish);
PINDEX vPos, vLen;
static PRegularExpression Validation("<?!--#form[ \t\r\n]+validation[ \t\r\n]*-->?",
PRegularExpression::Extended|PRegularExpression::IgnoreCase);
if (block.FindRegEx(Validation, vPos, vLen))
block.Splice(errors, vPos, vLen);
else
block += errors;
msg.Splice(block, pos, len);
appendErrors = FALSE;
}
if (appendErrors)
msg << errors;
}
}
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPConfig
PMutex PHTTPConfig::m_HTTPConfigMutex;
PHTTPConfig::PHTTPConfig(const PURL & url,
const PString & sect)
: PHTTPForm(url), section(sect)
{
Construct();
}
PHTTPConfig::PHTTPConfig(const PURL & url,
const PString & sect,
const PHTTPAuthority & auth)
: PHTTPForm(url, auth), section(sect)
{
Construct();
}
PHTTPConfig::PHTTPConfig(const PURL & url,
const PString & html,
const PString & sect)
: PHTTPForm(url, html), section(sect)
{
Construct();
}
PHTTPConfig::PHTTPConfig(const PURL & url,
const PString & html,
const PString & sect,
const PHTTPAuthority & auth)
: PHTTPForm(url, html, auth), section(sect)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -