Subversion Repositories tpanel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
74 andreas 1
/*
2
 * Copyright (C) 2021 by Andreas Theofilu <andreas@theosys.at>
3
 *
4
 * This program is free software; you can redistribute it and/or modify
5
 * it under the terms of the GNU General Public License as published by
6
 * the Free Software Foundation; either version 3 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program; if not, write to the Free Software Foundation,
16
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
17
 */
18
 
19
#include <fstream>
20
 
75 andreas 21
#include <string.h>
22
 
74 andreas 23
#include "texpat++.h"
24
#include "terror.h"
25
 
26
using namespace Expat;
27
using std::string;
28
using std::vector;
29
using std::ifstream;
30
 
31
int TExpat::mDepth = 0;
32
string TExpat::mContent;
33
string TExpat::mLastName;
34
vector<_ATTRIBUTE_t> TExpat::mAttributes;
35
 
36
TExpat::TExpat()
37
{
38
    DECL_TRACER("TExpat::TExpat()");
39
}
40
 
41
TExpat::TExpat(const std::string &file)
42
    : mFile(file)
43
{
44
    DECL_TRACER("TExpat::TExpat(const std::string &file)");
78 andreas 45
 
46
    mLastIter = mElements.end();
74 andreas 47
}
48
 
49
TExpat::~TExpat()
50
{
51
    DECL_TRACER("TExpat::~TExpat()");
52
}
53
 
75 andreas 54
void TExpat::setEncoding(TENCODING_t enc)
55
{
56
    DECL_TRACER("TExpat::setEncoding(TENCODING_t enc)");
57
 
58
    mSetEncoding = enc;
59
 
60
    switch(enc)
61
    {
62
        case ENC_ISO_8859_1:    mEncoding = "ISO-8859-1"; break;
63
        case ENC_US_ASCII:      mEncoding = "US-ASCII"; break;
64
        case ENC_UTF16:         mEncoding = "UTF-16"; break;
65
        case ENC_CP1250:        mEncoding = "CP1250"; break;
66
 
67
        default:
68
            mEncoding = "UTF-8";
69
            mSetEncoding = ENC_UTF8;
70
    }
71
}
72
 
74 andreas 73
bool TExpat::parse()
74
{
75
    DECL_TRACER("TExpat::parse()");
76
 
77
    if (!isValidFile(mFile))
78
    {
79
        MSG_ERROR("Invalid file: " << mFile);
80
        TError::setError();
81
        return false;
82
    }
83
 
84
    string buf;
85
    size_t size = 0;
86
 
87
    // First we read the whole XML file into a buffer
88
    try
89
    {
90
        ifstream stream(mFile, std::ios::in);
91
 
92
        if (!stream || !stream.is_open())
93
            return false;
94
 
95
        stream.seekg(0, stream.end);    // Find the end of the file
96
        size = stream.tellg();          // Get the position and save it
97
        stream.seekg(0, stream.beg);    // rewind to the beginning of the file
98
 
99
        buf.resize(size, '\0');         // Initialize the buffer with zeros
100
        char *begin = &*buf.begin();    // Assign the plain data buffer
101
        stream.read(begin, size);       // Read the whole file
102
        stream.close();                 // Close the file
103
    }
104
    catch (std::exception& e)
105
    {
106
        MSG_ERROR("File error: " << e.what());
107
        TError::setError();
108
        return false;
109
    }
110
 
111
    // Now we parse the file and write the relevant contents into our internal
112
    // variables.
113
    // First we initialialize the parser.
114
    int done = 1;   // 1 = Buffer is complete
115
    XML_Parser parser = XML_ParserCreate(NULL);
116
    XML_SetElementHandler(parser, &TExpat::startElement, &TExpat::endElement);
117
    XML_SetCharacterDataHandler(parser, &TExpat::CharacterDataHandler);
75 andreas 118
    XML_SetEncoding(parser, mEncoding.c_str());
74 andreas 119
    XML_SetUserData(parser, &mElements);
120
 
75 andreas 121
    if (mSetEncoding == ENC_CP1250)
122
        XML_SetUnknownEncodingHandler(parser, &TExpat::cp1250_encoding_handler, NULL);
123
 
124
    MSG_TRACE("Parsing XML file " << mFile);
125
 
74 andreas 126
    if (XML_Parse(parser, buf.data(), size, done) == XML_STATUS_ERROR)
127
    {
128
        MSG_ERROR(XML_ErrorString(XML_GetErrorCode(parser)) << " at line " << XML_GetCurrentLineNumber(parser));
129
        XML_ParserFree(parser);
130
        TError::setError();
131
        return false;
132
    }
133
 
134
    XML_ParserFree(parser);
75 andreas 135
/*
136
    if (TStreamError::checkFilter(HLOG_DEBUG))
137
    {
138
        // Print out the whole XML file formatted
139
        vector<_ELEMENT_t>::iterator iter;
140
 
141
        for (iter = mElements.begin(); iter != mElements.end(); ++iter)
142
        {
143
            string sIndent;
144
 
145
            for (int i = 0; i < iter->depth; i++)
146
                sIndent += "   ";
147
 
148
            if (iter->eType == _ET_START)
149
            {
150
                string attrs;
151
 
152
                if (iter->attrs.size() > 0)
153
                {
154
                    vector<ATTRIBUTE_t>::iterator atiter;
155
 
156
                    for (atiter = iter->attrs.begin(); atiter != iter->attrs.end(); ++atiter)
157
                    {
158
                        if (!attrs.empty())
159
                            attrs += " ";
160
 
161
                        attrs += atiter->name + " = \"" + atiter->content + "\"";
162
                    }
163
 
164
                    MSG_DEBUG("(" << iter->depth << ") " << sIndent << "<" << iter->name << " " << attrs << ">");
165
                }
166
                else
167
                {
168
                    MSG_DEBUG("(" << iter->depth << ") " << sIndent << "<" << iter->name << ">");
169
                }
170
            }
171
            else if (iter->eType == _ET_ATOMIC)
172
            {
173
                MSG_DEBUG("(" << iter->depth << ") " << sIndent << "<" << iter->name << ">" << iter->content << "</" << iter->name << ">");
174
            }
175
            else
176
            {
177
                MSG_DEBUG("(" << iter->depth << ") " << sIndent << "</" << iter->name << ">");
178
            }
179
        }
180
    }
181
*/
74 andreas 182
    return true;
183
}
184
 
