EvEmu  0.8.4
11 September 2021
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
DumpGenerator.cpp
Go to the documentation of this file.
1 /*
2  ------------------------------------------------------------------------------------
3  LICENSE:
4  ------------------------------------------------------------------------------------
5  This file is part of EVEmu: EVE Online Server Emulator
6  Copyright 2006 - 2021 The EVEmu Team
7  For the latest information visit https://evemu.dev
8  ------------------------------------------------------------------------------------
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU Lesser General Public License as published by the Free Software
11  Foundation; either version 2 of the License, or (at your option) any later
12  version.
13 
14  This program is distributed in the hope that it will be useful, but WITHOUT
15  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
17 
18  You should have received a copy of the GNU Lesser General Public License along with
19  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
20  Place - Suite 330, Boston, MA 02111-1307, USA, or go to
21  http://www.gnu.org/copyleft/lesser.txt.
22  ------------------------------------------------------------------------------------
23  Author: Zhur
24  Rewrite: Allan
25 */
26 
27 /* updated to (mostly)C++0x11 -allan 19 March 2016 */
28 
29 
30 #include "eve-xmlpktgen.h"
31 
32 #include "DumpGenerator.h"
33 
35 : Generator( outputFile )
36 {
38 }
39 
41 {
43 
45 }
46 
47 bool ClassDumpGenerator::ProcessElementDef( const TiXmlElement* field )
48 {
49  const char* name = field->Attribute( "name" );
50  if (name == nullptr) {
51  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
52  return false;
53  }
54 
55  fprintf( mOutputFile,
56  "void %s::Dump( LogType l_type, const char* pfx ) const\n"
57  "{\n"
58  " _log( l_type, \"%%s%s\", pfx );\n"
59  "\n",
60  name, name
61  );
62 
63  if( !ParseElementChildren( field ) )
64  return false;
65 
66  fprintf( mOutputFile,
67  "}\n"
68  "\n"
69  );
70 
71  return true;
72 }
73 
74 bool ClassDumpGenerator::ProcessElement( const TiXmlElement* field )
75 {
76  const char* name = field->Attribute( "name" );
77  if (name == nullptr) {
78  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
79  return false;
80  }
81 
82  fprintf( mOutputFile,
83  " _log( l_type, \"%%s%s:\", pfx );\n"
84  "\n"
85  " std::string %s_n( pfx );\n"
86  " %s_n += \" \";\n"
87  " %s.Dump( l_type, %s_n.c_str() );\n"
88  "\n",
89  name, name, name,
90  name, name
91  );
92 
93  return true;
94 }
95 
96 bool ClassDumpGenerator::ProcessElementPtr( const TiXmlElement* field )
97 {
98  const char* name = field->Attribute( "name" );
99  if (name == nullptr) {
100  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
101  return false;
102  }
103 
104  fprintf( mOutputFile,
105  " _log( l_type, \"%%s%s:\", pfx );\n"
106  "\n"
107  " std::string %s_n( pfx );\n"
108  " %s_n += \" \";\n"
109  " if (%s != nullptr)\n"
110  " %s->Dump( l_type, %s_n.c_str() );\n"
111  " else\n"
112  " _log( l_type, \"%%sERROR: ElementPtr = nullptr.\", %s_n.c_str() );\n"
113  "\n",
114  name, name, name, name,
115  name, name, name
116  );
117 
118  return true;
119 }
120 
121 bool ClassDumpGenerator::ProcessRaw( const TiXmlElement* field )
122 {
123  const char* name = field->Attribute( "name" );
124  if (name == nullptr) {
125  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
126  return false;
127  }
128 
129  fprintf( mOutputFile,
130  " _log( l_type, \"%%s%s:\", pfx );\n"
131  "\n"
132  " std::string %s_n( pfx );\n"
133  " %s_n += \" \";\n"
134  " if (%s != nullptr)\n"
135  " %s->Dump( l_type, %s_n.c_str() );\n"
136  " else\n"
137  " _log( l_type, \"%%sERROR: raw = nullptr.\", %s_n.c_str() );\n"
138  "\n",
139  name, name, name, name,
140  name, name, name
141  );
142 
143  return true;
144 }
145 
146 bool ClassDumpGenerator::ProcessInt( const TiXmlElement* field )
147 {
148  const char* name = field->Attribute( "name" );
149  if (name == nullptr) {
150  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
151  return false;
152  }
153 
154  fprintf( mOutputFile,
155  " _log( l_type, \"%%s%s=%%u\", pfx, %s );\n"
156  "\n",
157  name, name
158  );
159 
160  return true;
161 }
162 
163 bool ClassDumpGenerator::ProcessLong( const TiXmlElement* field )
164 {
165  const char* name = field->Attribute( "name" );
166  if (name == nullptr) {
167  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
168  return false;
169  }
170 
171  fprintf( mOutputFile,
172  " _log( l_type, \"%%s%s=%%\" PRId64, pfx, %s );\n"
173  "\n",
174  name, name
175  );
176 
177  return true;
178 }
179 
180 bool ClassDumpGenerator::ProcessReal( const TiXmlElement* field )
181 {
182  const char* name = field->Attribute( "name" );
183  if (name == nullptr) {
184  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
185  return false;
186  }
187 
188  fprintf( mOutputFile,
189  " _log( l_type, \"%%s%s=%%.13f\", pfx, %s );\n"
190  "\n",
191  name, name
192  );
193 
194  return true;
195 }
196 
197 bool ClassDumpGenerator::ProcessBool( const TiXmlElement* field )
198 {
199  const char* name = field->Attribute( "name" );
200  if (name == nullptr) {
201  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
202  return false;
203  }
204 
205  fprintf( mOutputFile,
206  " _log( l_type, \"%%s%s=%%s\", pfx, %s ? \"true\" : \"false\" );\n"
207  "\n",
208  name, name
209  );
210 
211  return true;
212 }
213 
214 bool ClassDumpGenerator::ProcessNone( const TiXmlElement* field )
215 {
216  return true;
217 }
218 
219 bool ClassDumpGenerator::ProcessBuffer( const TiXmlElement* field )
220 {
221  const char* name = field->Attribute( "name" );
222  if (name == nullptr) {
223  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
224  return false;
225  }
226 
227  fprintf( mOutputFile,
228  " _log( l_type, \"%%s%s: \", pfx );\n"
229  "\n"
230  " std::string %s_n( pfx );\n"
231  " %s_n += \" \";\n"
232  " %s->Dump( l_type, %s_n.c_str() );\n"
233  "\n",
234  name, name, name,
235  name, name
236  );
237 
238  return true;
239 }
240 
241 bool ClassDumpGenerator::ProcessString( const TiXmlElement* field )
242 {
243  const char* name = field->Attribute( "name" );
244  if (name == nullptr) {
245  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
246  return false;
247  }
248 
249  fprintf( mOutputFile,
250  " _log( l_type, \"%%s%s='%%s'\", pfx, %s.c_str() );\n"
251  "\n",
252  name, name
253  );
254 
255  return true;
256 }
257 
258 bool ClassDumpGenerator::ProcessStringInline( const TiXmlElement* field )
259 {
260  const char* value = field->Attribute( "value" );
261  if (value == nullptr) {
262  std::cout << std::endl << "string element at line " << field->Row() << " has no value attribute, skipping.";
263  return false;
264  }
265 
266  fprintf( mOutputFile,
267  " _log( l_type, \"%%sString '%s'\", pfx );\n"
268  "\n",
269  value
270  );
271 
272  return true;
273 }
274 
275 bool ClassDumpGenerator::ProcessWString( const TiXmlElement* field )
276 {
277  const char* name = field->Attribute( "name" );
278  if (name == nullptr) {
279  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
280  return false;
281  }
282 
283  fprintf( mOutputFile,
284  " _log( l_type, \"%%s%s='%%s'\", pfx, %s.c_str() );\n"
285  "\n",
286  name, name
287  );
288 
289  return true;
290 }
291 
292 bool ClassDumpGenerator::ProcessWStringInline( const TiXmlElement* field )
293 {
294  const char* value = field->Attribute( "value" );
295  if (value == nullptr) {
296  std::cout << std::endl << "wstring element at line " << field->Row() << " has no value attribute, skipping.";
297  return false;
298  }
299 
300  fprintf( mOutputFile,
301  " _log( l_type, \"%%sWString '%s'\", pfx );\n"
302  "\n",
303  value
304  );
305 
306  return true;
307 }
308 
309 bool ClassDumpGenerator::ProcessToken( const TiXmlElement* field )
310 {
311  const char* name = field->Attribute( "name" );
312  if (name == nullptr) {
313  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
314  return false;
315  }
316 
317  fprintf( mOutputFile,
318  " _log( l_type, \"%%s%s:\", pfx );\n"
319  "\n"
320  " std::string %s_n( pfx );\n"
321  " %s_n += \" \";\n"
322  " if (%s != nullptr)\n"
323  " %s->Dump( l_type, %s_n.c_str() );\n"
324  " else\n"
325  " _log( l_type, \"%%sERROR: token = nullptr.\", %s_n.c_str() );\n"
326  "\n",
327  name, name, name, name,
328  name, name, name
329  );
330 
331  return true;
332 }
333 
334 bool ClassDumpGenerator::ProcessTokenInline( const TiXmlElement* field )
335 {
336  const char* value = field->Attribute( "value" );
337  if (value == nullptr) {
338  std::cout << std::endl << "token element at line " << field->Row() << " has no value attribute, skipping.";
339  return false;
340  }
341 
342  fprintf( mOutputFile,
343  " _log( l_type, \"%%sToken '%s'\", pfx );\n"
344  "\n",
345  value
346  );
347 
348  return true;
349 }
350 
351 bool ClassDumpGenerator::ProcessObject( const TiXmlElement* field )
352 {
353  const char* name = field->Attribute( "name" );
354  if (name == nullptr) {
355  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
356  return false;
357  }
358 
359  fprintf( mOutputFile,
360  " _log( l_type, \"%%s%s:\", pfx );\n"
361  "\n"
362  " std::string %s_n( pfx );\n"
363  " %s_n += \" \";\n"
364  " if (%s != nullptr)\n"
365  " %s->Dump( l_type, %s_n.c_str() );\n"
366  " else \n"
367  " _log( l_type, \"%%s nullptr\", pfx );\n"
368  "\n",
369  name, name, name,
370  name, name, name
371  );
372 
373  return true;
374 }
375 
376 bool ClassDumpGenerator::ProcessObjectInline( const TiXmlElement* field )
377 {
378  fprintf( mOutputFile,
379  " _log( l_type, \"%%sObject:\", pfx );\n"
380  "\n"
381  );
382 
383  return ParseElementChildren( field, 2 );
384 }
385 
386 bool ClassDumpGenerator::ProcessObjectEx( const TiXmlElement* field )
387 {
388  const char* name = field->Attribute( "name" );
389  if (name == nullptr) {
390  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
391  return false;
392  }
393  const char* type = field->Attribute( "type" );
394  if (type == nullptr) {
395  std::cout << std::endl << "field at line " << field->Row() << " is missing the type attribute, skipping.";
396  return false;
397  }
398 
399  fprintf( mOutputFile,
400  " _log( l_type, \"%%s%s (%s):\", pfx );\n"
401  "\n"
402  " std::string %s_n( pfx );\n"
403  " %s_n += \" \";\n"
404  " if (%s != nullptr)\n"
405  " %s->Dump( l_type, %s_n.c_str() );\n"
406  " else\n"
407  " _log( l_type, \"%%s nullptr\", pfx );\n"
408  "\n",
409  name, type, name,
410  name, name, name, name
411  );
412 
413  return true;
414 }
415 
416 bool ClassDumpGenerator::ProcessTuple( const TiXmlElement* field )
417 {
418  const char* name = field->Attribute( "name" );
419  if (name == nullptr) {
420  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
421  return false;
422  }
423 
424  fprintf( mOutputFile,
425  " _log( l_type, \"%%s%s:\", pfx );\n"
426  "\n"
427  " std::string %s_n( pfx );\n"
428  " %s_n += \" \";\n"
429  " if (%s != nullptr)\n"
430  " %s->Dump( l_type, %s_n.c_str() );\n"
431  " else\n"
432  " _log( l_type, \"%%sERROR: tuple = nullptr.\", %s_n.c_str() );\n"
433  "\n",
434  name, name, name,
435  name, name, name, name
436  );
437 
438  return true;
439 }
440 
441 bool ClassDumpGenerator::ProcessTupleInline( const TiXmlElement* field )
442 {
443  //do we want to display the tuple in the dump?
444  return ParseElementChildren( field );
445 }
446 
447 bool ClassDumpGenerator::ProcessList( const TiXmlElement* field )
448 {
449  const char* name = field->Attribute( "name" );
450  if (name == nullptr) {
451  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
452  return false;
453  }
454 
455  fprintf( mOutputFile,
456  " _log( l_type, \"%%s%s:\", pfx );\n"
457  "\n"
458  " std::string %s_n( pfx );\n"
459  " %s_n += \" \";\n"
460  " if (%s != nullptr)\n"
461  " %s->Dump( l_type, %s_n.c_str() );\n"
462  " else\n"
463  " _log( l_type, \"%%sERROR: list = nullptr.\", %s_n.c_str() );\n"
464  "\n",
465  name, name, name,
466  name, name, name, name
467  );
468 
469  return true;
470 }
471 
472 bool ClassDumpGenerator::ProcessListInline( const TiXmlElement* field )
473 {
474  //do we want to display the list in the dump?
475  return ParseElementChildren( field );
476 }
477 
478 bool ClassDumpGenerator::ProcessListInt( const TiXmlElement* field )
479 {
480  const char* name = field->Attribute( "name" );
481  if (name == nullptr) {
482  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
483  return false;
484  }
485 
486  fprintf( mOutputFile,
487  " _log( l_type, \"%%s%s: Integer list with %%lu entries\", pfx, %s.size() );\n"
488  "\n"
489  " std::vector<int32>::const_iterator cur = %s.begin();\n"
490  " for (int index = 0; cur != %s.end(); ++cur, ++index )\n"
491  " _log( l_type, \"%%s [%%02d] %%d\", pfx, index, (*cur) );\n"
492  "\n",
493  name, name, name, name
494  );
495 
496  return true;
497 }
498 
499 bool ClassDumpGenerator::ProcessListLong( const TiXmlElement* field )
500 {
501  const char* name = field->Attribute( "name" );
502  if (name == nullptr) {
503  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
504  return false;
505  }
506 
507  fprintf( mOutputFile,
508  " _log( l_type, \"%%s%s: Integer list with %%lu entries\", pfx, %s.size() );\n"
509  "\n"
510  " std::vector<int64>::const_iterator cur = %s.begin();\n"
511  " for (int index = 0; cur != %s.end(); ++cur, ++index )\n"
512  " _log( l_type, \"%%s [%%02d] %%li\", pfx, index, (*cur) );\n"
513  "\n",
514  name, name, name, name
515  );
516 
517  return true;
518 }
519 
520 bool ClassDumpGenerator::ProcessListStr( const TiXmlElement* field )
521 {
522  const char* name = field->Attribute( "name" );
523  if (name == nullptr) {
524  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
525  return false;
526  }
527 
528  fprintf( mOutputFile,
529  " std::vector<std::string>::const_iterator %s_cur = %s.begin(), %s_end = %s.end();\n"
530  " for (int index = 0; %s_cur != %s_end; ++%s_cur, ++index )\n"
531  " _log( l_type, \"%%s [%%02d] %%s\", pfx, index, ( *%s_cur ).c_str() );\n"
532  "\n",
533  name, name, name, name,
534  name, name, name, name
535  );
536 
537  return true;
538 }
539 
540 bool ClassDumpGenerator::ProcessDict( const TiXmlElement* field )
541 {
542  const char* name = field->Attribute( "name" );
543  if (name == nullptr) {
544  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
545  return false;
546  }
547 
548  fprintf( mOutputFile,
549  " _log( l_type, \"%%s%s:\", pfx );\n"
550  "\n"
551  " std::string %s_n( pfx );\n"
552  " %s_n += \" \";\n"
553  " if (%s != nullptr)\n"
554  " %s->Dump( l_type, %s_n.c_str() );\n"
555  " else\n"
556  " _log( l_type, \"%%sERROR: dict = nullptr.\", %s_n.c_str() );\n"
557  "\n",
558  name, name, name,
559  name, name, name, name
560  );
561 
562  return true;
563 }
564 
565 bool ClassDumpGenerator::ProcessDictInline( const TiXmlElement* field )
566 {
567  //do we want to display the dict in the dump?
568  return ParseElementChildren( field );
569 }
570 
571 bool ClassDumpGenerator::ProcessDictInlineEntry( const TiXmlElement* field )
572 {
573  //we dont really even care about this...
574  const char* key = field->Attribute( "key" );
575  if (key == nullptr) {
576  std::cout << std::endl << "<dictInlineEntry> at line " << field->Row() << " is missing the key attribute, skipping.";
577  return false;
578  }
579 
580  return ParseElementChildren( field, 1 );
581 }
582 
583 bool ClassDumpGenerator::ProcessDictRaw( const TiXmlElement* field )
584 {
585  const char* name = field->Attribute( "name" );
586  if (name == nullptr) {
587  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
588  return false;
589  }
590 
591  const char* key = field->Attribute( "key" );
592  if (key == nullptr) {
593  std::cout << std::endl << "field at line " << field->Row() << " is missing the key attribute, skipping.";
594  return false;
595  }
596  const char* pykey = field->Attribute( "pykey" );
597  if (pykey == nullptr) {
598  std::cout << std::endl << "field at line " << field->Row() << " is missing the pykey attribute, skipping.";
599  return false;
600  }
601  const char* value = field->Attribute( "value" );
602  if (value == nullptr) {
603  std::cout << std::endl << "field at line " << field->Row() << " is missing the value attribute, skipping.";
604  return false;
605  }
606  const char* pyvalue = field->Attribute( "pyvalue" );
607  if (pyvalue == nullptr) {
608  std::cout << std::endl << "field at line " << field->Row() << " is missing the pyvalue attribute, skipping.";
609  return false;
610  }
611 
612  //TODO: un-kludge this with respect to printf placeholders/types
613  //could make PyRep's out of them and use ->Dump, but thats annoying
614 
615  fprintf( mOutputFile,
616  " _log( l_type, \"%%s%s: Dictionary with %%lu entries\", pfx, %s.size() );\n"
617  "\n"
618  " /* total crap casting here since we do not know the correct printf format */\n"
619  " for (auto cur : %s)\n"
620  " _log( l_type, \"%%s Key: %%u -> Value: %%u\", pfx, uint32(cur.first), uint32(cur.second));\n"
621  "\n",
622  name, name, name
623  );
624 
625  return true;
626 }
627 
628 bool ClassDumpGenerator::ProcessDictInt( const TiXmlElement* field )
629 {
630  const char* name = field->Attribute( "name" );
631  if (name == nullptr) {
632  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
633  return false;
634  }
635 
636  fprintf( mOutputFile,
637  " _log( l_type, \"%%s%s: Dictionary with %%lu entries\", pfx, %s.size() );\n"
638  "\n"
639  " for (auto cur : %s) {\n"
640  " _log( l_type, \"%%s Key: %%u\", pfx, cur.first );\n"
641  " std::string n( pfx );\n"
642  " n += \" \";\n"
643  " cur.second->Dump( l_type, n.c_str() );\n"
644  " }\n"
645  "\n",
646  name, name, name
647  );
648 
649  return true;
650 }
651 
652 bool ClassDumpGenerator::ProcessDictStr( const TiXmlElement* field )
653 {
654  const char* name = field->Attribute( "name" );
655  if (name == nullptr) {
656  std::cout << std::endl << "name field at line " << field->Row() << " is missing the name attribute, skipping.";
657  return false;
658  }
659 
660  fprintf( mOutputFile,
661  " _log( l_type, \"%%s%s: Dictionary with %%lu entries\", pfx, %s.size() );\n"
662  "\n"
663  " for (auto cur : %s) {\n"
664  " _log( l_type, \"%%s Key: %%s\", pfx, cur.first.c_str() );\n"
665  " std::string n( pfx );\n"
666  " n += \" \";\n"
667  " cur.second->Dump( l_type, n.c_str() );\n"
668  " }\n"
669  "\n",
670  name, name, name
671  );
672 
673  return true;
674 }
675 
676 bool ClassDumpGenerator::ProcessSubStreamInline( const TiXmlElement* field )
677 {
678  //do we want to display the substream in the dump?
679  return ParseElementChildren( field, 1 );
680 }
681 
682 bool ClassDumpGenerator::ProcessSubStructInline( const TiXmlElement* field )
683 {
684  return ParseElementChildren( field, 1 );
685 }
bool ProcessDictInline(const TiXmlElement *field)
bool ProcessDictInlineEntry(const TiXmlElement *field)
bool ProcessWString(const TiXmlElement *field)
bool ProcessElementPtr(const TiXmlElement *field)
bool ProcessNone(const TiXmlElement *field)
bool ProcessRaw(const TiXmlElement *field)
bool ProcessList(const TiXmlElement *field)
bool ProcessSubStreamInline(const TiXmlElement *field)
bool ProcessDictRaw(const TiXmlElement *field)
void RegisterProcessors()
Definition: Generator.cpp:44
bool ProcessString(const TiXmlElement *field)
bool ProcessTokenInline(const TiXmlElement *field)
bool ProcessToken(const TiXmlElement *field)
bool ProcessObjectEx(const TiXmlElement *field)
bool ProcessTupleInline(const TiXmlElement *field)
bool ProcessBool(const TiXmlElement *field)
bool ProcessTuple(const TiXmlElement *field)
bool ProcessDictStr(const TiXmlElement *field)
FILE * mOutputFile
Definition: Generator.h:108
bool ProcessListStr(const TiXmlElement *field)
bool ProcessObjectInline(const TiXmlElement *field)
bool ProcessStringInline(const TiXmlElement *field)
bool ProcessInt(const TiXmlElement *field)
ClassDumpGenerator(FILE *outputFile=NULL)
bool ProcessReal(const TiXmlElement *field)
bool ProcessBuffer(const TiXmlElement *field)
bool ProcessObject(const TiXmlElement *field)
bool ProcessElementDef(const TiXmlElement *field)
Generic class for eve-xmlpktgen's generators.
Definition: Generator.h:37
bool ProcessLong(const TiXmlElement *field)
bool ParseElementChildren(const TiXmlElement *element, size_t max=0) const
Parses element's children using registered parsers.
Definition: XMLParser.cpp:72
bool ProcessWStringInline(const TiXmlElement *field)
bool ProcessDictInt(const TiXmlElement *field)
bool ProcessDict(const TiXmlElement *field)
typeID Spawn an NPC with the specified type text Search for items matching the specified query() type() key(value)-Send an OnRemoteMessage" ) COMMAND( setbpattr
bool ProcessElement(const TiXmlElement *field)
bool ProcessListInline(const TiXmlElement *field)
bool ProcessListLong(const TiXmlElement *field)
bool ProcessListInt(const TiXmlElement *field)
bool ProcessSubStructInline(const TiXmlElement *field)
void AddMemberParser(const char *name, T &instance, bool(T::*method)(const TiXmlElement *))
Adds a member parser.
Definition: XMLParserEx.h:55