1 /*
2 * Copyright (C) 2007 Esmertec AG.
3 * Copyright (C) 2007 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 #include "expat_parser.h"
19
ExpatParser()20 ExpatParser::ExpatParser() :
21 mHandler(NULL)
22 {
23 mExpat = XML_ParserCreate(NULL);
24 if (mExpat) {
25 XML_SetUserData(mExpat, this);
26 XML_SetDoctypeDeclHandler(mExpat, startDoctypeWrapper, endDoctypeWrapper);
27 XML_SetElementHandler(mExpat, startElementWrapper, endElementWrapper);
28 XML_SetCharacterDataHandler(mExpat, charactersWrapper);
29 }
30 }
31
~ExpatParser()32 ExpatParser::~ExpatParser()
33 {
34 if (mExpat) {
35 XML_ParserFree(mExpat);
36 }
37 }
38
startElementWrapper(void * userData,const char * name,const char ** atts)39 void ExpatParser::startElementWrapper(void *userData, const char *name, const char **atts)
40 {
41 ExpatParser * self = (ExpatParser *)userData;
42 if (self->mHandler) {
43 self->mHandler->startElement(name, atts);
44 }
45 }
46
endElementWrapper(void * userData,const char * name)47 void ExpatParser::endElementWrapper(void *userData, const char *name)
48 {
49 ExpatParser * self = (ExpatParser *)userData;
50 if (self->mHandler) {
51 self->mHandler->endElement(name);
52 }
53 }
54
charactersWrapper(void * userData,const char * data,int len)55 void ExpatParser::charactersWrapper(void *userData, const char *data, int len)
56 {
57 ExpatParser * self = (ExpatParser *)userData;
58 if (self->mHandler) {
59 self->mHandler->characters(data, len);
60 }
61 }
62
startDoctypeWrapper(void * userData,const char * doctypeName,const char * sysid,const char * pubid,int has_internal_subset)63 void ExpatParser::startDoctypeWrapper(void *userData,
64 const char *doctypeName,
65 const char *sysid,
66 const char *pubid,
67 int has_internal_subset)
68 {
69 ExpatParser * self = (ExpatParser *)userData;
70 if (self->mHandler) {
71 self->mHandler->startDoctype(doctypeName, sysid, pubid, has_internal_subset);
72 }
73 }
74
endDoctypeWrapper(void * userData)75 void ExpatParser::endDoctypeWrapper(void *userData)
76 {
77 ExpatParser * self = (ExpatParser *)userData;
78 if (self->mHandler) {
79 self->mHandler->endDoctype();
80 }
81 }
82
parse(const char * data,int len,bool end)83 int ExpatParser::parse(const char * data, int len, bool end)
84 {
85 return XML_Parse(mExpat, data, len, end);
86 }
87
88