77 andreas 185
string TExpat::getElement(const string &name, int depth, bool *valid)
74 andreas 186
{
187
    DECL_TRACER("TExpat::getElement(const string &name, int depth)");
188
 
78 andreas 189
    vector<_ELEMENT_t>::iterator iter, startElement;
190
    bool start = false;
74 andreas 191
 
88 andreas 192
    if (mElements.size() > 0 && mLastIter != mElements.end())
78 andreas 193
        startElement = mLastIter;
88 andreas 194
    else if (mElements.size() > 0)
195
        startElement = mElements.begin();
78 andreas 196
    else
88 andreas 197
    {
198
        MSG_DEBUG("Have no elements in queue!");
199
        return string();
200
    }
78 andreas 201
 
202
    for (iter = startElement; iter != mElements.end(); ++iter)
74 andreas 203
    {
78 andreas 204
        if (!start && iter->depth == depth && iter->eType != _ET_END)
205
            start = true;
206
 
207
        if (start && iter->eType != _ET_END && iter->name.compare(name)  == 0 && iter->depth == depth)
77 andreas 208
        {
209
            if (valid)
210
                *valid = true;
211
 
74 andreas 212
            return iter->content;
77 andreas 213
        }
78 andreas 214
        else if (start && (iter->eType == _ET_END || iter->depth != depth))
215
            break;
74 andreas 216
    }
217
 
77 andreas 218
    if (valid)
219
        *valid = false;
220
 
74 andreas 221
    return string();
222
}
223
 
77 andreas 224
int TExpat::getElementInt(const string &name, int depth, bool *valid)
225
{
226
    DECL_TRACER("TExpat::getElementInt(const string &name, int depth, bool *valid)");
227
 
228
    bool val;
229
    string erg = getElement(name, depth, &val);
230
 
231
    if (valid)
232
        *valid = val;
233
 
234
    if (!val)
235
        return 0;
236
 
237
    return atoi(erg.c_str());
238
}
239
 
240
long TExpat::getElementLong(const string &name, int depth, bool *valid)
241
{
242
    DECL_TRACER("TExpat::getElementLong(const string &name, int depth, bool *valid)");
243
 
244
    bool val;
245
    string erg = getElement(name, depth, &val);
246
 
247
    if (valid)
248
        *valid = val;
249
 
250
    if (!val)
251
        return 0;
252
 
253
    return atol(erg.c_str());
254
}
255
 
256
float TExpat::getElementFloat(const string &name, int depth, bool *valid)
257
{
258
    DECL_TRACER("TExpat::getElementFloat(const string &name, int depth, bool *valid)");
259
 
260
    bool val;
261
    string erg = getElement(name, depth, &val);
262
 
263
    if (valid)
264
        *valid = val;
265
 
266
    if (!val)
267
        return 0;
268
 
269
    return (float)atof(erg.c_str());
270
}
271
 
272
double TExpat::getElementDouble(const string &name, int depth, bool *valid)
273
{
274
    DECL_TRACER("TExpat::getElementDouble(const string &name, int depth, bool *valid)");
275
 
276
    bool val;
277
    string erg = getElement(name, depth, &val);
278
 
279
    if (valid)
280
        *valid = val;
281
 
282
    if (!val)
283
        return 0;
284
 
285
    return atof(erg.c_str());
286
}
287
 
75 andreas 288
size_t TExpat::getElementIndex(const string& name, int depth)
289
{
290
    DECL_TRACER("TExpat::getElementIndex(const string& name, int depth)");
291
 
292
    vector<_ELEMENT_t>::iterator iter;
293
    size_t idx = 0;
294
 
88 andreas 295
    if (mElements.size() == 0)
296
    {
297
        mLastIter = mElements.end();
298
        return npos;
299
    }
300
 
75 andreas 301
    for (iter = mElements.begin(); iter != mElements.end(); ++iter)
302
    {
303
        if (iter->eType != _ET_END && iter->name.compare(name) == 0 && iter->depth == depth)
304
        {
305
            mLastIter = iter;
306
            return idx;
307
        }
308
 
309
        idx++;
310
    }
311
 
312
    mLastIter = mElements.end();
313
    return npos;
314
}
315
 
316
size_t TExpat::getElementIndex(const string& name, int* depth)
317
{
318
    DECL_TRACER("TExpat::getElementIndex(const string& name, int* depth)");
319
 
84 andreas 320
    if (mElements.size() == 0)
321
    {
322
        mLastIter = mElements.end();
323
        return npos;
324
    }
325
 
75 andreas 326
    vector<_ELEMENT_t>::iterator iter;
327
    size_t idx = 0;
328
 
329
    for (iter = mElements.begin(); iter != mElements.end(); ++iter)
330
    {
331
        if (iter->eType != _ET_END && iter->name.compare(name) == 0)
332
        {
333
            if (depth)
334
                *depth = iter->depth;
335
 
336
            mLastIter = iter;
337
            return idx;
338
        }
339
 
340
        idx++;
341
    }
342
 
343
    if (depth)
344
        *depth = -1;
345
 
346
    mLastIter = mElements.end();
347
    return npos;
348
}
349
 
350
size_t TExpat::getElementFromIndex(size_t index, string* name, string* content, vector<ATTRIBUTE_t> *attrs)
351
{
352
    DECL_TRACER("TExpat::getElementFromIndex(size_t index, string* name, string* content, vector<ATTRIBUTE_t> *attrs)");
353
 
354
    if (index == npos || index >= mElements.size() || mElements.at(index).eType == _ET_END)
355
        return npos;
356
 
357
    if (name)
358
        name->assign(mElements.at(index).name);
359
 
360
    if (content)
361
        content->assign(mElements.at(index).content);
362
 
363
    if (attrs)
364
        *attrs = mElements.at(index).attrs;
365
 
366
    return index;
367
}
368
 
369
size_t TExpat::getNextElementFromIndex(size_t index, string* name, string* content, vector<ATTRIBUTE_t>* attrs)
370
{
371
    DECL_TRACER("TExpat::getNextElementFromIndex(size_t index, int depth, string* name, string* content, vector<ATTRIBUTE_t>* attrs)");
372
 
373
    if (index == npos)
374
        return npos;
375
 
376
    size_t idx = index + 1;
377
 
378
    if (idx >= mElements.size() || mElements.at(idx).eType == _ET_END)
379
        return npos;
380
 
381
    if (name)
382
        name->assign(mElements.at(idx).name);
383
 
384
    if (content)
385
        content->assign(mElements.at(idx).content);
386
 
387
    if (attrs)
388
        *attrs = mElements.at(idx).attrs;
389
 
390
    return idx;
391
}
392
 
74 andreas 393
string TExpat::getFirstElement(const string &name, int *depth)
394
{
395
    DECL_TRACER("TExpat::getFirstElement(const string &name, int *depth)");
396
 
397
    vector<_ELEMENT_t>::iterator iter;
398
 
399
    for (iter = mElements.begin(); iter != mElements.end(); ++iter)
400
    {
75 andreas 401
        if (iter->eType != _ET_END && iter->name.compare(name) == 0)
74 andreas 402
        {
403
            if (depth)
404
                *depth = iter->depth;
405
 
406
            mLastIter = iter;
407
            return iter->content;
408
        }
409
    }
410
 
411
    if (depth)
412
        *depth = -1;
413
 
414
    mLastIter = mElements.end();
415
    return string();
416
}
417
 
77 andreas 418
string TExpat::getNextElement(const string &name, int depth, bool *valid)
74 andreas 419
{
420
    DECL_TRACER("TExpat::getNextElement(const string &name, int depth)");
421
 
77 andreas 422
    if (valid)
423
        *valid = false;
424
 
74 andreas 425
    if (mLastIter == mElements.end())
426
        return string();
427
 
428
    mLastIter++;
429
 
75 andreas 430
    while (mLastIter != mElements.end())
431
    {
432
        if (mLastIter == mElements.end() || mLastIter->eType == _ET_END)
433
            return string();
434
 
77 andreas 435
        if (mLastIter->name.compare(name) == 0 && mLastIter->depth == depth)
436
        {
437
            if (valid)
438
                *valid = true;
439
 
75 andreas 440
            return mLastIter->content;
77 andreas 441
        }
75 andreas 442
 
443
        mLastIter++;
444
    }
445
 
446
    return string();
447
}
448
 
449
size_t TExpat::getNextElementIndex(const string& name, int depth)
450
{
451
    DECL_TRACER("TExpat::getNextElementIndex(const string& name, int depth)");
452
 
74 andreas 453
    if (mLastIter == mElements.end())
75 andreas 454
        return npos;
74 andreas 455
 
75 andreas 456
    mLastIter++;
74 andreas 457
 
75 andreas 458
    while (mLastIter != mElements.end())
459
    {
78 andreas 460
        if (mLastIter->eType == _ET_END && mLastIter->depth < depth)
461
            break;
75 andreas 462
 
78 andreas 463
        if (mLastIter->name.compare(name)  == 0 && mLastIter->depth == depth && mLastIter->eType != _ET_END)
75 andreas 464
        {
465
            size_t idx = 0;
466
            vector<_ELEMENT_t>::iterator iter;
467
 
468
            for (iter = mElements.begin(); iter != mElements.end(); ++iter)
469
            {
470
                if (iter == mLastIter)
471
                    return idx;
472
 
473
                idx++;
474
            }
475
        }
476
 
477
        mLastIter++;
478
    }
479
 
480
    return npos;
481
}
482
 
483
string TExpat::getAttribute(const string& name, vector<ATTRIBUTE_t>& attrs)
484
{
485
    DECL_TRACER("TExpat::getAttribute(const string& name, vector<ATTRIBUTE_t>& attrs)");
486
 
487
    vector<ATTRIBUTE_t>::iterator iter;
488
 
88 andreas 489
    if (attrs.size() == 0)
490
        return string();
491
 
75 andreas 492
    for (iter = attrs.begin(); iter != attrs.end(); ++iter)
493
    {
494
        if (iter->name.compare(name) == 0)
495
            return iter->content;
496
    }
497
 
74 andreas 498
    return string();
499
}
500
 
75 andreas 501
int TExpat::getAttributeInt(const string& name, vector<ATTRIBUTE_t>& attrs)
502
{
503
    DECL_TRACER("TExpat::getAttributeInt(const string& name, vector<ATTRIBUTE_t>& attrs)");
74 andreas 504
 
75 andreas 505
    return atoi(getAttribute(name, attrs).c_str());
506
}
507
 
508
long Expat::TExpat::getAttributeLong(const std::string& name, std::vector<ATTRIBUTE_t>& attrs)
74 andreas 509
{
75 andreas 510
    DECL_TRACER("TExpat::getAttributeLong(const string& name, vector<ATTRIBUTE_t>& attrs)");
511
 
512
    return atol(getAttribute(name, attrs).c_str());
513
}
514
 
515
float Expat::TExpat::getAttributeFloat(const std::string& name, std::vector<ATTRIBUTE_t>& attrs)
516
{
517
    DECL_TRACER("TExpat::getAttributeFloat(const string& name, vector<ATTRIBUTE_t>& attrs)");
518
 
519
    return (float)atof(getAttribute(name, attrs).c_str());
520
}
521
 
522
double Expat::TExpat::getAttributeDouble(const std::string& name, std::vector<ATTRIBUTE_t>& attrs)
523
{
524
    DECL_TRACER("TExpat::getAttributeDouble(const string& name, vector<ATTRIBUTE_t>& attrs)");
525
 
526
    return atof(getAttribute(name, attrs).c_str());
527
}
528
 
