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 private:
00075 int ecount, dcount;
00076 enum { TAG, CDATA, COMMENT, DTD, AMP, NONE} state;
00077 char dbuf[8192];
00078 unsigned dp;
00079 bool parseChunk(const char *chunk, size_t len);
00080 void parseInit(void);
00081 bool parseTag(void);
00082 void putData(char c);
00083 void clrData(void);
00084
00085 protected:
00086 virtual ~XMLStream();
00087
00088 public:
00098 virtual bool open(const char *resource);
00099
00104 virtual void close(void);
00105
00111 virtual Slog::Level getLogging(void);
00112
00120 virtual void comment(const unsigned char *text, size_t len);
00121
00129 virtual int read(unsigned char *buffer, size_t len) = 0;
00130
00138 virtual void characters(const unsigned char *text, size_t len) = 0;
00139
00143 virtual void startDocument(void);
00144
00148 virtual void endDocument(void);
00149
00156 virtual void startElement(const unsigned char *name, const unsigned char **attr) = 0;
00157
00163 virtual void endElement(const unsigned char *name) = 0;
00164
00171 bool parse(const char *resource = NULL);
00172 };
00173
00183 class __EXPORT XMLRPC : public XMLStream
00184 {
00185 private:
00186 #ifdef HAVE_SSTREAM
00187 std::stringstream strBuf;
00188 #else
00189 char *buffer;
00190 std::strstream *oldStrBuf;
00191 size_t bufSize;
00192 #endif
00193 bool structFlag;
00194 bool reply, fault;
00195 unsigned array;
00196
00197 protected:
00207 virtual bool post(const char *resource, const char *msg) = 0;
00208
00212 void begStruct(void);
00213
00214 public:
00222 XMLRPC(size_t bufferSize = 512);
00223
00227 virtual ~XMLRPC();
00228
00232 void begArray(void);
00233
00237 void endArray(void);
00238
00244 void invoke(const char *method);
00245
00251 void response(bool fault);
00252
00258 void addParam(bool value);
00259
00266 void addMember(const char *name, bool value);
00267
00273 void addParam(long value);
00274
00281 void addMember(const char *name, long value);
00282
00288 void addParam(const char *string);
00289
00296 void addMember(const char *name, const char *value);
00297
00301 void endStruct(void);
00302
00309 bool send(const char *resource);
00310 };
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320 #ifdef CCXX_NAMESPACES
00321 }
00322 #endif
00323
00324 #endif
00325