⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpform.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 5 页
字号:
                              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()          << "&nbsp;&nbsp;&nbsp;&nbsp;"          << 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()          << "&nbsp;&nbsp;&nbsp;&nbsp;"          << 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 + -