529
int TExpat::convertElementToInt(const string& content)
530
{
531
    DECL_TRACER("TExpat::convertElementToInt(const string& content)");
532
 
533
    if (content.empty())
534
    {
535
        TError::setErrorMsg("Empty content!");
536
        return 0;
537
    }
538
 
539
    return atoi(content.c_str());
540
}
541
 
542
long TExpat::convertElementToLong(const string& content)
543
{
544
    DECL_TRACER("TExpat::convertElementToLong(const string& content)");
545
 
546
    if (content.empty())
547
    {
548
        TError::setErrorMsg("Empty content!");
549
        return 0;
550
    }
551
 
552
    return atol(content.c_str());
553
}
554
 
555
float TExpat::convertElementToFloat(const string& content)
556
{
557
    DECL_TRACER("TExpat::convertElementToFloat(const string& content)");
558
 
559
    if (content.empty())
560
    {
561
        TError::setErrorMsg("Empty content!");
562
        return 0;
563
    }
564
 
565
    return (float)atof(content.c_str());
566
}
567
 
568
double TExpat::convertElementToDouble(const string& content)
569
{
570
    DECL_TRACER("TExpat::convertElementToDouble(const string& content)");
571
 
572
    if (content.empty())
573
    {
574
        TError::setErrorMsg("Empty content!");
575
        return 0;
576
    }
577
 
578
    return atof(content.c_str());
579
}
580
 
581
bool TExpat::setIndex(size_t index)
582
{
583
    DECL_TRACER("TExpat::setIndex(size_t index)");
584
 
585
    if (index >= mElements.size())
586
    {
587
        TError::setErrorMsg("Invalid index " + std::to_string(index) + "!");
588
        mLastIter = mElements.end();
589
        return false;
590
    }
591
 
592
    vector<_ELEMENT_t>::iterator iter;
593
    size_t idx = 0;
594
 
595
    for (iter = mElements.begin(); iter != mElements.end(); ++iter)
596
    {
597
        if (idx == index)
598
        {
599
            mLastIter = iter;
600
            return true;
601
        }
602
 
603
        idx++;
604
    }
605
 
606
    mLastIter = mElements.end();
607
    return false;   // Should not happen and is just for satisfy the compiler.
608
}
609
 
610
vector<ATTRIBUTE_t> TExpat::getAttributes()
611
{
612
    DECL_TRACER("TExpat::getAttributes()");
613
 
614
    if (mLastIter == mElements.end())
615
        return vector<ATTRIBUTE_t>();
616
 
617
    return mLastIter->attrs;
618
}
619
 
620
vector<ATTRIBUTE_t> TExpat::getAttributes(size_t index)
621
{
622
    DECL_TRACER("TExpat::getAttributes(size_t index)");
623
 
624
    if (index >= mElements.size())
625
        return vector<ATTRIBUTE_t>();
626
 
627
    return mElements.at(index).attrs;
628
}
629
 
78 andreas 630
string TExpat::getElementName(bool *valid)
631
{
632
    DECL_TRACER("TExpat::getElementName()");
633
 
634
    if (mLastIter != mElements.end())
635
    {
636
        if (valid)
637
            *valid = true;
638
 
639
        return mLastIter->name;
640
    }
641
 
642
    if (valid)
643
        *valid = false;
644
 
645
    return string();
646
}
647
 
648
string TExpat::getElementContent(bool *valid)
649
{
650
    DECL_TRACER("TExpat::getElementContent()");
651
 
652
    if (mLastIter != mElements.end())
653
    {
654
        if (valid)
655
            *valid = true;
656
 
657
        return mLastIter->content;
658
    }
659
 
660
    if (valid)
661
        *valid = false;
662
 
663
    return string();
664
}
665
 
666
int TExpat::getElementContentInt(bool *valid)
667
{
668
    DECL_TRACER("TExpat::getElementContentInt(bool *valid)");
669
 
670
    if (mLastIter != mElements.end())
671
    {
672
        if (valid)
673
            *valid = true;
674
 
675
        return atoi(mLastIter->content.c_str());
676
    }
677
 
678
    if (valid)
679
        *valid = false;
680
 
681
    return 0;
682
}
683
 
684
long TExpat::getElementContentLong(bool *valid)
685
{
686
    DECL_TRACER("TExpat::getElementContentLong(bool *valid)");
687
 
688
    if (mLastIter != mElements.end())
689
    {
690
        if (valid)
691
            *valid = true;
692
 
693
        return atol(mLastIter->content.c_str());
694
    }
695
 
696
    if (valid)
697
        *valid = false;
698
 
699
    return 0;
700
}
701
 
