📄 httpform.cxx
字号:
static int SplitArraySizeKey(const PString & fullName, PString & section, PString & key){ static const char ArraySize[] = "Array Size"; PINDEX pos = fullName.Find("%u"); if (pos == P_MAX_INDEX) return SplitConfigKey(fullName & ArraySize, section, key); PINDEX endPos = fullName.GetLength() - 1; if (fullName[endPos] == '\\') endPos--; return SplitConfigKey(fullName.Left(pos) & ArraySize & fullName(pos+2, endPos), section, key);}void PHTTPFieldArray::LoadFromConfig(PConfig & cfg){ PString section, key; switch (SplitArraySizeKey(fullName, section, key)) { case 1 : SetSize(cfg.GetInteger(key, GetSize())); break; case 2 : SetSize(cfg.GetInteger(section, key, GetSize())); } PHTTPCompositeField::LoadFromConfig(cfg);}void PHTTPFieldArray::SaveToConfig(PConfig & cfg) const{ PString section, key; switch (SplitArraySizeKey(fullName, section, key)) { case 1 : cfg.SetInteger(key, GetSize()); break; case 2 : cfg.SetInteger(section, key, GetSize()); } PHTTPCompositeField::SaveToConfig(cfg);}void PHTTPFieldArray::SetArrayFieldName(PINDEX idx) const{ PString fmt = fullName; if (fmt.Find("%u") == P_MAX_INDEX) fmt += " %u"; fields[idx].SetName(psprintf(fmt, idx+1));}void PHTTPFieldArray::SetAllValues(const PStringToString & data){ PHTTPFieldList newFields; newFields.DisallowDeleteObjects(); PINDEX i; for (i = 0; i < fields.GetSize(); i++) newFields.Append(fields.GetAt(i)); BOOL lastFieldIsSet = FALSE; PINDEX size = fields.GetSize(); for (i = 0; i < size; i++) { PHTTPField * fieldPtr = &fields[i]; PINDEX pos = newFields.GetObjectsIndex(fieldPtr); fieldPtr->SetAllValues(data); PString control = data(fieldPtr->GetName() + ArrayControlBox); if (control == ArrayControlMoveUp) { if (pos > 0) { newFields.SetAt(pos, newFields.GetAt(pos-1)); newFields.SetAt(pos-1, fieldPtr); } } else if (control == ArrayControlMoveDown) { if (size > 2 && pos < size-2) { newFields.SetAt(pos, newFields.GetAt(pos+1)); newFields.SetAt(pos+1, fieldPtr); } } else if (control == ArrayControlToTop) { newFields.RemoveAt(pos); newFields.InsertAt(0, fieldPtr); } else if (control == ArrayControlToBottom) { newFields.RemoveAt(pos); newFields.Append(fieldPtr); } else if (control == ArrayControlAddTop) { if (i == size-1) { newFields.RemoveAt(pos); newFields.InsertAt(0, fieldPtr); lastFieldIsSet = TRUE; } } else if (control == ArrayControlAddBottom || control == ArrayControlAdd) { if (i == size-1) { newFields.RemoveAt(pos); newFields.Append(fieldPtr); lastFieldIsSet = TRUE; } } else if (control == ArrayControlIgnore) { newFields.RemoveAt(pos); newFields.Append(fieldPtr); } else if (control == ArrayControlRemove) newFields.RemoveAt(pos); } fields.DisallowDeleteObjects(); for (i = 0; i < newFields.GetSize(); i++) fields.Remove(newFields.GetAt(i)); fields.AllowDeleteObjects(); fields.RemoveAll(); for (i = 0; i < newFields.GetSize(); i++) { fields.Append(newFields.GetAt(i)); SetArrayFieldName(i); } if (lastFieldIsSet) AddBlankField();}PINDEX PHTTPFieldArray::GetSize() const{ PAssert(fields.GetSize() > 0, PLogicError); return fields.GetSize()-1;}void PHTTPFieldArray::AddBlankField(){ fields.Append(baseField->NewField()); SetArrayFieldName(fields.GetSize()-1);}//////////////////////////////////////////////////////////////////////////////// PHTTPStringFieldPHTTPStringField::PHTTPStringField(const char * name, PINDEX siz, const char * initVal, const char * help) : PHTTPField(name, NULL, help), value(initVal != NULL ? initVal : ""), initialValue(value){ size = siz;}PHTTPStringField::PHTTPStringField(const char * name, const char * title, PINDEX siz, const char * initVal, const char * help) : PHTTPField(name, title, help), value(initVal != NULL ? initVal : ""), initialValue(value){ size = siz;}PHTTPField * PHTTPStringField::NewField() const{ return new PHTTPStringField(baseName, title, size, initialValue, help);}void PHTTPStringField::GetHTMLTag(PHTML & html) const{ html << PHTML::InputText(fullName, size, value);}void PHTTPStringField::SetValue(const PString & newVal){ value = newVal;}PString PHTTPStringField::GetValue(BOOL dflt) const{ if (dflt) return initialValue; else return value;}//////////////////////////////////////////////////////////////////////////////// PHTTPPasswordFieldPHTTPPasswordField::PHTTPPasswordField(const char * name, PINDEX siz, const char * initVal, const char * help) : PHTTPStringField(name, siz, initVal, help){}PHTTPPasswordField::PHTTPPasswordField(const char * name, const char * title, PINDEX siz, const char * initVal, const char * help) : PHTTPStringField(name, title, siz, initVal, help){}PHTTPField * PHTTPPasswordField::NewField() const{ return new PHTTPPasswordField(baseName, title, size, initialValue, help);}void PHTTPPasswordField::GetHTMLTag(PHTML & html) const{ html << PHTML::InputPassword(fullName, size, value);}static const PTEACypher::Key PasswordKey = { { 103, 60, 222, 17, 128, 157, 31, 137, 133, 64, 82, 148, 94, 136, 4, 209 }};void PHTTPPasswordField::SetValue(const PString & newVal){ value = Decrypt(newVal);}PString PHTTPPasswordField::GetValue(BOOL dflt) const{ if (dflt) return initialValue; PTEACypher crypt(PasswordKey); return crypt.Encode(value);}PString PHTTPPasswordField::Decrypt(const PString & pword){ PString clear; PTEACypher crypt(PasswordKey); return crypt.Decode(pword, clear) ? clear : pword;}//////////////////////////////////////////////////////////////////////////////// PHTTPIntegerFieldPHTTPIntegerField::PHTTPIntegerField(const char * nam, int lo, int hig, int initVal, const char * unit, const char * help) : PHTTPField(nam, NULL, help), units(unit != NULL ? unit : ""){ low = lo; high = hig; value = initialValue = initVal;}PHTTPIntegerField::PHTTPIntegerField(const char * nam, const char * titl, int lo, int hig, int initVal, const char * unit, const char * help) : PHTTPField(nam, titl, help), units(unit != NULL ? unit : ""){ low = lo; high = hig; value = initialValue = initVal;}PHTTPField * PHTTPIntegerField::NewField() const{ return new PHTTPIntegerField(baseName, title, low, high, initialValue, units, help);}void PHTTPIntegerField::GetHTMLTag(PHTML & html) const{ html << PHTML::InputRange(fullName, low, high, value) << " " << units;}void PHTTPIntegerField::SetValue(const PString & newVal){ value = newVal.AsInteger();}PString PHTTPIntegerField::GetValue(BOOL dflt) const{ return PString(PString::Signed, dflt ? initialValue : value);}void PHTTPIntegerField::LoadFromConfig(PConfig & cfg){ PString section, key; switch (SplitConfigKey(fullName, section, key)) { case 1 : value = cfg.GetInteger(key, initialValue); break; case 2 : value = cfg.GetInteger(section, key, initialValue); }}void PHTTPIntegerField::SaveToConfig(PConfig & cfg) const{ PString section, key; switch (SplitConfigKey(fullName, section, key)) { case 1 : cfg.SetInteger(key, value); break; case 2 : cfg.SetInteger(section, key, value); }}BOOL PHTTPIntegerField::Validated(const PString & newVal, PStringStream & msg) const{ int val = newVal.AsInteger(); if (val >= low && val <= high) return TRUE; msg << "The field \"" << GetName() << "\" should be between " << low << " and " << high << ".<BR>"; return FALSE;}//////////////////////////////////////////////////////////////////////////////// PHTTPBooleanFieldPHTTPBooleanField::PHTTPBooleanField(const char * name, BOOL initVal, const char * help) : PHTTPField(name, NULL, help){ value = initialValue = initVal;}PHTTPBooleanField::PHTTPBooleanField(const char * name, const char * title, BOOL initVal, const char * help) : PHTTPField(name, title, help){ value = initialValue = initVal;}PHTTPField * PHTTPBooleanField::NewField() const{ return new PHTTPBooleanField(baseName, title, initialValue, help);}void PHTTPBooleanField::GetHTMLTag(PHTML & html) const{ html << PHTML::HiddenField(fullName, "FALSE") << PHTML::CheckBox(fullName, value ? PHTML::Checked : PHTML::UnChecked);}static void SpliceChecked(PString & text, BOOL value){ PINDEX pos = text.Find("checked"); if (value) { if (pos == P_MAX_INDEX) text.Splice(" checked", 6, 0); } else { if (pos != P_MAX_INDEX) { PINDEX len = 7; if (text[pos-1] == ' ') { pos--; len++; } text.Delete(pos, len); } }}PString PHTTPBooleanField::GetHTMLInput(const PString & input) const{ static PRegularExpression checkboxRegEx("type[ \t\r\n]*=[ \t\r\n]*\"?checkbox\"?", PRegularExpression::Extended|PRegularExpression::IgnoreCase); if (input.FindRegEx(checkboxRegEx) != P_MAX_INDEX) { PCaselessString text; PINDEX before, after; if (FindInputValue(input, before, after)) text = input(0, before) + "TRUE" + input.Mid(after); else text = "<input value=\"TRUE\"" + input.Mid(6); SpliceChecked(text, value); return "<input type=hidden name=\"" + fullName + "\">" + text; } static PRegularExpression radioRegEx("type[ \t\r\n]*=[ \t\r\n]*\"?radio\"?", PRegularExpression::Extended|PRegularExpression::IgnoreCase); if (input.FindRegEx(radioRegEx) != P_MAX_INDEX) { PINDEX before, after; if (FindInputValue(input, before, after)) { PCaselessString text = input; PString val = input(before+1, after-1); SpliceChecked(text, (value && (val *= "TRUE")) || (!value && (val *= "FALSE"))); return text; } return input; } return PHTTPField::GetHTMLInput(input);}void PHTTPBooleanField::SetValue(const PString & val)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -