📄 httpform.cxx
字号:
void PHTTPFieldArray::ExpandFieldNames(PString & text, PINDEX start, PINDEX & finish) const{ PString original = text(start, finish); PINDEX origFinish = finish; PINDEX finalFinish = finish; PINDEX fld = fields.GetSize(); while (fld > 0) { fields[--fld].ExpandFieldNames(text, start, finish); PINDEX pos,len; static PRegularExpression RowNum("<?!--#form[ \t\r\n]+rownum[ \t\r\n]*-->?", PRegularExpression::Extended|PRegularExpression::IgnoreCase); while (text.FindRegEx(RowNum, pos, len, start, finish)) SpliceAdjust(psprintf("%u", fld+1), text, pos, len, finish); static PRegularExpression SubForm("<?!--#form[ \t\r\n]+subform[ \t\r\n]*-->?", PRegularExpression::Extended|PRegularExpression::IgnoreCase); while (text.FindRegEx(SubForm, pos, len, start, finish)) { PString fmt = fullName; if (fmt.Find("%u") == P_MAX_INDEX) fmt += " %u"; SpliceAdjust("subformprefix=" + PURL::TranslateString(psprintf(fmt, fld+1), PURL::QueryTranslation), text, pos, len, finish); } static PRegularExpression RowControl("<?!--#form[ \t\r\n]+rowcontrol[ \t\r\n]*-->?", PRegularExpression::Extended|PRegularExpression::IgnoreCase); while (text.FindRegEx(RowControl, pos, len, start, finish)) { PHTML html(PHTML::InForm); if (canAddElements) AddArrayControlBox(html, fld); SpliceAdjust(html, text, pos, len, finish); } static PRegularExpression RowCheck("<?!--#form[ \t\r\n]+row(add|delete)[ \t\r\n]*(-?[^-])*-->?", PRegularExpression::Extended|PRegularExpression::IgnoreCase); while (text.FindRegEx(RowCheck, pos, len, start, finish)) { PStringStream checkbox; if (canAddElements) { PINDEX titlepos = text.Find("row", start)+3; BOOL adding = text[titlepos] == 'a'; if (( adding && fld >= fields.GetSize()-1) || (!adding && fld < fields.GetSize()-1)) { titlepos += adding ? 3 : 6; PINDEX dashes = text.Find("--", titlepos); PString title = text(titlepos, dashes-1).Trim(); if (title.IsEmpty() && adding) title = "Add"; checkbox << title << "<INPUT TYPE=checkbox NAME=\"" << fields[fld].GetName() << ArrayControlBox << "\" VALUE=" << (adding ? ArrayControlAdd : ArrayControlRemove) << '>'; } } SpliceAdjust(checkbox, text, pos, len, finish); } static PRegularExpression SelectRow("<select[ \t\r\n][^>]*name[ \t\r\n]*=[ \t\r\n]*\"!--#form[ \t\r\n]+rowselect[ \t\r\n]*--\"[^>]*>", PRegularExpression::Extended|PRegularExpression::IgnoreCase); static PRegularExpression SelEndRegEx("</select[^>]*>", PRegularExpression::Extended|PRegularExpression::IgnoreCase); PINDEX begin, end; while (FindSpliceBlock(SelectRow, SelEndRegEx, text, 0, pos, len, begin, end)) { PStringList options = GetArrayControlOptions(fld, fields.GetSize()-1, orderedArray); AdjustSelectOptions(text, begin, end, options[0], options, finish); static PRegularExpression RowSelect("!--#form[ \t\r\n]+rowselect[ \t\r\n]*--", PRegularExpression::Extended|PRegularExpression::IgnoreCase); if (text.FindRegEx(RowSelect, pos, len, pos, begin)) SpliceAdjust(fields[fld].GetName() + ArrayControlBox, text, pos, len, finish); } finalFinish += finish - origFinish; if (fld > 0) { text.Splice(original, start, 0); finish = origFinish; finalFinish += finish - start; } } finish = finalFinish;}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){ if (canAddElements) { 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{ if (canAddElements) { 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 && canAddElements) AddBlankField();}PINDEX PHTTPFieldArray::GetSize() const{ PINDEX size = fields.GetSize(); PAssert(size > 0, PLogicError); if (canAddElements) size--; return size;}void PHTTPFieldArray::AddBlankField(){ fields.Append(baseField->NewField()); SetArrayFieldName(fields.GetSize()-1);}PStringArray PHTTPFieldArray::GetStrings(PConfig & cfg){ LoadFromConfig(cfg); PStringArray values(GetSize()); for (PINDEX i = 0; i < GetSize(); i++) values[i] = fields[i].GetValue(FALSE); return values;}void PHTTPFieldArray::SetStrings(PConfig & cfg, const PStringArray & values){ SetSize(values.GetSize()); for (PINDEX i = 0; i < values.GetSize(); i++) fields[i].SetValue(values[i]); SaveToConfig(cfg);}//////////////////////////////////////////////////////////////////////////////// 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{ if (size < 128) html << PHTML::InputText(fullName, size, value); else html << PHTML::TextArea(fullName, (size+79)/80, 80) << value << PHTML::TextArea(fullName);}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); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -