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