00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00043 #ifndef CCXX_XML_H_
00044 #define CCXX_XML_H_
00045
00046 #ifndef CCXX_MISSING_H_
00047 #include <cc++/missing.h>
00048 #endif
00049
00050 #ifndef CCXX_THREAD_H_
00051 #include <cc++/thread.h>
00052 #endif
00053
00054 #ifndef CCXX_SLOG_H_
00055 #include <cc++/slog.h>
00056 #endif
00057
00058 #ifdef CCXX_NAMESPACES
00059 namespace ost {
00060 #endif
00061
00072 class __EXPORT XMLStream
00073 {
00074 #ifndef HAVE_LIBXML
00075 private:
00076 int ecount, dcount;
00077 enum { TAG, CDATA, COMMENT, DTD, AMP, NONE} state;
00078 char dbuf[8192];
00079 unsigned dp;
00080 bool parseChunk(const char *chunk, size_t len);
00081 void parseInit(void);
00082 bool parseTag(void);
00083 void putData(char c);
00084 void clrData(void);
00085
00086 #endif
00087 public:
00097 virtual bool open(const char *resource);
00098
00103 virtual void close(void);
00104
00110 virtual Slog::Level getLogging(void);
00111
00119 virtual void comment(const unsigned char *text, size_t len);
00120
00128 virtual int read(unsigned char *buffer, size_t len) = 0;
00129
00137 virtual void characters(const unsigned char *text, size_t len) = 0;
00138
00142 virtual void startDocument(void);
00143
00147 virtual void endDocument(void);
00148
00155 virtual void startElement(const unsigned char *name, const unsigned char **attr) = 0;
00156
00162 virtual void endElement(const unsigned char *name) = 0;
00163
00170 bool parse(const char *resource = NULL);
00171 };
00172
00182 class __EXPORT XMLRPC : public XMLStream
00183 {
00184 private:
00185 #ifdef HAVE_SSTREAM
00186 std::stringstream strBuf;
00187 #else
00188 char *buffer;
00189 std::strstream *oldStrBuf;
00190 size_t bufSize;
00191 #endif
00192 bool structFlag;
00193 bool reply, fault;
00194 unsigned array;
00195
00196 protected:
00206 virtual bool post(const char *resource, const char *msg) = 0;
00207
00211 void begStruct(void);
00212
00213 public:
00221 XMLRPC(size_t bufferSize = 512);
00222
00226 virtual ~XMLRPC();
00227
00231 void begArray(void);
00232
00236 void endArray(void);
00237
00243 void invoke(const char *method);
00244
00250 void response(bool fault);
00251
00257 void addParam(bool value);
00258
00265 void addMember(const char *name, bool value);
00266
00272 void addParam(long value);
00273
00280 void addMember(const char *name, long value);
00281
00287 void addParam(const char *string);
00288
00295 void addMember(const char *name, const char *value);
00296
00300 void endStruct(void);
00301
00308 bool send(const char *resource);
00309 };
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319 #ifdef CCXX_NAMESPACES
00320 }
00321 #endif
00322
00323 #endif
00324