diff options
author | Oliver Specht <os@openoffice.org> | 2000-12-13 07:04:43 +0000 |
---|---|---|
committer | Oliver Specht <os@openoffice.org> | 2000-12-13 07:04:43 +0000 |
commit | ab0f4f51f472708b9be76e41fa5e298e08916ceb (patch) | |
tree | 85e1b40abd5947f30abf7f16fcd65ff11e9e0a56 /unotools/source/config/configmgr.cxx | |
parent | 1e7ab85ed71f2a3b137b1654db95248df93cec0c (diff) |
#80698# use second configuration provider for locally cached components
Diffstat (limited to 'unotools/source/config/configmgr.cxx')
-rw-r--r-- | unotools/source/config/configmgr.cxx | 163 |
1 files changed, 158 insertions, 5 deletions
diff --git a/unotools/source/config/configmgr.cxx b/unotools/source/config/configmgr.cxx index 1603ec67d9af..af966349d02e 100644 --- a/unotools/source/config/configmgr.cxx +++ b/unotools/source/config/configmgr.cxx @@ -2,9 +2,9 @@ * * $RCSfile: configmgr.cxx,v $ * - * $Revision: 1.11 $ + * $Revision: 1.12 $ * - * last change: $Author: os $ $Date: 2000-12-09 14:59:13 $ + * last change: $Author: os $ $Date: 2000-12-13 08:04:43 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -77,6 +77,9 @@ #ifndef _COM_SUN_STAR_CONTAINER_XHIERARCHICALNAMEACCESS_HPP_ #include <com/sun/star/container/XHierarchicalNameAccess.hpp> #endif +#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_ +#include <com/sun/star/container/XNameContainer.hpp> +#endif #ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_ #include <com/sun/star/beans/PropertyValue.hpp> #endif @@ -114,7 +117,10 @@ struct ConfigItemListEntry_Impl typedef std::list<ConfigItemListEntry_Impl> ConfigItemList; struct utl::ConfigMgr_Impl { - ConfigItemList aItemList; + sal_Bool bIsLocalProvider; + ConfigItemList aItemList; + Reference< XMultiServiceFactory > xLocalConfigurationProvider; + }; /* -----------------------------28.08.00 15:35-------------------------------- @@ -123,6 +129,12 @@ struct utl::ConfigMgr_Impl ConfigManager::ConfigManager() : pMgrImpl(new utl::ConfigMgr_Impl) { + Reference< XMultiServiceFactory > xCfgProv = GetConfigurationProvider(); + Reference< XMultiServiceFactory > xLocalCfgProv = GetLocalConfigurationProvider(); + if(xCfgProv.get() && xCfgProv.get() == xLocalCfgProv.get()) + pMgrImpl->bIsLocalProvider = sal_False; + else + pMgrImpl->bIsLocalProvider = sal_True; } /* -----------------------------17.11.00 13:51-------------------------------- @@ -131,6 +143,7 @@ ConfigManager::ConfigManager(Reference< XMultiServiceFactory > xConfigProv) : pMgrImpl(new utl::ConfigMgr_Impl), xConfigurationProvider(xConfigProv) { + pMgrImpl->bIsLocalProvider = sal_False; } /* -----------------------------28.08.00 15:35-------------------------------- @@ -160,6 +173,36 @@ Reference< XMultiServiceFactory > ConfigManager::GetConfigurationProvider() if(!xConfigurationProvider.is()) { Reference< XMultiServiceFactory > xMSF = ::utl::getProcessServiceFactory(); + try + { + xConfigurationProvider = Reference< XMultiServiceFactory > + (xMSF->createInstance( + C2U("com.sun.star.configuration.ConfigurationProvider")), + UNO_QUERY); + } +#ifdef DBG_UTIL + catch(Exception& rEx) + { + OString sMsg("CreateInstance with arguments exception: "); + sMsg += OString(rEx.Message.getStr(), + rEx.Message.getLength(), + RTL_TEXTENCODING_ASCII_US); + OSL_DEBUG_ONLY(sMsg.getStr()); + } +#else + catch(Exception&){} +#endif + } + return xConfigurationProvider; +} +/* -----------------------------12.12.00 17:19-------------------------------- + + ---------------------------------------------------------------------------*/ +Reference< XMultiServiceFactory > ConfigManager::GetLocalConfigurationProvider() +{ + if(!pMgrImpl->xLocalConfigurationProvider.is()) + { + Reference< XMultiServiceFactory > xMSF = ::utl::getProcessServiceFactory(); Sequence <Any> aArgs(1); Any* pValues = aArgs.getArray(); PropertyValue aPValue; @@ -168,7 +211,7 @@ Reference< XMultiServiceFactory > ConfigManager::GetConfigurationProvider() pValues[0] <<= aPValue; try { - xConfigurationProvider = Reference< XMultiServiceFactory > + pMgrImpl->xLocalConfigurationProvider = Reference< XMultiServiceFactory > (xMSF->createInstanceWithArguments( C2U("com.sun.star.configuration.ConfigurationProvider"), aArgs), UNO_QUERY); @@ -186,7 +229,7 @@ Reference< XMultiServiceFactory > ConfigManager::GetConfigurationProvider() catch(Exception&){} #endif } - return xConfigurationProvider; + return pMgrImpl->xLocalConfigurationProvider; } /* -----------------------------29.08.00 12:35-------------------------------- @@ -361,4 +404,114 @@ Any ConfigManager::GetDirectConfigProperty(ConfigProperty eProp) return aRet; } +/* -----------------------------12.12.00 17:22-------------------------------- + + ---------------------------------------------------------------------------*/ +Reference< XHierarchicalNameAccess> ConfigManager::GetHierarchyAccess(const OUString& rFullPath) +{ + Sequence< Any > aArgs(1); + aArgs[0] <<= rFullPath; + Reference< XMultiServiceFactory > xCfgProvider = GetLocalConfigurationProvider(); + Reference< XInterface > xIFace; + if(xCfgProvider.is()) + { + try + { + xIFace = xCfgProvider->createInstanceWithArguments( + C2U(cAccessSrvc), + aArgs); + } +#ifdef DBG_UTIL + catch(Exception& rEx) + { + OString sMsg("CreateInstance exception: "); + sMsg += OString(rEx.Message.getStr(), + rEx.Message.getLength(), + RTL_TEXTENCODING_ASCII_US); + OSL_DEBUG_ONLY(sMsg.getStr()); + } +#else + catch(Exception&){} +#endif + } + return Reference<XHierarchicalNameAccess>(xIFace, UNO_QUERY); +} +/* -----------------------------12.12.00 17:17-------------------------------- + + ---------------------------------------------------------------------------*/ +Any ConfigManager::GetLocalProperty(const OUString& rProperty) +{ + OUString sPath = C2U(cConfigBaseURL); + sPath += rProperty; + + sal_Int32 nLastIndex = sPath.lastIndexOf( '/', sPath.getLength()); + OUString sNode = sPath.copy( 0, nLastIndex ); + OUString sProperty = sPath.copy( nLastIndex + 1, sPath.getLength() - nLastIndex - 1 ); + + Reference< XHierarchicalNameAccess> xAccess = GetHierarchyAccess(sNode); + Any aRet; + try + { + if(xAccess.is()) + aRet = xAccess->getByHierarchicalName(sProperty); + } +#ifdef DBG_UTIL + catch(Exception& rEx) + { + OString sMsg("GetLocalProperty: "); + sMsg += OString(rEx.Message.getStr(), + rEx.Message.getLength(), + RTL_TEXTENCODING_ASCII_US); + OSL_DEBUG_ONLY(sMsg.getStr()); + } +#else + catch(Exception&){} +#endif + return aRet; +} +/* -----------------------------12.12.00 17:17-------------------------------- + + ---------------------------------------------------------------------------*/ +void ConfigManager::PutLocalProperty(const OUString& rProperty, const Any& rValue) +{ + OUString sPath = C2U(cConfigBaseURL); + sPath += rProperty; + + sal_Int32 nLastIndex = sPath.lastIndexOf( '/', sPath.getLength()); + OUString sNode = sPath.copy( 0, nLastIndex ); + OUString sProperty = sPath.copy( nLastIndex + 1, sPath.getLength() - nLastIndex - 1 ); + + Reference< XHierarchicalNameAccess> xHierarchyAccess = GetHierarchyAccess(sNode); + + Any aNode = xHierarchyAccess->getByHierarchicalName(sNode); + Reference<XNameAccess> xNodeAcc; + aNode >>= xNodeAcc; + Reference<XNameReplace> xNodeReplace(xNodeAcc, UNO_QUERY); + if(xNodeReplace.is()) + { + try + { + xNodeReplace->replaceByName(sProperty, rValue); + } +#ifdef DBG_UTIL + catch(Exception& rEx) + { + OString sMsg("PutLocalProperty: "); + sMsg += OString(rEx.Message.getStr(), + rEx.Message.getLength(), + RTL_TEXTENCODING_ASCII_US); + OSL_DEBUG_ONLY(sMsg.getStr()); + } +#else + catch(Exception& ){} +#endif + } +} +/* -----------------------------13.12.00 08:47-------------------------------- + + ---------------------------------------------------------------------------*/ +sal_Bool ConfigManager::IsLocalConfigProvider() +{ + return pMgrImpl->bIsLocalProvider; +} |