• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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