📄 httpform.h
字号:
/*
* httpform.h
*
* Forms management using HTTP User Interface.
*
* Portable Windows Library
*
* Copyright (c) 1993-2002 Equivalence Pty. Ltd.
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is Portable Windows Library.
*
* The Initial Developer of the Original Code is Equivalence Pty. Ltd.
*
* Contributor(s): ______________________________________.
*
* $Log: httpform.h,v $
* Revision 1.18 2005/11/30 12:47:37 csoutheren
* Removed tabs, reformatted some code, and changed tags for Doxygen
*
* Revision 1.17 2003/03/24 04:30:41 robertj
* Added function to set and get strings from PConfig in correct format for
* use with HTTP form array contsructs.
*
* Revision 1.16 2002/11/06 22:47:24 robertj
* Fixed header comment (copyright etc)
*
* Revision 1.15 2002/09/16 01:08:59 robertj
* Added #define so can select if #pragma interface/implementation is used on
* platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
*
* Revision 1.14 2001/10/10 08:07:48 robertj
* Fixed large memory leak of strings when doing POST to a form.
*
* Revision 1.13 2000/12/18 07:12:37 robertj
* Added ability to have fixed length array fields.
*
* Revision 1.12 1999/03/09 08:01:46 robertj
* Changed comments for doc++ support (more to come).
*
* Revision 1.11 1999/02/16 08:07:10 robertj
* MSVC 6.0 compatibility changes.
*
* Revision 1.10 1998/11/30 02:50:48 robertj
* New directory structure
*
* Revision 1.9 1998/09/23 06:19:31 robertj
* Added open source copyright license.
*
* Revision 1.8 1998/08/20 05:45:33 robertj
* Fixed bug where substitutions did not always occur if near end of macro block.
*
* Revision 1.7 1998/01/26 00:25:24 robertj
* Major rewrite of HTTP forms management.
*
* Revision 1.6 1997/08/09 07:46:51 robertj
* Fixed problems with value of SELECT fields in form
*
* Revision 1.5 1997/07/26 11:38:17 robertj
* Support for overridable pages in HTTP service applications.
*
* Revision 1.4 1997/07/08 13:16:12 robertj
* Major HTTP form enhancements for lists and arrays of fields.
*
* Revision 1.3 1997/06/08 04:49:40 robertj
* Adding new llist based form field.
*
* Revision 1.2 1997/04/01 06:01:39 robertj
* Allowed value list in drop down box to be modified once created.
*
* Revision 1.1 1996/06/28 12:55:56 robertj
* Initial revision
*
*/
#ifndef _PHTTPFORM
#define _PHTTPFORM
#ifdef P_USE_PRAGMA
#pragma interface
#endif
#include <ptclib/http.h>
///////////////////////////////////////////////////////////////////////////////
// PHTTPField
/** This class is the abstract base class for fields in a #PHTTPForm#
resource type.
*/
class PHTTPField : public PObject
{
PCLASSINFO(PHTTPField, PObject)
public:
PHTTPField(
const char * bname, // base name (identifier) for the field.
const char * title, // Title text for field (defaults to name).
const char * help // Help text for the field.
);
// Create a new field in a HTTP form.
/** Compare the fields using the field names.
@return
Comparison of the name fields of the two fields.
*/
virtual Comparison Compare(
const PObject & obj
) const;
/** Get the identifier name of the field.
@return
String for field name.
*/
const PCaselessString & GetName() const { return fullName; }
/** Get the identifier name of the field.
@return
String for field name.
*/
const PCaselessString & GetBaseName() const { return baseName; }
/** Set the name for the field.
*/
virtual void SetName(
const PString & newName // New name for field
);
/** Locate the field naem, recusing down for composite fields.
@return
Pointer to located field, or NULL if not found.
*/
virtual const PHTTPField * LocateName(
const PString & name // Full field name to locate
) const;
/** Get the title of the field.
@return
String for title placed next to the field.
*/
const PString & GetTitle() const { return title; }
/** Get the title of the field.
@return
String for title placed next to the field.
*/
const PString & GetHelp() const { return help; }
void SetHelp(
const PString & text // Help text.
) { help = text; }
void SetHelp(
const PString & hotLinkURL, // URL for link to help page.
const PString & linkText // Help text in the link.
);
void SetHelp(
const PString & hotLinkURL, // URL for link to help page.
const PString & imageURL, // URL for image to be displayed in link.
const PString & imageText // Text in the link when image unavailable.
);
// Set the help text for the field.
/** Create a new field of the same class as the current field.
@return
New field object instance.
*/
virtual PHTTPField * NewField() const = 0;
virtual void ExpandFieldNames(PString & text, PINDEX start, PINDEX & finish) const;
// Splice expanded macro substitutions into text string
/** Convert the field to HTML form tag for inclusion into the HTTP page.
*/
virtual void GetHTMLTag(
PHTML & html // HTML to receive the fields HTML tag.
) const = 0;
/** Convert the field input to HTML for inclusion into the HTTP page.
*/
virtual PString GetHTMLInput(
const PString & input // Source HTML text for input tag.
) const;
/** Convert the field input to HTML for inclusion into the HTTP page.
*/
virtual PString GetHTMLSelect(
const PString & selection // Source HTML text for input tag.
) const;
/** Convert the field to HTML for inclusion into the HTTP page.
*/
virtual void GetHTMLHeading(
PHTML & html // HTML to receive the field info.
) const;
/** Get the string value of the field.
@return
String for field value.
*/
virtual PString GetValue(BOOL dflt = FALSE) const = 0;
/** Set the value of the field.
*/
virtual void SetValue(
const PString & newValue // New value for the field.
) = 0;
/** Get the value of the PConfig to the sub-field. If the field is not
composite then it always sets the value as for the non-indexed version.
*/
virtual void LoadFromConfig(
PConfig & cfg // Configuration for value transfer.
);
/** Set the value of the sub-field into the PConfig. If the field is not
composite then it always sets the value as for the non-indexed version.
*/
virtual void SaveToConfig(
PConfig & cfg // Configuration for value transfer.
) const;
/** Validate the new field value before #SetValue()# is called.
@return
BOOL if the new field value is OK.
*/
virtual BOOL Validated(
const PString & newVal, // Proposed new value for the field.
PStringStream & msg // Stream to take error HTML if value not valid.
) const;
/** Retrieve all the names in the field and subfields.
@return
List of strings for each subfield.
*/
virtual void GetAllNames(PStringList & list) const;
/** Set the value of the field in a list of fields.
*/
virtual void SetAllValues(
const PStringToString & data // New value for the field.
);
/** Validate the new field value in a list before #SetValue()# is called.
@return
BOOL if the all the new field values are OK.
*/
virtual BOOL ValidateAll(
const PStringToString & data, // Proposed new value for the field.
PStringStream & msg // Stream to take error HTML if value not valid.
) const;
BOOL NotYetInHTML() const { return notInHTML; }
void SetInHTML() { notInHTML = FALSE; }
protected:
PCaselessString baseName;
PCaselessString fullName;
PString title;
PString help;
BOOL notInHTML;
};
PLIST(PHTTPFieldList, PHTTPField);
class PHTTPCompositeField : public PHTTPField
{
PCLASSINFO(PHTTPCompositeField, PHTTPField)
public:
PHTTPCompositeField(
const char * name, // Name (identifier) for the field.
const char * title = NULL, // Title text for field (defaults to name).
const char * help = NULL // Help text for the field.
);
virtual void SetName(
const PString & name // New name for field
);
virtual const PHTTPField * LocateName(
const PString & name // Full field name to locate
) const;
virtual PHTTPField * NewField() const;
virtual void ExpandFieldNames(PString & text, PINDEX start, PINDEX & finish) const;
virtual void GetHTMLTag(
PHTML & html // HTML to receive the field info.
) const;
virtual PString GetHTMLInput(
const PString & input // Source HTML text for input tag.
) const;
virtual void GetHTMLHeading(
PHTML & html // HTML to receive the field info.
) const;
virtual PString GetValue(BOOL dflt = FALSE) const;
virtual void SetValue(
const PString & newValue // New value for the field.
);
virtual void LoadFromConfig(
PConfig & cfg // Configuration for value transfer.
);
virtual void SaveToConfig(
PConfig & cfg // Configuration for value transfer.
) const;
virtual void GetAllNames(PStringList & list) const;
virtual void SetAllValues(
const PStringToString & data // New value for the field.
);
virtual BOOL ValidateAll(
const PStringToString & data, // Proposed new value for the field.
PStringStream & msg // Stream to take error HTML if value not valid.
) const;
/** Get the number of sub-fields in the composite field. Note that this is
the total including any composite sub-fields, ie, it is the size of the
whole tree of primitive fields.
@return
Returns field count.
*/
virtual PINDEX GetSize() const;
void Append(PHTTPField * fld);
PHTTPField & operator[](PINDEX idx) const { return fields[idx]; }
void RemoveAt(PINDEX idx) { fields.RemoveAt(idx); }
void RemoveAll() { fields.RemoveAll(); }
protected:
PHTTPFieldList fields;
};
class PHTTPSubForm : public PHTTPCompositeField
{
PCLASSINFO(PHTTPSubForm, PHTTPCompositeField)
public:
PHTTPSubForm(
const PString & subFormName, // URL for the sub-form
const char * name, // Name (identifier) for the field.
const char * title = NULL, // Title text for field (defaults to name).
PINDEX primaryField = 0, // Pimary field whove value is in hot link
PINDEX secondaryField = P_MAX_INDEX // Seconary field next to hotlink
);
PHTTPField * NewField() const;
void GetHTMLTag(PHTML & html) const;
void GetHTMLHeading(PHTML & html) const;
protected:
PString subFormName;
PINDEX primary;
PINDEX secondary;
};
class PHTTPFieldArray : public PHTTPCompositeField
{
PCLASSINFO(PHTTPFieldArray, PHTTPCompositeField)
public:
PHTTPFieldArray(
PHTTPField * baseField,
BOOL ordered,
PINDEX fixedSize = 0
);
~PHTTPFieldArray();
virtual PHTTPField * NewField() const;
virtual void ExpandFieldNames(PString & text, PINDEX start, PINDEX & finish) const;
virtual void GetHTMLTag(
PHTML & html // HTML to receive the field info.
) const;
virtual void LoadFromConfig(
PConfig & cfg // Configuration for value transfer.
);
virtual void SaveToConfig(
PConfig & cfg // Configuration for value transfer.
) const;
virtual void SetAllValues(
const PStringToString & data // New value for the field.
);
virtual PINDEX GetSize() const;
void SetSize(PINDEX newSize);
PStringArray GetStrings(
PConfig & cfg ///< Config file to get strings from
);
void SetStrings(
PConfig & cfg, ///< Config file to Set strings to
const PStringArray & values ///< Strings to set
);
protected:
void AddBlankField();
void AddArrayControlBox(PHTML & html, PINDEX fld) const;
void SetArrayFieldName(PINDEX idx) const;
PHTTPField * baseField;
BOOL orderedArray;
BOOL canAddElements;
};
class PHTTPStringField : public PHTTPField
{
PCLASSINFO(PHTTPStringField, PHTTPField)
public:
PHTTPStringField(
const char * name,
PINDEX size,
const char * initVal = NULL,
const char * help = NULL
);
PHTTPStringField(
const char * name,
const char * title,
PINDEX size,
const char * initVal = NULL,
const char * help = NULL
);
virtual PHTTPField * NewField() const;
virtual void GetHTMLTag(
PHTML & html ///< HTML to receive the field info.
) const;
virtual PString GetValue(BOOL dflt = FALSE) const;
virtual void SetValue(
const PString & newVal
);
protected:
PString value;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -