diff options
Diffstat (limited to 'framework/source/services/pathsettings.cxx')
-rw-r--r-- | framework/source/services/pathsettings.cxx | 1183 |
1 files changed, 0 insertions, 1183 deletions
diff --git a/framework/source/services/pathsettings.cxx b/framework/source/services/pathsettings.cxx deleted file mode 100644 index c80d40150b..0000000000 --- a/framework/source/services/pathsettings.cxx +++ /dev/null @@ -1,1183 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_framework.hxx" -// ______________________________________________ -// my own includes - -/** Attention: stl headers must(!) be included at first. Otherwhise it can make trouble - with solaris headers ... -*/ -#include <vector> -#include <services/pathsettings.hxx> -#include <threadhelp/readguard.hxx> -#include <threadhelp/writeguard.hxx> -#include <services.h> - -#include "helper/mischelper.hxx" - -// ______________________________________________ -// interface includes -#include <com/sun/star/beans/Property.hpp> -#include <com/sun/star/beans/XProperty.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/container/XContainer.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> -#include <com/sun/star/util/XChangesNotifier.hpp> - -// ______________________________________________ -// includes of other projects -#include <tools/urlobj.hxx> -#include <rtl/ustrbuf.hxx> -#include <rtl/logfile.hxx> - -#include <comphelper/configurationhelper.hxx> -#include <unotools/configpathes.hxx> - -#include <fwkdllapi.h> - -// ______________________________________________ -// non exported const - -#define CFG_READONLY_DEFAULT sal_False - -const ::rtl::OUString CFGPROP_USERPATHES(RTL_CONSTASCII_USTRINGPARAM("UserPaths")); -const ::rtl::OUString CFGPROP_WRITEPATH(RTL_CONSTASCII_USTRINGPARAM("WritePath")); - -/* - 0 : old style "Template" string using ";" as seperator - 1 : internal paths "Template_internal" string list - 2 : user paths "Template_user" string list - 3 : write path "Template_write" string - */ - -const ::rtl::OUString POSTFIX_INTERNAL_PATHES(RTL_CONSTASCII_USTRINGPARAM("_internal")); -const ::rtl::OUString POSTFIX_USER_PATHES(RTL_CONSTASCII_USTRINGPARAM("_user")); -const ::rtl::OUString POSTFIX_WRITE_PATH(RTL_CONSTASCII_USTRINGPARAM("_writable")); - -const sal_Int32 IDGROUP_OLDSTYLE = 0; -const sal_Int32 IDGROUP_INTERNAL_PATHES = 1; -const sal_Int32 IDGROUP_USER_PATHES = 2; -const sal_Int32 IDGROUP_WRITE_PATH = 3; - -const sal_Int32 IDGROUP_COUNT = 4; - -sal_Int32 impl_getPropGroup(sal_Int32 nID) -{ - return (nID % IDGROUP_COUNT); -} - -// ______________________________________________ -// namespace - -namespace framework -{ - -//----------------------------------------------------------------------------- -// XInterface, XTypeProvider, XServiceInfo - -DEFINE_XINTERFACE_7 ( PathSettings , - OWeakObject , - DIRECT_INTERFACE ( css::lang::XTypeProvider ), - DIRECT_INTERFACE ( css::lang::XServiceInfo ), - DERIVED_INTERFACE( css::lang::XEventListener, css::util::XChangesListener), - DIRECT_INTERFACE ( css::util::XChangesListener ), - DIRECT_INTERFACE ( css::beans::XPropertySet ), - DIRECT_INTERFACE ( css::beans::XFastPropertySet ), - DIRECT_INTERFACE ( css::beans::XMultiPropertySet ) - ) - -DEFINE_XTYPEPROVIDER_7 ( PathSettings , - css::lang::XTypeProvider , - css::lang::XServiceInfo , - css::lang::XEventListener , - css::util::XChangesListener , - css::beans::XPropertySet , - css::beans::XFastPropertySet , - css::beans::XMultiPropertySet - ) - -DEFINE_XSERVICEINFO_ONEINSTANCESERVICE ( PathSettings , - ::cppu::OWeakObject , - SERVICENAME_PATHSETTINGS , - IMPLEMENTATIONNAME_PATHSETTINGS - ) - -DEFINE_INIT_SERVICE ( PathSettings, - { - /*Attention - I think we don't need any mutex or lock here ... because we are called by our own static method impl_createInstance() - to create a new instance of this class by our own supported service factory. - see macro DEFINE_XSERVICEINFO_MULTISERVICE and "impl_initService()" for further informations! - */ - - // fill cache - impl_readAll(); - } - ) - -//----------------------------------------------------------------------------- -PathSettings::PathSettings( const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR ) - // Init baseclasses first - // Attention: Don't change order of initialization! - // ThreadHelpBase is a struct with a lock as member. We can't use a lock as direct member! - // We must garant right initialization and a valid value of this to initialize other baseclasses! - : ThreadHelpBase() - , ::cppu::OBroadcastHelperVar< ::cppu::OMultiTypeInterfaceContainerHelper, ::cppu::OMultiTypeInterfaceContainerHelper::keyType >(m_aLock.getShareableOslMutex()) - , ::cppu::OPropertySetHelper(*(static_cast< ::cppu::OBroadcastHelper* >(this))) - , ::cppu::OWeakObject() - // Init member - , m_xSMGR (xSMGR) - , m_pPropHelp(0 ) - , m_bIgnoreEvents(sal_False) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "PathSettings::PathSettings" ); -} - -//----------------------------------------------------------------------------- -PathSettings::~PathSettings() -{ - css::uno::Reference< css::util::XChangesNotifier > xBroadcaster(m_xCfgNew, css::uno::UNO_QUERY); - if (xBroadcaster.is()) - xBroadcaster->removeChangesListener(m_xCfgNewListener); - if (m_pPropHelp) - delete m_pPropHelp; -} - -//----------------------------------------------------------------------------- -void SAL_CALL PathSettings::changesOccurred(const css::util::ChangesEvent& aEvent) - throw (css::uno::RuntimeException) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "PathSettings::changesOccurred" ); - - sal_Int32 c = aEvent.Changes.getLength(); - sal_Int32 i = 0; - sal_Bool bUpdateDescriptor = sal_False; - - for (i=0; i<c; ++i) - { - const css::util::ElementChange& aChange = aEvent.Changes[i]; - - ::rtl::OUString sChanged; - aChange.Accessor >>= sChanged; - - ::rtl::OUString sPath = ::utl::extractFirstFromConfigurationPath(sChanged); - if (sPath.getLength()) - { - PathSettings::EChangeOp eOp = impl_updatePath(sPath, sal_True); - if ( - (eOp == PathSettings::E_ADDED ) || - (eOp == PathSettings::E_REMOVED) - ) - bUpdateDescriptor = sal_True; - } - } - - if (bUpdateDescriptor) - impl_rebuildPropertyDescriptor(); -} - -//----------------------------------------------------------------------------- -void SAL_CALL PathSettings::disposing(const css::lang::EventObject& aSource) - throw(css::uno::RuntimeException) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "PathSettings::disposing" ); - WriteGuard aWriteLock(m_aLock); - - if (aSource.Source == m_xCfgNew) - m_xCfgNew.clear(); - - aWriteLock.unlock(); -} - -//----------------------------------------------------------------------------- -void PathSettings::impl_readAll() -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "PathSettings::impl_readAll" ); - RTL_LOGFILE_CONTEXT(aLog, "framework (as96863) ::PathSettings::load config (all)"); - - try - { - // TODO think about me - css::uno::Reference< css::container::XNameAccess > xCfg = fa_getCfgNew(); - css::uno::Sequence< ::rtl::OUString > lPaths = xCfg->getElementNames(); - - sal_Int32 c = lPaths.getLength(); - for (sal_Int32 i = 0; i < c; ++i) - { - const ::rtl::OUString& sPath = lPaths[i]; - impl_updatePath(sPath, sal_False); - } - } - catch(const css::uno::RuntimeException& ) - { - } - - impl_rebuildPropertyDescriptor(); -} - -//----------------------------------------------------------------------------- -// NO substitution here ! It's done outside ... -OUStringList PathSettings::impl_readOldFormat(const ::rtl::OUString& sPath) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "PathSettings::impl_readOldFormat" ); - css::uno::Reference< css::container::XNameAccess > xCfg( fa_getCfgOld() ); - OUStringList aPathVal; - - if( xCfg->hasByName(sPath) ) - { - css::uno::Any aVal( xCfg->getByName(sPath) ); - - ::rtl::OUString sStringVal; - css::uno::Sequence< ::rtl::OUString > lStringListVal; - - if (aVal >>= sStringVal) - { - aPathVal.push_back(sStringVal); - } - else if (aVal >>= lStringListVal) - { - aPathVal << lStringListVal; - } - } - - return aPathVal; -} - -//----------------------------------------------------------------------------- -// NO substitution here ! It's done outside ... -PathSettings::PathInfo PathSettings::impl_readNewFormat(const ::rtl::OUString& sPath) -{ - const static ::rtl::OUString CFGPROP_INTERNALPATHES(RTL_CONSTASCII_USTRINGPARAM("InternalPaths")); - const static ::rtl::OUString CFGPROP_ISSINGLEPATH(RTL_CONSTASCII_USTRINGPARAM("IsSinglePath")); - - css::uno::Reference< css::container::XNameAccess > xCfg = fa_getCfgNew(); - - // get access to the "queried" path - css::uno::Reference< css::container::XNameAccess > xPath; - xCfg->getByName(sPath) >>= xPath; - - PathSettings::PathInfo aPathVal; - - // read internal path list - css::uno::Reference< css::container::XNameAccess > xIPath; - xPath->getByName(CFGPROP_INTERNALPATHES) >>= xIPath; - aPathVal.lInternalPaths << xIPath->getElementNames(); - - // read user defined path list - aPathVal.lUserPaths << xPath->getByName(CFGPROP_USERPATHES); - - // read the writeable path - xPath->getByName(CFGPROP_WRITEPATH) >>= aPathVal.sWritePath; - - // read state props - xPath->getByName(CFGPROP_ISSINGLEPATH) >>= aPathVal.bIsSinglePath; - - // analyze finalized/mandatory states - aPathVal.bIsReadonly = sal_False; - css::uno::Reference< css::beans::XProperty > xInfo(xPath, css::uno::UNO_QUERY); - if (xInfo.is()) - { - css::beans::Property aInfo = xInfo->getAsProperty(); - sal_Bool bFinalized = ((aInfo.Attributes & css::beans::PropertyAttribute::READONLY ) == css::beans::PropertyAttribute::READONLY ); - - // Note: Till we support finalized / mandatory on our API more in detail we handle - // all states simple as READONLY ! But because all realy needed pathes are "mandatory" by default - // we have to handle "finalized" as the real "readonly" indicator . - aPathVal.bIsReadonly = bFinalized; - } - - return aPathVal; -} - -//----------------------------------------------------------------------------- -void PathSettings::impl_storePath(const PathSettings::PathInfo& aPath) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "PathSettings::impl_storePath" ); - m_bIgnoreEvents = sal_True; - - css::uno::Reference< css::container::XNameAccess > xCfgNew = fa_getCfgNew(); - css::uno::Reference< css::container::XNameAccess > xCfgOld = fa_getCfgOld(); - - // try to replace path-parts with well known and uspported variables. - // So an office can be moved easialy to another location without loosing - // it's related pathes. - PathInfo aResubstPath(aPath); - impl_subst(aResubstPath, sal_True); - - // update new configuration - if (! aResubstPath.bIsSinglePath) - { - ::comphelper::ConfigurationHelper::writeRelativeKey(xCfgNew, - aResubstPath.sPathName, - CFGPROP_USERPATHES, - css::uno::makeAny(aResubstPath.lUserPaths.getAsConstList())); - } - - ::comphelper::ConfigurationHelper::writeRelativeKey(xCfgNew, - aResubstPath.sPathName, - CFGPROP_WRITEPATH, - css::uno::makeAny(aResubstPath.sWritePath)); - - ::comphelper::ConfigurationHelper::flush(xCfgNew); - - // remove the whole path from the old configuration ! - // Otherwise we cant make sure that the diff between new and old configuration - // on loading time realy represent an user setting !!! - - // Check if the given path exists inside the old configuration. - // Because our new configuration knows more then the list of old pathes ... ! - if (xCfgOld->hasByName(aResubstPath.sPathName)) - { - css::uno::Reference< css::beans::XPropertySet > xProps(xCfgOld, css::uno::UNO_QUERY_THROW); - xProps->setPropertyValue(aResubstPath.sPathName, css::uno::Any()); - ::comphelper::ConfigurationHelper::flush(xCfgOld); - } - - m_bIgnoreEvents = sal_False; -} - -//----------------------------------------------------------------------------- -#ifdef MIGRATE_OLD_USER_PATHES -void PathSettings::impl_mergeOldUserPaths( PathSettings::PathInfo& rPath, - const OUStringList& lOld ) -{ - RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "PathSettings::impl_mergeOldUserPaths" ); - OUStringList::const_iterator pIt; - for ( pIt = lOld.begin(); - pIt != lOld.end() ; - ++pIt ) - { - const ::rtl::OUString& sOld = *pIt; - - if (rPath.bIsSinglePath) - { - LOG_ASSERT2(lOld.size()>1, "PathSettings::impl_mergeOldUserPaths()", "Single path has more then one path value inside old configuration (Common.xcu)!") - if (! rPath.sWritePath.equals(sOld)) - rPath.sWritePath = sOld; - } - else - { - if ( - ( rPath.lInternalPaths.findConst(sOld) == rPath.lInternalPaths.end()) && - ( rPath.lUserPaths.findConst(sOld) == rPath.lUserPaths.end() ) && - (! rPath.sWritePath.equals(sOld) ) - ) - rPath.lUserPaths.push_back(sOld); - } - } -} -#endif // MIGRATE_OLD_USER_PATHES - -//----------------------------------------------------------------------------- -PathSettings::EChangeOp PathSettings::impl_updatePath(const ::rtl::OUString& sPath , - sal_Bool bNotifyListener) -{ - // SAFE -> - WriteGuard aWriteLock(m_aLock); - - PathSettings::PathInfo* pPathOld = 0; - PathSettings::PathInfo* pPathNew = 0; - PathSettings::EChangeOp eOp = PathSettings::E_UNDEFINED; - PathSettings::PathInfo aPath; - - try - { - aPath = impl_readNewFormat(sPath); - aPath.sPathName = sPath; - // replace all might existing variables with real values - // Do it before these old pathes will be compared against the - // new path configuration. Otherwise some striungs uses different variables ... but substitution - // will produce strings with same content (because some variables are redundant!) - impl_subst(aPath, sal_False); - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - catch(const css::container::NoSuchElementException&) - { eOp = PathSettings::E_REMOVED; } - catch(const css::uno::Exception& exAny) - { throw exAny; } - - #ifdef MIGRATE_OLD_USER_PATHES - try - { - // migration of old user defined values on demand - // can be disabled for a new major - OUStringList lOldVals = impl_readOldFormat(sPath); - // replace all might existing variables with real values - // Do it before these old pathes will be compared against the - // new path configuration. Otherwise some striungs uses different variables ... but substitution - // will produce strings with same content (because some variables are redundant!) - impl_subst(lOldVals, fa_getSubstitution(), sal_False); - impl_mergeOldUserPaths(aPath, lOldVals); - } - catch(const css::uno::RuntimeException& exRun) - { throw exRun; } - // Normal(!) exceptions can be ignored! - // E.g. in case an addon installs a new path, which was not well known for an OOo 1.x installation - // we cant find a value for it inside the "old" configuration. So a NoSuchElementException - // will be normal .-) - catch(const css::uno::Exception&) - {} - #endif // MIGRATE_OLD_USER_PATHES - - PathSettings::PathHash::iterator pPath = m_lPaths.find(sPath); - if (eOp == PathSettings::E_UNDEFINED) - { - if (pPath != m_lPaths.end()) - eOp = PathSettings::E_CHANGED; - else - eOp = PathSettings::E_ADDED; - } - - switch(eOp) - { - case PathSettings::E_ADDED : - { - if (bNotifyListener) - { - pPathOld = 0; - pPathNew = &aPath; - impl_notifyPropListener(eOp, sPath, pPathOld, pPathNew); - } - m_lPaths[sPath] = aPath; - } - break; - - case PathSettings::E_CHANGED : - { - if (bNotifyListener) - { - pPathOld = &(pPath->second); - pPathNew = &aPath; - impl_notifyPropListener(eOp, sPath, pPathOld, pPathNew); - } - m_lPaths[sPath] = aPath; - } - break; - - case PathSettings::E_REMOVED : - { - if (pPath != m_lPaths.end()) - { - if (bNotifyListener) - { - pPathOld = &(pPath->second); - pPathNew = 0; - impl_notifyPropListener(eOp, sPath, pPathOld, pPathNew); - } - m_lPaths.erase(pPath); - } - } - break; - - default: // to let compiler be happy - break; - } - - return eOp; -} - -//----------------------------------------------------------------------------- -css::uno::Sequence< sal_Int32 > PathSettings::impl_mapPathName2IDList(const ::rtl::OUString& sPath) -{ - ::rtl::OUString sOldStyleProp = sPath; - ::rtl::OUString sInternalProp = sPath+POSTFIX_INTERNAL_PATHES; - ::rtl::OUString sUserProp = sPath+POSTFIX_USER_PATHES; - ::rtl::OUString sWriteProp = sPath+POSTFIX_WRITE_PATH; - - // Attention: The default set of IDs is fix and must follow these schema. - // Otherwhise the outside code ant work for new added properties. - // Why ? - // The outside code must fire N events for every changed property. - // And the knowing about packaging of variables of the structure PathInfo - // follow these group IDs ! But if such ID isnt in the range of [0..IDGROUP_COUNT] - // the outside cant determine the right group ... and cant fire the right events .-) - - css::uno::Sequence< sal_Int32 > lIDs(IDGROUP_COUNT); - lIDs[0] = IDGROUP_OLDSTYLE ; - lIDs[1] = IDGROUP_INTERNAL_PATHES; - lIDs[2] = IDGROUP_USER_PATHES ; - lIDs[3] = IDGROUP_WRITE_PATH ; - - sal_Int32 c = m_lPropDesc.getLength(); - sal_Int32 i = 0; - for (i=0; i<c; ++i) - { - const css::beans::Property& rProp = m_lPropDesc[i]; - - if (rProp.Name.equals(sOldStyleProp)) - lIDs[IDGROUP_OLDSTYLE] = rProp.Handle; - else - if (rProp.Name.equals(sInternalProp)) - lIDs[IDGROUP_INTERNAL_PATHES] = rProp.Handle; - else - if (rProp.Name.equals(sUserProp)) - lIDs[IDGROUP_USER_PATHES] = rProp.Handle; - else - if (rProp.Name.equals(sWriteProp)) - lIDs[IDGROUP_WRITE_PATH] = rProp.Handle; - } - - return lIDs; -} - -//----------------------------------------------------------------------------- -void PathSettings::impl_notifyPropListener( PathSettings::EChangeOp /*eOp*/ , - const ::rtl::OUString& sPath , - const PathSettings::PathInfo* pPathOld, - const PathSettings::PathInfo* pPathNew) -{ - css::uno::Sequence< sal_Int32 > lHandles(1); - css::uno::Sequence< css::uno::Any > lOldVals(1); - css::uno::Sequence< css::uno::Any > lNewVals(1); - - css::uno::Sequence< sal_Int32 > lIDs = impl_mapPathName2IDList(sPath); - sal_Int32 c = lIDs.getLength(); - sal_Int32 i = 0; - sal_Int32 nMaxID = m_lPropDesc.getLength()-1; - for (i=0; i<c; ++i) - { - sal_Int32 nID = lIDs[i]; - - if ( - (nID < 0 ) || - (nID > nMaxID) - ) - continue; - - lHandles[0] = nID; - switch(impl_getPropGroup(nID)) - { - case IDGROUP_OLDSTYLE : - { - if (pPathOld) - { - ::rtl::OUString sVal = impl_convertPath2OldStyle(*pPathOld); - lOldVals[0] <<= sVal; - } - if (pPathNew) - { - ::rtl::OUString sVal = impl_convertPath2OldStyle(*pPathNew); - lNewVals[0] <<= sVal; - } - } - break; - - case IDGROUP_INTERNAL_PATHES : - { - if (pPathOld) - lOldVals[0] <<= pPathOld->lInternalPaths.getAsConstList(); - if (pPathNew) - lNewVals[0] <<= pPathNew->lInternalPaths.getAsConstList(); - } - break; - - case IDGROUP_USER_PATHES : - { - if (pPathOld) - lOldVals[0] <<= pPathOld->lUserPaths.getAsConstList(); - if (pPathNew) - lNewVals[0] <<= pPathNew->lUserPaths.getAsConstList(); - } - break; - - case IDGROUP_WRITE_PATH : - { - if (pPathOld) - lOldVals[0] <<= pPathOld->sWritePath; - if (pPathNew) - lNewVals[0] <<= pPathNew->sWritePath; - } - break; - } - - fire(lHandles.getArray(), - lNewVals.getArray(), - lOldVals.getArray(), - 1, - sal_False); - } -} - -//----------------------------------------------------------------------------- -void PathSettings::impl_subst( OUStringList& lVals , - const css::uno::Reference< css::util::XStringSubstitution >& xSubst , - sal_Bool bReSubst) -{ - OUStringList::iterator pIt; - - for ( pIt = lVals.begin(); - pIt != lVals.end() ; - ++pIt ) - { - const ::rtl::OUString& sOld = *pIt; - ::rtl::OUString sNew ; - if (bReSubst) - sNew = xSubst->reSubstituteVariables(sOld); - else - sNew = xSubst->substituteVariables(sOld, sal_False); - - *pIt = sNew; - } -} - -//----------------------------------------------------------------------------- -void PathSettings::impl_subst(PathSettings::PathInfo& aPath , - sal_Bool bReSubst) -{ - css::uno::Reference< css::util::XStringSubstitution > xSubst = fa_getSubstitution(); - - impl_subst(aPath.lInternalPaths, xSubst, bReSubst); - impl_subst(aPath.lUserPaths , xSubst, bReSubst); - if (bReSubst) - aPath.sWritePath = xSubst->reSubstituteVariables(aPath.sWritePath); - else - aPath.sWritePath = xSubst->substituteVariables(aPath.sWritePath, sal_False); -} - -//----------------------------------------------------------------------------- -::rtl::OUString PathSettings::impl_convertPath2OldStyle(const PathSettings::PathInfo& rPath) const -{ - OUStringList::const_iterator pIt; - OUStringList lTemp; - lTemp.reserve(rPath.lInternalPaths.size() + rPath.lUserPaths.size() + 1); - - for ( pIt = rPath.lInternalPaths.begin(); - pIt != rPath.lInternalPaths.end() ; - ++pIt ) - { - lTemp.push_back(*pIt); - } - for ( pIt = rPath.lUserPaths.begin(); - pIt != rPath.lUserPaths.end() ; - ++pIt ) - { - lTemp.push_back(*pIt); - } - - if (rPath.sWritePath.getLength() > 0) - lTemp.push_back(rPath.sWritePath); - - ::rtl::OUStringBuffer sPathVal(256); - for ( pIt = lTemp.begin(); - pIt != lTemp.end() ; - ) - { - sPathVal.append(*pIt); - ++pIt; - if (pIt != lTemp.end()) - sPathVal.appendAscii(";"); - } - - return sPathVal.makeStringAndClear(); -} - -//----------------------------------------------------------------------------- -OUStringList PathSettings::impl_convertOldStyle2Path(const ::rtl::OUString& sOldStylePath) const -{ - OUStringList lList; - sal_Int32 nToken = 0; - do - { - ::rtl::OUString sToken = sOldStylePath.getToken(0, ';', nToken); - if (sToken.getLength()) - lList.push_back(sToken); - } - while(nToken >= 0); - - return lList; -} - -//----------------------------------------------------------------------------- -void PathSettings::impl_purgeKnownPaths(const PathSettings::PathInfo& rPath, - OUStringList& lList) -{ - OUStringList::const_iterator pIt; - for ( pIt = rPath.lInternalPaths.begin(); - pIt != rPath.lInternalPaths.end() ; - ++pIt ) - { - const ::rtl::OUString& rItem = *pIt; - OUStringList::iterator pItem = lList.find(rItem); - if (pItem != lList.end()) - lList.erase(pItem); - } - for ( pIt = rPath.lUserPaths.begin(); - pIt != rPath.lUserPaths.end() ; - ++pIt ) - { - const ::rtl::OUString& rItem = *pIt; - OUStringList::iterator pItem = lList.find(rItem); - if (pItem != lList.end()) - lList.erase(pItem); - } - - OUStringList::iterator pItem = lList.find(rPath.sWritePath); - if (pItem != lList.end()) - lList.erase(pItem); -} - -//----------------------------------------------------------------------------- -void PathSettings::impl_rebuildPropertyDescriptor() -{ - // SAFE -> - WriteGuard aWriteLock(m_aLock); - - sal_Int32 c = (sal_Int32)m_lPaths.size(); - sal_Int32 i = 0; - m_lPropDesc.realloc(c*IDGROUP_COUNT); - - PathHash::const_iterator pIt; - for ( pIt = m_lPaths.begin(); - pIt != m_lPaths.end() ; - ++pIt ) - { - const PathSettings::PathInfo& rPath = pIt->second; - css::beans::Property* pProp = 0; - - pProp = &(m_lPropDesc[i]); - pProp->Name = rPath.sPathName; - pProp->Handle = i; - pProp->Type = ::getCppuType((::rtl::OUString*)0); - pProp->Attributes = css::beans::PropertyAttribute::BOUND; - if (rPath.bIsReadonly) - pProp->Attributes |= css::beans::PropertyAttribute::READONLY; - ++i; - - pProp = &(m_lPropDesc[i]); - pProp->Name = rPath.sPathName+POSTFIX_INTERNAL_PATHES; - pProp->Handle = i; - pProp->Type = ::getCppuType((css::uno::Sequence< ::rtl::OUString >*)0); - pProp->Attributes = css::beans::PropertyAttribute::BOUND | - css::beans::PropertyAttribute::READONLY; - ++i; - - pProp = &(m_lPropDesc[i]); - pProp->Name = rPath.sPathName+POSTFIX_USER_PATHES; - pProp->Handle = i; - pProp->Type = ::getCppuType((css::uno::Sequence< ::rtl::OUString >*)0); - pProp->Attributes = css::beans::PropertyAttribute::BOUND; - if (rPath.bIsReadonly) - pProp->Attributes |= css::beans::PropertyAttribute::READONLY; - ++i; - - pProp = &(m_lPropDesc[i]); - pProp->Name = rPath.sPathName+POSTFIX_WRITE_PATH; - pProp->Handle = i; - pProp->Type = ::getCppuType((::rtl::OUString*)0); - pProp->Attributes = css::beans::PropertyAttribute::BOUND; - if (rPath.bIsReadonly) - pProp->Attributes |= css::beans::PropertyAttribute::READONLY; - ++i; - } - - if (m_pPropHelp) - delete m_pPropHelp; - m_pPropHelp = new ::cppu::OPropertyArrayHelper(m_lPropDesc, sal_False); // false => not sorted ... must be done inside helper - - aWriteLock.unlock(); - // <- SAFE -} - -//----------------------------------------------------------------------------- -css::uno::Any PathSettings::impl_getPathValue(sal_Int32 nID) const -{ - const PathSettings::PathInfo* pPath = impl_getPathAccessConst(nID); - if (! pPath) - throw css::container::NoSuchElementException(); - - css::uno::Any aVal; - switch(impl_getPropGroup(nID)) - { - case IDGROUP_OLDSTYLE : - { - ::rtl::OUString sVal = impl_convertPath2OldStyle(*pPath); - aVal <<= sVal; - } - break; - - case IDGROUP_INTERNAL_PATHES : - { - aVal <<= pPath->lInternalPaths.getAsConstList(); - } - break; - - case IDGROUP_USER_PATHES : - { - aVal <<= pPath->lUserPaths.getAsConstList(); - } - break; - - case IDGROUP_WRITE_PATH : - { - aVal <<= pPath->sWritePath; - } - break; - } - - return aVal; -} - -//----------------------------------------------------------------------------- -void PathSettings::impl_setPathValue( sal_Int32 nID , - const css::uno::Any& aVal) -{ - PathSettings::PathInfo* pOrgPath = impl_getPathAccess(nID); - if (! pOrgPath) - throw css::container::NoSuchElementException(); - - // We work on a copied path ... so we can be sure that errors during this operation - // does not make our internal cache invalid .-) - PathSettings::PathInfo aChangePath(*pOrgPath); - - switch(impl_getPropGroup(nID)) - { - case IDGROUP_OLDSTYLE : - { - ::rtl::OUString sVal; - aVal >>= sVal; - OUStringList lList = impl_convertOldStyle2Path(sVal); - impl_subst(lList, fa_getSubstitution(), sal_False); - impl_purgeKnownPaths(aChangePath, lList); - if (! impl_isValidPath(lList)) - throw css::lang::IllegalArgumentException(); - - if (aChangePath.bIsSinglePath) - { - LOG_ASSERT2(lList.size()>1, "PathSettings::impl_setPathValue()", "You try to set more then path value for a defined SINGLE_PATH!") - if ( !lList.empty() ) - aChangePath.sWritePath = *(lList.begin()); - else - aChangePath.sWritePath = ::rtl::OUString(); - } - else - { - OUStringList::const_iterator pIt; - for ( pIt = lList.begin(); - pIt != lList.end() ; - ++pIt ) - { - aChangePath.lUserPaths.push_back(*pIt); - } - } - } - break; - - case IDGROUP_INTERNAL_PATHES : - { - if (aChangePath.bIsSinglePath) - { - ::rtl::OUStringBuffer sMsg(256); - sMsg.appendAscii("The path '" ); - sMsg.append (aChangePath.sPathName); - sMsg.appendAscii("' is defined as SINGLE_PATH. It's sub set of internal pathes cant be set."); - throw css::uno::Exception(sMsg.makeStringAndClear(), - static_cast< ::cppu::OWeakObject* >(this)); - } - - OUStringList lList; - lList << aVal; - if (! impl_isValidPath(lList)) - throw css::lang::IllegalArgumentException(); - aChangePath.lInternalPaths = lList; - } - break; - - case IDGROUP_USER_PATHES : - { - if (aChangePath.bIsSinglePath) - { - ::rtl::OUStringBuffer sMsg(256); - sMsg.appendAscii("The path '" ); - sMsg.append (aChangePath.sPathName); - sMsg.appendAscii("' is defined as SINGLE_PATH. It's sub set of internal pathes cant be set."); - throw css::uno::Exception(sMsg.makeStringAndClear(), - static_cast< ::cppu::OWeakObject* >(this)); - } - - OUStringList lList; - lList << aVal; - if (! impl_isValidPath(lList)) - throw css::lang::IllegalArgumentException(); - aChangePath.lUserPaths = lList; - } - break; - - case IDGROUP_WRITE_PATH : - { - ::rtl::OUString sVal; - aVal >>= sVal; - if (! impl_isValidPath(sVal)) - throw css::lang::IllegalArgumentException(); - aChangePath.sWritePath = sVal; - } - break; - } - - // TODO check if path has at least one path value set - // At least it depends from the feature using this path, if an empty path list is allowed. - - // first we should try to store the changed (copied!) path ... - // In case an error occure on saving time an exception is thrown ... - // If no exception occures we can update our internal cache (means - // we can overwrite pOrgPath ! - impl_storePath(aChangePath); - pOrgPath->takeOver(aChangePath); -} - -//----------------------------------------------------------------------------- -sal_Bool PathSettings::impl_isValidPath(const OUStringList& lPath) const -{ - OUStringList::const_iterator pIt; - for ( pIt = lPath.begin(); - pIt != lPath.end() ; - ++pIt ) - { - const ::rtl::OUString& rVal = *pIt; - if (! impl_isValidPath(rVal)) - return sal_False; - } - - return sal_True; -} - -//----------------------------------------------------------------------------- -sal_Bool PathSettings::impl_isValidPath(const ::rtl::OUString& sPath) const -{ - // allow empty path to reset a path. -// idea by LLA to support empty pathes -// if (sPath.getLength() == 0) -// { -// return sal_True; -// } - - return (! INetURLObject(sPath).HasError()); -} - -//----------------------------------------------------------------------------- -::rtl::OUString impl_extractBaseFromPropName(const ::rtl::OUString& sPropName) -{ - sal_Int32 i = -1; - - i = sPropName.indexOf(POSTFIX_INTERNAL_PATHES); - if (i > -1) - return sPropName.copy(0, i); - i = sPropName.indexOf(POSTFIX_USER_PATHES); - if (i > -1) - return sPropName.copy(0, i); - i = sPropName.indexOf(POSTFIX_WRITE_PATH); - if (i > -1) - return sPropName.copy(0, i); - - return sPropName; -} - -//----------------------------------------------------------------------------- -PathSettings::PathInfo* PathSettings::impl_getPathAccess(sal_Int32 nHandle) -{ - // SAFE -> - ReadGuard aReadLock(m_aLock); - - if (nHandle > (m_lPropDesc.getLength()-1)) - return 0; - - const css::beans::Property& rProp = m_lPropDesc[nHandle]; - ::rtl::OUString sProp = impl_extractBaseFromPropName(rProp.Name); - PathSettings::PathHash::iterator rPath = m_lPaths.find(sProp); - - if (rPath != m_lPaths.end()) - return &(rPath->second); - - return 0; - // <- SAFE -} - -//----------------------------------------------------------------------------- -const PathSettings::PathInfo* PathSettings::impl_getPathAccessConst(sal_Int32 nHandle) const -{ - // SAFE -> - ReadGuard aReadLock(m_aLock); - - if (nHandle > (m_lPropDesc.getLength()-1)) - return 0; - - const css::beans::Property& rProp = m_lPropDesc[nHandle]; - ::rtl::OUString sProp = impl_extractBaseFromPropName(rProp.Name); - PathSettings::PathHash::const_iterator rPath = m_lPaths.find(sProp); - - if (rPath != m_lPaths.end()) - return &(rPath->second); - - return 0; - // <- SAFE -} - -//----------------------------------------------------------------------------- -sal_Bool SAL_CALL PathSettings::convertFastPropertyValue( css::uno::Any& aConvertedValue, - css::uno::Any& aOldValue , - sal_Int32 nHandle , - const css::uno::Any& aValue ) - throw(css::lang::IllegalArgumentException) -{ - // throws NoSuchElementException ! - css::uno::Any aCurrentVal = impl_getPathValue(nHandle); - - return PropHelper::willPropertyBeChanged( - aCurrentVal, - aValue, - aOldValue, - aConvertedValue); -} - -//----------------------------------------------------------------------------- -void SAL_CALL PathSettings::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, - const css::uno::Any& aValue ) - throw(css::uno::Exception) -{ - // throws NoSuchElement- and IllegalArgumentException ! - impl_setPathValue(nHandle, aValue); -} - -//----------------------------------------------------------------------------- -void SAL_CALL PathSettings::getFastPropertyValue(css::uno::Any& aValue , - sal_Int32 nHandle) const -{ - aValue = impl_getPathValue(nHandle); -} - -//----------------------------------------------------------------------------- -::cppu::IPropertyArrayHelper& SAL_CALL PathSettings::getInfoHelper() -{ - return *m_pPropHelp; -} - -//----------------------------------------------------------------------------- -css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL PathSettings::getPropertySetInfo() - throw(css::uno::RuntimeException) -{ - return css::uno::Reference< css::beans::XPropertySetInfo >(createPropertySetInfo(getInfoHelper())); -} - -//----------------------------------------------------------------------------- -css::uno::Reference< css::util::XStringSubstitution > PathSettings::fa_getSubstitution() -{ - // SAFE -> - ReadGuard aReadLock(m_aLock); - css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR; - css::uno::Reference< css::util::XStringSubstitution > xSubst = m_xSubstitution; - aReadLock.unlock(); - // <- SAFE - - if (! xSubst.is()) - { - // create the needed substitution service. - // We must replace all used variables inside readed path values. - // In case we can't do so ... the whole office can't work realy. - // That's why it seams to be OK to throw a RuntimeException then. - xSubst = css::uno::Reference< css::util::XStringSubstitution >( - xSMGR->createInstance(SERVICENAME_SUBSTITUTEPATHVARIABLES), - css::uno::UNO_QUERY_THROW); - - // SAFE -> - WriteGuard aWriteLock(m_aLock); - m_xSubstitution = xSubst; - aWriteLock.unlock(); - } - - return xSubst; -} - -//----------------------------------------------------------------------------- -css::uno::Reference< css::container::XNameAccess > PathSettings::fa_getCfgOld() -{ - const static ::rtl::OUString CFG_NODE_OLD(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Office.Common/Path/Current")); - - // SAFE -> - ReadGuard aReadLock(m_aLock); - css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR; - css::uno::Reference< css::container::XNameAccess > xCfg = m_xCfgOld; - aReadLock.unlock(); - // <- SAFE - - if (! xCfg.is()) - { - xCfg = css::uno::Reference< css::container::XNameAccess >( - ::comphelper::ConfigurationHelper::openConfig( - xSMGR, - CFG_NODE_OLD, - ::comphelper::ConfigurationHelper::E_STANDARD), // not readonly! Somtimes we need write access there !!! - css::uno::UNO_QUERY_THROW); - - // SAFE -> - WriteGuard aWriteLock(m_aLock); - m_xCfgOld = xCfg; - aWriteLock.unlock(); - } - - return xCfg; -} - -//----------------------------------------------------------------------------- -css::uno::Reference< css::container::XNameAccess > PathSettings::fa_getCfgNew() -{ - const static ::rtl::OUString CFG_NODE_NEW(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Office.Paths/Paths")); - - // SAFE -> - ReadGuard aReadLock(m_aLock); - css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR; - css::uno::Reference< css::container::XNameAccess > xCfg = m_xCfgNew; - aReadLock.unlock(); - // <- SAFE - - if (! xCfg.is()) - { - xCfg = css::uno::Reference< css::container::XNameAccess >( - ::comphelper::ConfigurationHelper::openConfig( - xSMGR, - CFG_NODE_NEW, - ::comphelper::ConfigurationHelper::E_STANDARD), - css::uno::UNO_QUERY_THROW); - - // SAFE -> - WriteGuard aWriteLock(m_aLock); - m_xCfgNew = xCfg; - m_xCfgNewListener = new WeakChangesListener(this); - aWriteLock.unlock(); - - css::uno::Reference< css::util::XChangesNotifier > xBroadcaster(xCfg, css::uno::UNO_QUERY_THROW); - xBroadcaster->addChangesListener(m_xCfgNewListener); - } - - return xCfg; -} - -} // namespace framework - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |