1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include <xpathobject.hxx>
25 
26 #include <string.h>
27 
28 #include "../dom/document.hxx"
29 #include <nodelist.hxx>
30 
31 
32 namespace XPath
33 {
lcl_GetType(xmlXPathObjectPtr const pXPathObj)34     static XPathObjectType lcl_GetType(xmlXPathObjectPtr const pXPathObj)
35     {
36         switch (pXPathObj->type)
37         {
38             case XPATH_UNDEFINED:
39                 return XPathObjectType_XPATH_UNDEFINED;
40             case XPATH_NODESET:
41                 return XPathObjectType_XPATH_NODESET;
42             case XPATH_BOOLEAN:
43                 return XPathObjectType_XPATH_BOOLEAN;
44             case XPATH_NUMBER:
45                 return XPathObjectType_XPATH_NUMBER;
46             case XPATH_STRING:
47                 return XPathObjectType_XPATH_STRING;
48             case XPATH_POINT:
49                 return XPathObjectType_XPATH_POINT;
50             case XPATH_RANGE:
51                 return XPathObjectType_XPATH_RANGE;
52             case XPATH_LOCATIONSET:
53                 return XPathObjectType_XPATH_LOCATIONSET;
54             case XPATH_USERS:
55                 return XPathObjectType_XPATH_USERS;
56             case XPATH_XSLT_TREE:
57                 return XPathObjectType_XPATH_XSLT_TREE;
58             default:
59                 return XPathObjectType_XPATH_UNDEFINED;
60         }
61     }
62 
CXPathObject(::rtl::Reference<DOM::CDocument> const & pDocument,::osl::Mutex & rMutex,::boost::shared_ptr<xmlXPathObject> const & pXPathObj)63     CXPathObject::CXPathObject(
64             ::rtl::Reference<DOM::CDocument> const& pDocument,
65             ::osl::Mutex & rMutex,
66             ::boost::shared_ptr<xmlXPathObject> const& pXPathObj)
67         : m_pDocument(pDocument)
68         , m_rMutex(rMutex)
69         , m_pXPathObj(pXPathObj)
70         , m_XPathObjectType(lcl_GetType(pXPathObj.get()))
71     {
72     }
73 
74     /**
75         get object type
76     */
getObjectType()77     XPathObjectType CXPathObject::getObjectType() throw (RuntimeException)
78     {
79         return m_XPathObjectType;
80     }
81 
82     /**
83         get the nodes from a nodelist type object
84     */
85     Reference< XNodeList > SAL_CALL
getNodeList()86     CXPathObject::getNodeList() throw (RuntimeException)
87     {
88         ::osl::MutexGuard const g(m_rMutex);
89 
90         Reference< XNodeList > const xRet(
91             new CNodeList(m_pDocument, m_rMutex, m_pXPathObj));
92         return xRet;
93     }
94 
95      /**
96         get value of a boolean object
97      */
getBoolean()98     sal_Bool SAL_CALL CXPathObject::getBoolean() throw (RuntimeException)
99     {
100         ::osl::MutexGuard const g(m_rMutex);
101 
102         return (sal_Bool) xmlXPathCastToBoolean(m_pXPathObj.get());
103     }
104 
105     /**
106         get number as byte
107     */
getByte()108     sal_Int8 SAL_CALL CXPathObject::getByte() throw (RuntimeException)
109     {
110         ::osl::MutexGuard const g(m_rMutex);
111 
112         return (sal_Int8) xmlXPathCastToNumber(m_pXPathObj.get());
113     }
114 
115     /**
116         get number as short
117     */
getShort()118     sal_Int16 SAL_CALL CXPathObject::getShort() throw (RuntimeException)
119     {
120         ::osl::MutexGuard const g(m_rMutex);
121 
122         return (sal_Int16) xmlXPathCastToNumber(m_pXPathObj.get());
123     }
124 
125     /**
126         get number as long
127     */
getLong()128     sal_Int32 SAL_CALL CXPathObject::getLong() throw (RuntimeException)
129     {
130         ::osl::MutexGuard const g(m_rMutex);
131 
132         return (sal_Int32) xmlXPathCastToNumber(m_pXPathObj.get());
133     }
134 
135     /**
136         get number as hyper
137     */
getHyper()138     sal_Int64 SAL_CALL CXPathObject::getHyper() throw (RuntimeException)
139     {
140         ::osl::MutexGuard const g(m_rMutex);
141 
142         return (sal_Int64) xmlXPathCastToNumber(m_pXPathObj.get());
143     }
144 
145     /**
146         get number as float
147     */
getFloat()148     float SAL_CALL CXPathObject::getFloat() throw (RuntimeException)
149     {
150         ::osl::MutexGuard const g(m_rMutex);
151 
152         return (float) xmlXPathCastToNumber(m_pXPathObj.get());
153     }
154 
155     /**
156         get number as double
157     */
getDouble()158     double SAL_CALL CXPathObject::getDouble() throw (RuntimeException)
159     {
160         ::osl::MutexGuard const g(m_rMutex);
161 
162         return  xmlXPathCastToNumber(m_pXPathObj.get());
163     }
164 
165     /**
166         get string value
167     */
getString()168     OUString SAL_CALL CXPathObject::getString() throw (RuntimeException)
169     {
170         ::osl::MutexGuard const g(m_rMutex);
171 
172         ::boost::shared_ptr<xmlChar const> str(
173             xmlXPathCastToString(m_pXPathObj.get()), xmlFree);
174         sal_Char const*const pS(reinterpret_cast<sal_Char const*>(str.get()));
175         return OUString(pS, strlen(pS), RTL_TEXTENCODING_UTF8);
176     }
177 
178 }
179 
180