File: xml_tag.h

package info (click to toggle)
scummvm 2.9.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 450,580 kB
  • sloc: cpp: 4,299,825; asm: 28,322; python: 12,901; sh: 11,302; java: 9,289; xml: 7,895; perl: 2,639; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (200 lines) | stat: -rw-r--r-- 6,085 bytes parent folder | download | duplicates (2)
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
190
191
192
193
194
195
196
197
198
199
200
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef QDENGINE_PARSER_XML_TAG_H
#define QDENGINE_PARSER_XML_TAG_H

#include "qdengine/qdengine.h"

namespace QDEngine {

//! Парсер XML на базе expat.
namespace xml {

//! XML тег.
class tag {
public:
	typedef Std::list<tag> subtags_t;
	typedef subtags_t::const_iterator subtag_iterator;

	//! Формат данных тега.
	enum tag_data_format {
		//! данные отсутствуют
		TAG_DATA_VOID,
		//! данные типа int16 int
		TAG_DATA_SHORT,
		//! данные типа uint16 int
		TAG_DATA_UNSIGNED_SHORT,
		//! данные типа int
		TAG_DATA_INT,
		//! данные типа uint32
		TAG_DATA_UNSIGNED_INT,
		//! данные типа float
		TAG_DATA_FLOAT,
		//! строковые данные
		TAG_DATA_STRING
	};

	tag(int id = 0, tag_data_format data_fmt = TAG_DATA_VOID, int data_sz = 0, int data_offs = 0) : _ID(id), _data_format(data_fmt), _data_size(data_sz), _data_offset(data_offs), _data(NULL) { }
	tag(const tag &tg) : _ID(tg._ID), _data_format(tg._data_format), _data_size(tg._data_size), _data_offset(tg._data_offset), _data(tg._data), _subtags(tg._subtags) { }
	~tag() { }
	bool readTag(Common::SeekableReadStream *ff, tag &tg);

	tag &operator = (const tag &tg) {
		if (this == &tg) return *this;

		_ID = tg._ID;
		_data_format = tg._data_format;
		_data_size = tg._data_size;
		_data_offset = tg._data_offset;

		_subtags = tg._subtags;

		return *this;
	}

	//! Возвращает идентификатор тега.
	int ID() const {
		return g_engine->_tagMap[_ID - 1];
	}

	int origID() const {
		return _ID;
	}

	//! Возвращает формат данных тега.
	tag_data_format data_format() const {
		return _data_format;
	}

	//! Возвращает количество элеметов данных тега.
	/**
	Чтобы получить размер данных в байтах, надо это число
	умножить на размер элемента данных в байтах - data_elemet_size().
	*/
	int data_size() const {
		return _data_size;
	}
	//! Возвращает размер элемента данных тега в байтах.
	int data_element_size() const {
		switch (_data_format) {
		case TAG_DATA_VOID:
			return 0;
		case TAG_DATA_SHORT:
		case TAG_DATA_UNSIGNED_SHORT:
			return sizeof(uint16);
		case TAG_DATA_INT:
			return sizeof(int32);
		case TAG_DATA_UNSIGNED_INT:
			return sizeof(uint32);
		case TAG_DATA_FLOAT:
			return sizeof(float);
		case TAG_DATA_STRING:
			return sizeof(byte);
		}
		return 0;
	}

	//! Устанавливает количество элементов данных тега.
	void set_data_size(int sz) {
		_data_size = sz;
	}

	//! Возвращает смещение до данных тега в данных парсера.
	int data_offset() const {
		return _data_offset;
	}
	//! Устанавливает смещение до данных тега в данных парсера.
	void set_data_offset(int off) {
		_data_offset = off;
	}

	//! Возвращает указатель на данные тега.
	const char *data() const {
		return &*(_data->begin() + _data_offset);
	}

	//! Устанавливает указатель на общие данные.
	void set_data(const Std::vector<char> *p) {
		_data = p;

		for (subtags_t::iterator it = _subtags.begin(); it != _subtags.end(); ++it)
			it->set_data(p);
	}

	//! Очистка вложенных тегов.
	void clear() {
		_subtags.clear();
	}
	//! Добавляет вложенный тег.
	/**
	Возвращает ссылку на последний вложенный тег.
	*/
	tag &add_subtag(const tag &tg) {
		_subtags.push_back(tg);
		return _subtags.back();
	}
	//! Возвращает true, если список вложенных тегов не пустой .
	bool has_subtags() const {
		return !_subtags.empty();
	}
	//! Возвращает количество вложенных тэгов.
	int num_subtags() const {
		return _subtags.size();
	}
	//! Возвращает итератор начала списка вложенных тегов.
	subtag_iterator subtags_begin() const {
		return _subtags.begin();
	}
	//! Возвращает итератор конца списка вложенных тегов.
	subtag_iterator subtags_end() const {
		return _subtags.end();
	}
	//! Поиск вложенного тега по его идентификатору.
	const tag *search_subtag(int subtag_id) const {
		for (subtag_iterator it = subtags_begin(); it != subtags_end(); ++it)
			if (it->ID() == subtag_id) return &*it;

		return NULL;
	}

private:

	//! Идентификатор (тип) тега.
	int _ID;
	//! Формат данных тега.
	tag_data_format _data_format;
	//! Количество элементов данных тега.
	int _data_size;
	//! Смещение до данных тега в общих данных.
	int _data_offset;
	//! Указатель на данные.
	const Std::vector<char> *_data;

	//! Список вложенных тегов.
	subtags_t _subtags;
};

} /* namespace xml */

} // namespace QDEngine

#endif // QDENGINE_PARSER_XML_TAG_H