CMS 3D CMS Logo

XMLUtils.h
Go to the documentation of this file.
1 #ifndef GeneratorInterface_LHEInterface_XMLUtils_h
2 #define GeneratorInterface_LHEInterface_XMLUtils_h
3 
4 #include <iostream>
5 #include <string>
6 #include <memory>
7 #include <vector>
8 
9 #include <xercesc/util/XMLString.hpp>
10 #include <xercesc/util/XMLUni.hpp>
11 #include <xercesc/util/XMLChar.hpp>
12 #include <xercesc/util/BinInputStream.hpp>
13 #include <xercesc/framework/XMLPScanToken.hpp>
14 #include <xercesc/sax/InputSource.hpp>
15 #include <xercesc/sax2/DefaultHandler.hpp>
16 #include <xercesc/sax2/SAX2XMLReader.hpp>
17 #include <lzma.h>
18 
19 class Storage;
20 
21 namespace lhef {
22 
23  class StorageWrap {
24  public:
25  StorageWrap(std::unique_ptr<Storage> storage);
26  ~StorageWrap();
27 
28  Storage *operator->() { return storage.get(); }
29  const Storage *operator->() const { return storage.get(); }
30 
31  private:
32  std::unique_ptr<Storage> storage;
33  };
34 
35  class XMLDocument {
36  public:
37  class Handler : public XERCES_CPP_NAMESPACE_QUALIFIER DefaultHandler {};
38 
39  XMLDocument(std::unique_ptr<std::istream> &in, Handler &handler);
40  XMLDocument(std::unique_ptr<StorageWrap> &in, Handler &handler);
41  virtual ~XMLDocument();
42 
43  bool parse();
44 
45  static std::shared_ptr<void> platformHandle() { return std::make_shared<XercesPlatform>(); }
46 
47  private:
49  public:
51  ~XercesPlatform();
52 
53  private:
54  // do not make any kind of copies
55  XercesPlatform(const XercesPlatform &orig) = delete;
56  XercesPlatform &operator=(const XercesPlatform &orig) = delete;
57 
58  static unsigned int instances;
59  };
60 
61  void init(Handler &handler);
62 
63  std::unique_ptr<XercesPlatform> platform;
64 
65  std::unique_ptr<XERCES_CPP_NAMESPACE_QUALIFIER InputSource> source;
66  std::unique_ptr<XERCES_CPP_NAMESPACE_QUALIFIER SAX2XMLReader> parser;
67 
69 
70  bool done;
71  };
72 
73  class XMLSimpleStr {
74  public:
75  XMLSimpleStr(const XMLCh *str) : string(XERCES_CPP_NAMESPACE_QUALIFIER XMLString::transcode(str)) {}
76 
78 
79  inline operator const char *() const { return string; }
80 
81  inline static bool isAllSpaces(const XMLCh *str, unsigned int length) {
82  return XERCES_CPP_NAMESPACE_QUALIFIER XMLChar1_0::isAllSpaces(str, length);
83  }
84 
85  inline static bool isSpace(XMLCh ch) { return XERCES_CPP_NAMESPACE_QUALIFIER XMLChar1_0::isWhitespace(ch); }
86 
87  private:
88  char *string;
89  };
90 
91  class XMLUniStr {
92  public:
93  XMLUniStr(const char *str) : unicode(XERCES_CPP_NAMESPACE_QUALIFIER XMLString::transcode(str)) {}
94 
96 
97  operator const XMLCh *() const { return unicode; }
98 
99  private:
100  XMLCh *unicode;
101  };
102 
103  template <typename T>
105  public:
106  typedef typename T::Stream_t Stream_t;
107 
108  XMLInputSourceWrapper(std::unique_ptr<Stream_t> &obj) : obj(std::move(obj)) {}
110 
111  XERCES_CPP_NAMESPACE_QUALIFIER BinInputStream *makeStream() const override { return new T(*obj); }
112 
113  private:
114  std::unique_ptr<Stream_t> obj;
115  };
116 
117  class CBInputStream : public XERCES_CPP_NAMESPACE_QUALIFIER BinInputStream {
118  public:
119  class Reader {
120  public:
121  virtual ~Reader();
122  virtual const std::string &data() = 0;
123  };
124 
125  typedef Reader Stream_t;
126 
128  ~CBInputStream() override;
129 
130  XMLFilePos curPos() const override { return pos; }
131 
132  XMLSize_t readBytes(XMLByte *const buf, const XMLSize_t size) override;
133 
134  const XMLCh *getContentType() const override { return nullptr; }
135 
136  private:
139  unsigned int pos;
140  };
141 
142  class STLInputStream : public XERCES_CPP_NAMESPACE_QUALIFIER BinInputStream {
143  public:
144  typedef std::istream Stream_t;
145 
146  STLInputStream(std::istream &in);
147  ~STLInputStream() override;
148 
149  XMLFilePos curPos() const override { return pos; }
150 
151  XMLSize_t readBytes(XMLByte *const buf, const XMLSize_t size) override;
152 
153  const XMLCh *getContentType() const override { return nullptr; }
154 
155  private:
156  std::istream &in;
157  unsigned int pos;
158  };
159 
160  class StorageInputStream : public XERCES_CPP_NAMESPACE_QUALIFIER BinInputStream {
161  public:
163 
165  ~StorageInputStream() override;
166 
167  XMLFilePos curPos() const override { return pos; }
168 
169  XMLSize_t readBytes(XMLByte *const buf, const XMLSize_t size) override;
170 
171  const XMLCh *getContentType() const override { return nullptr; }
172 
173  private:
175  unsigned int pos;
176  lzma_stream lstr;
178  unsigned int lasttotal_;
179 
180  unsigned int buffLoc_ = 0, buffTotal_ = 0;
181  std::vector<uint8_t> buffer_;
182  static constexpr unsigned bufferSize_ = 16 * 1024 * 1024;
183  };
184 
188 
189 } // namespace lhef
190 
191 #endif // GeneratorInterface_LHEInterface_XMLUtils_h
size
Write out results.
std::unique_ptr< Stream_t > obj
Definition: XMLUtils.h:114
XMLFilePos curPos() const override
Definition: XMLUtils.h:167
unsigned int pos
Definition: XMLUtils.h:157
XMLInputSourceWrapper< StorageInputStream > StorageInputSource
Definition: XMLUtils.h:187
XMLInputSourceWrapper< STLInputStream > STLInputSource
Definition: XMLUtils.h:186
std::istream Stream_t
Definition: XMLUtils.h:144
const XMLCh * getContentType() const override
Definition: XMLUtils.h:134
XMLFilePos curPos() const override
Definition: XMLUtils.h:130
StorageWrap(std::unique_ptr< Storage > storage)
Definition: XMLUtils.cc:25
std::string buffer
Definition: XMLUtils.h:138
XMLInputSourceWrapper< CBInputStream > CBInputSource
Definition: XMLUtils.h:185
int init
Definition: HydjetWrapper.h:64
static bool isSpace(XMLCh ch)
Definition: XMLUtils.h:85
static unsigned int instances
Definition: XMLUtils.h:58
std::unique_ptr< XercesPlatform > platform
Definition: XMLUtils.h:63
#define XERCES_CPP_NAMESPACE_QUALIFIER
Definition: LHERunInfo.h:16
unsigned int lasttotal_
Definition: XMLUtils.h:178
std::istream & in
Definition: XMLUtils.h:156
XERCES_CPP_NAMESPACE_QUALIFIER XMLPScanToken token
Definition: XMLUtils.h:68
XERCES_CPP_NAMESPACE_QUALIFIER BinInputStream * makeStream() const override
Definition: XMLUtils.h:111
Storage * operator->()
Definition: XMLUtils.h:28
static bool isAllSpaces(const XMLCh *str, unsigned int length)
Definition: XMLUtils.h:81
std::unique_ptr< XERCES_CPP_NAMESPACE_QUALIFIER SAX2XMLReader > parser
Definition: XMLUtils.h:66
static std::shared_ptr< void > platformHandle()
Definition: XMLUtils.h:45
XMLInputSourceWrapper(std::unique_ptr< Stream_t > &obj)
Definition: XMLUtils.h:108
unsigned int pos
Definition: XMLUtils.h:139
~XMLInputSourceWrapper() override
Definition: XMLUtils.h:109
XMLCh * unicode
Definition: XMLUtils.h:100
std::unique_ptr< XERCES_CPP_NAMESPACE_QUALIFIER InputSource > source
Definition: XMLUtils.h:65
StorageWrap & in
Definition: XMLUtils.h:174
StorageWrap Stream_t
Definition: XMLUtils.h:162
const XMLCh * getContentType() const override
Definition: XMLUtils.h:171
def parse(path, config)
Definition: dumpparser.py:13
const XMLCh * getContentType() const override
Definition: XMLUtils.h:153
XMLSimpleStr(const XMLCh *str)
Definition: XMLUtils.h:75
XMLUniStr(const char *str)
Definition: XMLUtils.h:93
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
const Storage * operator->() const
Definition: XMLUtils.h:29
std::unique_ptr< Storage > storage
Definition: XMLUtils.h:32
XMLFilePos curPos() const override
Definition: XMLUtils.h:149
std::vector< uint8_t > buffer_
Definition: XMLUtils.h:181
#define str(s)
long double T
def move(src, dest)
Definition: eostools.py:511
#define constexpr
Helper class to handle FWLite file input sources.