PTLib  Version 2.18.8
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
pxmlrpc.h
Go to the documentation of this file.
1 /*
2  * pxmlrpc.h
3  *
4  * XML/RPC support
5  *
6  * Portable Windows Library
7  *
8  * Copyright (c) 2002 Equivalence Pty. Ltd.
9  *
10  * The contents of this file are subject to the Mozilla Public License
11  * Version 1.0 (the "License"); you may not use this file except in
12  * compliance with the License. You may obtain a copy of the License at
13  * http://www.mozilla.org/MPL/
14  *
15  * Software distributed under the License is distributed on an "AS IS"
16  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17  * the License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * The Original Code is Portable Windows Library.
21  *
22  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
23  *
24  * Contributor(s): ______________________________________.
25  */
26 
27 #ifndef PTLIB_PXMLRPC_H
28 #define PTLIB_PXMLRPC_H
29 
30 #ifdef P_USE_PRAGMA
31 #pragma interface
32 #endif
33 
34 #include <ptclib/pxml.h>
35 
36 #if P_XMLRPC
37 
38 #include <ptclib/url.h>
39 
40 
41 class PXMLRPCBlock;
43 class PXMLRPCStructBase;
44 
45 
47 
48 class PXMLRPC : public PObject
49 {
50  PCLASSINFO(PXMLRPC, PObject);
51  public:
52  enum {
73 
74  UserFault = 1000,
75  };
76 
77  PXMLRPC(
78  const PURL & url,
79  PXML::Options options = PXML::NoOptions
80  );
81 
82  void SetTimeout(const PTimeInterval & t) { m_timeout = t; }
83 
84  PBoolean MakeRequest(const PString & method);
85  PBoolean MakeRequest(const PString & method, PXMLRPCBlock & response);
86  PBoolean MakeRequest(PXMLRPCBlock & request, PXMLRPCBlock & response);
87  PBoolean MakeRequest(const PString & method, const PXMLRPCStructBase & args, PXMLRPCStructBase & reply);
88 
89  PString GetFaultText() const { return m_faultText; }
90  PINDEX GetFaultCode() const { return m_faultCode; }
91 
92  static PBoolean ISO8601ToPTime(const PString & iso8601, PTime & val, int tz = PTime::GMT);
93  static PString PTimeToISO8601(const PTime & val);
94 
95  protected:
96  PBoolean PerformRequest(PXMLRPCBlock & request, PXMLRPCBlock & response);
97 
99  PINDEX m_faultCode;
102  PXML::Options m_options;
103 };
104 
106 
107 class PXMLRPCBlock : public PXML
108 {
109  PCLASSINFO(PXMLRPCBlock, PXML);
110  public:
111  PXMLRPCBlock();
112  PXMLRPCBlock(const PString & method);
113  PXMLRPCBlock(const PString & method, const PXMLRPCStructBase & structData);
114 
116  PXMLElement * GetParam(PINDEX idx) const;
117  PINDEX GetParamCount() const;
118 
119  // used when used as a response
120  PINDEX GetFaultCode() const { return m_faultCode; }
121  PString GetFaultText() const { return m_faultText; }
122  void SetFault(PINDEX code, const PString & text) { m_faultCode = code; m_faultText = text; }
124 
125  // helper functions for getting parameters
127  PBoolean GetParam(PINDEX idx, PString & type, PString & result);
128  PBoolean GetExpectedParam(PINDEX idx, const PString & expectedType, PString & value);
129 
130  PBoolean GetParam(PINDEX idx, PString & result);
131  PBoolean GetParam(PINDEX idx, int & result);
132  PBoolean GetParam(PINDEX idx, double & result);
133  PBoolean GetParam(PINDEX idx, PTime & result, int tz = PTime::GMT);
134  PBoolean GetParam(PINDEX idx, PStringToString & result);
135  PBoolean GetParam(PINDEX idx, PXMLRPCStructBase & result);
136  PBoolean GetParam(PINDEX idx, PStringArray & result);
137  PBoolean GetParam(PINDEX idx, PArray<PStringToString> & result);
138 
139  // functions for parsing values
140  PBoolean ParseScalar(PXMLElement * element, PString & type, PString & value);
141  PBoolean ParseStruct(PXMLElement * element, PStringToString & structDict);
142  PBoolean ParseStruct(PXMLElement * element, PXMLRPCStructBase & structData);
143  PBoolean ParseArray(PXMLElement * element, PStringArray & array);
146 
147  // functions for creating values
149  PXMLElement * CreateScalar(const PString & type, const PString & scalar);
150  PXMLElement * CreateMember(const PString & name, PXMLElement * value);
151 
152  PXMLElement * CreateScalar(const PString & str);
153  PXMLElement * CreateScalar(int value);
154  PXMLElement * CreateScalar(double value);
155  PXMLElement * CreateDateAndTime(const PTime & time);
156  PXMLElement * CreateBinary(const PBYTEArray & data);
157 
159  PXMLElement * CreateStruct(const PStringToString & dict);
160  PXMLElement * CreateStruct(const PStringToString & dict, const PString & typeStr);
161  PXMLElement * CreateStruct(const PXMLRPCStructBase & structData);
162 
163  PXMLElement * CreateArray(PXMLElement * & data);
164  PXMLElement * CreateArray(const PStringArray & array);
165  PXMLElement * CreateArray(const PStringArray & array, const PString & typeStr);
166  PXMLElement * CreateArray(const PStringArray & array, const PStringArray & types);
169 
170  // helper functions for adding parameters
171  void AddParam(PXMLElement * parm);
172  void AddParam(const PString & str);
173  void AddParam(int value);
174  void AddParam(double value);
175  void AddParam(const PTime & time);
176  void AddParam(const PXMLRPCStructBase & structData);
177  void AddBinary(const PBYTEArray & data);
178  void AddStruct(const PStringToString & dict);
179  void AddStruct(const PStringToString & dict, const PString & typeStr);
180  void AddArray(const PStringArray & array);
181  void AddArray(const PStringArray & array, const PString & typeStr);
182  void AddArray(const PStringArray & array, const PStringArray & types);
183  void AddArray(const PArray<PStringToString> & array);
184 
185  protected:
188  PINDEX m_faultCode;
189 };
190 
191 
193 
194 class PXMLRPCVariableBase : public PObject {
195  PCLASSINFO(PXMLRPCVariableBase, PObject);
196  protected:
197  PXMLRPCVariableBase(const char * name, const char * type = NULL);
198 
199  public:
200  const char * GetName() const { return m_name; }
201  const char * GetType() const { return m_type; }
202 
203  virtual void Copy(const PXMLRPCVariableBase & other) = 0;
204  virtual PString ToString(PINDEX i) const;
205  virtual void FromString(PINDEX i, const PString & str);
206  virtual PXMLRPCStructBase * GetStruct(PINDEX i) const;
207  virtual PBoolean IsArray() const;
208  virtual PINDEX GetSize() const;
209  virtual PBoolean SetSize(PINDEX);
210 
211  PString ToBase64(PAbstractArray & data) const;
212  void FromBase64(const PString & str, PAbstractArray & data);
213 
214  protected:
215  const char * m_name;
216  const char * m_type;
217 
218  private:
220 };
221 
222 
225  protected:
226  PXMLRPCArrayBase(PContainer & array, const char * name, const char * type);
228 
229  public:
230  virtual void PrintOn(ostream & strm) const;
231  virtual void Copy(const PXMLRPCVariableBase & other);
232  virtual PBoolean IsArray() const;
233  virtual PINDEX GetSize() const;
234  virtual PBoolean SetSize(PINDEX);
235 
236  protected:
238 };
239 
240 
243  protected:
244  PXMLRPCArrayObjectsBase(PArrayObjects & array, const char * name, const char * type);
246 
247  public:
248  virtual PString ToString(PINDEX i) const;
249  virtual void FromString(PINDEX i, const PString & str);
250  virtual PBoolean SetSize(PINDEX);
251 
252  virtual PObject * CreateObject() const = 0;
253 
254  protected:
256 };
257 
258 
259 class PXMLRPCStructBase : public PObject {
260  PCLASSINFO(PXMLRPCStructBase, PObject);
261  protected:
264  private:
266 
267  public:
268  void PrintOn(ostream & strm) const;
269 
270  PINDEX GetNumVariables() const { return variablesByOrder.GetSize(); }
271  PXMLRPCVariableBase & GetVariable(PINDEX idx) const { return variablesByOrder[idx]; }
272  PXMLRPCVariableBase * GetVariable(const char * name) const { return variablesByName.GetAt(name); }
273 
274  void AddVariable(PXMLRPCVariableBase * var);
276 
277  protected:
278  void EndConstructor();
279 
282 
284 };
285 
286 
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; }
292 
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) \
298  { init } \
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; } \
303  extras \
304  type & instance; \
305  } pxmlrpcvar_##variable
306 
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)
310 
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) \
317  { } \
318  extras \
319  arraytype & instance; \
320  } pxmlrpcvar_##variable
321 #ifdef DOCPLUSPLUS
322 }
323 #endif
324 
325 
326 #define PXMLRPC_STRUCT_END() \
327  };
328 
329 
330 #define PXMLRPC_VARIABLE(base, type, variable, xmltype) \
331  PXMLRPC_VARIABLE_CUSTOM(base, type, variable, xmltype, ;, ;)
332 
333 
334 #define PXMLRPC_VARIABLE_INIT(base, type, variable, xmltype, init) \
335  PXMLRPC_VARIABLE_CUSTOM(base, type, variable, xmltype, instance=init;, ;)
336 
337 
338 #define PXMLRPC_STRING(base, type, variable) \
339  PXMLRPC_VARIABLE(base, type, variable, "string")
340 
341 
342 #define PXMLRPC_STRING_INIT(base, type, variable, init) \
343  PXMLRPC_VARIABLE_INIT(base, type, variable, "string", init)
344 
345 
346 #define PXMLRPC_INTEGER(base, type, variable) \
347  PXMLRPC_VARIABLE(base, type, variable, "int")
348 
349 
350 #define PXMLRPC_INTEGER_INIT(base, type, variable, init) \
351  PXMLRPC_VARIABLE_INIT(base, type, variable, "int", init)
352 
353 
354 #define PXMLRPC_BOOLEAN(base, type, variable) \
355  PXMLRPC_VARIABLE(base, type, variable, "boolean")
356 
357 
358 #define PXMLRPC_BOOLEAN_INIT(base, type, variable, init) \
359  PXMLRPC_VARIABLE_INIT(base, type, variable, "boolean", init)
360 
361 
362 #define PXMLRPC_DOUBLE(base, type, variable) \
363  PXMLRPC_VARIABLE(base, type, variable, "double")
364 
365 
366 #define PXMLRPC_DOUBLE_INIT(base, type, variable, init) \
367  PXMLRPC_VARIABLE_INIT(base, type, variable, "double", init)
368 
369 
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); } )
373 
374 
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); } )
379 
380 
381 #define PXMLRPC_STRUCT(base, type, variable) \
382  PXMLRPC_VARIABLE_CUSTOM(base, type, variable, "struct", ;, \
383  PXMLRPCStructBase * GetStruct(PINDEX) const { return &instance; } )
384 
385 
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; })
389 
390 
391 #define PXMLRPC_ARRAY_STRING(base, arraytype, basetype, variable) \
392  PXMLRPC_ARRAY(base, arraytype, basetype, variable, "string")
393 
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(); })
398 
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(); })
403 
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; })
408 
409 
410 #define PXMLRPC_FUNC_NOARG_NOREPLY(name) \
411  PBoolean name() { return MakeRequest(#name); }
412 
413 
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);
418 
419 
420 #define PXMLRPC_FUNC_MULTI_ARGS(name) \
421  PXMLRPC_STRUCT_BEGIN(name##_in)
422 
423 
424 #ifdef DOCPLUSPLUS
425 {
426 #endif
427 #define PXMLRPC_FUNC_MULTI_REPLY(name) \
428  }; PXMLRPC_STRUCT_BEGIN(name##_out)
429 
430 
431 #ifdef DOCPLUSPLUS
432 {
433 #endif
434 #define PXMLRPC_FUNC_NO_ARGS(name) \
435  }; \
436  PBoolean name(name##_out & reply) \
437  { return MakeRequest(#name, name##_in(), reply); }
438 
439 
440 #ifdef DOCPLUSPLUS
441 {
442 #endif
443 #define PXMLRPC_FUNC_STRUCT_ARG(name) \
444  }; \
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; \
454  } variable; \
455  }; \
456  PBoolean name(const name##_in & args, name##_out & reply) \
457  { return MakeRequest(#name, name##_in_carrier(args), reply); }
458 
459 
460 #ifdef DOCPLUSPLUS
461 {
462 #endif
463 #define PXMLRPC_FUNC_NORM_ARGS(name) \
464  }; \
465  PBoolean name(const name##_in & args, name##_out & reply) \
466  { return MakeRequest(#name, args, reply); }
467 
468 
469 
471 
472 #endif // P_XMLRPC
473 
474 #endif // PTLIB_PXMLRPC_H
475 
476 
477 // End Of File ///////////////////////////////////////////////////////////////
virtual PBoolean SetSize(PINDEX)
Definition: pxmlrpc.h:55
PXMLRPCVariableBase(const char *name, const char *type=NULL)
PINDEX GetParamCount() const
static PBoolean ISO8601ToPTime(const PString &iso8601, PTime &val, int tz=PTime::GMT)
Definition: pxmlrpc.h:60
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
Definition: pxmlrpc.h:69
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
Definition: pxmlrpc.h:63
Definition: pxmlrpc.h:62
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
Definition: pxmlrpc.h:53
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
Definition: pxml.h:101
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
Definition: pxmlrpc.h:61
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)
Definition: pxmlrpc.h:64
bool PBoolean
Definition: object.h:174
PXMLElement * GetParam(PINDEX idx) const
virtual PBoolean SetSize(PINDEX)
Definition: pxmlrpc.h:67
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
Definition: pxml.h:398
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
Definition: pxmlrpc.h:48
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.
Definition: pxmlrpc.h:59
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)
Definition: pxmlrpc.h:74
This template class maps the PArrayObjects to a specific object type.
Definition: array.h:925
Definition: pxmlrpc.h:68
PXMLRPCVariableBase & GetVariable(PINDEX idx) const
Definition: pxmlrpc.h:271
Definition: pxmlrpc.h:71
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)
Definition: pxmlrpc.h:54
void AddParam(PXMLElement *parm)
PXMLRPCArrayBase & operator=(const PXMLRPCArrayBase &)
PXMLElement * CreateValueElement(PXMLElement *element)
Definition: pxmlrpc.h:65
Definition: pxmlrpc.h:241
PDictionary< PString, PXMLRPCVariableBase > variablesByName
Definition: pxmlrpc.h:281
PXMLElement * CreateStruct(PXMLElement *&data)
PString GetFaultText() const
Definition: pxmlrpc.h:89
Definition: pxmlrpc.h:72
Definition: pxmlrpc.h:70
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
Definition: pxmlrpc.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
Definition: pxmlrpc.h:66
PXMLRPCArrayBase(PContainer &array, const char *name, const char *type)