Line data Source code
1 : /**
2 : * @file
3 : *
4 : * @brief Utility functions used in the xerces plugin
5 : *
6 : * Provides unique pointers that act as a bridge between XMLCh and std::string
7 : * Provides a general XercesPluginException
8 : *
9 : * @copyright BSD License (see LICENSE.md or https://www.libelektra.org)
10 : */
11 :
12 : #ifndef ELEKTRA_PLUGIN_XERCES_UTIL_H
13 : #define ELEKTRA_PLUGIN_XERCES_UTIL_H
14 :
15 : #include <memory>
16 : #include <xercesc/util/TransService.hpp>
17 : #include <xercesc/util/XMLString.hpp>
18 :
19 : namespace xerces
20 : {
21 :
22 : template <typename T>
23 : struct XercesDeleter
24 : {
25 : void operator() (T * ptr) const
26 : {
27 37 : ptr->release ();
28 : }
29 : };
30 :
31 : template <>
32 : struct XercesDeleter<XMLCh>
33 : {
34 : void operator() (XMLCh * ptr) const
35 : {
36 401 : XERCES_CPP_NAMESPACE::XMLString::release (&ptr);
37 : }
38 : };
39 :
40 : template <>
41 : struct XercesDeleter<char>
42 : {
43 : void operator() (char * ptr) const
44 : {
45 4528 : XERCES_CPP_NAMESPACE::XMLString::release (&ptr);
46 : }
47 : };
48 :
49 : template <typename T>
50 : using XercesPtr = std::unique_ptr<T, XercesDeleter<T>>;
51 :
52 401 : inline XercesPtr<XMLCh> toXMLCh (std::string const & str)
53 : {
54 : // XMLByte required by TranscodeFromStr is an unsigned char * but basically they can be used equivalently
55 : return XercesPtr<XMLCh> (
56 1604 : XERCES_CPP_NAMESPACE::TranscodeFromStr (reinterpret_cast<const XMLByte *> (str.c_str ()), str.size (), "UTF-8").adopt ());
57 : }
58 :
59 4528 : inline XercesPtr<char> toCStr (XMLCh const * xmlCh)
60 : {
61 : // XMLByte returned by TranscodeToStr is an unsigned char * but basically they can be used equivalently
62 13584 : return XercesPtr<char> (reinterpret_cast<char *> (XERCES_CPP_NAMESPACE::TranscodeToStr (xmlCh, "UTF-8").adopt ()));
63 : }
64 :
65 4528 : inline std::string toStr (XMLCh const * xmlCh)
66 : {
67 22640 : return std::string (toCStr (xmlCh).get ());
68 : }
69 :
70 : #define asXMLCh(str) toXMLCh (str).get ()
71 : #define asCStr(str) toCStr (str).get ()
72 :
73 : class XercesPluginException : public std::exception
74 : {
75 : public:
76 9 : explicit XercesPluginException (std::string const & m) : msg (m)
77 : {
78 3 : }
79 3 : ~XercesPluginException () throw ()
80 6 : {
81 3 : }
82 3 : const char * what () const throw ()
83 : {
84 6 : return msg.c_str ();
85 : }
86 :
87 : private:
88 : std::string msg;
89 : };
90 : } // namespace xerces
91 :
92 : #define ELEKTRA_XERCES_ORIGINAL_ROOT_NAME "xerces/rootname"
93 :
94 : #endif
|