LCOV - code coverage report
Current view: top level - libreoffice/desktop/source/deployment/registry - dp_backenddb.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 300 0.0 %
Date: 2012-12-27 Functions: 0 21 0.0 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10