Go to the documentation of this file.
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