📄 httpform.cxx
字号:
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;}//////////////////////////////////////////////////////////////////////////////// PHTTPConfigPHTTPConfig::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){ Construct();}void PHTTPConfig::Construct(){ sectionField = NULL; keyField = NULL; valField = NULL;}void PHTTPConfig::LoadFromConfig(){ PConfig cfg(section); fields.LoadFromConfig(cfg);}void PHTTPConfig::OnLoadedText(PHTTPRequest & request, PString & text){ if (sectionField == NULL) { PString sectionName = request.url.GetQueryVars()("section", section); if (!sectionName) { section = sectionName; LoadFromConfig(); } } PHTTPForm::OnLoadedText(request, text);}BOOL PHTTPConfig::Post(PHTTPRequest & request, const PStringToString & data, PHTML & msg){ // Make sure the internal structure is up to date before accepting new data if (!section) LoadFromConfig(); PSortedStringList oldValues; // Remember fields that are here now, so can delete removed array fields PINDEX fld; for (fld = 0; fld < fields.GetSize(); fld++) { PHTTPField & field = fields[fld]; if (&field != keyField && &field != valField && &field != sectionField) { PStringList names; field.GetAllNames(names); oldValues = names; } } PHTTPForm::Post(request, data, msg); if (request.code != PHTTP::RequestOK) return TRUE; if (sectionField != NULL) section = sectionPrefix + sectionField->GetValue() + sectionSuffix; PString sectionName = request.url.GetQueryVars()("section", section); if (sectionName.IsEmpty()) return TRUE; PConfig cfg(sectionName); for (fld = 0; fld < fields.GetSize(); fld++) { PHTTPField & field = fields[fld]; if (&field == keyField) { PString key = field.GetValue(); if (!key) cfg.SetString(key, valField->GetValue()); } else if (&field != valField && &field != sectionField) field.SaveToConfig(cfg); } // Find out which fields have been removed (arrays elements deleted) for (fld = 0; fld < fields.GetSize(); fld++) { PHTTPField & field = fields[fld]; if (&field != keyField && &field != valField && &field != sectionField) { PStringList names; field.GetAllNames(names); for (PINDEX i = 0; i < names.GetSize(); i++) { PINDEX idx = oldValues.GetStringsIndex(names[i]); if (idx != P_MAX_INDEX) oldValues.RemoveAt(idx); } } } for (fld = 0; fld < oldValues.GetSize();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -