forked from libxmljs/libxmljs
/
xml_sax_parser.h
189 lines (142 loc) · 3.9 KB
/
xml_sax_parser.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
// Copyright 2009, Squish Tech, LLC.
#ifndef SRC_XML_SAX_PARSER_H_
#define SRC_XML_SAX_PARSER_H_
#include "libxmljs.h"
#include "xml_parser.h"
namespace libxmljs {
#define LXJS_GET_PARSER_FROM_CONTEXT(context) \
({ \
_xmlParserCtxt* the_context = static_cast<_xmlParserCtxt*>(context); \
static_cast<XmlSaxParser*>(the_context->_private); \
})
class XmlSaxParser : public XmlParser {
public:
XmlSaxParser();
virtual ~XmlSaxParser();
static void
Initialize(v8::Handle<v8::Object> target);
static v8::Handle<v8::Value>
NewParser(const v8::Arguments& args);
static v8::Handle<v8::Value>
NewPushParser(const v8::Arguments& args);
static v8::Handle<v8::Value>
ParseString(const v8::Arguments& args);
static v8::Handle<v8::Value>
ParseFile(const v8::Arguments& args);
static v8::Handle<v8::Value>
Push(const v8::Arguments& args);
void
SetCallbacks(const v8::Handle<v8::Object> context,
const v8::Handle<v8::Function> callbacks);
void
Callback(const char* what);
void
Callback(const char* what,
int argc,
v8::Handle<v8::Value> argv[]);
void
parse_string(const char* str,
unsigned int size);
void
parse_file(const char* filename);
void
initialize_push_parser();
void
push(const char* str,
unsigned int size,
bool terminate);
void
start_document();
void
end_document();
void
start_element(const xmlChar* name,
const xmlChar** p);
void
end_element(const xmlChar* name);
void
start_element_ns(const xmlChar* localname,
const xmlChar* prefix,
const xmlChar* uri,
int nb_namespaces,
const xmlChar** namespaces,
int nb_attributes,
int nb_defaulted,
const xmlChar** attributes);
void
end_element_ns(const xmlChar* localname,
const xmlChar* prefix,
const xmlChar* uri);
void
characters(const xmlChar* ch,
int len);
void
comment(const xmlChar* value);
void
cdata_block(const xmlChar* value,
int len);
void
warning(const char* message);
void
error(const char* message);
// TODO(sprsquish)
// void
// structured_error(
// xmlErrorPtr xerror);
protected:
void initializeContext();
void releaseContext();
xmlParserCtxt* context_;
v8::Persistent<v8::Object> callbacks_;
xmlSAXHandler* sax_handler_;
private:
friend struct SaxParserCallback;
void parse();
};
struct SaxParserCallback {
static void
start_document(void* context);
static void
end_document(void* context);
static void
start_element_ns(void* context,
const xmlChar* localname,
const xmlChar* prefix,
const xmlChar* uri,
int nb_namespaces,
const xmlChar** namespaces,
int nb_attributes,
int nb_defaulted,
const xmlChar** attributes);
static void
end_element_ns(void* context,
const xmlChar* localname,
const xmlChar* prefix,
const xmlChar* uri);
static void
characters(void* context,
const xmlChar* ch,
int len);
static void
comment(void* context,
const xmlChar* value);
static void
cdata_block(void* context,
const xmlChar* value,
int len);
static void
warning(void* context,
const char* fmt,
...);
static void
error(void* context,
const char* fmt,
...);
// TODO(sprsquish)
// static void
// structured_error(
// void *ctx,
// xmlErrorPtr xerror);
};
} // namespace libxmljs
#endif // SRC_XML_SAX_PARSER_H_