📄 httpform.cxx
字号:
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)
{
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);
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPStringField
PHTTPStringField::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;
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPPasswordField
PHTTPPasswordField::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;
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPIntegerField
PHTTPIntegerField::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;
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPBooleanField
PHTTPBooleanField::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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -