27 #ifndef PTLIB_PXMLRPC_H
28 #define PTLIB_PXMLRPC_H
79 PXML::Options options = PXML::NoOptions
208 virtual PINDEX
GetSize()
const;
230 virtual void PrintOn(ostream & strm)
const;
233 virtual PINDEX
GetSize()
const;
268 void PrintOn(ostream & strm)
const;
287 #define PXMLRPC_STRUCT_BEGIN(name) \
288 class name : public PXMLRPCStructBase { \
289 public: name() { EndConstructor(); } \
290 public: name(const name & other) { EndConstructor(); operator=(other); } \
291 public: name & operator=(const name & other) { PXMLRPCStructBase::operator=(other); return *this; }
293 #define PXMLRPC_VARIABLE_CLASS(base, type, variable, xmltype, init, extras) \
294 private: struct PXMLRPCVar_##variable : public PXMLRPCVariableBase { \
295 PXMLRPCVar_##variable() \
296 : PXMLRPCVariableBase(#variable, xmltype), \
297 instance(((base &)base::GetInitialiser()).variable) \
299 virtual void PrintOn (ostream & s) const { s << instance; } \
300 virtual void ReadFrom(istream & s) { s >> instance; } \
301 virtual void Copy(const PXMLRPCVariableBase & other) \
302 { instance = ((PXMLRPCVar_##variable &)other).instance; } \
305 } pxmlrpcvar_##variable
307 #define PXMLRPC_VARIABLE_CUSTOM(base, type, variable, xmltype, init, extras) \
308 public: type variable; \
309 PXMLRPC_VARIABLE_CLASS(base, type, variable, xmltype, init, extras)
311 #define PXMLRPC_ARRAY_CUSTOM(base, arraytype, basetype, variable, xmltype, par, extras) \
312 public: arraytype variable; \
313 private: struct PXMLRPCVar_##variable : public par { \
314 PXMLRPCVar_##variable() \
315 : par(((base &)base::GetInitialiser()).variable, #variable, xmltype), \
316 instance((arraytype &)m_array) \
319 arraytype & instance; \
320 } pxmlrpcvar_##variable
326 #define PXMLRPC_STRUCT_END() \
330 #define PXMLRPC_VARIABLE(base, type, variable, xmltype) \
331 PXMLRPC_VARIABLE_CUSTOM(base, type, variable, xmltype, ;, ;)
334 #define PXMLRPC_VARIABLE_INIT(base, type, variable, xmltype, init) \
335 PXMLRPC_VARIABLE_CUSTOM(base, type, variable, xmltype, instance=init;, ;)
338 #define PXMLRPC_STRING(base, type, variable) \
339 PXMLRPC_VARIABLE(base, type, variable, "string")
342 #define PXMLRPC_STRING_INIT(base, type, variable, init) \
343 PXMLRPC_VARIABLE_INIT(base, type, variable, "string", init)
346 #define PXMLRPC_INTEGER(base, type, variable) \
347 PXMLRPC_VARIABLE(base, type, variable, "int")
350 #define PXMLRPC_INTEGER_INIT(base, type, variable, init) \
351 PXMLRPC_VARIABLE_INIT(base, type, variable, "int", init)
354 #define PXMLRPC_BOOLEAN(base, type, variable) \
355 PXMLRPC_VARIABLE(base, type, variable, "boolean")
358 #define PXMLRPC_BOOLEAN_INIT(base, type, variable, init) \
359 PXMLRPC_VARIABLE_INIT(base, type, variable, "boolean", init)
362 #define PXMLRPC_DOUBLE(base, type, variable) \
363 PXMLRPC_VARIABLE(base, type, variable, "double")
366 #define PXMLRPC_DOUBLE_INIT(base, type, variable, init) \
367 PXMLRPC_VARIABLE_INIT(base, type, variable, "double", init)
370 #define PXMLRPC_DATETIME(base, type, variable) \
371 PXMLRPC_VARIABLE_CUSTOM(base, type, variable, "dateTime.iso8601", ;, \
372 PString ToString(PINDEX) const { return instance.AsString(PTime::ShortISO8601); } )
375 #define PXMLRPC_BINARY(base, type, variable) \
376 PXMLRPC_VARIABLE_CUSTOM(base, type, variable, "base64", ;, \
377 PString ToString(PINDEX) const { return ToBase64(instance); } \
378 void FromString(PINDEX, const PString & str) { FromBase64(str, instance); } )
381 #define PXMLRPC_STRUCT(base, type, variable) \
382 PXMLRPC_VARIABLE_CUSTOM(base, type, variable, "struct", ;, \
383 PXMLRPCStructBase * GetStruct(PINDEX) const { return &instance; } )
386 #define PXMLRPC_ARRAY(base, arraytype, basetype, variable, xmltype) \
387 PXMLRPC_ARRAY_CUSTOM(base, arraytype, basetype, variable, xmltype, PXMLRPCArrayObjectsBase, \
388 PObject * CreateObject() const { return new basetype; })
391 #define PXMLRPC_ARRAY_STRING(base, arraytype, basetype, variable) \
392 PXMLRPC_ARRAY(base, arraytype, basetype, variable, "string")
394 #define PXMLRPC_ARRAY_INTEGER(base, type, variable) \
395 PXMLRPC_ARRAY_CUSTOM(base, PScalarArray<type>, type, variable, "int", PXMLRPCArrayBase, \
396 PString ToString(PINDEX i) const { return PString(instance[i]); } \
397 void FromString(PINDEX i, const PString & str) { instance[i] = (type)str.AsInteger(); })
399 #define PXMLRPC_ARRAY_DOUBLE(base, type, variable) \
400 PXMLRPC_ARRAY_CUSTOM(base, PScalarArray<type>, type, variable, "double", PXMLRPCArrayBase, \
401 PString ToString(PINDEX i) const { return psprintf("%f", instance[i]); } \
402 void FromString(PINDEX i, const PString & str) { instance[i] = (type)str.AsReal(); })
404 #define PXMLRPC_ARRAY_STRUCT(base, type, variable) \
405 PXMLRPC_ARRAY_CUSTOM(base, PArray<type>, type, variable, "struct", PXMLRPCArrayObjectsBase, \
406 PXMLRPCStructBase * GetStruct(PINDEX i) const { return &instance[i]; } \
407 PObject * CreateObject() const { return new type; })
410 #define PXMLRPC_FUNC_NOARG_NOREPLY(name) \
411 PBoolean name() { return MakeRequest(#name); }
414 #define PXMLRPC_FUNC_SINGLE_ARG(name, vartype, argtype) \
415 class name##_in : public PXMLRPCStructBase { \
416 public: name##_in(const argtype & var) : variable(var) { EndConstructor(); } \
417 vartype(name##_in, argtype, variable);
420 #define PXMLRPC_FUNC_MULTI_ARGS(name) \
421 PXMLRPC_STRUCT_BEGIN(name##_in)
427 #define PXMLRPC_FUNC_MULTI_REPLY(name) \
428 }; PXMLRPC_STRUCT_BEGIN(name##_out)
434 #define PXMLRPC_FUNC_NO_ARGS(name) \
436 PBoolean name(name##_out & reply) \
437 { return MakeRequest(#name, name##_in(), reply); }
443 #define PXMLRPC_FUNC_STRUCT_ARG(name) \
445 class name##_in_carrier : public PXMLRPCStructBase { \
446 public: name##_in_carrier(const name##_in & var) : variable(var) { EndConstructor(); } \
447 private: struct var_class : public PXMLRPCVariableBase { \
448 var_class(const name##_in & var) \
449 : PXMLRPCVariableBase("variable", "struct"), instance(var) { } \
450 virtual void PrintOn (ostream & s) const { s << instance; } \
451 virtual PXMLRPCStructBase * GetStruct(PINDEX) const { return (PXMLRPCStructBase *)&instance; } \
452 virtual void Copy(const PXMLRPCVariableBase &) { } \
453 const name##_in & instance; \
456 PBoolean name(const name##_in & args, name##_out & reply) \
457 { return MakeRequest(#name, name##_in_carrier(args), reply); }
463 #define PXMLRPC_FUNC_NORM_ARGS(name) \
465 PBoolean name(const name##_in & args, name##_out & reply) \
466 { return MakeRequest(#name, args, reply); }
474 #endif // PTLIB_PXMLRPC_H
virtual PBoolean SetSize(PINDEX)
PXMLRPCVariableBase(const char *name, const char *type=NULL)
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:714
PBoolean GetExpectedParam(PINDEX idx, const PString &expectedType, PString &value)
PXMLElement * CreateBinary(const PBYTEArray &data)
This class defines an arbitrary time interval to millisecond accuracy.
Definition: timeint.h:51
virtual PINDEX GetSize() const
Get size of array.
Definition: pxmlrpc.h:259
virtual void FromString(PINDEX i, const PString &str)
This class defines an absolute time and date.
Definition: ptime.h:49
virtual PString ToString(PINDEX i) const
const char * GetName() const
Definition: pxmlrpc.h:200
virtual PBoolean IsArray() const
const char * m_name
Definition: pxmlrpc.h:215
void AddStruct(const PStringToString &dict)
PBoolean MakeRequest(const PString &method)
PXMLRPCVariableBase * GetVariable(const char *name) const
Definition: pxmlrpc.h:272
PXMLRPCArrayObjectsBase(PArrayObjects &array, const char *name, const char *type)
PURL m_url
Definition: pxmlrpc.h:98
This is a dictionary collection class of PString objects, keyed by another string.
Definition: pstring.h:3151
PINDEX m_faultCode
Definition: pxmlrpc.h:99
PBoolean ValidateResponse()
PINDEX GetFaultCode() const
Definition: pxmlrpc.h:120
const char * GetType() const
Definition: pxmlrpc.h:201
PString m_faultText
Definition: pxmlrpc.h:100
void AddVariable(PXMLRPCVariableBase *var)
PXMLElement * CreateMember(const PString &name, PXMLElement *value)
PXMLElement * CreateDateAndTime(const PTime &time)
PXMLRPCStructBase * initialiserStack
Definition: pxmlrpc.h:283
PBoolean ParseStruct(PXMLElement *element, PStringToString &structDict)
This is an array collection class of PString objects.
Definition: pstring.h:2365
PXML::Options m_options
Definition: pxmlrpc.h:102
void PrintOn(ostream &strm) const
Output the contents of the object to the stream.
PXMLElement * m_params
Definition: pxmlrpc.h:186
PINDEX GetFaultCode() const
Definition: pxmlrpc.h:90
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:2227
This class contains a variable length array of arbitrary memory blocks.
Definition: array.h:65
virtual PString ToString(PINDEX i) const
void AddArray(const PStringArray &array)
PContainer & m_array
Definition: pxmlrpc.h:237
Array of unsigned characters.
Definition: array.h:605
void SetFault(PINDEX code, const PString &text)
Definition: pxmlrpc.h:122
Definition: pxmlrpc.h:107
PXMLElement * CreateArray(PXMLElement *&data)
PString GetFaultText() const
Definition: pxmlrpc.h:121
Definition: pxmlrpc.h:223
PBoolean ParseArray(PXMLElement *element, PStringArray &array)
virtual PINDEX GetSize() const
PBoolean ParseScalar(PXMLElement *element, PString &type, PString &value)
bool PBoolean
Definition: object.h:174
PXMLElement * GetParam(PINDEX idx) const
virtual PBoolean SetSize(PINDEX)
PINDEX m_faultCode
Definition: pxmlrpc.h:188
virtual PObject * CreateObject() const =0
The character string class.
Definition: pstring.h:108
virtual void Copy(const PXMLRPCVariableBase &other)
virtual D * GetAt(const K &key) const
Get the object at the specified key position.
Definition: dict.h:1075
virtual void Copy(const PXMLRPCVariableBase &other)=0
PBoolean PerformRequest(PXMLRPCBlock &request, PXMLRPCBlock &response)
Definition: pxmlrpc.h:194
Abstract class to embody the base functionality of a container.
Definition: contain.h:99
const char * m_type
Definition: pxmlrpc.h:216
static PString PTimeToISO8601(const PTime &val)
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)
PArray< PXMLRPCVariableBase > variablesByOrder
Definition: pxmlrpc.h:280
PXMLRPCArrayObjectsBase & operator=(const PXMLRPCArrayObjectsBase &)
static PXMLRPCStructBase & GetInitialiser()
void FromBase64(const PString &str, PAbstractArray &data)
virtual void FromString(PINDEX i, const PString &str)
This template class maps the PArrayObjects to a specific object type.
Definition: array.h:925
PXMLRPCVariableBase & GetVariable(PINDEX idx) const
Definition: pxmlrpc.h:271
PXMLElement * CreateScalar(const PString &type, const PString &scalar)
Greenwich Mean Time, effectively UTC.
Definition: ptime.h:63
PTimeInterval m_timeout
Definition: pxmlrpc.h:101
PXMLElement * GetParams()
void AddBinary(const PBYTEArray &data)
void AddParam(PXMLElement *parm)
PXMLRPCArrayBase & operator=(const PXMLRPCArrayBase &)
PXMLElement * CreateValueElement(PXMLElement *element)
Definition: pxmlrpc.h:241
PDictionary< PString, PXMLRPCVariableBase > variablesByName
Definition: pxmlrpc.h:281
PXMLElement * CreateStruct(PXMLElement *&data)
PString GetFaultText() const
Definition: pxmlrpc.h:89
Ultimate parent class for all objects in the class library.
Definition: object.h:2204
PINDEX GetNumVariables() const
Definition: pxmlrpc.h:270
virtual PXMLRPCStructBase * GetStruct(PINDEX i) const
This class describes a Universal Resource Locator.
Definition: url.h:56
PArrayObjects & m_array
Definition: pxmlrpc.h:255
PString m_faultText
Definition: pxmlrpc.h:187
void SetTimeout(const PTimeInterval &t)
Definition: pxmlrpc.h:82
PXMLRPCArrayBase(PContainer &array, const char *name, const char *type)