1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_desktop.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "rtl/string.h"
28*b1cdbd2cSJim Jagielski #include "rtl/strbuf.hxx"
29*b1cdbd2cSJim Jagielski #include "rtl/bootstrap.hxx"
30*b1cdbd2cSJim Jagielski #include "cppuhelper/exc_hlp.hxx"
31*b1cdbd2cSJim Jagielski #include "osl/file.hxx"
32*b1cdbd2cSJim Jagielski #include "com/sun/star/uno/XComponentContext.hpp"
33*b1cdbd2cSJim Jagielski #include "com/sun/star/xml/dom/XDocumentBuilder.hpp"
34*b1cdbd2cSJim Jagielski #include "com/sun/star/xml/xpath/XXPathAPI.hpp"
35*b1cdbd2cSJim Jagielski #include "com/sun/star/io/XActiveDataSource.hpp"
36*b1cdbd2cSJim Jagielski #include "com/sun/star/io/XActiveDataControl.hpp"
37*b1cdbd2cSJim Jagielski #include "dp_ucb.h"
38*b1cdbd2cSJim Jagielski #include "dp_misc.h"
39*b1cdbd2cSJim Jagielski #include "ucbhelper/content.hxx"
40*b1cdbd2cSJim Jagielski #include "xmlscript/xml_helper.hxx"
41*b1cdbd2cSJim Jagielski #include "dp_backenddb.hxx"
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski namespace css = ::com::sun::star;
45*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
46*b1cdbd2cSJim Jagielski using ::rtl::OUString;
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski namespace dp_registry {
50*b1cdbd2cSJim Jagielski namespace backend {
51*b1cdbd2cSJim Jagielski 
BackendDb(Reference<css::uno::XComponentContext> const & xContext,::rtl::OUString const & url)52*b1cdbd2cSJim Jagielski BackendDb::BackendDb(
53*b1cdbd2cSJim Jagielski     Reference<css::uno::XComponentContext> const &  xContext,
54*b1cdbd2cSJim Jagielski     ::rtl::OUString const & url):
55*b1cdbd2cSJim Jagielski     m_xContext(xContext)
56*b1cdbd2cSJim Jagielski {
57*b1cdbd2cSJim Jagielski     m_urlDb = dp_misc::expandUnoRcUrl(url);
58*b1cdbd2cSJim Jagielski }
59*b1cdbd2cSJim Jagielski 
save()60*b1cdbd2cSJim Jagielski void BackendDb::save()
61*b1cdbd2cSJim Jagielski {
62*b1cdbd2cSJim Jagielski     const Reference<css::io::XActiveDataSource> xDataSource(m_doc,css::uno::UNO_QUERY_THROW);
63*b1cdbd2cSJim Jagielski     ::rtl::ByteSequence bytes;
64*b1cdbd2cSJim Jagielski     xDataSource->setOutputStream(::xmlscript::createOutputStream(&bytes));
65*b1cdbd2cSJim Jagielski     const Reference<css::io::XActiveDataControl> xDataControl(m_doc,css::uno::UNO_QUERY_THROW);
66*b1cdbd2cSJim Jagielski     xDataControl->start();
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski     const Reference<css::io::XInputStream> xData(
69*b1cdbd2cSJim Jagielski         ::xmlscript::createInputStream(bytes));
70*b1cdbd2cSJim Jagielski     ::ucbhelper::Content ucbDb(m_urlDb, 0);
71*b1cdbd2cSJim Jagielski     ucbDb.writeStream(xData, true /*replace existing*/);
72*b1cdbd2cSJim Jagielski }
73*b1cdbd2cSJim Jagielski 
getDocument()74*b1cdbd2cSJim Jagielski css::uno::Reference<css::xml::dom::XDocument> BackendDb::getDocument()
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski     if (!m_doc.is())
77*b1cdbd2cSJim Jagielski     {
78*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XDocumentBuilder> xDocBuilder(
79*b1cdbd2cSJim Jagielski             m_xContext->getServiceManager()->createInstanceWithContext(
80*b1cdbd2cSJim Jagielski                 OUSTR("com.sun.star.xml.dom.DocumentBuilder"),
81*b1cdbd2cSJim Jagielski                 m_xContext ), css::uno::UNO_QUERY);
82*b1cdbd2cSJim Jagielski         if (!xDocBuilder.is())
83*b1cdbd2cSJim Jagielski             throw css::uno::RuntimeException(
84*b1cdbd2cSJim Jagielski                 OUSTR(" Could not create service com.sun.star.xml.dom.DocumentBuilder"), 0);
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski         ::osl::DirectoryItem item;
87*b1cdbd2cSJim Jagielski         ::osl::File::RC err = ::osl::DirectoryItem::get(m_urlDb, item);
88*b1cdbd2cSJim Jagielski         if (err == ::osl::File::E_None)
89*b1cdbd2cSJim Jagielski         {
90*b1cdbd2cSJim Jagielski             ::ucbhelper::Content descContent(
91*b1cdbd2cSJim Jagielski                 m_urlDb, css::uno::Reference<css::ucb::XCommandEnvironment>());
92*b1cdbd2cSJim Jagielski             Reference<css::io::XInputStream> xIn = descContent.openStream();
93*b1cdbd2cSJim Jagielski             m_doc = xDocBuilder->parse(xIn);
94*b1cdbd2cSJim Jagielski         }
95*b1cdbd2cSJim Jagielski         else if (err == ::osl::File::E_NOENT)
96*b1cdbd2cSJim Jagielski         {
97*b1cdbd2cSJim Jagielski             //Create a new document and insert some basic stuff
98*b1cdbd2cSJim Jagielski             m_doc = xDocBuilder->newDocument();
99*b1cdbd2cSJim Jagielski             const Reference<css::xml::dom::XElement> rootNode =
100*b1cdbd2cSJim Jagielski                 m_doc->createElementNS(getDbNSName(), getNSPrefix() +
101*b1cdbd2cSJim Jagielski                                        OUSTR(":") + getRootElementName());
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski             m_doc->appendChild(Reference<css::xml::dom::XNode>(
104*b1cdbd2cSJim Jagielski                                    rootNode, UNO_QUERY_THROW));
105*b1cdbd2cSJim Jagielski             save();
106*b1cdbd2cSJim Jagielski         }
107*b1cdbd2cSJim Jagielski         else
108*b1cdbd2cSJim Jagielski             throw css::uno::RuntimeException(
109*b1cdbd2cSJim Jagielski                 OUSTR("Extension manager could not access database file:" )
110*b1cdbd2cSJim Jagielski                 + m_urlDb, 0);
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski         if (!m_doc.is())
113*b1cdbd2cSJim Jagielski             throw css::uno::RuntimeException(
114*b1cdbd2cSJim Jagielski                 OUSTR("Extension manager could not get root node of data base file: ")
115*b1cdbd2cSJim Jagielski                       + m_urlDb, 0);
116*b1cdbd2cSJim Jagielski     }
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski     return m_doc;
119*b1cdbd2cSJim Jagielski }
120*b1cdbd2cSJim Jagielski 
getXPathAPI()121*b1cdbd2cSJim Jagielski Reference<css::xml::xpath::XXPathAPI> BackendDb::getXPathAPI()
122*b1cdbd2cSJim Jagielski {
123*b1cdbd2cSJim Jagielski     if (!m_xpathApi.is())
124*b1cdbd2cSJim Jagielski     {
125*b1cdbd2cSJim Jagielski         m_xpathApi = Reference< css::xml::xpath::XXPathAPI >(
126*b1cdbd2cSJim Jagielski             m_xContext->getServiceManager()->createInstanceWithContext(
127*b1cdbd2cSJim Jagielski                 OUSTR("com.sun.star.xml.xpath.XPathAPI"),
128*b1cdbd2cSJim Jagielski                 m_xContext), css::uno::UNO_QUERY);
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski         if (!m_xpathApi.is())
131*b1cdbd2cSJim Jagielski             throw css::uno::RuntimeException(
132*b1cdbd2cSJim Jagielski                 OUSTR(" Could not create service com.sun.star.xml.xpath.XPathAPI"), 0);
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski         m_xpathApi->registerNS(
135*b1cdbd2cSJim Jagielski             getNSPrefix(), getDbNSName());
136*b1cdbd2cSJim Jagielski     }
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski     return m_xpathApi;
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski 
removeElement(::rtl::OUString const & sXPathExpression)141*b1cdbd2cSJim Jagielski void BackendDb::removeElement(::rtl::OUString const & sXPathExpression)
142*b1cdbd2cSJim Jagielski {
143*b1cdbd2cSJim Jagielski     try
144*b1cdbd2cSJim Jagielski     {
145*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XDocument> doc = getDocument();
146*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XNode> root = doc->getFirstChild();
147*b1cdbd2cSJim Jagielski         const Reference<css::xml::xpath::XXPathAPI> xpathApi = getXPathAPI();
148*b1cdbd2cSJim Jagielski         //find the extension element that is to be removed
149*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XNode> aNode =
150*b1cdbd2cSJim Jagielski             xpathApi->selectSingleNode(root, sXPathExpression);
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski         if (aNode.is())
153*b1cdbd2cSJim Jagielski         {
154*b1cdbd2cSJim Jagielski             root->removeChild(aNode);
155*b1cdbd2cSJim Jagielski             save();
156*b1cdbd2cSJim Jagielski         }
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski #if    OSL_DEBUG_LEVEL > 0
159*b1cdbd2cSJim Jagielski         //There must not be any other entry with the same url
160*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XNode> nextNode =
161*b1cdbd2cSJim Jagielski             xpathApi->selectSingleNode(root, sXPathExpression);
162*b1cdbd2cSJim Jagielski         OSL_ASSERT(! nextNode.is());
163*b1cdbd2cSJim Jagielski #endif
164*b1cdbd2cSJim Jagielski     }
165*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
166*b1cdbd2cSJim Jagielski     {
167*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
168*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
169*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to write data entry in backend db: ") +
170*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
171*b1cdbd2cSJim Jagielski     }
172*b1cdbd2cSJim Jagielski }
173*b1cdbd2cSJim Jagielski 
removeEntry(::rtl::OUString const & url)174*b1cdbd2cSJim Jagielski void BackendDb::removeEntry(::rtl::OUString const & url)
175*b1cdbd2cSJim Jagielski {
176*b1cdbd2cSJim Jagielski     const OUString sKeyElement = getKeyElementName();
177*b1cdbd2cSJim Jagielski     const OUString sPrefix = getNSPrefix();
178*b1cdbd2cSJim Jagielski     ::rtl::OUStringBuffer sExpression(500);
179*b1cdbd2cSJim Jagielski     sExpression.append(sPrefix);
180*b1cdbd2cSJim Jagielski     sExpression.appendAscii(":");
181*b1cdbd2cSJim Jagielski     sExpression.append(sKeyElement);
182*b1cdbd2cSJim Jagielski     sExpression.append(OUSTR("[@url = \""));
183*b1cdbd2cSJim Jagielski     sExpression.append(url);
184*b1cdbd2cSJim Jagielski     sExpression.appendAscii("\"]");
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski     removeElement(sExpression.makeStringAndClear());
187*b1cdbd2cSJim Jagielski }
188*b1cdbd2cSJim Jagielski 
revokeEntry(::rtl::OUString const & url)189*b1cdbd2cSJim Jagielski void BackendDb::revokeEntry(::rtl::OUString const & url)
190*b1cdbd2cSJim Jagielski {
191*b1cdbd2cSJim Jagielski     try
192*b1cdbd2cSJim Jagielski     {
193*b1cdbd2cSJim Jagielski         Reference<css::xml::dom::XElement> entry = Reference<css::xml::dom::XElement>(getKeyElement(url), UNO_QUERY);
194*b1cdbd2cSJim Jagielski         if (entry.is())
195*b1cdbd2cSJim Jagielski         {
196*b1cdbd2cSJim Jagielski             entry->setAttribute(OUSTR("revoked"), OUSTR("true"));
197*b1cdbd2cSJim Jagielski             save();
198*b1cdbd2cSJim Jagielski         }
199*b1cdbd2cSJim Jagielski     }
200*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
201*b1cdbd2cSJim Jagielski     {
202*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
203*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
204*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to revoke data entry in backend db: ") +
205*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
206*b1cdbd2cSJim Jagielski     }
207*b1cdbd2cSJim Jagielski }
208*b1cdbd2cSJim Jagielski 
activateEntry(::rtl::OUString const & url)209*b1cdbd2cSJim Jagielski bool BackendDb::activateEntry(::rtl::OUString const & url)
210*b1cdbd2cSJim Jagielski {
211*b1cdbd2cSJim Jagielski     try
212*b1cdbd2cSJim Jagielski     {
213*b1cdbd2cSJim Jagielski         bool ret = false;
214*b1cdbd2cSJim Jagielski         Reference<css::xml::dom::XElement> entry = Reference<css::xml::dom::XElement>(getKeyElement(url), UNO_QUERY);
215*b1cdbd2cSJim Jagielski         if (entry.is())
216*b1cdbd2cSJim Jagielski         {
217*b1cdbd2cSJim Jagielski             //no attribute "active" means it is active, that is, registered.
218*b1cdbd2cSJim Jagielski             entry->removeAttribute(OUSTR("revoked"));
219*b1cdbd2cSJim Jagielski             save();
220*b1cdbd2cSJim Jagielski             ret = true;
221*b1cdbd2cSJim Jagielski         }
222*b1cdbd2cSJim Jagielski         return ret;
223*b1cdbd2cSJim Jagielski     }
224*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
225*b1cdbd2cSJim Jagielski     {
226*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
227*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
228*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to revoke data entry in backend db: ") +
229*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
230*b1cdbd2cSJim Jagielski     }
231*b1cdbd2cSJim Jagielski }
232*b1cdbd2cSJim Jagielski 
hasActiveEntry(::rtl::OUString const & url)233*b1cdbd2cSJim Jagielski bool BackendDb::hasActiveEntry(::rtl::OUString const & url)
234*b1cdbd2cSJim Jagielski {
235*b1cdbd2cSJim Jagielski     try
236*b1cdbd2cSJim Jagielski     {
237*b1cdbd2cSJim Jagielski         bool ret = false;
238*b1cdbd2cSJim Jagielski         Reference<css::xml::dom::XElement> entry = Reference<css::xml::dom::XElement>(getKeyElement(url), UNO_QUERY);
239*b1cdbd2cSJim Jagielski         if (entry.is())
240*b1cdbd2cSJim Jagielski         {
241*b1cdbd2cSJim Jagielski             OUString sActive = entry->getAttribute(OUSTR("revoked"));
242*b1cdbd2cSJim Jagielski             if (!sActive.equals(OUSTR("true")))
243*b1cdbd2cSJim Jagielski                 ret = true;
244*b1cdbd2cSJim Jagielski         }
245*b1cdbd2cSJim Jagielski         return ret;
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski     }
248*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
249*b1cdbd2cSJim Jagielski     {
250*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
251*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
252*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to determine an active entry in backend db: ") +
253*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
254*b1cdbd2cSJim Jagielski     }
255*b1cdbd2cSJim Jagielski }
256*b1cdbd2cSJim Jagielski 
getKeyElement(::rtl::OUString const & url)257*b1cdbd2cSJim Jagielski Reference<css::xml::dom::XNode> BackendDb::getKeyElement(
258*b1cdbd2cSJim Jagielski     ::rtl::OUString const & url)
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski     try
261*b1cdbd2cSJim Jagielski     {
262*b1cdbd2cSJim Jagielski         const OUString sPrefix = getNSPrefix();
263*b1cdbd2cSJim Jagielski         const OUString sKeyElement = getKeyElementName();
264*b1cdbd2cSJim Jagielski         ::rtl::OUStringBuffer sExpression(500);
265*b1cdbd2cSJim Jagielski         sExpression.append(sPrefix);
266*b1cdbd2cSJim Jagielski         sExpression.appendAscii(":");
267*b1cdbd2cSJim Jagielski         sExpression.append(sKeyElement);
268*b1cdbd2cSJim Jagielski         sExpression.append(OUSTR("[@url = \""));
269*b1cdbd2cSJim Jagielski         sExpression.append(url);
270*b1cdbd2cSJim Jagielski         sExpression.appendAscii("\"]");
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XDocument> doc = getDocument();
273*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XNode> root = doc->getFirstChild();
274*b1cdbd2cSJim Jagielski         const Reference<css::xml::xpath::XXPathAPI> xpathApi = getXPathAPI();
275*b1cdbd2cSJim Jagielski         return xpathApi->selectSingleNode(root, sExpression.makeStringAndClear());
276*b1cdbd2cSJim Jagielski     }
277*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
278*b1cdbd2cSJim Jagielski     {
279*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
280*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
281*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to read key element in backend db: ") +
282*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
283*b1cdbd2cSJim Jagielski     }
284*b1cdbd2cSJim Jagielski }
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski //Only writes the data if there is at least one entry
writeVectorOfPair(::std::vector<::std::pair<::rtl::OUString,::rtl::OUString>> const & vecPairs,OUString const & sVectorTagName,OUString const & sPairTagName,OUString const & sFirstTagName,OUString const & sSecondTagName,css::uno::Reference<css::xml::dom::XNode> const & xParent)287*b1cdbd2cSJim Jagielski void BackendDb::writeVectorOfPair(
288*b1cdbd2cSJim Jagielski     ::std::vector< ::std::pair< ::rtl::OUString, ::rtl::OUString > > const & vecPairs,
289*b1cdbd2cSJim Jagielski     OUString const & sVectorTagName,
290*b1cdbd2cSJim Jagielski     OUString const & sPairTagName,
291*b1cdbd2cSJim Jagielski     OUString const & sFirstTagName,
292*b1cdbd2cSJim Jagielski     OUString const & sSecondTagName,
293*b1cdbd2cSJim Jagielski     css::uno::Reference<css::xml::dom::XNode> const & xParent)
294*b1cdbd2cSJim Jagielski {
295*b1cdbd2cSJim Jagielski     try{
296*b1cdbd2cSJim Jagielski         if (vecPairs.size() == 0)
297*b1cdbd2cSJim Jagielski             return;
298*b1cdbd2cSJim Jagielski         const OUString sNameSpace = getDbNSName();
299*b1cdbd2cSJim Jagielski         OSL_ASSERT(sNameSpace.getLength());
300*b1cdbd2cSJim Jagielski         const OUString sPrefix(getNSPrefix() + OUSTR(":"));
301*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XDocument> doc = getDocument();
302*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XNode> root = doc->getFirstChild();
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XElement> vectorNode(
305*b1cdbd2cSJim Jagielski             doc->createElementNS(sNameSpace, sPrefix + sVectorTagName));
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski         xParent->appendChild(
308*b1cdbd2cSJim Jagielski             Reference<css::xml::dom::XNode>(
309*b1cdbd2cSJim Jagielski                 vectorNode, css::uno::UNO_QUERY_THROW));
310*b1cdbd2cSJim Jagielski         typedef ::std::vector< ::std::pair< OUString, OUString > >::const_iterator CIT;
311*b1cdbd2cSJim Jagielski         for (CIT i = vecPairs.begin(); i != vecPairs.end(); i++)
312*b1cdbd2cSJim Jagielski         {
313*b1cdbd2cSJim Jagielski             const Reference<css::xml::dom::XElement> pairNode(
314*b1cdbd2cSJim Jagielski                 doc->createElementNS(sNameSpace, sPrefix + sPairTagName));
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski             vectorNode->appendChild(
317*b1cdbd2cSJim Jagielski                 Reference<css::xml::dom::XNode>(
318*b1cdbd2cSJim Jagielski                     pairNode, css::uno::UNO_QUERY_THROW));
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski             const Reference<css::xml::dom::XElement> firstNode(
321*b1cdbd2cSJim Jagielski                 doc->createElementNS(sNameSpace, sPrefix + sFirstTagName));
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski             pairNode->appendChild(
324*b1cdbd2cSJim Jagielski                 Reference<css::xml::dom::XNode>(
325*b1cdbd2cSJim Jagielski                     firstNode, css::uno::UNO_QUERY_THROW));
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski             const Reference<css::xml::dom::XText> firstTextNode(
328*b1cdbd2cSJim Jagielski                 doc->createTextNode( i->first));
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski             firstNode->appendChild(
331*b1cdbd2cSJim Jagielski                 Reference<css::xml::dom::XNode>(
332*b1cdbd2cSJim Jagielski                     firstTextNode, css::uno::UNO_QUERY_THROW));
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski             const Reference<css::xml::dom::XElement> secondNode(
335*b1cdbd2cSJim Jagielski                 doc->createElementNS(sNameSpace, sPrefix + sSecondTagName));
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski             pairNode->appendChild(
338*b1cdbd2cSJim Jagielski                 Reference<css::xml::dom::XNode>(
339*b1cdbd2cSJim Jagielski                     secondNode, css::uno::UNO_QUERY_THROW));
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski             const Reference<css::xml::dom::XText> secondTextNode(
342*b1cdbd2cSJim Jagielski                 doc->createTextNode( i->second));
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski             secondNode->appendChild(
345*b1cdbd2cSJim Jagielski                 Reference<css::xml::dom::XNode>(
346*b1cdbd2cSJim Jagielski                     secondTextNode, css::uno::UNO_QUERY_THROW));
347*b1cdbd2cSJim Jagielski         }
348*b1cdbd2cSJim Jagielski     }
349*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
350*b1cdbd2cSJim Jagielski     {
351*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
352*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
353*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to write data entry in backend db: ") +
354*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
355*b1cdbd2cSJim Jagielski     }
356*b1cdbd2cSJim Jagielski }
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski ::std::vector< ::std::pair< OUString, OUString > >
readVectorOfPair(Reference<css::xml::dom::XNode> const & parent,OUString const & sListTagName,OUString const & sPairTagName,OUString const & sFirstTagName,OUString const & sSecondTagName)359*b1cdbd2cSJim Jagielski BackendDb::readVectorOfPair(
360*b1cdbd2cSJim Jagielski     Reference<css::xml::dom::XNode> const & parent,
361*b1cdbd2cSJim Jagielski     OUString const & sListTagName,
362*b1cdbd2cSJim Jagielski     OUString const & sPairTagName,
363*b1cdbd2cSJim Jagielski     OUString const & sFirstTagName,
364*b1cdbd2cSJim Jagielski     OUString const & sSecondTagName)
365*b1cdbd2cSJim Jagielski {
366*b1cdbd2cSJim Jagielski     try
367*b1cdbd2cSJim Jagielski     {
368*b1cdbd2cSJim Jagielski         OSL_ASSERT(parent.is());
369*b1cdbd2cSJim Jagielski         const OUString sPrefix(getNSPrefix() + OUSTR(":"));
370*b1cdbd2cSJim Jagielski         const Reference<css::xml::xpath::XXPathAPI> xpathApi = getXPathAPI();
371*b1cdbd2cSJim Jagielski         const OUString sExprPairs(
372*b1cdbd2cSJim Jagielski             sPrefix + sListTagName + OUSTR("/") + sPrefix + sPairTagName);
373*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XNodeList> listPairs =
374*b1cdbd2cSJim Jagielski             xpathApi->selectNodeList(parent, sExprPairs);
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski         ::std::vector< ::std::pair< OUString, OUString > > retVector;
377*b1cdbd2cSJim Jagielski         sal_Int32 length = listPairs->getLength();
378*b1cdbd2cSJim Jagielski         for (sal_Int32 i = 0; i < length; i++)
379*b1cdbd2cSJim Jagielski         {
380*b1cdbd2cSJim Jagielski             const Reference<css::xml::dom::XNode> aPair = listPairs->item(i);
381*b1cdbd2cSJim Jagielski             const OUString sExprFirst(sPrefix + sFirstTagName + OUSTR("/text()"));
382*b1cdbd2cSJim Jagielski             const Reference<css::xml::dom::XNode> first =
383*b1cdbd2cSJim Jagielski                 xpathApi->selectSingleNode(aPair, sExprFirst);
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski             const OUString sExprSecond(sPrefix + sSecondTagName + OUSTR("/text()"));
386*b1cdbd2cSJim Jagielski             const Reference<css::xml::dom::XNode> second =
387*b1cdbd2cSJim Jagielski                 xpathApi->selectSingleNode(aPair, sExprSecond);
388*b1cdbd2cSJim Jagielski             OSL_ASSERT(first.is() && second.is());
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski             retVector.push_back(::std::make_pair(
391*b1cdbd2cSJim Jagielski                                     first->getNodeValue(), second->getNodeValue()));
392*b1cdbd2cSJim Jagielski         }
393*b1cdbd2cSJim Jagielski         return retVector;
394*b1cdbd2cSJim Jagielski     }
395*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
396*b1cdbd2cSJim Jagielski     {
397*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
398*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
399*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to read data entry in backend db: ") +
400*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
401*b1cdbd2cSJim Jagielski     }
402*b1cdbd2cSJim Jagielski }
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski //Only writes the data if there is at least one entry
writeSimpleList(::std::list<::rtl::OUString> const & list,OUString const & sListTagName,OUString const & sMemberTagName,Reference<css::xml::dom::XNode> const & xParent)405*b1cdbd2cSJim Jagielski void BackendDb::writeSimpleList(
406*b1cdbd2cSJim Jagielski     ::std::list< ::rtl::OUString> const & list,
407*b1cdbd2cSJim Jagielski     OUString const & sListTagName,
408*b1cdbd2cSJim Jagielski     OUString const & sMemberTagName,
409*b1cdbd2cSJim Jagielski     Reference<css::xml::dom::XNode> const & xParent)
410*b1cdbd2cSJim Jagielski {
411*b1cdbd2cSJim Jagielski     try
412*b1cdbd2cSJim Jagielski     {
413*b1cdbd2cSJim Jagielski         if (list.size() == 0)
414*b1cdbd2cSJim Jagielski             return;
415*b1cdbd2cSJim Jagielski         const OUString sNameSpace = getDbNSName();
416*b1cdbd2cSJim Jagielski         const OUString sPrefix(getNSPrefix() + OUSTR(":"));
417*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XDocument> doc = getDocument();
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XElement> listNode(
420*b1cdbd2cSJim Jagielski             doc->createElementNS(sNameSpace, sPrefix + sListTagName));
421*b1cdbd2cSJim Jagielski 
422*b1cdbd2cSJim Jagielski         xParent->appendChild(
423*b1cdbd2cSJim Jagielski             Reference<css::xml::dom::XNode>(
424*b1cdbd2cSJim Jagielski                 listNode, css::uno::UNO_QUERY_THROW));
425*b1cdbd2cSJim Jagielski 
426*b1cdbd2cSJim Jagielski         typedef ::std::list<OUString>::const_iterator ITC_ITEMS;
427*b1cdbd2cSJim Jagielski         for (ITC_ITEMS i = list.begin(); i != list.end(); i++)
428*b1cdbd2cSJim Jagielski         {
429*b1cdbd2cSJim Jagielski             const Reference<css::xml::dom::XNode> memberNode(
430*b1cdbd2cSJim Jagielski                 doc->createElementNS(sNameSpace, sPrefix + sMemberTagName), css::uno::UNO_QUERY_THROW);
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski             listNode->appendChild(memberNode);
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski             const Reference<css::xml::dom::XNode> textNode(
435*b1cdbd2cSJim Jagielski                 doc->createTextNode( *i), css::uno::UNO_QUERY_THROW);
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski             memberNode->appendChild(textNode);
438*b1cdbd2cSJim Jagielski         }
439*b1cdbd2cSJim Jagielski     }
440*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
441*b1cdbd2cSJim Jagielski     {
442*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
443*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
444*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to write data entry in backend db: ") +
445*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
446*b1cdbd2cSJim Jagielski     }
447*b1cdbd2cSJim Jagielski }
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski //Writes only the element if is has a value.
450*b1cdbd2cSJim Jagielski //The prefix is automatically added to the element name
writeSimpleElement(OUString const & sElementName,OUString const & value,Reference<css::xml::dom::XNode> const & xParent)451*b1cdbd2cSJim Jagielski void BackendDb::writeSimpleElement(
452*b1cdbd2cSJim Jagielski     OUString const & sElementName, OUString const & value,
453*b1cdbd2cSJim Jagielski     Reference<css::xml::dom::XNode> const & xParent)
454*b1cdbd2cSJim Jagielski {
455*b1cdbd2cSJim Jagielski     try
456*b1cdbd2cSJim Jagielski     {
457*b1cdbd2cSJim Jagielski         if (value.getLength() == 0)
458*b1cdbd2cSJim Jagielski             return;
459*b1cdbd2cSJim Jagielski         const OUString sPrefix = getNSPrefix();
460*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XDocument> doc = getDocument();
461*b1cdbd2cSJim Jagielski         const OUString sNameSpace = getDbNSName();
462*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XNode> dataNode(
463*b1cdbd2cSJim Jagielski             doc->createElementNS(sNameSpace, sPrefix + OUSTR(":") + sElementName),
464*b1cdbd2cSJim Jagielski             UNO_QUERY_THROW);
465*b1cdbd2cSJim Jagielski         xParent->appendChild(dataNode);
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XNode> dataValue(
468*b1cdbd2cSJim Jagielski             doc->createTextNode(value), UNO_QUERY_THROW);
469*b1cdbd2cSJim Jagielski         dataNode->appendChild(dataValue);
470*b1cdbd2cSJim Jagielski     }
471*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
472*b1cdbd2cSJim Jagielski     {
473*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
474*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
475*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to write data entry(writeSimpleElement) in backend db: ") +
476*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
477*b1cdbd2cSJim Jagielski     }
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski }
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski /** The key elements have an url attribute and are always children of the root
482*b1cdbd2cSJim Jagielski     element.
483*b1cdbd2cSJim Jagielski */
writeKeyElement(::rtl::OUString const & url)484*b1cdbd2cSJim Jagielski Reference<css::xml::dom::XNode> BackendDb::writeKeyElement(
485*b1cdbd2cSJim Jagielski     ::rtl::OUString const & url)
486*b1cdbd2cSJim Jagielski {
487*b1cdbd2cSJim Jagielski     try
488*b1cdbd2cSJim Jagielski     {
489*b1cdbd2cSJim Jagielski         const OUString sNameSpace = getDbNSName();
490*b1cdbd2cSJim Jagielski         const OUString sPrefix = getNSPrefix();
491*b1cdbd2cSJim Jagielski         const OUString sElementName = getKeyElementName();
492*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XDocument> doc = getDocument();
493*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XNode> root = doc->getFirstChild();
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski         //Check if there are an entry with the same url. This can be the case if the
496*b1cdbd2cSJim Jagielski         //the status of an XPackage is ambiguous. In this case a call to activateExtension
497*b1cdbd2cSJim Jagielski         //(dp_extensionmanager.cxx), will register the package again. See also
498*b1cdbd2cSJim Jagielski         //Package::processPackage_impl in dp_backend.cxx.
499*b1cdbd2cSJim Jagielski         //A package can become
500*b1cdbd2cSJim Jagielski         //invalid after its successful registration, for example if a second extension with
501*b1cdbd2cSJim Jagielski         //the same service is installed.
502*b1cdbd2cSJim Jagielski         const OUString sExpression(
503*b1cdbd2cSJim Jagielski             sPrefix + OUSTR(":") + sElementName + OUSTR("[@url = \"") + url + OUSTR("\"]"));
504*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XNode> existingNode =
505*b1cdbd2cSJim Jagielski             getXPathAPI()->selectSingleNode(root, sExpression);
506*b1cdbd2cSJim Jagielski         if (existingNode.is())
507*b1cdbd2cSJim Jagielski         {
508*b1cdbd2cSJim Jagielski             OSL_ASSERT(0);
509*b1cdbd2cSJim Jagielski             //replace the existing entry.
510*b1cdbd2cSJim Jagielski             removeEntry(url);
511*b1cdbd2cSJim Jagielski         }
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XElement> keyElement(
514*b1cdbd2cSJim Jagielski             doc->createElementNS(sNameSpace, sPrefix +  OUSTR(":") + sElementName));
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski         keyElement->setAttribute(OUSTR("url"), url);
517*b1cdbd2cSJim Jagielski 
518*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XNode> keyNode(
519*b1cdbd2cSJim Jagielski             keyElement, UNO_QUERY_THROW);
520*b1cdbd2cSJim Jagielski         root->appendChild(keyNode);
521*b1cdbd2cSJim Jagielski         return keyNode;
522*b1cdbd2cSJim Jagielski     }
523*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
524*b1cdbd2cSJim Jagielski     {
525*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
526*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
527*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to write key element in backend db: ") +
528*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
529*b1cdbd2cSJim Jagielski     }
530*b1cdbd2cSJim Jagielski }
531*b1cdbd2cSJim Jagielski 
readSimpleElement(OUString const & sElementName,Reference<css::xml::dom::XNode> const & xParent)532*b1cdbd2cSJim Jagielski OUString BackendDb::readSimpleElement(
533*b1cdbd2cSJim Jagielski     OUString const & sElementName, Reference<css::xml::dom::XNode> const & xParent)
534*b1cdbd2cSJim Jagielski {
535*b1cdbd2cSJim Jagielski     try
536*b1cdbd2cSJim Jagielski     {
537*b1cdbd2cSJim Jagielski         const OUString sPrefix = getNSPrefix();
538*b1cdbd2cSJim Jagielski         const OUString sExpr(sPrefix + OUSTR(":") + sElementName + OUSTR("/text()"));
539*b1cdbd2cSJim Jagielski         const Reference<css::xml::xpath::XXPathAPI> xpathApi = getXPathAPI();
540*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XNode> val =
541*b1cdbd2cSJim Jagielski             xpathApi->selectSingleNode(xParent, sExpr);
542*b1cdbd2cSJim Jagielski         if (val.is())
543*b1cdbd2cSJim Jagielski             return val->getNodeValue();
544*b1cdbd2cSJim Jagielski         return OUString();
545*b1cdbd2cSJim Jagielski     }
546*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
547*b1cdbd2cSJim Jagielski     {
548*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
549*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
550*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to read data (readSimpleElement) in backend db: ") +
551*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
552*b1cdbd2cSJim Jagielski     }
553*b1cdbd2cSJim Jagielski }
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski 
readList(Reference<css::xml::dom::XNode> const & parent,OUString const & sListTagName,OUString const & sMemberTagName)556*b1cdbd2cSJim Jagielski ::std::list< OUString> BackendDb::readList(
557*b1cdbd2cSJim Jagielski     Reference<css::xml::dom::XNode> const & parent,
558*b1cdbd2cSJim Jagielski     OUString const & sListTagName,
559*b1cdbd2cSJim Jagielski     OUString const & sMemberTagName)
560*b1cdbd2cSJim Jagielski {
561*b1cdbd2cSJim Jagielski     try
562*b1cdbd2cSJim Jagielski     {
563*b1cdbd2cSJim Jagielski         OSL_ASSERT(parent.is());
564*b1cdbd2cSJim Jagielski         const OUString sPrefix(getNSPrefix() + OUSTR(":"));
565*b1cdbd2cSJim Jagielski         const Reference<css::xml::xpath::XXPathAPI> xpathApi = getXPathAPI();
566*b1cdbd2cSJim Jagielski         const OUString sExprList(
567*b1cdbd2cSJim Jagielski             sPrefix + sListTagName + OUSTR("/") + sPrefix + sMemberTagName + OUSTR("/text()"));
568*b1cdbd2cSJim Jagielski         const Reference<css::xml::dom::XNodeList> list =
569*b1cdbd2cSJim Jagielski             xpathApi->selectNodeList(parent, sExprList);
570*b1cdbd2cSJim Jagielski 
571*b1cdbd2cSJim Jagielski         ::std::list<OUString > retList;
572*b1cdbd2cSJim Jagielski         sal_Int32 length = list->getLength();
573*b1cdbd2cSJim Jagielski         for (sal_Int32 i = 0; i < length; i++)
574*b1cdbd2cSJim Jagielski         {
575*b1cdbd2cSJim Jagielski             const Reference<css::xml::dom::XNode> member = list->item(i);
576*b1cdbd2cSJim Jagielski             retList.push_back(member->getNodeValue());
577*b1cdbd2cSJim Jagielski         }
578*b1cdbd2cSJim Jagielski         return retList;
579*b1cdbd2cSJim Jagielski     }
580*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
581*b1cdbd2cSJim Jagielski     {
582*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
583*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
584*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to read data entry in backend db: ") +
585*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
586*b1cdbd2cSJim Jagielski     }
587*b1cdbd2cSJim Jagielski }
588*b1cdbd2cSJim Jagielski 
getOneChildFromAllEntries(OUString const & name)589*b1cdbd2cSJim Jagielski ::std::list<OUString> BackendDb::getOneChildFromAllEntries(
590*b1cdbd2cSJim Jagielski     OUString const & name)
591*b1cdbd2cSJim Jagielski {
592*b1cdbd2cSJim Jagielski     try
593*b1cdbd2cSJim Jagielski     {
594*b1cdbd2cSJim Jagielski         ::std::list<OUString> listRet;
595*b1cdbd2cSJim Jagielski         Reference<css::xml::dom::XDocument> doc = getDocument();
596*b1cdbd2cSJim Jagielski         Reference<css::xml::dom::XNode> root = doc->getFirstChild();
597*b1cdbd2cSJim Jagielski 
598*b1cdbd2cSJim Jagielski         Reference<css::xml::xpath::XXPathAPI> xpathApi = getXPathAPI();
599*b1cdbd2cSJim Jagielski         const OUString sPrefix = getNSPrefix();
600*b1cdbd2cSJim Jagielski         const OUString sKeyElement = getKeyElementName();
601*b1cdbd2cSJim Jagielski         ::rtl::OUStringBuffer buf(512);
602*b1cdbd2cSJim Jagielski         buf.append(sPrefix);
603*b1cdbd2cSJim Jagielski         buf.appendAscii(":");
604*b1cdbd2cSJim Jagielski         buf.append(sKeyElement);
605*b1cdbd2cSJim Jagielski         buf.appendAscii("/");
606*b1cdbd2cSJim Jagielski         buf.append(sPrefix);
607*b1cdbd2cSJim Jagielski         buf.appendAscii(":");
608*b1cdbd2cSJim Jagielski         buf.append(name);
609*b1cdbd2cSJim Jagielski         buf.append(OUSTR("/text()"));
610*b1cdbd2cSJim Jagielski 
611*b1cdbd2cSJim Jagielski         Reference<css::xml::dom::XNodeList> nodes =
612*b1cdbd2cSJim Jagielski             xpathApi->selectNodeList(root, buf.makeStringAndClear());
613*b1cdbd2cSJim Jagielski         if (nodes.is())
614*b1cdbd2cSJim Jagielski         {
615*b1cdbd2cSJim Jagielski             sal_Int32 length = nodes->getLength();
616*b1cdbd2cSJim Jagielski             for (sal_Int32 i = 0; i < length; i++)
617*b1cdbd2cSJim Jagielski                 listRet.push_back(nodes->item(i)->getNodeValue());
618*b1cdbd2cSJim Jagielski         }
619*b1cdbd2cSJim Jagielski         return listRet;
620*b1cdbd2cSJim Jagielski     }
621*b1cdbd2cSJim Jagielski     catch (css::deployment::DeploymentException& )
622*b1cdbd2cSJim Jagielski     {
623*b1cdbd2cSJim Jagielski         throw;
624*b1cdbd2cSJim Jagielski     }
625*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
626*b1cdbd2cSJim Jagielski     {
627*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
628*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
629*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to read data entry in backend db: ") +
630*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
631*b1cdbd2cSJim Jagielski     }
632*b1cdbd2cSJim Jagielski }
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski 
635*b1cdbd2cSJim Jagielski 
636*b1cdbd2cSJim Jagielski //================================================================================
RegisteredDb(Reference<XComponentContext> const & xContext,::rtl::OUString const & url)637*b1cdbd2cSJim Jagielski RegisteredDb::RegisteredDb(
638*b1cdbd2cSJim Jagielski     Reference<XComponentContext> const &  xContext,
639*b1cdbd2cSJim Jagielski     ::rtl::OUString const & url):BackendDb(xContext, url)
640*b1cdbd2cSJim Jagielski {
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski }
643*b1cdbd2cSJim Jagielski 
addEntry(::rtl::OUString const & url)644*b1cdbd2cSJim Jagielski void RegisteredDb::addEntry(::rtl::OUString const & url)
645*b1cdbd2cSJim Jagielski {
646*b1cdbd2cSJim Jagielski     try{
647*b1cdbd2cSJim Jagielski         if (!activateEntry(url))
648*b1cdbd2cSJim Jagielski         {
649*b1cdbd2cSJim Jagielski             const OUString sNameSpace = getDbNSName();
650*b1cdbd2cSJim Jagielski             const OUString sPrefix = getNSPrefix();
651*b1cdbd2cSJim Jagielski             const OUString sEntry = getKeyElementName();
652*b1cdbd2cSJim Jagielski 
653*b1cdbd2cSJim Jagielski             Reference<css::xml::dom::XDocument> doc = getDocument();
654*b1cdbd2cSJim Jagielski             Reference<css::xml::dom::XNode> root = doc->getFirstChild();
655*b1cdbd2cSJim Jagielski 
656*b1cdbd2cSJim Jagielski #if    OSL_DEBUG_LEVEL > 0
657*b1cdbd2cSJim Jagielski             //There must not be yet an entry with the same url
658*b1cdbd2cSJim Jagielski             OUString sExpression(
659*b1cdbd2cSJim Jagielski                 sPrefix + OUSTR(":") + sEntry + OUSTR("[@url = \"") + url + OUSTR("\"]"));
660*b1cdbd2cSJim Jagielski             Reference<css::xml::dom::XNode> _extensionNode =
661*b1cdbd2cSJim Jagielski                 getXPathAPI()->selectSingleNode(root, sExpression);
662*b1cdbd2cSJim Jagielski             OSL_ASSERT(! _extensionNode.is());
663*b1cdbd2cSJim Jagielski #endif
664*b1cdbd2cSJim Jagielski             Reference<css::xml::dom::XElement> helpElement(
665*b1cdbd2cSJim Jagielski                 doc->createElementNS(sNameSpace, sPrefix +  OUSTR(":") + sEntry));
666*b1cdbd2cSJim Jagielski 
667*b1cdbd2cSJim Jagielski             helpElement->setAttribute(OUSTR("url"), url);
668*b1cdbd2cSJim Jagielski 
669*b1cdbd2cSJim Jagielski             Reference<css::xml::dom::XNode> helpNode(
670*b1cdbd2cSJim Jagielski                 helpElement, UNO_QUERY_THROW);
671*b1cdbd2cSJim Jagielski             root->appendChild(helpNode);
672*b1cdbd2cSJim Jagielski 
673*b1cdbd2cSJim Jagielski             save();
674*b1cdbd2cSJim Jagielski         }
675*b1cdbd2cSJim Jagielski     }
676*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
677*b1cdbd2cSJim Jagielski     {
678*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
679*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
680*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to write data entry in backend db: ") +
681*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
682*b1cdbd2cSJim Jagielski     }
683*b1cdbd2cSJim Jagielski }
684*b1cdbd2cSJim Jagielski 
getEntry(::rtl::OUString const & url)685*b1cdbd2cSJim Jagielski bool RegisteredDb::getEntry(::rtl::OUString const & url)
686*b1cdbd2cSJim Jagielski {
687*b1cdbd2cSJim Jagielski     try
688*b1cdbd2cSJim Jagielski     {
689*b1cdbd2cSJim Jagielski         const OUString sPrefix = getNSPrefix();
690*b1cdbd2cSJim Jagielski         const OUString sEntry = getKeyElementName();
691*b1cdbd2cSJim Jagielski         const OUString sExpression(
692*b1cdbd2cSJim Jagielski             sPrefix + OUSTR(":") + sEntry + OUSTR("[@url = \"") + url + OUSTR("\"]"));
693*b1cdbd2cSJim Jagielski         Reference<css::xml::dom::XDocument> doc = getDocument();
694*b1cdbd2cSJim Jagielski         Reference<css::xml::dom::XNode> root = doc->getFirstChild();
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski         Reference<css::xml::xpath::XXPathAPI> xpathApi = getXPathAPI();
697*b1cdbd2cSJim Jagielski         //find the extension element that is to be removed
698*b1cdbd2cSJim Jagielski         Reference<css::xml::dom::XNode> aNode =
699*b1cdbd2cSJim Jagielski             xpathApi->selectSingleNode(root, sExpression);
700*b1cdbd2cSJim Jagielski         if (!aNode.is())
701*b1cdbd2cSJim Jagielski         {
702*b1cdbd2cSJim Jagielski             return false;
703*b1cdbd2cSJim Jagielski         }
704*b1cdbd2cSJim Jagielski         return true;
705*b1cdbd2cSJim Jagielski     }
706*b1cdbd2cSJim Jagielski     catch(css::uno::Exception &)
707*b1cdbd2cSJim Jagielski     {
708*b1cdbd2cSJim Jagielski         Any exc( ::cppu::getCaughtException() );
709*b1cdbd2cSJim Jagielski         throw css::deployment::DeploymentException(
710*b1cdbd2cSJim Jagielski             OUSTR("Extension Manager: failed to read data entry in backend db: ") +
711*b1cdbd2cSJim Jagielski             m_urlDb, 0, exc);
712*b1cdbd2cSJim Jagielski     }
713*b1cdbd2cSJim Jagielski }
714*b1cdbd2cSJim Jagielski 
715*b1cdbd2cSJim Jagielski 
716*b1cdbd2cSJim Jagielski } // namespace backend
717*b1cdbd2cSJim Jagielski } // namespace dp_registry
718*b1cdbd2cSJim Jagielski 
719