📄 pxmlrpc.h
字号:
virtual void FromString(PINDEX i, const PString & str);
virtual PXMLRPCStructBase * GetStruct(PINDEX i) const;
virtual BOOL IsArray() const;
virtual PINDEX GetSize() const;
virtual BOOL SetSize(PINDEX);
PString ToBase64(PAbstractArray & data) const;
void FromBase64(const PString & str, PAbstractArray & data);
protected:
const char * name;
const char * type;
private:
PXMLRPCVariableBase(const PXMLRPCVariableBase &) { }
};
class PXMLRPCArrayBase : public PXMLRPCVariableBase {
PCLASSINFO(PXMLRPCArrayBase, PXMLRPCVariableBase);
protected:
PXMLRPCArrayBase(PContainer & array, const char * name, const char * type);
PXMLRPCArrayBase & operator=(const PXMLRPCArrayBase &);
public:
virtual void PrintOn(ostream & strm) const;
virtual void Copy(const PXMLRPCVariableBase & other);
virtual BOOL IsArray() const;
virtual PINDEX GetSize() const;
virtual BOOL SetSize(PINDEX);
protected:
PContainer & array;
};
class PXMLRPCArrayObjectsBase : public PXMLRPCArrayBase {
PCLASSINFO(PXMLRPCArrayObjectsBase, PXMLRPCArrayBase);
protected:
PXMLRPCArrayObjectsBase(PArrayObjects & array, const char * name, const char * type);
PXMLRPCArrayObjectsBase & operator=(const PXMLRPCArrayObjectsBase &);
public:
virtual PString ToString(PINDEX i) const;
virtual void FromString(PINDEX i, const PString & str);
virtual BOOL SetSize(PINDEX);
virtual PObject * CreateObject() const = 0;
protected:
PArrayObjects & array;
};
class PXMLRPCStructBase : public PObject {
PCLASSINFO(PXMLRPCStructBase, PObject);
protected:
PXMLRPCStructBase();
PXMLRPCStructBase & operator=(const PXMLRPCStructBase &);
private:
PXMLRPCStructBase(const PXMLRPCStructBase &) { }
public:
void PrintOn(ostream & strm) const;
PINDEX GetNumVariables() const { return variablesByOrder.GetSize(); }
PXMLRPCVariableBase & GetVariable(PINDEX idx) const { return variablesByOrder[idx]; }
PXMLRPCVariableBase * GetVariable(const char * name) const { return variablesByName.GetAt(name); }
void AddVariable(PXMLRPCVariableBase * var);
static PXMLRPCStructBase & GetInitialiser() { return *PAssertNULL(initialiserInstance); }
protected:
void EndConstructor();
PList<PXMLRPCVariableBase> variablesByOrder;
PDictionary<PString, PXMLRPCVariableBase> variablesByName;
PXMLRPCStructBase * initialiserStack;
static PMutex initialiserMutex;
static PXMLRPCStructBase * initialiserInstance;
};
#define PXMLRPC_STRUCT_BEGIN(name) \
class name : public PXMLRPCStructBase { \
public: name() { EndConstructor(); } \
public: name(const name & other) { EndConstructor(); operator=(other); } \
public: name & operator=(const name & other) { PXMLRPCStructBase::operator=(other); return *this; }
#define PXMLRPC_VARIABLE_CLASS(base, type, variable, xmltype, init, extras) \
private: struct PXMLRPCVar_##variable : public PXMLRPCVariableBase { \
PXMLRPCVar_##variable() \
: PXMLRPCVariableBase(#variable, xmltype), \
instance(((base &)base::GetInitialiser()).variable) \
{ init } \
virtual void PrintOn (ostream & s) const { s << instance; } \
virtual void ReadFrom(istream & s) { s >> instance; } \
virtual void Copy(const PXMLRPCVariableBase & other) \
{ instance = ((PXMLRPCVar_##variable &)other).instance; } \
extras \
type & instance; \
} pxmlrpcvar_##variable
#define PXMLRPC_VARIABLE_CUSTOM(base, type, variable, xmltype, init, extras) \
public: type variable; \
PXMLRPC_VARIABLE_CLASS(base, type, variable, xmltype, init, extras)
#define PXMLRPC_ARRAY_CUSTOM(base, arraytype, basetype, variable, xmltype, par, extras) \
public: arraytype variable; \
private: struct PXMLRPCVar_##variable : public par { \
PXMLRPCVar_##variable() \
: par(((base &)base::GetInitialiser()).variable, #variable, xmltype), \
instance((arraytype &)array) \
{ } \
extras \
arraytype & instance; \
} pxmlrpcvar_##variable
#ifdef DOCPLUSPLUS
}
#endif
#define PXMLRPC_STRUCT_END() \
};
#define PXMLRPC_VARIABLE(base, type, variable, xmltype) \
PXMLRPC_VARIABLE_CUSTOM(base, type, variable, xmltype, ;, ;)
#define PXMLRPC_VARIABLE_INIT(base, type, variable, xmltype, init) \
PXMLRPC_VARIABLE_CUSTOM(base, type, variable, xmltype, instance=init;, ;)
#define PXMLRPC_STRING(base, type, variable) \
PXMLRPC_VARIABLE(base, type, variable, "string")
#define PXMLRPC_STRING_INIT(base, type, variable, init) \
PXMLRPC_VARIABLE_INIT(base, type, variable, "string", init)
#define PXMLRPC_INTEGER(base, type, variable) \
PXMLRPC_VARIABLE(base, type, variable, "int")
#define PXMLRPC_INTEGER_INIT(base, type, variable, init) \
PXMLRPC_VARIABLE_INIT(base, type, variable, "int", init)
#define PXMLRPC_BOOLEAN(base, type, variable) \
PXMLRPC_VARIABLE(base, type, variable, "boolean")
#define PXMLRPC_BOOLEAN_INIT(base, type, variable, init) \
PXMLRPC_VARIABLE_INIT(base, type, variable, "boolean", init)
#define PXMLRPC_DOUBLE(base, type, variable) \
PXMLRPC_VARIABLE(base, type, variable, "double")
#define PXMLRPC_DOUBLE_INIT(base, type, variable, init) \
PXMLRPC_VARIABLE_INIT(base, type, variable, "double", init)
#define PXMLRPC_DATETIME(base, type, variable) \
PXMLRPC_VARIABLE_CUSTOM(base, type, variable, "dateTime.iso8601", ;, \
PString ToString(PINDEX) const { return instance.AsString(PTime::ShortISO8601); } )
#define PXMLRPC_BINARY(base, type, variable) \
PXMLRPC_VARIABLE_CUSTOM(base, type, variable, "base64", ;, \
PString ToString(PINDEX) const { return ToBase64(instance); } \
void FromString(PINDEX, const PString & str) { FromBase64(str, instance); } )
#define PXMLRPC_STRUCT(base, type, variable) \
PXMLRPC_VARIABLE_CUSTOM(base, type, variable, "struct", ;, \
PXMLRPCStructBase * GetStruct(PINDEX) const { return &instance; } )
#define PXMLRPC_ARRAY(base, arraytype, basetype, variable, xmltype) \
PXMLRPC_ARRAY_CUSTOM(base, arraytype, basetype, variable, xmltype, PXMLRPCArrayObjectsBase, \
PObject * CreateObject() const { return new basetype; })
#define PXMLRPC_ARRAY_STRING(base, arraytype, basetype, variable) \
PXMLRPC_ARRAY(base, arraytype, basetype, variable, "string")
#define PXMLRPC_ARRAY_INTEGER(base, type, variable) \
PXMLRPC_ARRAY_CUSTOM(base, PScalarArray<type>, type, variable, "int", PXMLRPCArrayBase, \
PString ToString(PINDEX i) const { return PString(instance[i]); } \
void FromString(PINDEX i, const PString & str) { instance[i] = (type)str.AsInteger(); })
#define PXMLRPC_ARRAY_DOUBLE(base, type, variable) \
PXMLRPC_ARRAY_CUSTOM(base, PScalarArray<type>, type, variable, "double", PXMLRPCArrayBase, \
PString ToString(PINDEX i) const { return psprintf("%f", instance[i]); } \
void FromString(PINDEX i, const PString & str) { instance[i] = (type)str.AsReal(); })
#define PXMLRPC_ARRAY_STRUCT(base, type, variable) \
PXMLRPC_ARRAY_CUSTOM(base, PArray<type>, type, variable, "struct", PXMLRPCArrayObjectsBase, \
PXMLRPCStructBase * GetStruct(PINDEX i) const { return &instance[i]; } \
PObject * CreateObject() const { return new type; })
#define PXMLRPC_FUNC_NOARG_NOREPLY(name) \
BOOL name() { return MakeRequest(#name); }
#define PXMLRPC_FUNC_SINGLE_ARG(name, vartype, argtype) \
class name##_in : public PXMLRPCStructBase { \
public: name##_in(const argtype & var) : variable(var) { EndConstructor(); } \
vartype(name##_in, argtype, variable);
#define PXMLRPC_FUNC_MULTI_ARGS(name) \
PXMLRPC_STRUCT_BEGIN(name##_in)
#ifdef DOCPLUSPLUS
{
#endif
#define PXMLRPC_FUNC_MULTI_REPLY(name) \
}; PXMLRPC_STRUCT_BEGIN(name##_out)
#ifdef DOCPLUSPLUS
{
#endif
#define PXMLRPC_FUNC_NO_ARGS(name) \
}; \
BOOL name(name##_out & reply) \
{ return MakeRequest(#name, name##_in(), reply); }
#ifdef DOCPLUSPLUS
{
#endif
#define PXMLRPC_FUNC_STRUCT_ARG(name) \
}; \
class name##_in_carrier : public PXMLRPCStructBase { \
public: name##_in_carrier(const name##_in & var) : variable(var) { EndConstructor(); } \
private: struct var_class : public PXMLRPCVariableBase { \
var_class(const name##_in & var) \
: PXMLRPCVariableBase("variable", "struct"), instance(var) { } \
virtual void PrintOn (ostream & s) const { s << instance; } \
virtual PXMLRPCStructBase * GetStruct(PINDEX) const { return (PXMLRPCStructBase *)&instance; } \
virtual void Copy(const PXMLRPCVariableBase &) { } \
const name##_in & instance; \
} variable; \
}; \
BOOL name(const name##_in & args, name##_out & reply) \
{ return MakeRequest(#name, name##_in_carrier(args), reply); }
#ifdef DOCPLUSPLUS
{
#endif
#define PXMLRPC_FUNC_NORM_ARGS(name) \
}; \
BOOL name(const name##_in & args, name##_out & reply) \
{ return MakeRequest(#name, args, reply); }
/////////////////////////////////////////////////////////////////
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -