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