annotate C++/XmlParser.cpp @ 297:836903141476

Socket: provide experimental SSL support
author David Demelier <markand@malikania.fr>
date Sat, 15 Nov 2014 12:41:52 +0100
parents 617459270743
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
200
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * XmlParser.h -- C++ wrapper around libexpat
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013 David Demelier <markand@malikania.fr>
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <fstream>
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include "XmlParser.h"
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 namespace {
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 void xmlStartElementHandler(XmlParser *p, const XML_Char *name, const XML_Char **attrs)
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 {
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 XmlParser::Attrs attributes;
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 for (const XML_Char **p = attrs; *p != NULL; p += 2)
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 attributes[p[0]] = p[1];
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 p->startElementHandler(name, attributes);
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 }
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 void xmlEndElementHandler(XmlParser *p, const XML_Char *name)
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 {
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 p->endElementHandler(name);
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 }
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 void xmlCharacterDataHandler(XmlParser *p, const XML_Char *data, int length)
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 {
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 std::string str;
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
43
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 str.reserve(length);
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 str.insert(0, data, length);
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 p->characterDataHandler(str);
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 }
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 }
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 XmlParser::XmlParser(const std::string &path)
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 : m_path(path)
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 {
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 auto p = XML_ParserCreate(nullptr);
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 XML_SetUserData(p, this);
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 XML_SetElementHandler(p,
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 reinterpret_cast<XML_StartElementHandler>(xmlStartElementHandler),
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 reinterpret_cast<XML_EndElementHandler>(xmlEndElementHandler));
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 XML_SetCharacterDataHandler(p,
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 reinterpret_cast<XML_CharacterDataHandler>(xmlCharacterDataHandler));
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 m_handle = Ptr(new XML_Parser(p));
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 }
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 void XmlParser::open()
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 {
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 std::string line;
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 std::ifstream ifile(m_path);
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 int done = 0;
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
72
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 if (ifile.is_open() && !done) {
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 while (std::getline(ifile, line)) {
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 done = ifile.eof();
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 XML_Parse(*m_handle.get(), line.c_str(), line.length(), done);
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 }
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 }
617459270743 Add XML parser
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 }