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