702
float TExpat::getElementContentFloat(bool *valid)
703
{
704
    DECL_TRACER("TExpat::getElementContentFloat(bool *valid)");
705
 
706
    if (mLastIter != mElements.end())
707
    {
708
        if (valid)
709
            *valid = true;
710
 
711
        return (float)atof(mLastIter->content.c_str());
712
    }
713
 
714
    if (valid)
715
        *valid = false;
716
 
717
    return 0.0;
718
}
719
 
720
double TExpat::getElementContentDouble(bool *valid)
721
{
722
    DECL_TRACER("TExpat::getElementContentDouble(bool *valid)");
723
 
724
    if (mLastIter != mElements.end())
725
    {
726
        if (valid)
727
            *valid = true;
728
 
729
        return atof(mLastIter->content.c_str());
730
    }
731
 
732
    if (valid)
733
        *valid = false;
734
 
735
    return 0.0;
736
}
737
 
75 andreas 738
/******************************************************************************
739
 *                        Static methods starting here
740
 ******************************************************************************/
741
 
742
void TExpat::createCP1250Encoding(XML_Encoding* enc)
743
{
744
    if (!enc)
745
        return;
746
 
747
    for (int i = 0; i < 0x0100; i++)
748
    {
749
        if (i < 0x007f)
750
            enc->map[i] = i;
751
        else
752
        {
753
            switch(i)
754
            {
755
                case 0x080: enc->map[i] = 0x20AC; break;
756
                case 0x082: enc->map[i] = 0x201A; break;
757
                case 0x083: enc->map[i] = 0x0192; break;
758
                case 0x084: enc->map[i] = 0x201E; break;
759
                case 0x085: enc->map[i] = 0x2026; break;
760
                case 0x086: enc->map[i] = 0x2020; break;
761
                case 0x087: enc->map[i] = 0x2021; break;
762
                case 0x088: enc->map[i] = 0x02C6; break;
763
                case 0x089: enc->map[i] = 0x2030; break;
764
                case 0x08A: enc->map[i] = 0x0160; break;
765
                case 0x08B: enc->map[i] = 0x2039; break;
766
                case 0x08C: enc->map[i] = 0x0152; break;
767
                case 0x08D: enc->map[i] = 0x00A4; break;
768
                case 0x08E: enc->map[i] = 0x017D; break;
769
                case 0x08F: enc->map[i] = 0x00B9; break;
770
                case 0x091: enc->map[i] = 0x2018; break;
771
                case 0x092: enc->map[i] = 0x2019; break;
772
                case 0x093: enc->map[i] = 0x201C; break;
773
                case 0x094: enc->map[i] = 0x201D; break;
774
                case 0x095: enc->map[i] = 0x2022; break;
775
                case 0x096: enc->map[i] = 0x2013; break;
776
                case 0x097: enc->map[i] = 0x2014; break;
777
                case 0x098: enc->map[i] = 0x02DC; break;
778
                case 0x099: enc->map[i] = 0x2122; break;
779
                case 0x09A: enc->map[i] = 0x0161; break;
780
                case 0x09B: enc->map[i] = 0x203A; break;
781
                case 0x09C: enc->map[i] = 0x0153; break;
782
                case 0x09D: enc->map[i] = 0x00A5; break;
783
                case 0x09E: enc->map[i] = 0x017E; break;
784
                case 0x09F: enc->map[i] = 0x0178; break;
785
                case 0x0A0: enc->map[i] = 0x02A0; break;
786
                case 0x0A1: enc->map[i] = 0x02C7; break;
787
                case 0x0A2: enc->map[i] = 0x02D8; break;
788
                case 0x0A3: enc->map[i] = 0x0141; break;
789
                case 0x0A4: enc->map[i] = 0x00A4; break;
790
                case 0x0A5: enc->map[i] = 0x0104; break;
791
                case 0x0A6: enc->map[i] = 0x00A6; break;
792
                case 0x0A7: enc->map[i] = 0x00A7; break;
793
                case 0x0A8: enc->map[i] = 0x00A8; break;
794
                case 0x0A9: enc->map[i] = 0x00A9; break;
795
                case 0x0AA: enc->map[i] = 0x015E; break;
796
                case 0x0AB: enc->map[i] = 0x00AB; break;
797
                case 0x0AC: enc->map[i] = 0x00AC; break;
798
                case 0x0AD: enc->map[i] = 0x00AD; break;
799
                case 0x0AE: enc->map[i] = 0x00AE; break;
800
                case 0x0AF: enc->map[i] = 0x017B; break;
801
                case 0x0B0: enc->map[i] = 0x00B0; break;
802
                case 0x0B1: enc->map[i] = 0x00B1; break;
803
                case 0x0B2: enc->map[i] = 0x02DB; break;
804
                case 0x0B3: enc->map[i] = 0x0142; break;
805
                case 0x0B4: enc->map[i] = 0x00B4; break;
806
                case 0x0B5: enc->map[i] = 0x00B5; break;
807
                case 0x0B6: enc->map[i] = 0x00B6; break;
808
                case 0x0B7: enc->map[i] = 0x00B7; break;
809
                case 0x0B8: enc->map[i] = 0x00B8; break;
810
                case 0x0B9: enc->map[i] = 0x0105; break;
811
                case 0x0BA: enc->map[i] = 0x015F; break;
812
                case 0x0BB: enc->map[i] = 0x00BB; break;
813
                case 0x0BC: enc->map[i] = 0x013D; break;
814
                case 0x0BD: enc->map[i] = 0x02DD; break;
815
                case 0x0BE: enc->map[i] = 0x013E; break;
816
                case 0x0BF: enc->map[i] = 0x017C; break;
817
                case 0x0C0: enc->map[i] = 0x0154; break;
818
                case 0x0C1: enc->map[i] = 0x00C1; break;
819
                case 0x0C2: enc->map[i] = 0x00C2; break;
820
                case 0x0C3: enc->map[i] = 0x0102; break;
821
                case 0x0C4: enc->map[i] = 0x00C4; break;
822
                case 0x0C5: enc->map[i] = 0x0139; break;
823
                case 0x0C6: enc->map[i] = 0x0106; break;
824
                case 0x0C7: enc->map[i] = 0x00C7; break;
825
                case 0x0C8: enc->map[i] = 0x010C; break;
826
                case 0x0C9: enc->map[i] = 0x00C9; break;
827
                case 0x0CA: enc->map[i] = 0x0118; break;
828
                case 0x0CB: enc->map[i] = 0x00CB; break;
76 andreas 829
                case 0x0CC: enc->map[i] = 0x00CC; break;    //0x011A
75 andreas 830
                case 0x0CD: enc->map[i] = 0x00CD; break;
831
                case 0x0CE: enc->map[i] = 0x00CE; break;
76 andreas 832
                case 0x0CF: enc->map[i] = 0x00CF; break;
75 andreas 833
                case 0x0D0: enc->map[i] = 0x0110; break;
834
                case 0x0D1: enc->map[i] = 0x0143; break;
835
                case 0x0D2: enc->map[i] = 0x0147; break;
836
                case 0x0D3: enc->map[i] = 0x00D3; break;
837
                case 0x0D4: enc->map[i] = 0x00D4; break;
838
                case 0x0D5: enc->map[i] = 0x0150; break;
839
                case 0x0D6: enc->map[i] = 0x00D6; break;
840
                case 0x0D7: enc->map[i] = 0x00D7; break;
841
                case 0x0D8: enc->map[i] = 0x0158; break;
842
                case 0x0D9: enc->map[i] = 0x016E; break;
843
                case 0x0DA: enc->map[i] = 0x00DA; break;
844
                case 0x0DB: enc->map[i] = 0x0170; break;
845
                case 0x0DC: enc->map[i] = 0x00DC; break;
846
                case 0x0DD: enc->map[i] = 0x00DD; break;
847
                case 0x0DE: enc->map[i] = 0x0162; break;
848
                case 0x0DF: enc->map[i] = 0x00DF; break;
849
                case 0x0E0: enc->map[i] = 0x0155; break;
850
                case 0x0E1: enc->map[i] = 0x00E1; break;
851
                case 0x0E2: enc->map[i] = 0x00E2; break;
852
                case 0x0E3: enc->map[i] = 0x0103; break;
853
                case 0x0E4: enc->map[i] = 0x00E4; break;
854
                case 0x0E5: enc->map[i] = 0x013A; break;
855
                case 0x0E6: enc->map[i] = 0x0107; break;
856
                case 0x0E7: enc->map[i] = 0x00E7; break;
857
                case 0x0E8: enc->map[i] = 0x010D; break;
858
                case 0x0E9: enc->map[i] = 0x00E9; break;
859
                case 0x0EA: enc->map[i] = 0x0119; break;
860
                case 0x0EB: enc->map[i] = 0x00EB; break;
861
                case 0x0EC: enc->map[i] = 0x011B; break;
862
                case 0x0ED: enc->map[i] = 0x00ED; break;
863
                case 0x0EE: enc->map[i] = 0x00EE; break;
864
                case 0x0EF: enc->map[i] = 0x010F; break;
865
                case 0x0F0: enc->map[i] = 0x0111; break;
866
                case 0x0F1: enc->map[i] = 0x0144; break;
867
                case 0x0F2: enc->map[i] = 0x0148; break;
868
                case 0x0F3: enc->map[i] = 0x00F3; break;
869
                case 0x0F4: enc->map[i] = 0x00F4; break;
870
                case 0x0F5: enc->map[i] = 0x0151; break;
871
                case 0x0F6: enc->map[i] = 0x00F6; break;
872
                case 0x0F7: enc->map[i] = 0x00F7; break;
873
                case 0x0F8: enc->map[i] = 0x0159; break;
874
                case 0x0F9: enc->map[i] = 0x016F; break;
875
                case 0x0FA: enc->map[i] = 0x00FA; break;
876
                case 0x0FB: enc->map[i] = 0x0171; break;
877
                case 0x0FC: enc->map[i] = 0x00FC; break;
878
                case 0x0FD: enc->map[i] = 0x00FD; break;
879
                case 0x0FE: enc->map[i] = 0x0163; break;
880
                case 0x0FF: enc->map[i] = 0x02D9; break;
881
 
882
                default:
883
                    enc->map[i] = -1;
884
            }
885
        }
886
    }
887
}
888
 
