Go to the documentation of this file.00001
00002 #ifndef _XMLRPCVALUE_H_
00003 #define _XMLRPCVALUE_H_
00004
00005
00006
00007 #if defined(_MSC_VER)
00008 # pragma warning(disable:4786) // identifier was truncated in debug info
00009 #endif
00010
00011 #include "XmlRpcDecl.h"
00012
00013 #ifndef MAKEDEPEND
00014 # include <map>
00015 # include <string>
00016 # include <vector>
00017 # include <time.h>
00018 #endif
00019
00020 namespace XmlRpc {
00021
00023
00024 class XMLRPCPP_DECL XmlRpcValue {
00025 public:
00026
00027
00028 enum Type {
00029 TypeInvalid,
00030 TypeBoolean,
00031 TypeInt,
00032 TypeDouble,
00033 TypeString,
00034 TypeDateTime,
00035 TypeBase64,
00036 TypeArray,
00037 TypeStruct
00038 };
00039
00040
00041 typedef std::vector<char> BinaryData;
00042 typedef std::vector<XmlRpcValue> ValueArray;
00043 typedef std::map<std::string, XmlRpcValue> ValueStruct;
00044 typedef ValueStruct::iterator iterator;
00045
00046
00048 XmlRpcValue() : _type(TypeInvalid) { _value.asBinary = 0; }
00049 XmlRpcValue(bool value) : _type(TypeBoolean) { _value.asBool = value; }
00050 XmlRpcValue(int value) : _type(TypeInt) { _value.asInt = value; }
00051 XmlRpcValue(double value) : _type(TypeDouble) { _value.asDouble = value; }
00052
00053 XmlRpcValue(std::string const& value) : _type(TypeString)
00054 { _value.asString = new std::string(value); }
00055
00056 XmlRpcValue(const char* value) : _type(TypeString)
00057 { _value.asString = new std::string(value); }
00058
00059 XmlRpcValue(struct tm* value) : _type(TypeDateTime)
00060 { _value.asTime = new struct tm(*value); }
00061
00062
00063 XmlRpcValue(void* value, int nBytes) : _type(TypeBase64)
00064 {
00065 _value.asBinary = new BinaryData((char*)value, ((char*)value)+nBytes);
00066 }
00067
00069 XmlRpcValue(std::string const& xml, int* offset) : _type(TypeInvalid)
00070 { if ( ! fromXml(xml,offset)) _type = TypeInvalid; }
00071
00073 XmlRpcValue(XmlRpcValue const& rhs) : _type(TypeInvalid) { *this = rhs; }
00074
00076 ~XmlRpcValue() { invalidate(); }
00077
00079 void clear() { invalidate(); }
00080
00081
00082 XmlRpcValue& operator=(XmlRpcValue const& rhs);
00083 XmlRpcValue& operator=(int const& rhs) { return operator=(XmlRpcValue(rhs)); }
00084 XmlRpcValue& operator=(double const& rhs) { return operator=(XmlRpcValue(rhs)); }
00085 XmlRpcValue& operator=(const char* rhs) { return operator=(XmlRpcValue(std::string(rhs))); }
00086
00087 bool operator==(XmlRpcValue const& other) const;
00088 bool operator!=(XmlRpcValue const& other) const;
00089
00090 operator bool&() { assertTypeOrInvalid(TypeBoolean); return _value.asBool; }
00091 operator int&() { assertTypeOrInvalid(TypeInt); return _value.asInt; }
00092 operator double&() { assertTypeOrInvalid(TypeDouble); return _value.asDouble; }
00093 operator std::string&() { assertTypeOrInvalid(TypeString); return *_value.asString; }
00094 operator BinaryData&() { assertTypeOrInvalid(TypeBase64); return *_value.asBinary; }
00095 operator struct tm&() { assertTypeOrInvalid(TypeDateTime); return *_value.asTime; }
00096
00097 XmlRpcValue const& operator[](int i) const { assertArray(i+1); return _value.asArray->at(i); }
00098 XmlRpcValue& operator[](int i) { assertArray(i+1); return _value.asArray->at(i); }
00099
00100 XmlRpcValue& operator[](std::string const& k) { assertStruct(); return (*_value.asStruct)[k]; }
00101 XmlRpcValue& operator[](const char* k) { assertStruct(); std::string s(k); return (*_value.asStruct)[s]; }
00102
00103 iterator begin() {assertStruct(); return (*_value.asStruct).begin(); }
00104 iterator end() {assertStruct(); return (*_value.asStruct).end(); }
00105
00106
00108 bool valid() const { return _type != TypeInvalid; }
00109
00111 Type const &getType() const { return _type; }
00112
00114 int size() const;
00115
00117 void setSize(int size) { assertArray(size); }
00118
00120 bool hasMember(const std::string& name) const;
00121
00123 bool fromXml(std::string const& valueXml, int* offset);
00124
00126 std::string toXml() const;
00127
00129 std::ostream& write(std::ostream& os) const;
00130
00131
00133 static std::string const& getDoubleFormat() { return _doubleFormat; }
00134
00136 static void setDoubleFormat(const char* f) { _doubleFormat = f; }
00137
00138
00139 protected:
00140
00141 void invalidate();
00142
00143
00144 void assertTypeOrInvalid(Type t);
00145 void assertArray(int size) const;
00146 void assertArray(int size);
00147 void assertStruct();
00148
00149
00150 bool boolFromXml(std::string const& valueXml, int* offset);
00151 bool intFromXml(std::string const& valueXml, int* offset);
00152 bool doubleFromXml(std::string const& valueXml, int* offset);
00153 bool stringFromXml(std::string const& valueXml, int* offset);
00154 bool timeFromXml(std::string const& valueXml, int* offset);
00155 bool binaryFromXml(std::string const& valueXml, int* offset);
00156 bool arrayFromXml(std::string const& valueXml, int* offset);
00157 bool structFromXml(std::string const& valueXml, int* offset);
00158
00159
00160 std::string boolToXml() const;
00161 std::string intToXml() const;
00162 std::string doubleToXml() const;
00163 std::string stringToXml() const;
00164 std::string timeToXml() const;
00165 std::string binaryToXml() const;
00166 std::string arrayToXml() const;
00167 std::string structToXml() const;
00168
00169
00170 static std::string _doubleFormat;
00171
00172
00173 Type _type;
00174
00175
00176
00177 union {
00178 bool asBool;
00179 int asInt;
00180 double asDouble;
00181 struct tm* asTime;
00182 std::string* asString;
00183 BinaryData* asBinary;
00184 ValueArray* asArray;
00185 ValueStruct* asStruct;
00186 } _value;
00187
00188 };
00189 }
00190
00191
00192 std::ostream& operator<<(std::ostream& os, XmlRpc::XmlRpcValue& v);
00193
00194
00195 #endif // _XMLRPCVALUE_H_