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