📄 pxmlrpc.h
字号:
/*
* pxmlrpc.h
*
* XML/RPC support
*
* Portable Windows Library
*
* Copyright (c) 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: pxmlrpc.h,v $
* Revision 1.20 2004/05/17 06:05:20 csoutheren
* Changed "make docs" to use doxygen
* Added new config file and main page
*
* Revision 1.19 2003/04/15 07:08:36 robertj
* Changed read and write from streams for base array classes so operates in
* the same way for both PIntArray and PArray<int> etc
*
* Revision 1.18 2003/04/15 03:00:41 robertj
* Added array support to XML/RPC
* Fixed XML/RPC parsing when lots of white space in raw XML, caused by
* big fix to base XML parser not returning internal data elements.
*
* Revision 1.17 2003/01/28 05:08:07 robertj
* Fixed copy constructor on function arguments and return value
*
* Revision 1.16 2002/12/16 06:57:15 robertj
* Added ability to specify certain elemets (by name) that are exempt from
* the indent formatting. Useful for XML/RPC where leading white space is
* not ignored by all servers.
* Improved the macros for defining RPC functions.
*
* Revision 1.15 2002/12/13 01:04:56 robertj
* Added copy constructor and assignment operator to XML/RPC structs
*
* Revision 1.14 2002/12/10 04:44:43 robertj
* Added support in PTime for ISO 8601 format.
*
* Revision 1.13 2002/12/09 04:06:18 robertj
* Added macros for defining multi-argument functions
*
* Revision 1.12 2002/12/04 02:09:26 robertj
* Changed macro name prefix to PXMLRPC
*
* Revision 1.11 2002/12/04 00:31:13 robertj
* Fixed GNU compatibility
*
* Revision 1.10 2002/12/04 00:15:56 robertj
* Large enhancement to create automatically encoding and decoding structures
* using macros to build a class.
*
* Revision 1.9 2002/11/06 22:47:24 robertj
* Fixed header comment (copyright etc)
*
* Revision 1.8 2002/10/02 08:54:34 craigs
* Added support for XMLRPC server
*
* Revision 1.7 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.6 2002/08/13 03:02:07 robertj
* Removed previous fix for memory leak, as object was already deleted.
*
* Revision 1.5 2002/08/13 01:55:00 craigs
* Fixed memory leak on PXMLRPCRequest class
*
* Revision 1.4 2002/08/06 01:04:03 robertj
* Fixed missing pragma interface/implementation
*
* Revision 1.3 2002/07/12 05:51:14 craigs
* Added structs to XMLRPC response types
*
* Revision 1.2 2002/03/27 00:50:44 craigs
* Fixed problems with parsing faults and creating structs
*
* Revision 1.1 2002/03/26 07:06:50 craigs
* Initial version
*
*/
#ifndef _PXMLRPC_H
#define _PXMLRPC_H
#ifdef P_USE_PRAGMA
#pragma interface
#endif
#include <ptclib/pxml.h>
#include <ptclib/url.h>
class PXMLRPCBlock;
class PXMLRPCVariableBase;
class PXMLRPCStructBase;
/////////////////////////////////////////////////////////////////
class PXMLRPC : public PObject
{
PCLASSINFO(PXMLRPC, PObject);
public:
enum {
CannotCreateRequestXML = 100,
CannotParseResponseXML,
CannotParseRequestXML,
HTTPPostFailed,
CannotReadResponseContentBody,
ResponseRootNotMethodResponse,
ResponseEmpty,
ResponseUnknownFormat,
ParamNotValue,
ScalarWithoutElement,
ParamNotStruct,
MemberIncomplete,
MemberUnnamed,
FaultyFault,
RequestHasWrongDocumentType,
RequestHasNoMethodName,
RequestHasNoParms,
MethodNameIsEmpty,
UnknownMethod,
ParamNotArray,
UserFault = 1000,
};
PXMLRPC(
const PURL & url,
unsigned options = 0
);
void SetTimeout(const PTimeInterval & _timeout) { timeout = _timeout; }
BOOL MakeRequest(const PString & method);
BOOL MakeRequest(const PString & method, PXMLRPCBlock & response);
BOOL MakeRequest(PXMLRPCBlock & request, PXMLRPCBlock & response);
BOOL MakeRequest(const PString & method, const PXMLRPCStructBase & args, PXMLRPCStructBase & reply);
PString GetFaultText() const { return faultText; }
PINDEX GetFaultCode() const { return faultCode; }
static BOOL ISO8601ToPTime(const PString & iso8601, PTime & val, int tz = PTime::GMT);
static PString PTimeToISO8601(const PTime & val);
protected:
BOOL PerformRequest(PXMLRPCBlock & request, PXMLRPCBlock & response);
PURL url;
PINDEX faultCode;
PString faultText;
PTimeInterval timeout;
unsigned options;
};
/////////////////////////////////////////////////////////////////
class PXMLRPCBlock : public PXML
{
PCLASSINFO(PXMLRPCBlock, PXML);
public:
PXMLRPCBlock();
PXMLRPCBlock(const PString & method);
PXMLRPCBlock(const PString & method, const PXMLRPCStructBase & structData);
BOOL Load(const PString & str);
PXMLElement * GetParams();
PXMLElement * GetParam(PINDEX idx) const;
PINDEX GetParamCount() const;
// used when used as a response
PINDEX GetFaultCode() const { return faultCode; }
PString GetFaultText() const { return faultText; }
void SetFault(PINDEX code, const PString & text) { faultCode = code; faultText = text; }
BOOL ValidateResponse();
// helper functions for getting parameters
BOOL GetParams(PXMLRPCStructBase & data);
BOOL GetParam(PINDEX idx, PString & type, PString & result);
BOOL GetExpectedParam(PINDEX idx, const PString & expectedType, PString & value);
BOOL GetParam(PINDEX idx, PString & result);
BOOL GetParam(PINDEX idx, int & result);
BOOL GetParam(PINDEX idx, double & result);
BOOL GetParam(PINDEX idx, PTime & result, int tz = PTime::GMT);
BOOL GetParam(PINDEX idx, PStringToString & result);
BOOL GetParam(PINDEX idx, PXMLRPCStructBase & result);
BOOL GetParam(PINDEX idx, PStringArray & result);
BOOL GetParam(PINDEX idx, PArray<PStringToString> & result);
// static functions for parsing values
BOOL ParseScalar(PXMLElement * element, PString & type, PString & value);
BOOL ParseStruct(PXMLElement * element, PStringToString & structDict);
BOOL ParseStruct(PXMLElement * element, PXMLRPCStructBase & structData);
BOOL ParseArray(PXMLElement * element, PStringArray & array);
BOOL ParseArray(PXMLElement * element, PArray<PStringToString> & array);
BOOL ParseArray(PXMLElement * element, PXMLRPCVariableBase & array);
// static functions for creating values
static PXMLElement * CreateValueElement(PXMLElement * element);
static PXMLElement * CreateScalar(const PString & type, const PString & scalar);
static PXMLElement * CreateMember(const PString & name, PXMLElement * value);
static PXMLElement * CreateScalar(const PString & str);
static PXMLElement * CreateScalar(int value);
static PXMLElement * CreateScalar(double value);
static PXMLElement * CreateDateAndTime(const PTime & time);
static PXMLElement * CreateBinary(const PBYTEArray & data);
static PXMLElement * CreateStruct();
static PXMLElement * CreateStruct(const PStringToString & dict);
static PXMLElement * CreateStruct(const PStringToString & dict, const PString & typeStr);
static PXMLElement * CreateStruct(const PXMLRPCStructBase & structData);
static PXMLElement * CreateArray(const PStringArray & array);
static PXMLElement * CreateArray(const PStringArray & array, const PString & typeStr);
static PXMLElement * CreateArray(const PStringArray & array, const PStringArray & types);
static PXMLElement * CreateArray(const PArray<PStringToString> & array);
static PXMLElement * CreateArray(const PXMLRPCVariableBase & array);
// helper functions for adding parameters
void AddParam(PXMLElement * parm);
void AddParam(const PString & str);
void AddParam(int value);
void AddParam(double value);
void AddParam(const PTime & time);
void AddParam(const PXMLRPCStructBase & structData);
void AddBinary(const PBYTEArray & data);
void AddStruct(const PStringToString & dict);
void AddStruct(const PStringToString & dict, const PString & typeStr);
void AddArray(const PStringArray & array);
void AddArray(const PStringArray & array, const PString & typeStr);
void AddArray(const PStringArray & array, const PStringArray & types);
void AddArray(const PArray<PStringToString> & array);
protected:
PXMLElement * params;
PString faultText;
PINDEX faultCode;
};
/////////////////////////////////////////////////////////////////
class PXMLRPCVariableBase : public PObject {
PCLASSINFO(PXMLRPCVariableBase, PObject);
protected:
PXMLRPCVariableBase(const char * name, const char * type = NULL);
public:
const char * GetName() const { return name; }
const char * GetType() const { return type; }
virtual void Copy(const PXMLRPCVariableBase & other) = 0;
virtual PString ToString(PINDEX i) const;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -