LCOV - code coverage report
Current view: top level - libreoffice/unotools/source/config - confignode.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 65 221 29.4 %
Date: 2012-12-27 Functions: 12 28 42.9 %
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 <unotools/confignode.hxx>
      22             : #include <unotools/configpaths.hxx>
      23             : #include <tools/diagnose_ex.h>
      24             : #include <osl/diagnose.h>
      25             : #include <com/sun/star/container/XHierarchicalName.hpp>
      26             : #include <com/sun/star/beans/PropertyValue.hpp>
      27             : #include <com/sun/star/configuration/theDefaultProvider.hpp>
      28             : #include <com/sun/star/lang/XSingleServiceFactory.hpp>
      29             : #include <com/sun/star/lang/XComponent.hpp>
      30             : #include <com/sun/star/util/XStringEscape.hpp>
      31             : #include <com/sun/star/lang/XServiceInfo.hpp>
      32             : #include <com/sun/star/container/XNamed.hpp>
      33             : #include <comphelper/extract.hxx>
      34             : #include <comphelper/componentcontext.hxx>
      35             : #include <comphelper/namedvaluecollection.hxx>
      36             : #include <rtl/string.hxx>
      37             : #if OSL_DEBUG_LEVEL > 0
      38             : #include <rtl/strbuf.hxx>
      39             : #endif
      40             : 
      41             : //........................................................................
      42             : namespace utl
      43             : {
      44             : //........................................................................
      45             : 
      46             :     using namespace ::com::sun::star::uno;
      47             :     using namespace ::com::sun::star::lang;
      48             :     using namespace ::com::sun::star::util;
      49             :     using namespace ::com::sun::star::beans;
      50             :     using namespace ::com::sun::star::container;
      51             :     using namespace ::com::sun::star::configuration;
      52             : 
      53             :     //========================================================================
      54             :     //= OConfigurationNode
      55             :     //========================================================================
      56             :     //------------------------------------------------------------------------
      57          34 :     OConfigurationNode::OConfigurationNode(const Reference< XInterface >& _rxNode )
      58          34 :         :m_bEscapeNames(sal_False)
      59             :     {
      60             :         OSL_ENSURE(_rxNode.is(), "OConfigurationNode::OConfigurationNode: invalid node interface!");
      61          34 :         if (_rxNode.is())
      62             :         {
      63             :             // collect all interfaces necessary
      64          34 :             m_xHierarchyAccess = Reference< XHierarchicalNameAccess >(_rxNode, UNO_QUERY);
      65          34 :             m_xDirectAccess = Reference< XNameAccess >(_rxNode, UNO_QUERY);
      66             : 
      67             :             // reset _all_ interfaces if _one_ of them is not supported
      68          34 :             if (!m_xHierarchyAccess.is() || !m_xDirectAccess.is())
      69             :             {
      70           0 :                 m_xHierarchyAccess = NULL;
      71           0 :                 m_xDirectAccess = NULL;
      72             :             }
      73             : 
      74             :             // now for the non-critical interfaces
      75          34 :             m_xReplaceAccess = Reference< XNameReplace >(_rxNode, UNO_QUERY);
      76          34 :             m_xContainerAccess = Reference< XNameContainer >(_rxNode, UNO_QUERY);
      77             :         }
      78             : 
      79          34 :         Reference< XComponent > xConfigNodeComp(m_xDirectAccess, UNO_QUERY);
      80          34 :         if (xConfigNodeComp.is())
      81          34 :             startComponentListening(xConfigNodeComp);
      82             : 
      83          34 :         if (isValid())
      84          34 :             setEscape(isSetNode());
      85          34 :     }
      86             : 
      87             :     //------------------------------------------------------------------------
      88          34 :     OConfigurationNode::OConfigurationNode(const OConfigurationNode& _rSource)
      89             :         :OEventListenerAdapter()
      90             :         ,m_xHierarchyAccess(_rSource.m_xHierarchyAccess)
      91             :         ,m_xDirectAccess(_rSource.m_xDirectAccess)
      92             :         ,m_xReplaceAccess(_rSource.m_xReplaceAccess)
      93             :         ,m_xContainerAccess(_rSource.m_xContainerAccess)
      94             :         ,m_bEscapeNames(_rSource.m_bEscapeNames)
      95          34 :         ,m_sCompletePath(_rSource.m_sCompletePath)
      96             :     {
      97          34 :         Reference< XComponent > xConfigNodeComp(m_xDirectAccess, UNO_QUERY);
      98          34 :         if (xConfigNodeComp.is())
      99          34 :             startComponentListening(xConfigNodeComp);
     100          34 :     }
     101             : 
     102             :     //------------------------------------------------------------------------
     103           0 :     const OConfigurationNode& OConfigurationNode::operator=(const OConfigurationNode& _rSource)
     104             :     {
     105           0 :         stopAllComponentListening();
     106             : 
     107           0 :         m_xHierarchyAccess = _rSource.m_xHierarchyAccess;
     108           0 :         m_xDirectAccess = _rSource.m_xDirectAccess;
     109           0 :         m_xContainerAccess = _rSource.m_xContainerAccess;
     110           0 :         m_xReplaceAccess = _rSource.m_xReplaceAccess;
     111           0 :         m_bEscapeNames = _rSource.m_bEscapeNames;
     112           0 :         m_sCompletePath = _rSource.m_sCompletePath;
     113             : 
     114           0 :         Reference< XComponent > xConfigNodeComp(m_xDirectAccess, UNO_QUERY);
     115           0 :         if (xConfigNodeComp.is())
     116           0 :             startComponentListening(xConfigNodeComp);
     117             : 
     118           0 :         return *this;
     119             :     }
     120             : 
     121             :     //------------------------------------------------------------------------
     122           0 :     void OConfigurationNode::_disposing( const EventObject& _rSource )
     123             :     {
     124           0 :         Reference< XComponent > xDisposingSource(_rSource.Source, UNO_QUERY);
     125           0 :         Reference< XComponent > xConfigNodeComp(m_xDirectAccess, UNO_QUERY);
     126           0 :         if (xDisposingSource.get() == xConfigNodeComp.get())
     127           0 :             clear();
     128           0 :     }
     129             : 
     130             :     //------------------------------------------------------------------------
     131           0 :     ::rtl::OUString OConfigurationNode::getLocalName() const
     132             :     {
     133           0 :         ::rtl::OUString sLocalName;
     134             :         try
     135             :         {
     136           0 :             Reference< XNamed > xNamed( m_xDirectAccess, UNO_QUERY_THROW );
     137           0 :             sLocalName = xNamed->getName();
     138             :         }
     139           0 :         catch( const Exception& )
     140             :         {
     141             :             DBG_UNHANDLED_EXCEPTION();
     142             :         }
     143           0 :         return sLocalName;
     144             :     }
     145             : 
     146             :     //------------------------------------------------------------------------
     147           0 :     ::rtl::OUString OConfigurationNode::getNodePath() const
     148             :     {
     149           0 :         ::rtl::OUString sNodePath;
     150             :         try
     151             :         {
     152           0 :             Reference< XHierarchicalName > xNamed( m_xDirectAccess, UNO_QUERY_THROW );
     153           0 :             sNodePath = xNamed->getHierarchicalName();
     154             :         }
     155           0 :         catch( const Exception& )
     156             :         {
     157             :             DBG_UNHANDLED_EXCEPTION();
     158             :         }
     159           0 :         return sNodePath;
     160             :     }
     161             : 
     162             :     //------------------------------------------------------------------------
     163          34 :     ::rtl::OUString OConfigurationNode::normalizeName(const ::rtl::OUString& _rName, NAMEORIGIN _eOrigin) const
     164             :     {
     165          34 :         ::rtl::OUString sName(_rName);
     166          34 :         if (getEscape())
     167             :         {
     168           0 :             Reference< XStringEscape > xEscaper(m_xDirectAccess, UNO_QUERY);
     169           0 :             if (xEscaper.is() && !sName.isEmpty())
     170             :             {
     171             :                 try
     172             :                 {
     173           0 :                     if (NO_CALLER == _eOrigin)
     174           0 :                         sName = xEscaper->escapeString(sName);
     175             :                     else
     176           0 :                         sName = xEscaper->unescapeString(sName);
     177             :                 }
     178           0 :                 catch(Exception&)
     179             :                 {
     180             :                     DBG_UNHANDLED_EXCEPTION();
     181             :                 }
     182           0 :             }
     183             :         }
     184          34 :         return sName;
     185             :     }
     186             : 
     187             :     //------------------------------------------------------------------------
     188           0 :     Sequence< ::rtl::OUString > OConfigurationNode::getNodeNames() const throw()
     189             :     {
     190             :         OSL_ENSURE(m_xDirectAccess.is(), "OConfigurationNode::getNodeNames: object is invalid!");
     191           0 :         Sequence< ::rtl::OUString > aReturn;
     192           0 :         if (m_xDirectAccess.is())
     193             :         {
     194             :             try
     195             :             {
     196           0 :                 aReturn = m_xDirectAccess->getElementNames();
     197             :                 // normalize the names
     198           0 :                 ::rtl::OUString* pNames = aReturn.getArray();
     199           0 :                 for (sal_Int32 i=0; i<aReturn.getLength(); ++i, ++pNames)
     200           0 :                     *pNames = normalizeName(*pNames, NO_CONFIGURATION);
     201             :             }
     202           0 :             catch(Exception&)
     203             :             {
     204             :                 OSL_FAIL("OConfigurationNode::getNodeNames: caught a generic exception!");
     205             :             }
     206             :         }
     207             : 
     208           0 :         return aReturn;
     209             :     }
     210             : 
     211             :     //------------------------------------------------------------------------
     212           0 :     sal_Bool OConfigurationNode::removeNode(const ::rtl::OUString& _rName) const throw()
     213             :     {
     214             :         OSL_ENSURE(m_xContainerAccess.is(), "OConfigurationNode::removeNode: object is invalid!");
     215           0 :         if (m_xContainerAccess.is())
     216             :         {
     217             :             try
     218             :             {
     219           0 :                 ::rtl::OUString sName = normalizeName(_rName, NO_CALLER);
     220           0 :                 m_xContainerAccess->removeByName(sName);
     221           0 :                 return sal_True;
     222             :             }
     223           0 :             catch (NoSuchElementException&)
     224             :             {
     225             :                 #if OSL_DEBUG_LEVEL > 0
     226             :                 rtl::OStringBuffer aBuf( 256 );
     227             :                 aBuf.append("OConfigurationNode::removeNode: there is no element named!");
     228             :                 aBuf.append( rtl::OUStringToOString( _rName, RTL_TEXTENCODING_ASCII_US ) );
     229             :                 aBuf.append( "!" );
     230             :                 OSL_FAIL(aBuf.getStr());
     231             :                 #endif
     232             :             }
     233           0 :             catch (WrappedTargetException&)
     234             :             {
     235             :                 OSL_FAIL("OConfigurationNode::removeNode: caught a WrappedTargetException!");
     236             :             }
     237           0 :             catch(Exception&)
     238             :             {
     239             :                 OSL_FAIL("OConfigurationNode::removeNode: caught a generic exception!");
     240             :             }
     241             :         }
     242           0 :         return sal_False;
     243             :     }
     244             :     //------------------------------------------------------------------------
     245           0 :     OConfigurationNode OConfigurationNode::insertNode(const ::rtl::OUString& _rName,const Reference< XInterface >& _xNode) const throw()
     246             :     {
     247           0 :         if(_xNode.is())
     248             :         {
     249             :             try
     250             :             {
     251           0 :                 ::rtl::OUString sName = normalizeName(_rName, NO_CALLER);
     252           0 :                 m_xContainerAccess->insertByName(sName, makeAny(_xNode));
     253             :                 // if we're here, all was ok ...
     254           0 :                 return OConfigurationNode( _xNode );
     255             :             }
     256           0 :             catch(const Exception&)
     257             :             {
     258             :                 DBG_UNHANDLED_EXCEPTION();
     259             :             }
     260             : 
     261             :             // dispose the child if it has already been created, but could not be inserted
     262           0 :             Reference< XComponent > xChildComp(_xNode, UNO_QUERY);
     263           0 :             if (xChildComp.is())
     264           0 :                 try { xChildComp->dispose(); } catch(Exception&) { }
     265             :         }
     266             : 
     267           0 :         return OConfigurationNode();
     268             :     }
     269             :     //------------------------------------------------------------------------
     270           0 :     OConfigurationNode OConfigurationNode::createNode(const ::rtl::OUString& _rName) const throw()
     271             :     {
     272           0 :         Reference< XSingleServiceFactory > xChildFactory(m_xContainerAccess, UNO_QUERY);
     273             :         OSL_ENSURE(xChildFactory.is(), "OConfigurationNode::createNode: object is invalid or read-only!");
     274             : 
     275           0 :         if (xChildFactory.is()) // implies m_xContainerAccess.is()
     276             :         {
     277           0 :             Reference< XInterface > xNewChild;
     278             :             try
     279             :             {
     280           0 :                 xNewChild = xChildFactory->createInstance();
     281             :             }
     282           0 :             catch(const Exception&)
     283             :             {
     284             :                 DBG_UNHANDLED_EXCEPTION();
     285             :             }
     286           0 :             return insertNode(_rName,xNewChild);
     287             :         }
     288             : 
     289           0 :         return OConfigurationNode();
     290             :     }
     291             : 
     292             :     //------------------------------------------------------------------------
     293           0 :     OConfigurationNode OConfigurationNode::openNode(const ::rtl::OUString& _rPath) const throw()
     294             :     {
     295             :         OSL_ENSURE(m_xDirectAccess.is(), "OConfigurationNode::openNode: object is invalid!");
     296             :         OSL_ENSURE(m_xHierarchyAccess.is(), "OConfigurationNode::openNode: object is invalid!");
     297             :         try
     298             :         {
     299           0 :             ::rtl::OUString sNormalized = normalizeName(_rPath, NO_CALLER);
     300             : 
     301           0 :             Reference< XInterface > xNode;
     302           0 :             if (m_xDirectAccess.is() && m_xDirectAccess->hasByName(sNormalized))
     303             :             {
     304           0 :                 if (!::cppu::extractInterface(xNode, m_xDirectAccess->getByName(sNormalized)))
     305             :                     OSL_FAIL("OConfigurationNode::openNode: could not open the node!");
     306             :             }
     307           0 :             else if (m_xHierarchyAccess.is())
     308             :             {
     309           0 :                 if (!::cppu::extractInterface(xNode, m_xHierarchyAccess->getByHierarchicalName(_rPath)))
     310             :                     OSL_FAIL("OConfigurationNode::openNode: could not open the node!");
     311             :             }
     312           0 :             if (xNode.is())
     313           0 :                 return OConfigurationNode( xNode );
     314             :         }
     315           0 :         catch(const NoSuchElementException&)
     316             :         {
     317             :             #if OSL_DEBUG_LEVEL > 0
     318             :             rtl::OStringBuffer aBuf( 256 );
     319             :             aBuf.append("OConfigurationNode::openNode: there is no element named ");
     320             :             aBuf.append( rtl::OUStringToOString( _rPath, RTL_TEXTENCODING_ASCII_US ) );
     321             :             aBuf.append("!");
     322             :             OSL_FAIL(aBuf.getStr());
     323             :             #endif
     324             :         }
     325           0 :         catch(Exception&)
     326             :         {
     327             :             OSL_FAIL("OConfigurationNode::openNode: caught an exception while retrieving the node!");
     328             :         }
     329           0 :         return OConfigurationNode();
     330             :     }
     331             : 
     332             :     //------------------------------------------------------------------------
     333          34 :     void OConfigurationNode::setEscape(sal_Bool _bEnable)
     334             :     {
     335          34 :         m_bEscapeNames = _bEnable && Reference< XStringEscape >::query(m_xDirectAccess).is();
     336          34 :     }
     337             : 
     338             :     //------------------------------------------------------------------------
     339          34 :     sal_Bool OConfigurationNode::isSetNode() const
     340             :     {
     341          34 :         sal_Bool bIsSet = sal_False;
     342          34 :         Reference< XServiceInfo > xSI(m_xHierarchyAccess, UNO_QUERY);
     343          34 :         if (xSI.is())
     344             :         {
     345          34 :             try { bIsSet = xSI->supportsService(::rtl::OUString("com.sun.star.configuration.SetAccess")); }
     346           0 :             catch(Exception&) { }
     347             :         }
     348          34 :         return bIsSet;
     349             :     }
     350             : 
     351           0 :     sal_Bool OConfigurationNode::hasByHierarchicalName( const ::rtl::OUString& _rName ) const throw()
     352             :     {
     353             :         OSL_ENSURE( m_xHierarchyAccess.is(), "OConfigurationNode::hasByHierarchicalName: no hierarchy access!" );
     354             :         try
     355             :         {
     356           0 :             if ( m_xHierarchyAccess.is() )
     357             :             {
     358           0 :                 ::rtl::OUString sName = normalizeName( _rName, NO_CALLER );
     359           0 :                 return m_xHierarchyAccess->hasByHierarchicalName( sName );
     360             :             }
     361             :         }
     362           0 :         catch(Exception&)
     363             :         {
     364             :         }
     365           0 :         return sal_False;
     366             :     }
     367             : 
     368             :     //------------------------------------------------------------------------
     369           0 :     sal_Bool OConfigurationNode::hasByName(const ::rtl::OUString& _rName) const throw()
     370             :     {
     371             :         OSL_ENSURE(m_xDirectAccess.is(), "OConfigurationNode::hasByName: object is invalid!");
     372             :         try
     373             :         {
     374           0 :             ::rtl::OUString sName = normalizeName(_rName, NO_CALLER);
     375           0 :             if (m_xDirectAccess.is())
     376           0 :                 return m_xDirectAccess->hasByName(sName);
     377             :         }
     378           0 :         catch(Exception&)
     379             :         {
     380             :         }
     381           0 :         return sal_False;
     382             :     }
     383             : 
     384             :     //------------------------------------------------------------------------
     385           0 :     sal_Bool OConfigurationNode::setNodeValue(const ::rtl::OUString& _rPath, const Any& _rValue) const throw()
     386             :     {
     387           0 :         sal_Bool bResult = false;
     388             : 
     389             :         OSL_ENSURE(m_xReplaceAccess.is(), "OConfigurationNode::setNodeValue: object is invalid!");
     390           0 :         if (m_xReplaceAccess.is())
     391             :         {
     392             :             try
     393             :             {
     394             :                 // check if _rPath is a level-1 path
     395           0 :                 ::rtl::OUString sNormalizedName = normalizeName(_rPath, NO_CALLER);
     396           0 :                 if (m_xReplaceAccess->hasByName(sNormalizedName))
     397             :                 {
     398           0 :                     m_xReplaceAccess->replaceByName(sNormalizedName, _rValue);
     399           0 :                     bResult = true;
     400             :                 }
     401             : 
     402             :                 // check if the name refers to a indirect descendant
     403           0 :                 else if (m_xHierarchyAccess.is() && m_xHierarchyAccess->hasByHierarchicalName(_rPath))
     404             :                 {
     405             :                     OSL_ASSERT(!_rPath.isEmpty());
     406             : 
     407           0 :                     ::rtl::OUString sParentPath, sLocalName;
     408             : 
     409           0 :                     if ( splitLastFromConfigurationPath(_rPath, sParentPath, sLocalName) )
     410             :                     {
     411           0 :                         OConfigurationNode aParentAccess = openNode(sParentPath);
     412           0 :                         if (aParentAccess.isValid())
     413           0 :                             bResult = aParentAccess.setNodeValue(sLocalName, _rValue);
     414             :                     }
     415             :                     else
     416             :                     {
     417           0 :                         m_xReplaceAccess->replaceByName(sLocalName, _rValue);
     418           0 :                         bResult = true;
     419           0 :                     }
     420           0 :                 }
     421             : 
     422             :             }
     423           0 :             catch(IllegalArgumentException&)
     424             :             {
     425             :                 OSL_FAIL("OConfigurationNode::setNodeValue: could not replace the value: caught an IllegalArgumentException!");
     426             :             }
     427           0 :             catch(NoSuchElementException&)
     428             :             {
     429             :                 OSL_FAIL("OConfigurationNode::setNodeValue: could not replace the value: caught a NoSuchElementException!");
     430             :             }
     431           0 :             catch(WrappedTargetException&)
     432             :             {
     433             :                 OSL_FAIL("OConfigurationNode::setNodeValue: could not replace the value: caught a WrappedTargetException!");
     434             :             }
     435           0 :             catch(Exception&)
     436             :             {
     437             :                 OSL_FAIL("OConfigurationNode::setNodeValue: could not replace the value: caught a generic Exception!");
     438             :             }
     439             : 
     440             : 
     441             :         }
     442           0 :         return bResult;
     443             :     }
     444             : 
     445             :     //------------------------------------------------------------------------
     446          34 :     Any OConfigurationNode::getNodeValue(const ::rtl::OUString& _rPath) const throw()
     447             :     {
     448             :         OSL_ENSURE(m_xDirectAccess.is(), "OConfigurationNode::hasByName: object is invalid!");
     449             :         OSL_ENSURE(m_xHierarchyAccess.is(), "OConfigurationNode::hasByName: object is invalid!");
     450          34 :         Any aReturn;
     451             :         try
     452             :         {
     453          34 :             ::rtl::OUString sNormalizedPath = normalizeName(_rPath, NO_CALLER);
     454          34 :             if (m_xDirectAccess.is() && m_xDirectAccess->hasByName(sNormalizedPath) )
     455             :             {
     456          34 :                 aReturn = m_xDirectAccess->getByName(sNormalizedPath);
     457             :             }
     458           0 :             else if (m_xHierarchyAccess.is())
     459             :             {
     460           0 :                 aReturn = m_xHierarchyAccess->getByHierarchicalName(_rPath);
     461          34 :             }
     462             :         }
     463           0 :         catch(const NoSuchElementException&)
     464             :         {
     465             :             DBG_UNHANDLED_EXCEPTION();
     466             :         }
     467          34 :         return aReturn;
     468             :     }
     469             : 
     470             :     //------------------------------------------------------------------------
     471           0 :     void OConfigurationNode::clear() throw()
     472             :     {
     473           0 :         m_xHierarchyAccess.clear();
     474           0 :         m_xDirectAccess.clear();
     475           0 :         m_xReplaceAccess.clear();
     476           0 :         m_xContainerAccess.clear();
     477           0 :     }
     478             : 
     479             :     //========================================================================
     480             :     //= helper
     481             :     //========================================================================
     482             :     namespace
     483             :     {
     484             :         //--------------------------------------------------------------------
     485           2 :         Reference< XMultiServiceFactory > lcl_getConfigProvider( const ::comphelper::ComponentContext& i_rContext )
     486             :         {
     487             :             try
     488             :             {
     489           2 :                 Reference< XMultiServiceFactory > xProvider = theDefaultProvider::get( i_rContext.getUNOContext() );
     490           2 :                 return xProvider;
     491             :             }
     492           0 :             catch ( const Exception& )
     493             :             {
     494             :                 DBG_UNHANDLED_EXCEPTION();
     495             :             }
     496           0 :             return NULL;
     497             :         }
     498             : 
     499             :         //--------------------------------------------------------------------
     500          34 :         Reference< XInterface > lcl_createConfigurationRoot( const Reference< XMultiServiceFactory >& i_rxConfigProvider,
     501             :             const ::rtl::OUString& i_rNodePath, const bool i_bUpdatable, const sal_Int32 i_nDepth, const bool i_bLazyWrite )
     502             :         {
     503          34 :             ENSURE_OR_RETURN( i_rxConfigProvider.is(), "invalid provider", NULL );
     504             :             try
     505             :             {
     506          34 :                 ::comphelper::NamedValueCollection aArgs;
     507          34 :                 aArgs.put( "nodepath", i_rNodePath );
     508          34 :                 aArgs.put( "lazywrite", i_bLazyWrite );
     509          34 :                 aArgs.put( "depth", i_nDepth );
     510             : 
     511             :                 ::rtl::OUString sAccessService( i_bUpdatable ?
     512             :                                 ::rtl::OUString( "com.sun.star.configuration.ConfigurationUpdateAccess" ) :
     513          34 :                                 ::rtl::OUString( "com.sun.star.configuration.ConfigurationAccess" ));
     514             : 
     515             :                 Reference< XInterface > xRoot(
     516          34 :                     i_rxConfigProvider->createInstanceWithArguments( sAccessService, aArgs.getWrappedPropertyValues() ),
     517             :                     UNO_SET_THROW
     518          34 :                 );
     519          34 :                 return xRoot;
     520             :             }
     521           0 :             catch ( const Exception& )
     522             :             {
     523             :                 DBG_UNHANDLED_EXCEPTION();
     524             :             }
     525           0 :             return NULL;
     526             :         }
     527             :     }
     528             : 
     529             :     //------------------------------------------------------------------------
     530          34 :     OConfigurationTreeRoot::OConfigurationTreeRoot( const Reference< XInterface >& _rxRootNode )
     531             :         :OConfigurationNode( _rxRootNode )
     532          34 :         ,m_xCommitter( _rxRootNode, UNO_QUERY )
     533             :     {
     534          34 :     }
     535             : 
     536             :     //------------------------------------------------------------------------
     537           0 :     OConfigurationTreeRoot::OConfigurationTreeRoot( const ::comphelper::ComponentContext& i_rContext, const ::rtl::OUString& i_rNodePath, const bool i_bUpdatable )
     538             :         :OConfigurationNode( lcl_createConfigurationRoot( lcl_getConfigProvider( i_rContext.getLegacyServiceFactory() ),
     539             :             i_rNodePath, i_bUpdatable, -1, false ).get() )
     540           0 :         ,m_xCommitter()
     541             :     {
     542           0 :         if ( i_bUpdatable )
     543             :         {
     544           0 :             m_xCommitter.set( getUNONode(), UNO_QUERY );
     545             :             OSL_ENSURE( m_xCommitter.is(), "OConfigurationTreeRoot::OConfigurationTreeRoot: could not create an updatable node!" );
     546             :         }
     547           0 :     }
     548             : 
     549             :     //------------------------------------------------------------------------
     550           0 :     void OConfigurationTreeRoot::clear() throw()
     551             :     {
     552           0 :         OConfigurationNode::clear();
     553           0 :         m_xCommitter.clear();
     554           0 :     }
     555             : 
     556             :     //------------------------------------------------------------------------
     557           0 :     sal_Bool OConfigurationTreeRoot::commit() const throw()
     558             :     {
     559             :         OSL_ENSURE(isValid(), "OConfigurationTreeRoot::commit: object is invalid!");
     560           0 :         if (!isValid())
     561           0 :             return sal_False;
     562             :         OSL_ENSURE(m_xCommitter.is(), "OConfigurationTreeRoot::commit: I'm a readonly node!");
     563           0 :         if (!m_xCommitter.is())
     564           0 :             return sal_False;
     565             : 
     566             :         try
     567             :         {
     568           0 :             m_xCommitter->commitChanges();
     569           0 :             return sal_True;
     570             :         }
     571           0 :         catch(const Exception&)
     572             :         {
     573             :             DBG_UNHANDLED_EXCEPTION();
     574             :         }
     575           0 :         return sal_False;
     576             :     }
     577             : 
     578             :     //------------------------------------------------------------------------
     579          34 :     OConfigurationTreeRoot OConfigurationTreeRoot::createWithProvider(const Reference< XMultiServiceFactory >& _rxConfProvider, const ::rtl::OUString& _rPath, sal_Int32 _nDepth, CREATION_MODE _eMode, sal_Bool _bLazyWrite)
     580             :     {
     581             :         Reference< XInterface > xRoot( lcl_createConfigurationRoot(
     582          34 :             _rxConfProvider, _rPath, _eMode != CM_READONLY, _nDepth, _bLazyWrite ) );
     583          34 :         if ( xRoot.is() )
     584          34 :             return OConfigurationTreeRoot( xRoot );
     585           0 :         return OConfigurationTreeRoot();
     586             :     }
     587             : 
     588             :     //------------------------------------------------------------------------
     589           2 :     OConfigurationTreeRoot OConfigurationTreeRoot::createWithServiceFactory( const Reference< XMultiServiceFactory >& _rxORB, const ::rtl::OUString& _rPath, sal_Int32 _nDepth, CREATION_MODE _eMode, sal_Bool _bLazyWrite )
     590             :     {
     591           2 :         return createWithProvider( lcl_getConfigProvider( _rxORB ), _rPath, _nDepth, _eMode, _bLazyWrite );
     592             :     }
     593             : 
     594             :     //------------------------------------------------------------------------
     595          32 :     OConfigurationTreeRoot OConfigurationTreeRoot::tryCreateWithComponentContext( const Reference< XComponentContext >& rxContext,
     596             :         const ::rtl::OUString& _rPath, sal_Int32 _nDepth , CREATION_MODE _eMode , sal_Bool _bLazyWrite )
     597             :     {
     598             :         OSL_ENSURE( rxContext.is(), "OConfigurationTreeRoot::tryCreateWithComponentContext: invalid XComponentContext!" );
     599             :         try
     600             :         {
     601          32 :             Reference< XMultiServiceFactory > xConfigFactory = theDefaultProvider::get( rxContext );
     602          32 :             return createWithProvider( xConfigFactory, _rPath, _nDepth, _eMode, _bLazyWrite );
     603             :         }
     604           0 :         catch(const Exception&)
     605             :         {
     606             :             // silence this, 'cause the contract of this method states "no assertions"
     607             :         }
     608           0 :         return OConfigurationTreeRoot();
     609             :     }
     610             : 
     611             : //........................................................................
     612             : }   // namespace utl
     613             : //........................................................................
     614             : 
     615             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10