1 /***************************************************************************
2 ulxr_expatwrap.h - c++ wrapper for expat
3 -------------------
4 begin : Thu Apr 30 2002
5 copyright : (C) 2002-2007 by Ewald Arnold
6 email : ulxmlrpcpp@ewald-arnold.de
7
8 $Id: ulxr_expatwrap.cpp 1074 2007-08-27 16:46:55Z ewald-arnold $
9
10 ***************************************************************************/
11
12 /**************************************************************************
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License as
16 * published by the Free Software Foundation; either version 2 of the License,
17 * or (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU Lesser General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 *
28 ***************************************************************************/
29
30
31 #define ULXR_NEED_EXPORTS
32 #include <ulxmlrpcpp/ulxmlrpcpp.h> // always first header
33
34 #include <ulxmlrpcpp/ulxr_expatwrap.h>
35
36
37 namespace ulxr {
38
39
ExpatWrapper(bool createParser)40 ULXR_API_IMPL0 ExpatWrapper::ExpatWrapper(bool createParser)
41 : XmlParserBase()
42 {
43 if (createParser)
44 {
45 expatParser = ::XML_ParserCreate(0);
46 setHandler();
47 }
48 }
49
50
~ExpatWrapper()51 ULXR_API_IMPL0 ExpatWrapper::~ExpatWrapper()
52 {
53 if (expatParser) // allows subclasses to avoid finishing parsing
54 ::XML_ParserFree(expatParser);
55 }
56
57
ULXR_API_IMPL(void)58 ULXR_API_IMPL(void) ExpatWrapper::setHandler()
59 {
60 ::XML_SetUserData(expatParser, this);
61 ::XML_SetElementHandler(expatParser, startElementCallback, endElementCallback);
62 ::XML_SetCharacterDataHandler(expatParser, charDataCallback);
63 }
64
65
ULXR_API_IMPL(void)66 ULXR_API_IMPL(void) ExpatWrapper::resetParser()
67 {
68 ::XML_ParserReset(expatParser, 0);
69 setHandler();
70 }
71
72
ULXR_API_IMPL(void)73 ULXR_API_IMPL(void) ExpatWrapper::startElement(const XML_Char*, const XML_Char**)
74 {
75 }
76
77
ULXR_API_IMPL(void)78 ULXR_API_IMPL(void) ExpatWrapper::endElement(const XML_Char*)
79 {
80 }
81
82
ULXR_API_IMPL(void)83 ULXR_API_IMPL(void) ExpatWrapper::charData(const XML_Char*, int )
84 {
85 }
86
87
ULXR_API_IMPL(int)88 ULXR_API_IMPL(int) ExpatWrapper::mapToFaultCode(int xpatcode) const
89 {
90 int fc = NotWellformedError;
91 // try to map error codes
92 switch (xpatcode)
93 {
94 case XML_ERROR_UNKNOWN_ENCODING:
95 fc = UnsupportedEncodingError;
96 break;
97
98 case XML_ERROR_BAD_CHAR_REF:
99 case XML_ERROR_PARTIAL_CHAR:
100 case XML_ERROR_INCORRECT_ENCODING: // fallthrough
101 fc = InvalidCharacterError;
102 break;
103
104 default:
105 fc = NotWellformedError;
106 }
107 return fc;
108 }
109
110
ULXR_API_IMPL(void)111 ULXR_API_IMPL(void)
112 ExpatWrapper::startElementCallback(void *userData,
113 const XML_Char* name,
114 const XML_Char** atts)
115 {
116 ((ExpatWrapper*)userData)->startElement(name, atts);
117 }
118
119
ULXR_API_IMPL(void)120 ULXR_API_IMPL(void)
121 ExpatWrapper::endElementCallback(void *userData, const XML_Char* name)
122 {
123 ((ExpatWrapper*)userData)->endElement(name);
124 }
125
126
ULXR_API_IMPL(void)127 ULXR_API_IMPL(void)
128 ExpatWrapper::charDataCallback(void *userData, const XML_Char* s, int len)
129 {
130 ((ExpatWrapper*)userData)->charData(s, len);
131 }
132
133
ULXR_API_IMPL(int)134 ULXR_API_IMPL(int) ExpatWrapper::parse(const char* buffer, int len, int isFinal)
135 {
136 return ::XML_Parse(expatParser, buffer, len, isFinal);
137 }
138
139
ULXR_API_IMPL(unsigned)140 ULXR_API_IMPL(unsigned) ExpatWrapper::getErrorCode() const
141 {
142 return ::XML_GetErrorCode(expatParser);
143 }
144
145
ULXR_API_IMPL(CppString)146 ULXR_API_IMPL(CppString) ExpatWrapper::getErrorString(unsigned code) const
147 {
148 #ifdef ULXR_UNICODE
149 return ULXR_GET_STRING(XML_ErrorString((XML_Error) code));
150 #else
151 return XML_ErrorString((XML_Error) code);
152 #endif
153 }
154
155
ULXR_API_IMPL(int)156 ULXR_API_IMPL(int) ExpatWrapper::getCurrentLineNumber() const
157 {
158 return ::XML_GetCurrentLineNumber(expatParser);
159 }
160
161
162 } // namespace ulxr
163