889
void TExpat::startElement(void *userData, const XML_Char *name, const XML_Char **attrs)
890
{
74 andreas 891
    if (!name)
892
        return;
893
 
75 andreas 894
    std::vector<_ELEMENT_t> *ud = (std::vector<_ELEMENT_t> *)userData;
895
    _ELEMENT_t el;
896
 
74 andreas 897
    mLastName.assign(name);
898
    mDepth++;
899
    mAttributes.clear();
75 andreas 900
    mContent.clear();
74 andreas 901
 
75 andreas 902
    el.depth = mDepth;
903
    el.name = mLastName;
904
    el.eType = _ET_START;
905
 
74 andreas 906
    if (attrs && *attrs)
907
    {
908
        for (int i = 0; attrs[i]; i += 2)
909
        {
910
            _ATTRIBUTE_t at;
911
            at.name.assign(attrs[i]);
912
            at.content.assign(attrs[i + 1]);
913
            mAttributes.push_back(at);
914
        }
75 andreas 915
 
916
        el.attrs = mAttributes;
74 andreas 917
    }
75 andreas 918
 
919
    ud->push_back(el);
74 andreas 920
}
921
 
922
void TExpat::endElement(void *userData, const XML_Char *name)
923
{
924
    if (!userData || !name)
925
        return;
926
 
75 andreas 927
    std::vector<_ELEMENT_t> *ud = (std::vector<_ELEMENT_t> *)userData;
928
 
929
    if (mLastName.compare(name) == 0)
74 andreas 930
    {
75 andreas 931
        if (ud->back().depth == mDepth)
932
        {
933
            ud->back().eType = _ET_ATOMIC;
934
            ud->back().content = mContent;
935
 
936
            mDepth--;
937
            mLastName.clear();
938
            mContent.clear();
939
            return;
940
        }
74 andreas 941
    }
942
 
943
    _ELEMENT_t el;
944
    el.depth = mDepth;
75 andreas 945
    el.name.assign(name);
946
    el.eType = _ET_END;
74 andreas 947
    ud->push_back(el);
75 andreas 948
    mDepth--;
949
 
74 andreas 950
    mLastName.clear();
951
    mContent.clear();
952
}
953
 
954
void TExpat::CharacterDataHandler(void *, const XML_Char *s, int len)
955
{
956
    if (!s || len <= 0 || mLastName.empty())
957
        return;
958
 
76 andreas 959
    mContent.append(s, len);
74 andreas 960
}
75 andreas 961
 
962
int XMLCALL TExpat::cp1250_encoding_handler(void *, const XML_Char *encoding, XML_Encoding *info)
963
{
964
    if (!info)
965
        return XML_STATUS_ERROR;
966
 
967
    if (encoding && strcmp(encoding, "CP1250") != 0)
968
    {
969
        MSG_ERROR("Invalid encoding handler (" << encoding << ")");
970
        TError::setError();
971
        return XML_STATUS_ERROR;
972
    }
973
 
974
    memset(info, 0, sizeof(XML_Encoding));
975
    createCP1250Encoding(info);
976
    return XML_STATUS_OK;
977
}