📄 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 + -