Welcome to mirror list, hosted at ThFree Co, Russian Federation.

parse_xml.hpp « coding - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b5ca32b9042754ef69be1e29aa7b90b2fcfa2f86 (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
#pragma once

#include "internal/xmlparser.h"
#include "source.hpp"

#include "../base/assert.hpp"


static const size_t KMaxXMLFileBufferSize = 16384;

template <typename XMLDispatcherT, typename SourceT>
bool ParseXML(SourceT & source, XMLDispatcherT & dispatcher, bool useCharData = false)
{
  // Create the parser
  XmlParser<XMLDispatcherT> parser(dispatcher, useCharData);
  if (!parser.Create())
    return false;

  try
  {
    while (true)
    {
      char * buffer = static_cast<char *>(parser.GetBuffer(KMaxXMLFileBufferSize));
      CHECK(buffer, ());
      source.Read(buffer, KMaxXMLFileBufferSize);
      if (!parser.ParseBuffer(KMaxXMLFileBufferSize, false))
        return false;
    }
  }
  catch (SourceOutOfBoundsException & e)
  {
    size_t const toRead = e.BytesRead();
    // 0 - means Reader overflow (see ReaderSource::Read)
    if (toRead == 0 || !parser.ParseBuffer(toRead, true))
      return false;
  }

  return true;
}