summaryrefslogtreecommitdiff
path: root/indra/llxml/llxmlparser.h
blob: c5025ef450da0a49a2f9c541f1fdb622d9e6e4f5 (plain)
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
/** 
 * @file llxmlparser.h
 * @brief LLXmlParser class definition
 *
 * $LicenseInfo:firstyear=2002&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2010, Linden Research, Inc.
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License only.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 * 
 * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 * $/LicenseInfo$
 */

#ifndef LL_LLXMLPARSER_H
#define LL_LLXMLPARSER_H

#ifndef XML_STATIC
#define XML_STATIC
#endif
#ifdef LL_USESYSTEMLIBS
#include <expat.h>
#else
#include "expat/expat.h"
#endif

class LLXmlParser
{
public:
	LLXmlParser();
	virtual ~LLXmlParser();

	// Parses entire file
	bool parseFile(const std::string &path);

	//	Parses some input. Returns 0 if a fatal error is detected.
	//	The last call must have isFinal true;
	//	len may be zero for this call (or any other).
	S32 parse( const char* buf, int len, int isFinal );

	const char* getErrorString();
	
	S32 getCurrentLineNumber();

	S32 getCurrentColumnNumber();

	S32 getDepth() { return mDepth; }

protected:
	// atts is array of name/value pairs, terminated by 0;
	// names and values are 0 terminated.
	virtual void startElement(const char *name, const char **atts) {}

	virtual void endElement(const char *name) {}

	// s is not 0 terminated.
	virtual void characterData(const char *s, int len) {}
	
	// target and data are 0 terminated
	virtual void processingInstruction(const char *target, const char *data) {}

	// data is 0 terminated 
	virtual void comment(const char *data) {}

	virtual void startCdataSection() {}

	virtual void endCdataSection() {}

	//	This is called for any characters in the XML document for
	//	which there is no applicable handler.  This includes both
	//	characters that are part of markup which is of a kind that is
	//	not reported (comments, markup declarations), or characters
	//	that are part of a construct which could be reported but
	//	for which no handler has been supplied. The characters are passed
	//	exactly as they were in the XML document except that
	//	they will be encoded in UTF-8.  Line boundaries are not normalized.
	//	Note that a byte order mark character is not passed to the default handler.
	//	There are no guarantees about how characters are divided between calls
	//	to the default handler: for example, a comment might be split between
	//	multiple calls.
	virtual void defaultData(const char *s, int len) {}

	//	This is called for a declaration of an unparsed (NDATA)
	//	entity.  The base argument is whatever was set by XML_SetBase.
	//	The entityName, systemId and notationName arguments will never be null.
	//	The other arguments may be.
	virtual void unparsedEntityDecl(
		const char *entityName,
		const char *base,
		const char *systemId,
		const char *publicId,
		const char *notationName) {}

public:
	///////////////////////////////////////////////////////////////////////////////
	// Pseudo-private methods.  These are only used by internal callbacks.
	
	static void startElementHandler(void *userData, const XML_Char *name, const XML_Char **atts);
	static void endElementHandler(void *userData, const XML_Char *name);
	static void characterDataHandler(void *userData, const XML_Char *s, int len);
	static void processingInstructionHandler(void *userData, const XML_Char *target, const XML_Char *data);
	static void commentHandler(void *userData, const XML_Char *data);
	static void startCdataSectionHandler(void *userData);
	static void endCdataSectionHandler(void *userData);
	static void defaultDataHandler( void *userData, const XML_Char *s, int len);
	static void unparsedEntityDeclHandler(
		void *userData,
		const XML_Char *entityName,
		const XML_Char *base,
		const XML_Char *systemId,
		const XML_Char *publicId,
		const XML_Char *notationName);


protected:
	XML_Parser		mParser;
	int				mDepth;
	std::string		mAuxErrorString;
};

#endif  // LL_LLXMLPARSER_H