xref: /aosp_15_r20/external/parameter-framework/upstream/xmlserializer/XmlElement.cpp (revision c33452fb792a5495ec310a9626f2638b053af5dd)
1*c33452fbSAndroid Build Coastguard Worker /*
2*c33452fbSAndroid Build Coastguard Worker  * Copyright (c) 2011-2014, Intel Corporation
3*c33452fbSAndroid Build Coastguard Worker  * All rights reserved.
4*c33452fbSAndroid Build Coastguard Worker  *
5*c33452fbSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without modification,
6*c33452fbSAndroid Build Coastguard Worker  * are permitted provided that the following conditions are met:
7*c33452fbSAndroid Build Coastguard Worker  *
8*c33452fbSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright notice, this
9*c33452fbSAndroid Build Coastguard Worker  * list of conditions and the following disclaimer.
10*c33452fbSAndroid Build Coastguard Worker  *
11*c33452fbSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright notice,
12*c33452fbSAndroid Build Coastguard Worker  * this list of conditions and the following disclaimer in the documentation and/or
13*c33452fbSAndroid Build Coastguard Worker  * other materials provided with the distribution.
14*c33452fbSAndroid Build Coastguard Worker  *
15*c33452fbSAndroid Build Coastguard Worker  * 3. Neither the name of the copyright holder nor the names of its contributors
16*c33452fbSAndroid Build Coastguard Worker  * may be used to endorse or promote products derived from this software without
17*c33452fbSAndroid Build Coastguard Worker  * specific prior written permission.
18*c33452fbSAndroid Build Coastguard Worker  *
19*c33452fbSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20*c33452fbSAndroid Build Coastguard Worker  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21*c33452fbSAndroid Build Coastguard Worker  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22*c33452fbSAndroid Build Coastguard Worker  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23*c33452fbSAndroid Build Coastguard Worker  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24*c33452fbSAndroid Build Coastguard Worker  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25*c33452fbSAndroid Build Coastguard Worker  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26*c33452fbSAndroid Build Coastguard Worker  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*c33452fbSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28*c33452fbSAndroid Build Coastguard Worker  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*c33452fbSAndroid Build Coastguard Worker  */
30*c33452fbSAndroid Build Coastguard Worker #include "XmlElement.h"
31*c33452fbSAndroid Build Coastguard Worker #include "PfError.hpp"
32*c33452fbSAndroid Build Coastguard Worker #include <libxml/tree.h>
33*c33452fbSAndroid Build Coastguard Worker #include "convert.hpp"
34*c33452fbSAndroid Build Coastguard Worker #include <stdlib.h>
35*c33452fbSAndroid Build Coastguard Worker #include <stdexcept>
36*c33452fbSAndroid Build Coastguard Worker 
37*c33452fbSAndroid Build Coastguard Worker using std::string;
38*c33452fbSAndroid Build Coastguard Worker 
CXmlElement(_xmlNode * pXmlElement)39*c33452fbSAndroid Build Coastguard Worker CXmlElement::CXmlElement(_xmlNode *pXmlElement) : _pXmlElement(pXmlElement)
40*c33452fbSAndroid Build Coastguard Worker {
41*c33452fbSAndroid Build Coastguard Worker }
42*c33452fbSAndroid Build Coastguard Worker 
CXmlElement()43*c33452fbSAndroid Build Coastguard Worker CXmlElement::CXmlElement() : _pXmlElement(nullptr)
44*c33452fbSAndroid Build Coastguard Worker {
45*c33452fbSAndroid Build Coastguard Worker }
46*c33452fbSAndroid Build Coastguard Worker 
setXmlElement(_xmlNode * pXmlElement)47*c33452fbSAndroid Build Coastguard Worker void CXmlElement::setXmlElement(_xmlNode *pXmlElement)
48*c33452fbSAndroid Build Coastguard Worker {
49*c33452fbSAndroid Build Coastguard Worker     _pXmlElement = pXmlElement;
50*c33452fbSAndroid Build Coastguard Worker }
51*c33452fbSAndroid Build Coastguard Worker 
getType() const52*c33452fbSAndroid Build Coastguard Worker string CXmlElement::getType() const
53*c33452fbSAndroid Build Coastguard Worker {
54*c33452fbSAndroid Build Coastguard Worker     return (const char *)_pXmlElement->name;
55*c33452fbSAndroid Build Coastguard Worker }
56*c33452fbSAndroid Build Coastguard Worker 
getPath() const57*c33452fbSAndroid Build Coastguard Worker string CXmlElement::getPath() const
58*c33452fbSAndroid Build Coastguard Worker {
59*c33452fbSAndroid Build Coastguard Worker     string strPathElement = "/" + getType();
60*c33452fbSAndroid Build Coastguard Worker 
61*c33452fbSAndroid Build Coastguard Worker     if (hasAttribute("Name")) {
62*c33452fbSAndroid Build Coastguard Worker 
63*c33452fbSAndroid Build Coastguard Worker         strPathElement += "[@Name=" + getNameAttribute() + "]";
64*c33452fbSAndroid Build Coastguard Worker     }
65*c33452fbSAndroid Build Coastguard Worker 
66*c33452fbSAndroid Build Coastguard Worker     CXmlElement parentElement;
67*c33452fbSAndroid Build Coastguard Worker 
68*c33452fbSAndroid Build Coastguard Worker     if (getParentElement(parentElement)) {
69*c33452fbSAndroid Build Coastguard Worker 
70*c33452fbSAndroid Build Coastguard Worker         // Done
71*c33452fbSAndroid Build Coastguard Worker         return parentElement.getPath() + strPathElement;
72*c33452fbSAndroid Build Coastguard Worker     }
73*c33452fbSAndroid Build Coastguard Worker     return strPathElement;
74*c33452fbSAndroid Build Coastguard Worker }
75*c33452fbSAndroid Build Coastguard Worker 
hasAttribute(const string & strAttributeName) const76*c33452fbSAndroid Build Coastguard Worker bool CXmlElement::hasAttribute(const string &strAttributeName) const
77*c33452fbSAndroid Build Coastguard Worker {
78*c33452fbSAndroid Build Coastguard Worker     return xmlHasProp(_pXmlElement, (const xmlChar *)strAttributeName.c_str()) != nullptr;
79*c33452fbSAndroid Build Coastguard Worker }
80*c33452fbSAndroid Build Coastguard Worker 
81*c33452fbSAndroid Build Coastguard Worker template <>
getAttribute(const string & name,string & value) const82*c33452fbSAndroid Build Coastguard Worker bool CXmlElement::getAttribute<std::string>(const string &name, string &value) const
83*c33452fbSAndroid Build Coastguard Worker {
84*c33452fbSAndroid Build Coastguard Worker     string backup = value;
85*c33452fbSAndroid Build Coastguard Worker     xmlChar *pucXmlValue = xmlGetProp((xmlNode *)_pXmlElement, (const xmlChar *)name.c_str());
86*c33452fbSAndroid Build Coastguard Worker     if (pucXmlValue == nullptr) {
87*c33452fbSAndroid Build Coastguard Worker         value = backup;
88*c33452fbSAndroid Build Coastguard Worker         return false;
89*c33452fbSAndroid Build Coastguard Worker     }
90*c33452fbSAndroid Build Coastguard Worker 
91*c33452fbSAndroid Build Coastguard Worker     value = (const char *)pucXmlValue;
92*c33452fbSAndroid Build Coastguard Worker 
93*c33452fbSAndroid Build Coastguard Worker     xmlFree(pucXmlValue);
94*c33452fbSAndroid Build Coastguard Worker 
95*c33452fbSAndroid Build Coastguard Worker     return true;
96*c33452fbSAndroid Build Coastguard Worker }
97*c33452fbSAndroid Build Coastguard Worker 
98*c33452fbSAndroid Build Coastguard Worker template <typename T>
getAttribute(const std::string & name,T & value) const99*c33452fbSAndroid Build Coastguard Worker bool CXmlElement::getAttribute(const std::string &name, T &value) const
100*c33452fbSAndroid Build Coastguard Worker {
101*c33452fbSAndroid Build Coastguard Worker     std::string rawValue;
102*c33452fbSAndroid Build Coastguard Worker     if (!getAttribute(name, rawValue)) {
103*c33452fbSAndroid Build Coastguard Worker         return false;
104*c33452fbSAndroid Build Coastguard Worker     }
105*c33452fbSAndroid Build Coastguard Worker 
106*c33452fbSAndroid Build Coastguard Worker     T backup = value;
107*c33452fbSAndroid Build Coastguard Worker     if (!convertTo<T>(rawValue, value)) {
108*c33452fbSAndroid Build Coastguard Worker         value = backup;
109*c33452fbSAndroid Build Coastguard Worker         throw PfError("\'" + rawValue + "\' could not be parsed as the requested type.");
110*c33452fbSAndroid Build Coastguard Worker     }
111*c33452fbSAndroid Build Coastguard Worker 
112*c33452fbSAndroid Build Coastguard Worker     return true;
113*c33452fbSAndroid Build Coastguard Worker }
114*c33452fbSAndroid Build Coastguard Worker 
getNameAttribute() const115*c33452fbSAndroid Build Coastguard Worker string CXmlElement::getNameAttribute() const
116*c33452fbSAndroid Build Coastguard Worker {
117*c33452fbSAndroid Build Coastguard Worker     string attribute;
118*c33452fbSAndroid Build Coastguard Worker     getAttribute("Name", attribute);
119*c33452fbSAndroid Build Coastguard Worker     return attribute;
120*c33452fbSAndroid Build Coastguard Worker }
121*c33452fbSAndroid Build Coastguard Worker 
getTextContent() const122*c33452fbSAndroid Build Coastguard Worker string CXmlElement::getTextContent() const
123*c33452fbSAndroid Build Coastguard Worker {
124*c33452fbSAndroid Build Coastguard Worker     xmlChar *pucXmlContent = xmlNodeGetContent(_pXmlElement);
125*c33452fbSAndroid Build Coastguard Worker     if (pucXmlContent == nullptr) {
126*c33452fbSAndroid Build Coastguard Worker         return "";
127*c33452fbSAndroid Build Coastguard Worker     }
128*c33452fbSAndroid Build Coastguard Worker 
129*c33452fbSAndroid Build Coastguard Worker     string strContent((const char *)pucXmlContent);
130*c33452fbSAndroid Build Coastguard Worker 
131*c33452fbSAndroid Build Coastguard Worker     xmlFree(pucXmlContent);
132*c33452fbSAndroid Build Coastguard Worker 
133*c33452fbSAndroid Build Coastguard Worker     return strContent;
134*c33452fbSAndroid Build Coastguard Worker }
135*c33452fbSAndroid Build Coastguard Worker 
getChildElement(const string & strType,CXmlElement & childElement) const136*c33452fbSAndroid Build Coastguard Worker bool CXmlElement::getChildElement(const string &strType, CXmlElement &childElement) const
137*c33452fbSAndroid Build Coastguard Worker {
138*c33452fbSAndroid Build Coastguard Worker     CChildIterator childIterator(*this);
139*c33452fbSAndroid Build Coastguard Worker 
140*c33452fbSAndroid Build Coastguard Worker     while (childIterator.next(childElement)) {
141*c33452fbSAndroid Build Coastguard Worker 
142*c33452fbSAndroid Build Coastguard Worker         if (childElement.getType() == strType) {
143*c33452fbSAndroid Build Coastguard Worker 
144*c33452fbSAndroid Build Coastguard Worker             return true;
145*c33452fbSAndroid Build Coastguard Worker         }
146*c33452fbSAndroid Build Coastguard Worker     }
147*c33452fbSAndroid Build Coastguard Worker     return false;
148*c33452fbSAndroid Build Coastguard Worker }
149*c33452fbSAndroid Build Coastguard Worker 
getChildElement(const string & strType,const string & strNameAttribute,CXmlElement & childElement) const150*c33452fbSAndroid Build Coastguard Worker bool CXmlElement::getChildElement(const string &strType, const string &strNameAttribute,
151*c33452fbSAndroid Build Coastguard Worker                                   CXmlElement &childElement) const
152*c33452fbSAndroid Build Coastguard Worker {
153*c33452fbSAndroid Build Coastguard Worker     CChildIterator childIterator(*this);
154*c33452fbSAndroid Build Coastguard Worker 
155*c33452fbSAndroid Build Coastguard Worker     while (childIterator.next(childElement)) {
156*c33452fbSAndroid Build Coastguard Worker 
157*c33452fbSAndroid Build Coastguard Worker         if ((childElement.getType() == strType) &&
158*c33452fbSAndroid Build Coastguard Worker             (childElement.getNameAttribute() == strNameAttribute)) {
159*c33452fbSAndroid Build Coastguard Worker 
160*c33452fbSAndroid Build Coastguard Worker             return true;
161*c33452fbSAndroid Build Coastguard Worker         }
162*c33452fbSAndroid Build Coastguard Worker     }
163*c33452fbSAndroid Build Coastguard Worker     return false;
164*c33452fbSAndroid Build Coastguard Worker }
165*c33452fbSAndroid Build Coastguard Worker 
getNbChildElements() const166*c33452fbSAndroid Build Coastguard Worker size_t CXmlElement::getNbChildElements() const
167*c33452fbSAndroid Build Coastguard Worker {
168*c33452fbSAndroid Build Coastguard Worker     CXmlElement childElement;
169*c33452fbSAndroid Build Coastguard Worker     size_t uiNbChildren = 0;
170*c33452fbSAndroid Build Coastguard Worker 
171*c33452fbSAndroid Build Coastguard Worker     CChildIterator childIterator(*this);
172*c33452fbSAndroid Build Coastguard Worker 
173*c33452fbSAndroid Build Coastguard Worker     while (childIterator.next(childElement)) {
174*c33452fbSAndroid Build Coastguard Worker 
175*c33452fbSAndroid Build Coastguard Worker         uiNbChildren++;
176*c33452fbSAndroid Build Coastguard Worker     }
177*c33452fbSAndroid Build Coastguard Worker     return uiNbChildren;
178*c33452fbSAndroid Build Coastguard Worker }
179*c33452fbSAndroid Build Coastguard Worker 
getParentElement(CXmlElement & parentElement) const180*c33452fbSAndroid Build Coastguard Worker bool CXmlElement::getParentElement(CXmlElement &parentElement) const
181*c33452fbSAndroid Build Coastguard Worker {
182*c33452fbSAndroid Build Coastguard Worker     _xmlNode *pXmlNode = _pXmlElement->parent;
183*c33452fbSAndroid Build Coastguard Worker 
184*c33452fbSAndroid Build Coastguard Worker     if (pXmlNode->type == XML_ELEMENT_NODE) {
185*c33452fbSAndroid Build Coastguard Worker 
186*c33452fbSAndroid Build Coastguard Worker         parentElement.setXmlElement(pXmlNode);
187*c33452fbSAndroid Build Coastguard Worker 
188*c33452fbSAndroid Build Coastguard Worker         return true;
189*c33452fbSAndroid Build Coastguard Worker     }
190*c33452fbSAndroid Build Coastguard Worker     return false;
191*c33452fbSAndroid Build Coastguard Worker }
192*c33452fbSAndroid Build Coastguard Worker 
193*c33452fbSAndroid Build Coastguard Worker template <>
setAttribute(const string & name,const bool & value)194*c33452fbSAndroid Build Coastguard Worker void CXmlElement::setAttribute<bool>(const string &name, const bool &value)
195*c33452fbSAndroid Build Coastguard Worker {
196*c33452fbSAndroid Build Coastguard Worker     setAttribute(name, value ? "true" : "false");
197*c33452fbSAndroid Build Coastguard Worker }
198*c33452fbSAndroid Build Coastguard Worker 
199*c33452fbSAndroid Build Coastguard Worker template <>
setAttribute(const string & name,const string & value)200*c33452fbSAndroid Build Coastguard Worker void CXmlElement::setAttribute<std::string>(const string &name, const string &value)
201*c33452fbSAndroid Build Coastguard Worker {
202*c33452fbSAndroid Build Coastguard Worker     setAttribute(name, value.c_str());
203*c33452fbSAndroid Build Coastguard Worker }
204*c33452fbSAndroid Build Coastguard Worker 
205*c33452fbSAndroid Build Coastguard Worker // This method exists for 2 reasons:
206*c33452fbSAndroid Build Coastguard Worker //  - at link time, all calls to setAttribute(const string&, const char [N])
207*c33452fbSAndroid Build Coastguard Worker //    for any value of N will all resolve to this method; this prevents the
208*c33452fbSAndroid Build Coastguard Worker //    need for one template instance per value of N.
209*c33452fbSAndroid Build Coastguard Worker //  - the libxml2 API takes a C-style string anyway.
setAttribute(const string & name,const char * value)210*c33452fbSAndroid Build Coastguard Worker void CXmlElement::setAttribute(const string &name, const char *value)
211*c33452fbSAndroid Build Coastguard Worker {
212*c33452fbSAndroid Build Coastguard Worker     xmlNewProp(_pXmlElement, BAD_CAST name.c_str(), BAD_CAST value);
213*c33452fbSAndroid Build Coastguard Worker }
214*c33452fbSAndroid Build Coastguard Worker 
215*c33452fbSAndroid Build Coastguard Worker template <typename T>
setAttribute(const std::string & name,const T & value)216*c33452fbSAndroid Build Coastguard Worker void CXmlElement::setAttribute(const std::string &name, const T &value)
217*c33452fbSAndroid Build Coastguard Worker {
218*c33452fbSAndroid Build Coastguard Worker     setAttribute(name, std::to_string(value).c_str());
219*c33452fbSAndroid Build Coastguard Worker }
220*c33452fbSAndroid Build Coastguard Worker 
setNameAttribute(const string & strValue)221*c33452fbSAndroid Build Coastguard Worker void CXmlElement::setNameAttribute(const string &strValue)
222*c33452fbSAndroid Build Coastguard Worker {
223*c33452fbSAndroid Build Coastguard Worker     setAttribute("Name", strValue);
224*c33452fbSAndroid Build Coastguard Worker }
225*c33452fbSAndroid Build Coastguard Worker 
setTextContent(const string & strContent)226*c33452fbSAndroid Build Coastguard Worker void CXmlElement::setTextContent(const string &strContent)
227*c33452fbSAndroid Build Coastguard Worker {
228*c33452fbSAndroid Build Coastguard Worker     xmlAddChild(_pXmlElement, xmlNewText(BAD_CAST strContent.c_str()));
229*c33452fbSAndroid Build Coastguard Worker }
230*c33452fbSAndroid Build Coastguard Worker 
231*c33452fbSAndroid Build Coastguard Worker // Child creation
createChild(CXmlElement & childElement,const string & strType)232*c33452fbSAndroid Build Coastguard Worker void CXmlElement::createChild(CXmlElement &childElement, const string &strType)
233*c33452fbSAndroid Build Coastguard Worker {
234*c33452fbSAndroid Build Coastguard Worker #ifdef LIBXML_TREE_ENABLED
235*c33452fbSAndroid Build Coastguard Worker     xmlNodePtr pChildNode = xmlNewChild(_pXmlElement, nullptr, BAD_CAST strType.c_str(), nullptr);
236*c33452fbSAndroid Build Coastguard Worker 
237*c33452fbSAndroid Build Coastguard Worker     childElement.setXmlElement(pChildNode);
238*c33452fbSAndroid Build Coastguard Worker #endif
239*c33452fbSAndroid Build Coastguard Worker }
240*c33452fbSAndroid Build Coastguard Worker 
241*c33452fbSAndroid Build Coastguard Worker // Child iteration
CChildIterator(const CXmlElement & xmlElement)242*c33452fbSAndroid Build Coastguard Worker CXmlElement::CChildIterator::CChildIterator(const CXmlElement &xmlElement)
243*c33452fbSAndroid Build Coastguard Worker     : _pCurNode(xmlElement._pXmlElement->children)
244*c33452fbSAndroid Build Coastguard Worker {
245*c33452fbSAndroid Build Coastguard Worker }
246*c33452fbSAndroid Build Coastguard Worker 
next(CXmlElement & xmlChildElement)247*c33452fbSAndroid Build Coastguard Worker bool CXmlElement::CChildIterator::next(CXmlElement &xmlChildElement)
248*c33452fbSAndroid Build Coastguard Worker {
249*c33452fbSAndroid Build Coastguard Worker     while (_pCurNode) {
250*c33452fbSAndroid Build Coastguard Worker 
251*c33452fbSAndroid Build Coastguard Worker         if (_pCurNode->type == XML_ELEMENT_NODE) {
252*c33452fbSAndroid Build Coastguard Worker 
253*c33452fbSAndroid Build Coastguard Worker             xmlChildElement.setXmlElement(_pCurNode);
254*c33452fbSAndroid Build Coastguard Worker 
255*c33452fbSAndroid Build Coastguard Worker             _pCurNode = _pCurNode->next;
256*c33452fbSAndroid Build Coastguard Worker 
257*c33452fbSAndroid Build Coastguard Worker             return true;
258*c33452fbSAndroid Build Coastguard Worker         }
259*c33452fbSAndroid Build Coastguard Worker         _pCurNode = _pCurNode->next;
260*c33452fbSAndroid Build Coastguard Worker     }
261*c33452fbSAndroid Build Coastguard Worker 
262*c33452fbSAndroid Build Coastguard Worker     return false;
263*c33452fbSAndroid Build Coastguard Worker }
264*c33452fbSAndroid Build Coastguard Worker 
265*c33452fbSAndroid Build Coastguard Worker template bool CXmlElement::getAttribute(const std::string &name, bool &value) const;
266*c33452fbSAndroid Build Coastguard Worker template bool CXmlElement::getAttribute(const std::string &name, signed char &value) const;
267*c33452fbSAndroid Build Coastguard Worker template bool CXmlElement::getAttribute(const std::string &name, unsigned char &value) const;
268*c33452fbSAndroid Build Coastguard Worker template bool CXmlElement::getAttribute(const std::string &name, short &value) const;
269*c33452fbSAndroid Build Coastguard Worker template bool CXmlElement::getAttribute(const std::string &name, unsigned short &value) const;
270*c33452fbSAndroid Build Coastguard Worker template bool CXmlElement::getAttribute(const std::string &name, int &value) const;
271*c33452fbSAndroid Build Coastguard Worker template bool CXmlElement::getAttribute(const std::string &name, unsigned int &value) const;
272*c33452fbSAndroid Build Coastguard Worker template bool CXmlElement::getAttribute(const std::string &name, long &value) const;
273*c33452fbSAndroid Build Coastguard Worker template bool CXmlElement::getAttribute(const std::string &name, unsigned long &value) const;
274*c33452fbSAndroid Build Coastguard Worker template bool CXmlElement::getAttribute(const std::string &name, long long &value) const;
275*c33452fbSAndroid Build Coastguard Worker template bool CXmlElement::getAttribute(const std::string &name, unsigned long long &value) const;
276*c33452fbSAndroid Build Coastguard Worker template bool CXmlElement::getAttribute(const std::string &name, float &value) const;
277*c33452fbSAndroid Build Coastguard Worker template bool CXmlElement::getAttribute(const std::string &name, double &value) const;
278*c33452fbSAndroid Build Coastguard Worker 
279*c33452fbSAndroid Build Coastguard Worker template void CXmlElement::setAttribute(const std::string &name, const signed char &value);
280*c33452fbSAndroid Build Coastguard Worker template void CXmlElement::setAttribute(const std::string &name, const unsigned char &value);
281*c33452fbSAndroid Build Coastguard Worker template void CXmlElement::setAttribute(const std::string &name, const short &value);
282*c33452fbSAndroid Build Coastguard Worker template void CXmlElement::setAttribute(const std::string &name, const unsigned short &value);
283*c33452fbSAndroid Build Coastguard Worker template void CXmlElement::setAttribute(const std::string &name, const int &value);
284*c33452fbSAndroid Build Coastguard Worker template void CXmlElement::setAttribute(const std::string &name, const unsigned int &value);
285*c33452fbSAndroid Build Coastguard Worker template void CXmlElement::setAttribute(const std::string &name, const long &value);
286*c33452fbSAndroid Build Coastguard Worker template void CXmlElement::setAttribute(const std::string &name, const unsigned long &value);
287*c33452fbSAndroid Build Coastguard Worker template void CXmlElement::setAttribute(const std::string &name, const long long &value);
288*c33452fbSAndroid Build Coastguard Worker template void CXmlElement::setAttribute(const std::string &name, const unsigned long long &value);
289*c33452fbSAndroid Build Coastguard Worker template void CXmlElement::setAttribute(const std::string &name, const float &value);
290*c33452fbSAndroid Build Coastguard Worker template void CXmlElement::setAttribute(const std::string &name, const double &value);
291