12#include "lcf/reader_lcf.h"
13#include "lcf/reader_xml.h"
14#include "lcf/dbstring.h"
20static void StartElementHandler(
void* closure,
const XML_Char* name,
const XML_Char** atts) {
24static void EndElementHandler(
void* closure,
const XML_Char* name) {
28static void CharacterDataHandler(
void* closure,
const XML_Char* s,
int len) {
36XmlReader::XmlReader(std::istream& filestream) :
41 parser = XML_ParserCreate(
"UTF-8");
43 XML_SetUserData(parser, (
void*)
this);
44 XML_SetElementHandler(parser, StartElementHandler, EndElementHandler);
45 XML_SetCharacterDataHandler(parser, CharacterDataHandler);
47 handlers.push_back(NULL);
51XmlReader::~XmlReader() {
54 XML_ParserFree(parser);
57 if (!handlers.empty()) {
58 delete(handlers.back());
63bool XmlReader::IsOk()
const {
64 return (stream.good() && parser != NULL);
67void XmlReader::Parse() {
69 static const int bufsize = 4096;
70 while (IsOk() && !stream.eof()) {
71 void* buffer = XML_GetBuffer(parser, bufsize);
72 int len = stream.read(
reinterpret_cast<char*
>(buffer),bufsize).gcount();
73 int result = XML_ParseBuffer(parser, len, len <= 0);
75 Log::Error(
"XML: %s", XML_ErrorString(XML_GetErrorCode(parser)));
80void XmlReader::SetHandler(XmlHandler* handler) {
81 handlers.back() = handler;
84void XmlReader::StartElement(
const char* name,
const char** atts) {
85 XmlHandler* handler = handlers.back();
86 handlers.push_back(handler);
87 handlers.back()->StartElement(*
this, name, atts);
91void XmlReader::CharacterData(
const char* s,
int len) {
92 buffer.append(s, len);
95void XmlReader::EndElement(
const char* name) {
96 XmlHandler* handler = handlers.back();
97 handler->CharacterData(*
this, buffer);
99 if (handler != handlers.back())
101 handlers.back()->EndElement(*
this, name);
107void XmlReader::Read<bool>(
bool& val,
const std::string& data) {
108 std::istringstream s(data);
115void XmlReader::Read<int32_t>(int32_t& val,
const std::string& data) {
116 std::istringstream s(data);
121void XmlReader::Read<int8_t>(int8_t& val,
const std::string& data) {
122 std::istringstream s(data);
129void XmlReader::Read<uint8_t>(uint8_t& val,
const std::string& data) {
130 std::istringstream s(data);
137void XmlReader::Read<int16_t>(int16_t& val,
const std::string& data) {
138 std::istringstream s(data);
143void XmlReader::Read<uint32_t>(uint32_t& val,
const std::string& data) {
144 std::istringstream s(data);
149void XmlReader::Read<double>(
double& val,
const std::string& data) {
150 std::istringstream s(data);
155void XmlReader::Read<std::string>(std::string&
val,
const std::string&
data) {
156 static const std::string
prefix(
"\xee\x80");
169 for (
size_t pos = 0; ; ) {
173 if (
next == std::string::npos)
182void XmlReader::Read<DBString>(DBString& val,
const std::string& data) {
185 val = DBString(sval);
189void XmlReader::Read<DBBitArray>(DBBitArray& val,
const std::string& data) {
191 std::vector<bool> tmp;
192 ReadVector(tmp, data);
193 val = DBBitArray(tmp.begin(), tmp.end());
197void XmlReader::ReadVector(std::vector<T>& val,
const std::string& data) {
199 std::istringstream s(data);
205 XmlReader::Read<T>(x, str);
214void XmlReader::ReadVector(DBArray<T>& val,
const std::string& data) {
217 ReadVector(tmp, data);
218 val = DBArray<T>(tmp.begin(), tmp.end());
222void XmlReader::Read<std::vector<int32_t>>(std::vector<int32_t>&
val,
const std::string&
data) {
227void XmlReader::Read<std::vector<bool>>(std::vector<bool>&
val,
const std::string&
data) {
232void XmlReader::Read<std::vector<uint8_t>>(std::vector<uint8_t>&
val,
const std::string&
data) {
237void XmlReader::Read<std::vector<int16_t>>(std::vector<int16_t>&
val,
const std::string&
data) {
242void XmlReader::Read<std::vector<uint32_t>>(std::vector<uint32_t>&
val,
const std::string&
data) {
247void XmlReader::Read<std::vector<double>>(std::vector<double>&
val,
const std::string&
data) {
252void XmlReader::Read<DBArray<int32_t>>(DBArray<int32_t>& val,
const std::string& data) {
253 ReadVector<int32_t>(val, data);
257void XmlReader::Read<DBArray<bool>>(DBArray<bool>& val,
const std::string& data) {
258 ReadVector<bool>(val, data);
262void XmlReader::Read<DBArray<uint8_t>>(DBArray<uint8_t>& val,
const std::string& data) {
263 ReadVector<uint8_t>(val, data);
267void XmlReader::Read<DBArray<int16_t>>(DBArray<int16_t>& val,
const std::string& data) {
268 ReadVector<int16_t>(val, data);
272void XmlReader::Read<DBArray<uint32_t>>(DBArray<uint32_t>& val,
const std::string& data) {
273 ReadVector<uint32_t>(val, data);
277void XmlReader::Read<DBArray<double>>(DBArray<double>& val,
const std::string& data) {
278 ReadVector<double>(val, data);