00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef NL_I_XML_H
00027 #define NL_I_XML_H
00028
00029
00030 #undef NL_DONT_USE_EXTERNAL_CODE
00031
00032 #ifndef NL_DONT_USE_EXTERNAL_CODE
00033
00034 #include "nel/misc/types_nl.h"
00035 #include "nel/misc/stream.h"
00036
00037
00038 #include <libxml/parser.h>
00039
00040 namespace NLMISC {
00041
00042
00043 struct EXmlParsingError : public EStream
00044 {
00045 EXmlParsingError ( const std::string& str ) : EStream( str ) {};
00046 };
00047
00086 class CIXml : public IStream
00087 {
00088 friend void xmlGenericErrorFuncForNeL (void *ctx, const char *msg, ...);
00089 public:
00090
00093 CIXml ();
00094
00097 virtual ~CIXml ();
00098
00106 bool init (IStream &stream);
00107
00110 void release ();
00111
00114 xmlNodePtr getRootNode () const;
00115
00118 static xmlNodePtr getFirstChildNode (xmlNodePtr parent, const char *childName);
00119
00122 static xmlNodePtr getNextChildNode (xmlNodePtr last, const char *childName);
00123
00126 static xmlNodePtr getFirstChildNode (xmlNodePtr parent, xmlElementType type);
00127
00130 static xmlNodePtr getNextChildNode (xmlNodePtr last, xmlElementType type);
00131
00134 static uint countChildren (xmlNodePtr node, const char *childName);
00135
00138 static uint countChildren (xmlNodePtr node, xmlElementType type);
00139
00140 private:
00141
00143 virtual void serial(uint8 &b);
00144 virtual void serial(sint8 &b);
00145 virtual void serial(uint16 &b);
00146 virtual void serial(sint16 &b);
00147 virtual void serial(uint32 &b);
00148 virtual void serial(sint32 &b);
00149 virtual void serial(uint64 &b);
00150 virtual void serial(sint64 &b);
00151 virtual void serial(float &b);
00152 virtual void serial(double &b);
00153 virtual void serial(bool &b);
00154 #ifndef NL_OS_CYGWIN
00155 virtual void serial(char &b);
00156 #endif
00157 virtual void serial(std::string &b);
00158 virtual void serial(ucstring &b);
00159 virtual void serialBuffer(uint8 *buf, uint len);
00160 virtual void serialBit(bool &bit);
00161
00162 virtual bool xmlPushBeginInternal (const char *nodeName);
00163 virtual bool xmlPushEndInternal ();
00164 virtual bool xmlPopInternal ();
00165 virtual bool xmlSetAttribInternal (const char *attribName);
00166 virtual bool xmlBreakLineInternal ();
00167 virtual bool xmlCommentInternal (const char *comment);
00168
00169
00170 void serialSeparatedBufferIn ( std::string &value, bool checkSeparator = true );
00171 inline void flushContentString ();
00172
00173
00174 bool _PushBegin;
00175
00176
00177 bool _AttribPresent;
00178
00179
00180 std::string _AttribName;
00181
00182
00183 xmlNodePtr _CurrentNode;
00184
00185
00186 xmlNodePtr _CurrentElement;
00187
00188
00189 xmlParserCtxtPtr _Parser;
00190
00191
00192 std::string _ContentString;
00193
00194
00195 uint _ContentStringIndex;
00196
00197
00198 std::string _ErrorString;
00199 };
00200
00201
00202 }
00203
00204 #endif // NL_DONT_USE_EXTERNAL_CODE
00205
00206 #endif // NL_I_XML_H
00207
00208