This source file includes following definitions.
- CreateNode
- CreateNode
- CreateComment
- GetParseError
- ToXML
- FromXML
- ToXML
- FromXML
- ToXML
- ToXML
- ToXML
- ToXML
- FromXML
- FromXML
- FromXML
- FromXML
- LoadXML
- Load
- Load
- Save
- MakeDoc
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 namespace jmmcg { namespace NTUtils { namespace XML {
36
37 inline MSXML2::IXMLDOMNodePtr __fastcall
38 CreateNode(const node_types type,const jmmcg::tchar *node_name,const MSXML2::IXMLDOMDocumentPtr &doc,const jmmcg::tchar *xml_ns) {
39 static const jmmcg::tchar * const node_types_names[]={
40 _T("attribute"),
41 _T("document"),
42 _T("element"),
43 _T("text")
44 };
45 return doc->createNode(node_types_names[type],node_name,xml_ns);
46 }
47
48 inline MSXML2::IXMLDOMNodePtr __fastcall
49 CreateNode(const node_types type,const jmmcg::tchar *node_name,const MSXML2::IXMLDOMDocumentPtr &doc,const jmmcg::tchar *xml_ns,const MSXML2::IXMLDOMNodePtr &node) {
50 return node->appendChild(CreateNode(type,node_name,doc,xml_ns));
51 }
52
53 inline MSXML2::IXMLDOMNodePtr __fastcall
54 CreateComment(const jmmcg::tchar *node_name,const jmmcg::tchar *comment,const MSXML2::IXMLDOMDocumentPtr &doc,const jmmcg::tchar *xml_ns,const MSXML2::IXMLDOMNodePtr &node) {
55 const MSXML2::IXMLDOMNodePtr comment_node(CreateNode(element,node_name,doc,xml_ns,node));
56 const MSXML2::IXMLDOMTextPtr text(CreateNode(text,node_name,doc,xml_ns,comment_node));
57 text->nodeValue=comment;
58 return text;
59 }
60
61 inline jmmcg::tstring __fastcall
62 GetParseError(const MSXML2::IXMLDOMDocumentPtr &doc) {
63 return jmmcg::tstring(static_cast<const jmmcg::tchar *>(doc->parseError->reason));
64 }
65
66
67
68 inline void __fastcall
69 ToXML(const MSXML2::IXMLDOMDocumentPtr &doc,const MSXML2::IXMLDOMNodePtr &n,const POINT &pt,const jmmcg::tchar *xml_ns) {
70 try {
71 const MSXML2::IXMLDOMElementPtr node(CreateNode(element,_T("point"),doc,xml_ns,n));
72 node->setAttribute(_T("x"),pt.x);
73 node->setAttribute(_T("y"),pt.y);
74 } catch (const _com_error &err) {
75 jmmcg::info::function info(__LINE__,__PRETTY_FUNCTION__,typeid(void),jmmcg::info::function::argument(_T("const MSXML2::IXMLDOMDocumentPtr &"),jmmcg::tostring(doc)));
76 info.add_arg(_T("const MSXML2::IXMLDOMNodePtr &"),jmmcg::tostring(n));
77 info.add_arg(_T("const POINT *"),jmmcg::tostring(&pt));
78 info.add_arg(_T("const jmmcg::tchar *"),xml_ns);
79 throw exception(err.ErrorMessage(),info,JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $")));
80 }
81 }
82
83 inline void __fastcall
84 FromXML(const MSXML2::IXMLDOMNodePtr &n,POINT &pt) {
85 try {
86 const MSXML2::IXMLDOMNamedNodeMapPtr attribs(n->selectSingleNode(_T("point"))->attributes);
87 jmmcg::fromstring(static_cast<const jmmcg::tchar *>(attribs->getNamedItem(_T("x"))->text),pt.x);
88 jmmcg::fromstring(static_cast<const jmmcg::tchar *>(attribs->getNamedItem(_T("y"))->text),pt.y);
89 } catch (const _com_error &err) {
90 jmmcg::info::function info(__LINE__,__PRETTY_FUNCTION__,typeid(void),jmmcg::info::function::argument(_T("const MSXML2::IXMLDOMNodePtr &"),jmmcg::tostring(n)));
91 info.add_arg(_T("const POINT *"),jmmcg::tostring(&pt));
92 throw exception(err.ErrorMessage(),info,JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $")));
93 }
94 }
95
96 inline void __fastcall
97 ToXML(const MSXML2::IXMLDOMDocumentPtr &doc,const MSXML2::IXMLDOMNodePtr &n,const RECT &rect,const jmmcg::tchar *xml_ns) {
98 try {
99 const MSXML2::IXMLDOMElementPtr node(CreateNode(element,_T("rectangle"),doc,xml_ns,n));
100 node->setAttribute(_T("top"),rect.top);
101 node->setAttribute(_T("left"),rect.left);
102 node->setAttribute(_T("bottom"),rect.bottom);
103 node->setAttribute(_T("right"),rect.right);
104 } catch (const _com_error &err) {
105 jmmcg::info::function info(__LINE__,__PRETTY_FUNCTION__,typeid(void),jmmcg::info::function::argument(_T("const MSXML2::IXMLDOMDocumentPtr &"),jmmcg::tostring(doc)));
106 info.add_arg(_T("const MSXML2::IXMLDOMNodePtr &"),jmmcg::tostring(n));
107 info.add_arg(_T("const RECT *"),jmmcg::tostring(&rect));
108 info.add_arg(_T("const jmmcg::tchar *"),xml_ns);
109 throw exception(err.ErrorMessage(),info,JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $")));
110 }
111 }
112
113 inline void __fastcall
114 FromXML(const MSXML2::IXMLDOMNodePtr &n,RECT &rect) {
115 try {
116 const MSXML2::IXMLDOMNamedNodeMapPtr attribs(n->selectSingleNode(_T("rectangle"))->attributes);
117 jmmcg::fromstring(static_cast<const jmmcg::tchar *>(attribs->getNamedItem(_T("top"))->text),rect.top);
118 jmmcg::fromstring(static_cast<const jmmcg::tchar *>(attribs->getNamedItem(_T("left"))->text),rect.left);
119 jmmcg::fromstring(static_cast<const jmmcg::tchar *>(attribs->getNamedItem(_T("bottom"))->text),rect.bottom);
120 jmmcg::fromstring(static_cast<const jmmcg::tchar *>(attribs->getNamedItem(_T("right"))->text),rect.right);
121 } catch (const _com_error &err) {
122 jmmcg::info::function info(__LINE__,__PRETTY_FUNCTION__,typeid(void),jmmcg::info::function::argument(_T("const MSXML2::IXMLDOMNodePtr &"),jmmcg::tostring(n)));
123 info.add_arg(_T("const RECT *"),jmmcg::tostring(&rect));
124 throw exception(err.ErrorMessage(),info,JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $")));
125 }
126 }
127
128 template<typename Value> inline void __fastcall
129 ToXML(const MSXML2::IXMLDOMDocumentPtr &doc,const MSXML2::IXMLDOMNodePtr &n,const jmmcg::tchar *colln_name,const std::vector<Value> &colln,const jmmcg::tchar *xml_ns) {
130 try {
131 const MSXML2::IXMLDOMNodePtr colln_node(CreateNode(element,colln_name,doc,xml_ns,n));
132 for (std::vector<Value>::const_iterator i(colln.begin());i!=colln.end();++i) {
133 const MSXML2::IXMLDOMNodePtr node(CreateNode(element,_T("node"),doc,xml_ns,colln_node));
134 i->ToXML(doc,node);
135 }
136 } catch (const _com_error &err) {
137 jmmcg::info::function info(__LINE__,__PRETTY_FUNCTION__,typeid(void),jmmcg::info::function::argument(_T("const MSXML2::IXMLDOMDocumentPtr &"),jmmcg::tostring(doc)));
138 info.add_arg(_T("const MSXML2::IXMLDOMNodePtr &"),jmmcg::tostring(n));
139 info.add_arg(_T("const jmmcg::tchar *"),colln_name);
140 info.add_arg(_T("const std::vector<Value> *"),jmmcg::tostring(&colln));
141 info.add_arg(_T("const jmmcg::tchar *"),xml_ns);
142 throw exception(err.ErrorMessage(),info,JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $")));
143 }
144 }
145
146 template<> inline void __fastcall
147 ToXML(const MSXML2::IXMLDOMDocumentPtr &doc,const MSXML2::IXMLDOMNodePtr &n,const jmmcg::tchar *colln_name,const std::vector<double> &colln,const jmmcg::tchar *xml_ns) {
148 try {
149 const MSXML2::IXMLDOMNodePtr colln_node(CreateNode(element,colln_name,doc,xml_ns,n));
150 for (std::vector<double>::const_iterator i(colln.begin());i!=colln.end();++i) {
151 const MSXML2::IXMLDOMElementPtr node(CreateNode(element,_T("node"),doc,xml_ns,colln_node));
152 node->setAttribute(_T("value"),*i);
153 }
154 } catch (const _com_error &err) {
155 jmmcg::info::function info(__LINE__,__PRETTY_FUNCTION__,typeid(void),jmmcg::info::function::argument(_T("const MSXML2::IXMLDOMDocumentPtr &"),jmmcg::tostring(doc)));
156 info.add_arg(_T("const MSXML2::IXMLDOMNodePtr &"),jmmcg::tostring(n));
157 info.add_arg(_T("const jmmcg::tchar *"),colln_name);
158 info.add_arg(_T("const std::vector<double> *"),jmmcg::tostring(&colln));
159 info.add_arg(_T("const jmmcg::tchar *"),xml_ns);
160 throw exception(err.ErrorMessage(),info,JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $")));
161 }
162 }
163
164 template<> inline void __fastcall
165 ToXML(const MSXML2::IXMLDOMDocumentPtr &doc,const MSXML2::IXMLDOMNodePtr &n,const jmmcg::tchar *colln_name,const std::vector<unsigned long> &colln,const jmmcg::tchar *xml_ns) {
166 try {
167 const MSXML2::IXMLDOMNodePtr colln_node(CreateNode(element,colln_name,doc,xml_ns,n));
168 for (std::vector<unsigned long>::const_iterator i(colln.begin());i!=colln.end();++i) {
169 const MSXML2::IXMLDOMElementPtr node(CreateNode(element,_T("node"),doc,xml_ns,colln_node));
170 node->setAttribute(_T("value"),static_cast<long>(*i));
171 }
172 } catch (const _com_error &err) {
173 jmmcg::info::function info(__LINE__,__PRETTY_FUNCTION__,typeid(void),jmmcg::info::function::argument(_T("const MSXML2::IXMLDOMDocumentPtr &"),jmmcg::tostring(doc)));
174 info.add_arg(_T("const MSXML2::IXMLDOMNodePtr &"),jmmcg::tostring(n));
175 info.add_arg(_T("const jmmcg::tchar *"),colln_name);
176 info.add_arg(_T("const std::vector<unsigned long> *"),jmmcg::tostring(&colln));
177 info.add_arg(_T("const jmmcg::tchar *"),xml_ns);
178 throw exception(err.ErrorMessage(),info,JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $")));
179 }
180 }
181
182 template<> inline void __fastcall
183 ToXML(const MSXML2::IXMLDOMDocumentPtr &doc,const MSXML2::IXMLDOMNodePtr &n,const jmmcg::tchar *colln_name,const std::vector<CPoint> &colln,const jmmcg::tchar *xml_ns) {
184 try {
185 const MSXML2::IXMLDOMNodePtr colln_node(CreateNode(element,colln_name,doc,xml_ns,n));
186 for (std::vector<CPoint>::const_iterator i(colln.begin());i!=colln.end();++i) {
187 const MSXML2::IXMLDOMNodePtr node(CreateNode(element,_T("node"),doc,xml_ns,colln_node));
188 ToXML(doc,node,*i,xml_ns);
189 }
190 } catch (const _com_error &err) {
191 jmmcg::info::function info(__LINE__,__PRETTY_FUNCTION__,typeid(void),jmmcg::info::function::argument(_T("const MSXML2::IXMLDOMDocumentPtr &"),jmmcg::tostring(doc)));
192 info.add_arg(_T("const MSXML2::IXMLDOMNodePtr &"),jmmcg::tostring(n));
193 info.add_arg(_T("const jmmcg::tchar *"),colln_name);
194 info.add_arg(_T("const std::vector<CPoint> *"),jmmcg::tostring(&colln));
195 info.add_arg(_T("const jmmcg::tchar *"),xml_ns);
196 throw exception(err.ErrorMessage(),info,JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $")));
197 }
198 }
199
200 template<typename Value> inline void __fastcall
201 FromXML(const MSXML2::IXMLDOMNodePtr &n,const jmmcg::tstring &colln_name,std::vector<Value> &colln) {
202 try {
203 assert(colln.empty());
204 const MSXML2::IXMLDOMNodeListPtr nodes(n->selectNodes((colln_name+_T("/*")).c_str()));
205 for (long i=0;i<nodes->length;++i) {
206 colln.push_back(Value::FromXML(nodes->item[i]));
207 }
208 } catch (const _com_error &err) {
209 jmmcg::info::function info(__LINE__,__PRETTY_FUNCTION__,typeid(void),jmmcg::info::function::argument(_T("const MSXML2::IXMLDOMNodePtr &"),jmmcg::tostring(n)));
210 info.add_arg(_T("const jmmcg::tchar *"),colln_name);
211 info.add_arg(_T("const std::vector<Value> *"),jmmcg::tostring(&colln));
212 throw exception(err.ErrorMessage(),info,JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $")));
213 }
214 }
215
216 template<> inline void __fastcall
217 FromXML(const MSXML2::IXMLDOMNodePtr &n,const jmmcg::tstring &colln_name,std::vector<double> &colln) {
218 try {
219 assert(colln.empty());
220 const MSXML2::IXMLDOMNodeListPtr nodes(n->selectNodes((colln_name+_T("/node/@value")).c_str()));
221 for (long i=0;i<nodes->length;++i) {
222 double tmp;
223 jmmcg::fromstring(static_cast<const jmmcg::tchar *>(nodes->item[i]->text),tmp);
224 colln.push_back(tmp);
225 }
226 } catch (const _com_error &err) {
227 jmmcg::info::function info(__LINE__,__PRETTY_FUNCTION__,typeid(void),jmmcg::info::function::argument(_T("const MSXML2::IXMLDOMNodePtr &"),jmmcg::tostring(n)));
228 info.add_arg(_T("const jmmcg::tchar *"),colln_name);
229 info.add_arg(_T("const std::vector<double> *"),jmmcg::tostring(&colln));
230 throw exception(err.ErrorMessage(),info,JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $")));
231 }
232 }
233
234 template<> inline void __fastcall
235 FromXML(const MSXML2::IXMLDOMNodePtr &n,const jmmcg::tstring &colln_name,std::vector<unsigned long> &colln) {
236 try {
237 assert(colln.empty());
238 const MSXML2::IXMLDOMNodeListPtr nodes(n->selectNodes((colln_name+_T("/node/@value")).c_str()));
239 for (long i=0;i<nodes->length;++i) {
240 unsigned long tmp;
241 jmmcg::fromstring(static_cast<const jmmcg::tchar *>(nodes->item[i]->text),tmp);
242 colln.push_back(tmp);
243 }
244 } catch (const _com_error &err) {
245 jmmcg::info::function info(__LINE__,__PRETTY_FUNCTION__,typeid(void),jmmcg::info::function::argument(_T("const MSXML2::IXMLDOMNodePtr &"),jmmcg::tostring(n)));
246 info.add_arg(_T("const jmmcg::tchar *"),colln_name);
247 info.add_arg(_T("const std::vector<unsigned long> *"),jmmcg::tostring(&colln));
248 throw exception(err.ErrorMessage(),info,JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $")));
249 }
250 }
251
252 template<> inline void __fastcall
253 FromXML(const MSXML2::IXMLDOMNodePtr &n,const jmmcg::tstring &colln_name,std::vector<CPoint> &colln) {
254 try {
255 assert(colln.empty());
256 const MSXML2::IXMLDOMNodeListPtr nodes(n->selectNodes((colln_name+_T("/*")).c_str()));
257 for (long i=0;i<nodes->length;++i) {
258 CPoint val;
259 FromXML(nodes->item[i],val);
260 colln.push_back(val);
261 }
262 } catch (const _com_error &err) {
263 jmmcg::info::function info(__LINE__,__PRETTY_FUNCTION__,typeid(void),jmmcg::info::function::argument(_T("const MSXML2::IXMLDOMNodePtr &"),jmmcg::tostring(n)));
264 info.add_arg(_T("const jmmcg::tchar *"),colln_name);
265 info.add_arg(_T("const std::vector<CPoint> *"),jmmcg::tostring(&colln));
266 throw exception(err.ErrorMessage(),info,JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $")));
267 }
268 }
269
270
271
272 inline __stdcall
273 DocWrapper::DocWrapper(void)
274 : doc(MakeDoc()) {
275 doc->appendChild(doc->createProcessingInstruction(_T("xml"),_T("version='1.0'")));
276 doc->async=false;
277 }
278
279 inline __stdcall
280 DocWrapper::DocWrapper(const DocWrapper &d)
281 : doc(d.Doc()) {
282 doc->appendChild(doc->createProcessingInstruction(_T("xml"),_T("version='1.0'")));
283 doc->async=false;
284 }
285
286 inline __stdcall
287 DocWrapper::~DocWrapper(void) {
288 }
289
290 inline const MSXML2::IXMLDOMDocumentPtr & __fastcall
291 DocWrapper::Doc(void) const noexcept(true) {
292 return doc;
293 }
294
295 inline void __fastcall
296 DocWrapper::LoadXML(const jmmcg::tchar *xml) {
297 if (doc->loadXML(xml)==VARIANT_FALSE) {
298 throw exception(
299 GetParseError(doc),
300 jmmcg::info::function(__LINE__,__PRETTY_FUNCTION__,typeid(&DocWrapper::LoadXML),jmmcg::info::function::argument(_T("const jmmcg::tchar *"),xml)),
301 JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $"))
302 );
303 }
304 }
305
306 inline void __fastcall
307 DocWrapper::Load(const jmmcg::tchar *filename) {
308 if (doc->load(filename)==VARIANT_FALSE) {
309 throw exception(
310 GetParseError(doc),
311 jmmcg::info::function(__LINE__,__PRETTY_FUNCTION__,typeid(&DocWrapper::Load),jmmcg::info::function::argument(_T("const jmmcg::tchar *"),filename)),
312 JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $"))
313 );
314 }
315 }
316
317 inline void __fastcall
318 DocWrapper::Load(const IStreamPtr &file_ptr) {
319 IUnknown *itf;
320 const HRESULT hr=const_cast<IStreamPtr &>(file_ptr).QueryInterface(IID_IUnknown,itf);
321 if (FAILED(hr) || doc->load(itf)==VARIANT_FALSE) {
322 throw exception(
323 GetParseError(doc),
324 jmmcg::info::function(__LINE__,__PRETTY_FUNCTION__,typeid(&DocWrapper::Load),jmmcg::info::function::argument(_T("const IStreamPtr &"),jmmcg::tostring(file_ptr))),
325 JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $"))
326 );
327 }
328 }
329
330 inline void __fastcall
331 DocWrapper::Save(const jmmcg::tchar *filename) {
332
333 if (doc->save(filename)!=S_OK) {
334 throw exception(
335 GetParseError(doc),
336 jmmcg::info::function(__LINE__,__PRETTY_FUNCTION__,typeid(&DocWrapper::Save),jmmcg::info::function::argument(_T("const jmmcg::tchar *"),filename)),
337 JMMCG_REVISION_HDR(_T("$Header: svn+ssh://jmmcg@svn.code.sf.net/p/libjmmcg/code/trunk/libjmmcg/experimental/NT-based/NTSpecific/XML_Stuff%20impl.hpp 2055 2017-05-13 19:35:47Z jmmcg $"))
338 );
339 }
340 }
341
342 inline MSXML2::IXMLDOMDocumentPtr __fastcall
343 DocWrapper::MakeDoc(void) {
344 return MSXML2::IXMLDOMDocumentPtr(__uuidof(MSXML2::DOMDocument));
345 }
346
347 } } }