31 #ifndef PTLIB_PXMLRPC_H
32 #define PTLIB_PXMLRPC_H
213 virtual PINDEX
GetSize()
const;
235 virtual void PrintOn(ostream & strm)
const;
238 virtual PINDEX
GetSize()
const;
273 void PrintOn(ostream & strm)
const;
294 #define PXMLRPC_STRUCT_BEGIN(name) \
295 class name : public PXMLRPCStructBase { \
296 public: name() { EndConstructor(); } \
297 public: name(const name & other) { EndConstructor(); operator=(other); } \
298 public: name & operator=(const name & other) { PXMLRPCStructBase::operator=(other); return *this; }
300 #define PXMLRPC_VARIABLE_CLASS(base, type, variable, xmltype, init, extras) \
301 private: struct PXMLRPCVar_##variable : public PXMLRPCVariableBase { \
302 PXMLRPCVar_##variable() \
303 : PXMLRPCVariableBase(#variable, xmltype), \
304 instance(((base &)base::GetInitialiser()).variable) \
306 virtual void PrintOn (ostream & s) const { s << instance; } \
307 virtual void ReadFrom(istream & s) { s >> instance; } \
308 virtual void Copy(const PXMLRPCVariableBase & other) \
309 { instance = ((PXMLRPCVar_##variable &)other).instance; } \
312 } pxmlrpcvar_##variable
314 #define PXMLRPC_VARIABLE_CUSTOM(base, type, variable, xmltype, init, extras) \
315 public: type variable; \
316 PXMLRPC_VARIABLE_CLASS(base, type, variable, xmltype, init, extras)
318 #define PXMLRPC_ARRAY_CUSTOM(base, arraytype, basetype, variable, xmltype, par, extras) \
319 public: arraytype variable; \
320 private: struct PXMLRPCVar_##variable : public par { \
321 PXMLRPCVar_##variable() \
322 : par(((base &)base::GetInitialiser()).variable, #variable, xmltype), \
323 instance((arraytype &)array) \
326 arraytype & instance; \
327 } pxmlrpcvar_##variable
333 #define PXMLRPC_STRUCT_END() \
337 #define PXMLRPC_VARIABLE(base, type, variable, xmltype) \
338 PXMLRPC_VARIABLE_CUSTOM(base, type, variable, xmltype, ;, ;)
341 #define PXMLRPC_VARIABLE_INIT(base, type, variable, xmltype, init) \
342 PXMLRPC_VARIABLE_CUSTOM(base, type, variable, xmltype, instance=init;, ;)
345 #define PXMLRPC_STRING(base, type, variable) \
346 PXMLRPC_VARIABLE(base, type, variable, "string")
349 #define PXMLRPC_STRING_INIT(base, type, variable, init) \
350 PXMLRPC_VARIABLE_INIT(base, type, variable, "string", init)
353 #define PXMLRPC_INTEGER(base, type, variable) \
354 PXMLRPC_VARIABLE(base, type, variable, "int")
357 #define PXMLRPC_INTEGER_INIT(base, type, variable, init) \
358 PXMLRPC_VARIABLE_INIT(base, type, variable, "int", init)
361 #define PXMLRPC_BOOLEAN(base, type, variable) \
362 PXMLRPC_VARIABLE(base, type, variable, "boolean")
365 #define PXMLRPC_BOOLEAN_INIT(base, type, variable, init) \
366 PXMLRPC_VARIABLE_INIT(base, type, variable, "boolean", init)
369 #define PXMLRPC_DOUBLE(base, type, variable) \
370 PXMLRPC_VARIABLE(base, type, variable, "double")
373 #define PXMLRPC_DOUBLE_INIT(base, type, variable, init) \
374 PXMLRPC_VARIABLE_INIT(base, type, variable, "double", init)
377 #define PXMLRPC_DATETIME(base, type, variable) \
378 PXMLRPC_VARIABLE_CUSTOM(base, type, variable, "dateTime.iso8601", ;, \
379 PString ToString(PINDEX) const { return instance.AsString(PTime::ShortISO8601); } )
382 #define PXMLRPC_BINARY(base, type, variable) \
383 PXMLRPC_VARIABLE_CUSTOM(base, type, variable, "base64", ;, \
384 PString ToString(PINDEX) const { return ToBase64(instance); } \
385 void FromString(PINDEX, const PString & str) { FromBase64(str, instance); } )
388 #define PXMLRPC_STRUCT(base, type, variable) \
389 PXMLRPC_VARIABLE_CUSTOM(base, type, variable, "struct", ;, \
390 PXMLRPCStructBase * GetStruct(PINDEX) const { return &instance; } )
393 #define PXMLRPC_ARRAY(base, arraytype, basetype, variable, xmltype) \
394 PXMLRPC_ARRAY_CUSTOM(base, arraytype, basetype, variable, xmltype, PXMLRPCArrayObjectsBase, \
395 PObject * CreateObject() const { return new basetype; })
398 #define PXMLRPC_ARRAY_STRING(base, arraytype, basetype, variable) \
399 PXMLRPC_ARRAY(base, arraytype, basetype, variable, "string")
401 #define PXMLRPC_ARRAY_INTEGER(base, type, variable) \
402 PXMLRPC_ARRAY_CUSTOM(base, PScalarArray<type>, type, variable, "int", PXMLRPCArrayBase, \
403 PString ToString(PINDEX i) const { return PString(instance[i]); } \
404 void FromString(PINDEX i, const PString & str) { instance[i] = (type)str.AsInteger(); })
406 #define PXMLRPC_ARRAY_DOUBLE(base, type, variable) \
407 PXMLRPC_ARRAY_CUSTOM(base, PScalarArray<type>, type, variable, "double", PXMLRPCArrayBase, \
408 PString ToString(PINDEX i) const { return psprintf("%f", instance[i]); } \
409 void FromString(PINDEX i, const PString & str) { instance[i] = (type)str.AsReal(); })
411 #define PXMLRPC_ARRAY_STRUCT(base, type, variable) \
412 PXMLRPC_ARRAY_CUSTOM(base, PArray<type>, type, variable, "struct", PXMLRPCArrayObjectsBase, \
413 PXMLRPCStructBase * GetStruct(PINDEX i) const { return &instance[i]; } \
414 PObject * CreateObject() const { return new type; })
417 #define PXMLRPC_FUNC_NOARG_NOREPLY(name) \
418 PBoolean name() { return MakeRequest(#name); }
421 #define PXMLRPC_FUNC_SINGLE_ARG(name, vartype, argtype) \
422 class name##_in : public PXMLRPCStructBase { \
423 public: name##_in(const argtype & var) : variable(var) { EndConstructor(); } \
424 vartype(name##_in, argtype, variable);
427 #define PXMLRPC_FUNC_MULTI_ARGS(name) \
428 PXMLRPC_STRUCT_BEGIN(name##_in)
434 #define PXMLRPC_FUNC_MULTI_REPLY(name) \
435 }; PXMLRPC_STRUCT_BEGIN(name##_out)
441 #define PXMLRPC_FUNC_NO_ARGS(name) \
443 PBoolean name(name##_out & reply) \
444 { return MakeRequest(#name, name##_in(), reply); }
450 #define PXMLRPC_FUNC_STRUCT_ARG(name) \
452 class name##_in_carrier : public PXMLRPCStructBase { \
453 public: name##_in_carrier(const name##_in & var) : variable(var) { EndConstructor(); } \
454 private: struct var_class : public PXMLRPCVariableBase { \
455 var_class(const name##_in & var) \
456 : PXMLRPCVariableBase("variable", "struct"), instance(var) { } \
457 virtual void PrintOn (ostream & s) const { s << instance; } \
458 virtual PXMLRPCStructBase * GetStruct(PINDEX) const { return (PXMLRPCStructBase *)&instance; } \
459 virtual void Copy(const PXMLRPCVariableBase &) { } \
460 const name##_in & instance; \
463 PBoolean name(const name##_in & args, name##_out & reply) \
464 { return MakeRequest(#name, name##_in_carrier(args), reply); }
470 #define PXMLRPC_FUNC_NORM_ARGS(name) \
472 PBoolean name(const name##_in & args, name##_out & reply) \
473 { return MakeRequest(#name, args, reply); }
481 #endif // PTLIB_PXMLRPC_H
virtual PBoolean SetSize(PINDEX)
const char * name
Definition: pxmlrpc.h:220
PXMLRPCVariableBase(const char *name, const char *type=NULL)
PArrayObjects & array
Definition: pxmlrpc.h:260
PINDEX GetParamCount() const
static PBoolean ISO8601ToPTime(const PString &iso8601, PTime &val, int tz=PTime::GMT)
virtual PBoolean IsArray() const
An array of objects.
Definition: array.h:813
PBoolean GetExpectedParam(PINDEX idx, const PString &expectedType, PString &value)
PINDEX faultCode
Definition: pxmlrpc.h:193
This class defines an arbitrary time interval to millisecond accuracy.
Definition: timeint.h:55
virtual PINDEX GetSize() const
Get size of array.
Definition: pxmlrpc.h:264
static PMutex initialiserMutex
Definition: pxmlrpc.h:289
static PXMLElement * CreateValueElement(PXMLElement *element)
PString faultText
Definition: pxmlrpc.h:104
virtual void FromString(PINDEX i, const PString &str)
This class defines an absolute time and date.
Definition: ptime.h:53
virtual PString ToString(PINDEX i) const
const char * GetName() const
Definition: pxmlrpc.h:205
PTimeInterval timeout
Definition: pxmlrpc.h:105
virtual PBoolean IsArray() const
void AddStruct(const PStringToString &dict)
PBoolean MakeRequest(const PString &method)
PXMLRPCVariableBase * GetVariable(const char *name) const
Definition: pxmlrpc.h:277
PXMLRPCArrayObjectsBase(PArrayObjects &array, const char *name, const char *type)
This is a dictionary collection class of PString objects, keyed by another string.
Definition: pstring.h:2784
PBoolean ValidateResponse()
PINDEX GetFaultCode() const
Definition: pxmlrpc.h:126
const char * GetType() const
Definition: pxmlrpc.h:206
void AddVariable(PXMLRPCVariableBase *var)
PBoolean Load(const PString &str)
PXMLRPCStructBase * initialiserStack
Definition: pxmlrpc.h:288
PBoolean ParseStruct(PXMLElement *element, PStringToString &structDict)
static PXMLRPCStructBase * initialiserInstance
Definition: pxmlrpc.h:290
This is an array collection class of PString objects.
Definition: pstring.h:2024
PXML::Options m_options
Definition: pxmlrpc.h:106
static PXMLElement * CreateScalar(const PString &type, const PString &scalar)
PContainer & array
Definition: pxmlrpc.h:242
void PrintOn(ostream &strm) const
Output the contents of the object to the stream.
PURL url
Definition: pxmlrpc.h:102
PINDEX GetFaultCode() const
Definition: pxmlrpc.h:94
PXMLRPC(const PURL &url, PXML::Options options=PXML::NoOptions)
virtual PINDEX GetSize() const
PObject()
Constructor for PObject, made protected so cannot ever create one on its own.
Definition: object.h:1124
This class contains a variable length array of arbitrary memory blocks.
Definition: array.h:67
virtual PString ToString(PINDEX i) const
void AddArray(const PStringArray &array)
BOOL PBoolean
Definition: object.h:102
static PXMLElement * CreateMember(const PString &name, PXMLElement *value)
Array of unsigned characters.
Definition: array.h:670
void SetFault(PINDEX code, const PString &text)
Definition: pxmlrpc.h:128
Definition: pxmlrpc.h:111
PINDEX faultCode
Definition: pxmlrpc.h:103
PString GetFaultText() const
Definition: pxmlrpc.h:127
Definition: pxmlrpc.h:228
PBoolean ParseArray(PXMLElement *element, PStringArray &array)
virtual PINDEX GetSize() const
#define PAssertNULL(ptr)
This macro is used to assert that a pointer must be non-null.
Definition: object.h:220
static PXMLElement * CreateBinary(const PBYTEArray &data)
PBoolean ParseScalar(PXMLElement *element, PString &type, PString &value)
PXMLElement * GetParam(PINDEX idx) const
virtual PBoolean SetSize(PINDEX)
virtual PObject * CreateObject() const =0
The character string class.
Definition: pstring.h:108
static PXMLElement * CreateArray(const PStringArray &array)
virtual void Copy(const PXMLRPCVariableBase &other)
virtual D * GetAt(const K &key) const
Get the object at the specified key position.
Definition: dict.h:938
virtual void Copy(const PXMLRPCVariableBase &other)=0
PBoolean PerformRequest(PXMLRPCBlock &request, PXMLRPCBlock &response)
Definition: pxmlrpc.h:199
Abstract class to embody the base functionality of a container.
Definition: contain.h:104
static PString PTimeToISO8601(const PTime &val)
static PXMLElement * CreateDateAndTime(const PTime &time)
PString ToBase64(PAbstractArray &data) const
PXMLRPCStructBase & operator=(const PXMLRPCStructBase &)
virtual void PrintOn(ostream &strm) const
Output the contents of the object to the stream.
virtual PBoolean SetSize(PINDEX)
static PXMLElement * CreateStruct()
PArray< PXMLRPCVariableBase > variablesByOrder
Definition: pxmlrpc.h:285
PXMLRPCArrayObjectsBase & operator=(const PXMLRPCArrayObjectsBase &)
static PXMLRPCStructBase & GetInitialiser()
Definition: pxmlrpc.h:280
void FromBase64(const PString &str, PAbstractArray &data)
Greenwich Mean Time, effectively UTC.
Definition: ptime.h:67
virtual void FromString(PINDEX i, const PString &str)
PString faultText
Definition: pxmlrpc.h:192
This template class maps the PArrayObjects to a specific object type.
Definition: array.h:1024
PXMLRPCVariableBase & GetVariable(PINDEX idx) const
Definition: pxmlrpc.h:276
PXMLElement * GetParams()
void AddBinary(const PBYTEArray &data)
void AddParam(PXMLElement *parm)
PXMLRPCArrayBase & operator=(const PXMLRPCArrayBase &)
Definition: pxmlrpc.h:246
PDictionary< PString, PXMLRPCVariableBase > variablesByName
Definition: pxmlrpc.h:286
Options
Definition: pxml.h:71
PString GetFaultText() const
Definition: pxmlrpc.h:93
Ultimate parent class for all objects in the class library.
Definition: object.h:1118
PXMLElement * params
Definition: pxmlrpc.h:191
const char * type
Definition: pxmlrpc.h:221
PINDEX GetNumVariables() const
Definition: pxmlrpc.h:275
virtual PXMLRPCStructBase * GetStruct(PINDEX i) const
This class describes a Universal Resource Locator.
Definition: url.h:54
void SetTimeout(const PTimeInterval &t)
Definition: pxmlrpc.h:86
PXMLRPCArrayBase(PContainer &array, const char *name, const char *type)