diff options
author | Matúš Kukan <matus.kukan@collabora.com> | 2014-01-09 19:40:02 +0100 |
---|---|---|
committer | Matúš Kukan <matus.kukan@collabora.com> | 2014-01-23 11:41:29 +0100 |
commit | 89b0017b22889af6a8afe28b94c06e7095dc8c6f (patch) | |
tree | 1dba1bc711ef023e8dabe75e6dec0dbdb098e241 /framework | |
parent | 22832569e1436171b8707be36365d9bdb7857c62 (diff) |
fwk: Use constructor feature for one instance PathSettings.
Change-Id: Iaa01abc9f604d8f9e6f762e3340f9468e19f4848
Diffstat (limited to 'framework')
-rw-r--r-- | framework/inc/helper/mischelper.hxx | 1 | ||||
-rw-r--r-- | framework/inc/services/pathsettings.hxx | 430 | ||||
-rw-r--r-- | framework/source/register/registerservices.cxx | 2 | ||||
-rw-r--r-- | framework/source/services/pathsettings.cxx | 461 | ||||
-rw-r--r-- | framework/util/fwk.component | 3 |
5 files changed, 433 insertions, 464 deletions
diff --git a/framework/inc/helper/mischelper.hxx b/framework/inc/helper/mischelper.hxx index 6689b3301566..f8fa26ff2b0c 100644 --- a/framework/inc/helper/mischelper.hxx +++ b/framework/inc/helper/mischelper.hxx @@ -27,6 +27,7 @@ #include <com/sun/star/util/XChangesListener.hpp> #include <com/sun/star/container/XContainerListener.hpp> #include <com/sun/star/frame/XFrame.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> #include <cppuhelper/implbase1.hxx> diff --git a/framework/inc/services/pathsettings.hxx b/framework/inc/services/pathsettings.hxx deleted file mode 100644 index fb816c1055d5..000000000000 --- a/framework/inc/services/pathsettings.hxx +++ /dev/null @@ -1,430 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#ifndef INCLUDED_FRAMEWORK_INC_SERVICES_PATHSETTINGS_HXX -#define INCLUDED_FRAMEWORK_INC_SERVICES_PATHSETTINGS_HXX - -#include <threadhelp/threadhelpbase.hxx> -#include <macros/generic.hxx> -#include <macros/xinterface.hxx> -#include <macros/xtypeprovider.hxx> -#include <macros/xserviceinfo.hxx> -#include <stdtypes.h> -#include <properties.h> - -#include <com/sun/star/container/XNameAccess.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/lang/XTypeProvider.hpp> -#include <com/sun/star/util/XStringSubstitution.hpp> -#include <com/sun/star/util/XChangesListener.hpp> -#include <com/sun/star/util/XPathSettings.hpp> - -#include <cppuhelper/propshlp.hxx> -#include <cppuhelper/implbase3.hxx> -#include <unotools/configitem.hxx> -#include <comphelper/sequenceasvector.hxx> - -/* enable it if you wish to migrate old user settings (using the old cfg schema) on demand .... - disable it in case only the new schema must be used. - */ - -namespace framework -{ - -typedef ::cppu::WeakImplHelper3< - css::lang::XServiceInfo, - css::util::XChangesListener, // => XEventListener - css::util::XPathSettings> // => XPropertySet - PathSettings_BASE; - -class PathSettings : // base classes - // Order is necessary for right initialization! - private ThreadHelpBase , - public ::cppu::OBroadcastHelper , - public ::cppu::OPropertySetHelper , // => XPropertySet / XFastPropertySet / XMultiPropertySet - public PathSettings_BASE -{ - struct PathInfo - { - public: - - PathInfo() - : sPathName () - , lInternalPaths() - , lUserPaths () - , sWritePath () - , bIsSinglePath (sal_False) - , bIsReadonly (sal_False) - {} - - PathInfo(const PathInfo& rCopy) - { - takeOver(rCopy); - } - - void takeOver(const PathInfo& rCopy) - { - sPathName = rCopy.sPathName; - lInternalPaths = rCopy.lInternalPaths; - lUserPaths = rCopy.lUserPaths; - sWritePath = rCopy.sWritePath; - bIsSinglePath = rCopy.bIsSinglePath; - bIsReadonly = rCopy.bIsReadonly; - } - - /// an internal name describing this path - OUString sPathName; - - /// contains all paths, which are used internaly - but are not visible for the user. - OUStringList lInternalPaths; - - /// contains all paths configured by the user - OUStringList lUserPaths; - - /// this special path is used to generate feature depending content there - OUString sWritePath; - - /// indicates real single paths, which uses WritePath property only - sal_Bool bIsSinglePath; - - /// simple handling of finalized/mandatory states ... => we know one state READONLY only .-) - sal_Bool bIsReadonly; - }; - - typedef BaseHash< PathSettings::PathInfo > PathHash; - - enum EChangeOp - { - E_UNDEFINED, - E_ADDED, - E_CHANGED, - E_REMOVED - }; - - // ______________________________________ - // member - - private: - - /** reference to factory, which has create this instance. */ - css::uno::Reference< css::uno::XComponentContext > m_xContext; - - /** list of all path variables and her corresponding values. */ - PathSettings::PathHash m_lPaths; - - /** describes all properties available on our interface. - Will be generated on demand based on our path list m_lPaths. */ - css::uno::Sequence< css::beans::Property > m_lPropDesc; - - /** helper needed to (re-)substitute all internal save path values. */ - css::uno::Reference< css::util::XStringSubstitution > m_xSubstitution; - - /** provides access to the old configuration schema (which will be migrated on demand). */ - css::uno::Reference< css::container::XNameAccess > m_xCfgOld; - - /** provides access to the new configuration schema. */ - css::uno::Reference< css::container::XNameAccess > m_xCfgNew; - - /** helper to listen for configuration changes without ownership cycle problems */ - css::uno::Reference< css::util::XChangesListener > m_xCfgNewListener; - - ::cppu::OPropertyArrayHelper* m_pPropHelp; - - ::sal_Bool m_bIgnoreEvents; - - // ___________________________________________ - // interface - - public: - - /** initialize a new instance of this class. - Attention: It's necessary for right function of this class, that the order of base - classes is the right one. Because we transfer information from one base to another - during this ctor runs! */ - PathSettings(const css::uno::Reference< css::uno::XComponentContext >& xContext); - - /** free all used resources ... if it was not already done. */ - virtual ~PathSettings(); - - /** declaration of XInterface, XTypeProvider, XServiceInfo */ - DECLARE_XSERVICEINFO - - // XInterface - virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& type) throw ( ::com::sun::star::uno::RuntimeException ); - virtual void SAL_CALL acquire() throw () - { OWeakObject::acquire(); } - virtual void SAL_CALL release() throw () - { OWeakObject::release(); } - - // XTypeProvider - virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); - - // css::util::XChangesListener - virtual void SAL_CALL changesOccurred(const css::util::ChangesEvent& aEvent) throw (css::uno::RuntimeException); - - // css::lang::XEventListener - virtual void SAL_CALL disposing(const css::lang::EventObject& aSource) - throw(css::uno::RuntimeException); - - using ::cppu::OPropertySetHelper::disposing; - - - /** - * XPathSettings attribute methods - */ - virtual OUString SAL_CALL getAddin() throw (css::uno::RuntimeException) - { return getStringProperty("Addin"); } - virtual void SAL_CALL setAddin(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Addin", p1); } - virtual OUString SAL_CALL getAutoCorrect() throw (css::uno::RuntimeException) - { return getStringProperty("AutoCorrect"); } - virtual void SAL_CALL setAutoCorrect(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("AutoCorrect", p1); } - virtual OUString SAL_CALL getAutoText() throw (css::uno::RuntimeException) - { return getStringProperty("AutoText"); } - virtual void SAL_CALL setAutoText(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("AutoText", p1); } - virtual OUString SAL_CALL getBackup() throw (css::uno::RuntimeException) - { return getStringProperty("Backup"); } - virtual void SAL_CALL setBackup(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Backup", p1); } - virtual OUString SAL_CALL getBasic() throw (css::uno::RuntimeException) - { return getStringProperty("Basic"); } - virtual void SAL_CALL setBasic(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Basic", p1); } - virtual OUString SAL_CALL getBitmap() throw (css::uno::RuntimeException) - { return getStringProperty("Bitmap"); } - virtual void SAL_CALL setBitmap(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Bitmap", p1); } - virtual OUString SAL_CALL getConfig() throw (css::uno::RuntimeException) - { return getStringProperty("Config"); } - virtual void SAL_CALL setConfig(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Config", p1); } - virtual OUString SAL_CALL getDictionary() throw (css::uno::RuntimeException) - { return getStringProperty("Dictionary"); } - virtual void SAL_CALL setDictionary(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Dictionary", p1); } - virtual OUString SAL_CALL getFavorite() throw (css::uno::RuntimeException) - { return getStringProperty("Favorite"); } - virtual void SAL_CALL setFavorite(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Favorite", p1); } - virtual OUString SAL_CALL getFilter() throw (css::uno::RuntimeException) - { return getStringProperty("Filter"); } - virtual void SAL_CALL setFilter(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Filter", p1); } - virtual OUString SAL_CALL getGallery() throw (css::uno::RuntimeException) - { return getStringProperty("Gallery"); } - virtual void SAL_CALL setGallery(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Gallery", p1); } - virtual OUString SAL_CALL getGraphic() throw (css::uno::RuntimeException) - { return getStringProperty("Graphic"); } - virtual void SAL_CALL setGraphic(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Graphic", p1); } - virtual OUString SAL_CALL getHelp() throw (css::uno::RuntimeException) - { return getStringProperty("Help"); } - virtual void SAL_CALL setHelp(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Help", p1); } - virtual OUString SAL_CALL getLinguistic() throw (css::uno::RuntimeException) - { return getStringProperty("Linguistic"); } - virtual void SAL_CALL setLinguistic(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Linguistic", p1); } - virtual OUString SAL_CALL getModule() throw (css::uno::RuntimeException) - { return getStringProperty("Module"); } - virtual void SAL_CALL setModule(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Module", p1); } - virtual OUString SAL_CALL getPalette() throw (css::uno::RuntimeException) - { return getStringProperty("Palette"); } - virtual void SAL_CALL setPalette(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Palette", p1); } - virtual OUString SAL_CALL getPlugin() throw (css::uno::RuntimeException) - { return getStringProperty("Plugin"); } - virtual void SAL_CALL setPlugin(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Plugin", p1); } - virtual OUString SAL_CALL getStorage() throw (css::uno::RuntimeException) - { return getStringProperty("Storage"); } - virtual void SAL_CALL setStorage(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Storage", p1); } - virtual OUString SAL_CALL getTemp() throw (css::uno::RuntimeException) - { return getStringProperty("Temp"); } - virtual void SAL_CALL setTemp(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Temp", p1); } - virtual OUString SAL_CALL getTemplate() throw (css::uno::RuntimeException) - { return getStringProperty("Template"); } - virtual void SAL_CALL setTemplate(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Template", p1); } - virtual OUString SAL_CALL getUIConfig() throw (css::uno::RuntimeException) - { return getStringProperty("UIConfig"); } - virtual void SAL_CALL setUIConfig(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("UIConfig", p1); } - virtual OUString SAL_CALL getUserConfig() throw (css::uno::RuntimeException) - { return getStringProperty("UserConfig"); } - virtual void SAL_CALL setUserConfig(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("UserConfig", p1); } - virtual OUString SAL_CALL getUserDictionary() throw (css::uno::RuntimeException) - { return getStringProperty("UserDictionary"); } - virtual void SAL_CALL setUserDictionary(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("UserDictionary", p1); } - virtual OUString SAL_CALL getWork() throw (css::uno::RuntimeException) - { return getStringProperty("Work"); } - virtual void SAL_CALL setWork(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("Work", p1); } - virtual OUString SAL_CALL getBasePathShareLayer() throw (css::uno::RuntimeException) - { return getStringProperty("UIConfig"); } - virtual void SAL_CALL setBasePathShareLayer(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("UIConfig", p1); } - virtual OUString SAL_CALL getBasePathUserLayer() throw (css::uno::RuntimeException) - { return getStringProperty("UserConfig"); } - virtual void SAL_CALL setBasePathUserLayer(const OUString& p1) throw (css::uno::RuntimeException) - { setStringProperty("UserConfig", p1); } - - - - /** - * overrides to resolve inheritance ambiguity - */ - virtual void SAL_CALL setPropertyValue(const OUString& p1, const css::uno::Any& p2) - throw (css::beans::UnknownPropertyException, css::beans::PropertyVetoException, css::lang::IllegalArgumentException, css::lang::WrappedTargetException, css::uno::RuntimeException) - { ::cppu::OPropertySetHelper::setPropertyValue(p1, p2); } - virtual css::uno::Any SAL_CALL getPropertyValue(const OUString& p1) - throw (com::sun::star::beans::UnknownPropertyException, com::sun::star::lang::WrappedTargetException, com::sun::star::uno::RuntimeException) - { return ::cppu::OPropertySetHelper::getPropertyValue(p1); } - virtual void SAL_CALL addPropertyChangeListener(const OUString& p1, const css::uno::Reference<css::beans::XPropertyChangeListener>& p2) - throw (com::sun::star::beans::UnknownPropertyException, com::sun::star::lang::WrappedTargetException, com::sun::star::uno::RuntimeException) - { ::cppu::OPropertySetHelper::addPropertyChangeListener(p1, p2); } - virtual void SAL_CALL removePropertyChangeListener(const OUString& p1, const css::uno::Reference<css::beans::XPropertyChangeListener>& p2) - throw (com::sun::star::beans::UnknownPropertyException, com::sun::star::lang::WrappedTargetException, com::sun::star::uno::RuntimeException) - { ::cppu::OPropertySetHelper::removePropertyChangeListener(p1, p2); } - virtual void SAL_CALL addVetoableChangeListener(const OUString& p1, const css::uno::Reference<css::beans::XVetoableChangeListener>& p2) - throw (com::sun::star::beans::UnknownPropertyException, com::sun::star::lang::WrappedTargetException, com::sun::star::uno::RuntimeException) - { ::cppu::OPropertySetHelper::addVetoableChangeListener(p1, p2); } - virtual void SAL_CALL removeVetoableChangeListener(const OUString& p1, const css::uno::Reference<css::beans::XVetoableChangeListener>& p2) - throw (com::sun::star::beans::UnknownPropertyException, com::sun::star::lang::WrappedTargetException, com::sun::star::uno::RuntimeException) - { ::cppu::OPropertySetHelper::removeVetoableChangeListener(p1, p2); } - - - // ___________________________________________ - // helper - - private: - - OUString getStringProperty(const OUString& p1) - throw(css::uno::RuntimeException); - - void setStringProperty(const OUString& p1, const OUString& p2) - throw(css::uno::RuntimeException); - - /** read all configured paths and create all needed internal structures. */ - void impl_readAll(); - - /** read a path info using the old cfg schema. - This is needed for "migration on demand" reasons only. - Can be removed for next major release .-) */ - OUStringList impl_readOldFormat(const OUString& sPath); - - /** read a path info using the new cfg schema. */ - PathSettings::PathInfo impl_readNewFormat(const OUString& sPath); - - /** filter "real user defined paths" from the old configuration schema - and set it as UserPaths on the new schema. - Can be removed with new major release ... */ - - void impl_mergeOldUserPaths( PathSettings::PathInfo& rPath, - const OUStringList& lOld ); - - /** reload one path directly from the new configuration schema (because - it was updated by any external code) */ - PathSettings::EChangeOp impl_updatePath(const OUString& sPath , - sal_Bool bNotifyListener); - - /** replace all might existing placeholder variables inside the given path ... - or check if the given path value uses paths, which can be replaced with predefined - placeholder variables ... - */ - void impl_subst( OUStringList& lVals , - const css::uno::Reference< css::util::XStringSubstitution >& xSubst , - sal_Bool bReSubst); - - void impl_subst(PathSettings::PathInfo& aPath , - sal_Bool bReSubst); - - - /** converts our new string list schema to the old ";" separated schema ... */ - OUString impl_convertPath2OldStyle(const PathSettings::PathInfo& rPath ) const; - OUStringList impl_convertOldStyle2Path(const OUString& sOldStylePath) const; - - /** remove still known paths from the given lList argument. - So real user defined paths can be extracted from the list of - fix internal paths ! - */ - void impl_purgeKnownPaths(const PathSettings::PathInfo& rPath, - OUStringList& lList); - - /** rebuild the member m_lPropDesc using the path list m_lPaths. */ - void impl_rebuildPropertyDescriptor(); - - /** provides direct access to the list of path values - using it's internal property id. - */ - css::uno::Any impl_getPathValue( sal_Int32 nID ) const; - void impl_setPathValue( sal_Int32 nID , - const css::uno::Any& aVal); - - /** check the given handle and return the corresponding PathInfo reference. - These reference can be used then directly to manipulate these path. */ - PathSettings::PathInfo* impl_getPathAccess (sal_Int32 nHandle); - const PathSettings::PathInfo* impl_getPathAccessConst(sal_Int32 nHandle) const; - - /** it checks, if the given path value seams to be a valid URL or system path. */ - sal_Bool impl_isValidPath(const OUString& sPath) const; - sal_Bool impl_isValidPath(const OUStringList& lPath) const; - - void impl_storePath(const PathSettings::PathInfo& aPath); - - css::uno::Sequence< sal_Int32 > impl_mapPathName2IDList(const OUString& sPath); - - void impl_notifyPropListener( PathSettings::EChangeOp eOp , - const OUString& sPath , - const PathSettings::PathInfo* pPathOld, - const PathSettings::PathInfo* pPathNew); - - - // OPropertySetHelper - virtual sal_Bool SAL_CALL convertFastPropertyValue ( css::uno::Any& aConvertedValue , - css::uno::Any& aOldValue , - sal_Int32 nHandle , - const css::uno::Any& aValue ) throw(css::lang::IllegalArgumentException); - virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle , - const css::uno::Any& aValue ) throw(css::uno::Exception); - using cppu::OPropertySetHelper::getFastPropertyValue; - virtual void SAL_CALL getFastPropertyValue ( css::uno::Any& aValue , - sal_Int32 nHandle ) const; - virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper ( ); - virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo ( ) throw(::css::uno::RuntimeException); - - /** factory methods to guarantee right (but on demand) initialized members ... */ - css::uno::Reference< css::util::XStringSubstitution > fa_getSubstitution(); - css::uno::Reference< css::container::XNameAccess > fa_getCfgOld(); - css::uno::Reference< css::container::XNameAccess > fa_getCfgNew(); -}; - -} // namespace framework - -#endif // INCLUDED_FRAMEWORK_INC_SERVICES_PATHSETTINGS_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/register/registerservices.cxx b/framework/source/register/registerservices.cxx index 9b85bf0fe4a6..a6e0fee39582 100644 --- a/framework/source/register/registerservices.cxx +++ b/framework/source/register/registerservices.cxx @@ -48,7 +48,6 @@ #include <uifactory/windowcontentfactorymanager.hxx> #include <services/substitutepathvars.hxx> -#include <services/pathsettings.hxx> #include <services/ContextChangeEventMultiplexer.hxx> COMPONENTGETFACTORY ( fwk, @@ -69,7 +68,6 @@ COMPONENTGETFACTORY ( fwk, IFFACTORY( ::framework::TaskCreatorService ) else IFFACTORY( ::framework::WindowContentFactoryManager ) else IFFACTORY( ::framework::SubstitutePathVariables ) else - IFFACTORY( ::framework::PathSettings ) else IFFACTORY( ::framework::ContextChangeEventMultiplexer ) ) diff --git a/framework/source/services/pathsettings.cxx b/framework/source/services/pathsettings.cxx index 904f3bdd1069..472fac3b189c 100644 --- a/framework/source/services/pathsettings.cxx +++ b/framework/source/services/pathsettings.cxx @@ -17,14 +17,11 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -/** 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 <threadhelp/threadhelpbase.hxx> +#include <properties.h> +#include <stdtypes.h> #include "helper/mischelper.hxx" @@ -35,16 +32,26 @@ #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/util/XChangesNotifier.hpp> #include <com/sun/star/util/PathSubstitution.hpp> +#include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/util/XStringSubstitution.hpp> +#include <com/sun/star/util/XChangesListener.hpp> +#include <com/sun/star/util/XPathSettings.hpp> #include <tools/urlobj.hxx> #include <rtl/ustrbuf.hxx> +#include <cppuhelper/propshlp.hxx> +#include <cppuhelper/implbase3.hxx> +#include <cppuhelper/supportsservice.hxx> +#include <comphelper/sequence.hxx> +#include <comphelper/sequenceasvector.hxx> #include <comphelper/configurationhelper.hxx> #include <comphelper/processfactory.hxx> +#include <unotools/configitem.hxx> #include <unotools/configpaths.hxx> -#include <fwkdllapi.h> - +using namespace framework; #define CFGPROP_USERPATHS "UserPaths" #define CFGPROP_WRITEPATH "WritePath" @@ -60,6 +67,8 @@ #define POSTFIX_USER_PATHS "_user" #define POSTFIX_WRITE_PATH "_writable" +namespace { + const sal_Int32 IDGROUP_OLDSTYLE = 0; const sal_Int32 IDGROUP_INTERNAL_PATHS = 1; const sal_Int32 IDGROUP_USER_PATHS = 2; @@ -72,31 +81,392 @@ sal_Int32 impl_getPropGroup(sal_Int32 nID) return (nID % IDGROUP_COUNT); } +/* enable it if you wish to migrate old user settings (using the old cfg schema) on demand .... + disable it in case only the new schema must be used. + */ -namespace framework +typedef ::cppu::WeakImplHelper3< + css::lang::XServiceInfo, + css::util::XChangesListener, // => XEventListener + css::util::XPathSettings> // => XPropertySet + PathSettings_BASE; + +class PathSettings : // base classes + // Order is necessary for right initialization! + private ThreadHelpBase , + public ::cppu::OBroadcastHelper , + public ::cppu::OPropertySetHelper , // => XPropertySet / XFastPropertySet / XMultiPropertySet + public PathSettings_BASE { + struct PathInfo + { + public: + + PathInfo() + : sPathName () + , lInternalPaths() + , lUserPaths () + , sWritePath () + , bIsSinglePath (sal_False) + , bIsReadonly (sal_False) + {} + + PathInfo(const PathInfo& rCopy) + { + takeOver(rCopy); + } + + void takeOver(const PathInfo& rCopy) + { + sPathName = rCopy.sPathName; + lInternalPaths = rCopy.lInternalPaths; + lUserPaths = rCopy.lUserPaths; + sWritePath = rCopy.sWritePath; + bIsSinglePath = rCopy.bIsSinglePath; + bIsReadonly = rCopy.bIsReadonly; + } + + /// an internal name describing this path + OUString sPathName; + + /// contains all paths, which are used internaly - but are not visible for the user. + OUStringList lInternalPaths; + + /// contains all paths configured by the user + OUStringList lUserPaths; + + /// this special path is used to generate feature depending content there + OUString sWritePath; + + /// indicates real single paths, which uses WritePath property only + sal_Bool bIsSinglePath; + + /// simple handling of finalized/mandatory states ... => we know one state READONLY only .-) + sal_Bool bIsReadonly; + }; + + typedef BaseHash< PathSettings::PathInfo > PathHash; + + enum EChangeOp + { + E_UNDEFINED, + E_ADDED, + E_CHANGED, + E_REMOVED + }; -//----------------------------------------------------------------------------- -// XInterface, XTypeProvider, XServiceInfo - -DEFINE_XSERVICEINFO_ONEINSTANCESERVICE_2( PathSettings , - ::cppu::OWeakObject , - "com.sun.star.util.PathSettings" , - OUString("com.sun.star.comp.framework.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 information! - */ - - // fill cache - impl_readAll(); - } - ) +private: + + /** reference to factory, which has create this instance. */ + css::uno::Reference< css::uno::XComponentContext > m_xContext; + + /** list of all path variables and her corresponding values. */ + PathSettings::PathHash m_lPaths; + + /** describes all properties available on our interface. + Will be generated on demand based on our path list m_lPaths. */ + css::uno::Sequence< css::beans::Property > m_lPropDesc; + + /** helper needed to (re-)substitute all internal save path values. */ + css::uno::Reference< css::util::XStringSubstitution > m_xSubstitution; + + /** provides access to the old configuration schema (which will be migrated on demand). */ + css::uno::Reference< css::container::XNameAccess > m_xCfgOld; + + /** provides access to the new configuration schema. */ + css::uno::Reference< css::container::XNameAccess > m_xCfgNew; + + /** helper to listen for configuration changes without ownership cycle problems */ + css::uno::Reference< css::util::XChangesListener > m_xCfgNewListener; + + ::cppu::OPropertyArrayHelper* m_pPropHelp; + + ::sal_Bool m_bIgnoreEvents; + +public: + + /** initialize a new instance of this class. + Attention: It's necessary for right function of this class, that the order of base + classes is the right one. Because we transfer information from one base to another + during this ctor runs! */ + PathSettings(const css::uno::Reference< css::uno::XComponentContext >& xContext); + + /** free all used resources ... if it was not already done. */ + virtual ~PathSettings(); + + virtual OUString SAL_CALL getImplementationName() + throw (css::uno::RuntimeException) + { + return OUString("com.sun.star.comp.framework.PathSettings"); + } + + virtual sal_Bool SAL_CALL supportsService(OUString const & ServiceName) + throw (css::uno::RuntimeException) + { + return cppu::supportsService(this, ServiceName); + } + + virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() + throw (css::uno::RuntimeException) + { + css::uno::Sequence< OUString > aSeq(1); + aSeq[0] = OUString("com.sun.star.util.PathSettings"); + return aSeq; + } + + // XInterface + virtual ::css::uno::Any SAL_CALL queryInterface( const ::css::uno::Type& type) throw ( ::css::uno::RuntimeException ); + virtual void SAL_CALL acquire() throw () + { OWeakObject::acquire(); } + virtual void SAL_CALL release() throw () + { OWeakObject::release(); } + + // XTypeProvider + virtual ::css::uno::Sequence< ::css::uno::Type > SAL_CALL getTypes( ) throw(::css::uno::RuntimeException); + + // css::util::XChangesListener + virtual void SAL_CALL changesOccurred(const css::util::ChangesEvent& aEvent) throw (css::uno::RuntimeException); + + // css::lang::XEventListener + virtual void SAL_CALL disposing(const css::lang::EventObject& aSource) + throw(css::uno::RuntimeException); + + using ::cppu::OPropertySetHelper::disposing; + + + /** + * XPathSettings attribute methods + */ + virtual OUString SAL_CALL getAddin() throw (css::uno::RuntimeException) + { return getStringProperty("Addin"); } + virtual void SAL_CALL setAddin(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Addin", p1); } + virtual OUString SAL_CALL getAutoCorrect() throw (css::uno::RuntimeException) + { return getStringProperty("AutoCorrect"); } + virtual void SAL_CALL setAutoCorrect(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("AutoCorrect", p1); } + virtual OUString SAL_CALL getAutoText() throw (css::uno::RuntimeException) + { return getStringProperty("AutoText"); } + virtual void SAL_CALL setAutoText(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("AutoText", p1); } + virtual OUString SAL_CALL getBackup() throw (css::uno::RuntimeException) + { return getStringProperty("Backup"); } + virtual void SAL_CALL setBackup(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Backup", p1); } + virtual OUString SAL_CALL getBasic() throw (css::uno::RuntimeException) + { return getStringProperty("Basic"); } + virtual void SAL_CALL setBasic(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Basic", p1); } + virtual OUString SAL_CALL getBitmap() throw (css::uno::RuntimeException) + { return getStringProperty("Bitmap"); } + virtual void SAL_CALL setBitmap(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Bitmap", p1); } + virtual OUString SAL_CALL getConfig() throw (css::uno::RuntimeException) + { return getStringProperty("Config"); } + virtual void SAL_CALL setConfig(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Config", p1); } + virtual OUString SAL_CALL getDictionary() throw (css::uno::RuntimeException) + { return getStringProperty("Dictionary"); } + virtual void SAL_CALL setDictionary(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Dictionary", p1); } + virtual OUString SAL_CALL getFavorite() throw (css::uno::RuntimeException) + { return getStringProperty("Favorite"); } + virtual void SAL_CALL setFavorite(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Favorite", p1); } + virtual OUString SAL_CALL getFilter() throw (css::uno::RuntimeException) + { return getStringProperty("Filter"); } + virtual void SAL_CALL setFilter(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Filter", p1); } + virtual OUString SAL_CALL getGallery() throw (css::uno::RuntimeException) + { return getStringProperty("Gallery"); } + virtual void SAL_CALL setGallery(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Gallery", p1); } + virtual OUString SAL_CALL getGraphic() throw (css::uno::RuntimeException) + { return getStringProperty("Graphic"); } + virtual void SAL_CALL setGraphic(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Graphic", p1); } + virtual OUString SAL_CALL getHelp() throw (css::uno::RuntimeException) + { return getStringProperty("Help"); } + virtual void SAL_CALL setHelp(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Help", p1); } + virtual OUString SAL_CALL getLinguistic() throw (css::uno::RuntimeException) + { return getStringProperty("Linguistic"); } + virtual void SAL_CALL setLinguistic(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Linguistic", p1); } + virtual OUString SAL_CALL getModule() throw (css::uno::RuntimeException) + { return getStringProperty("Module"); } + virtual void SAL_CALL setModule(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Module", p1); } + virtual OUString SAL_CALL getPalette() throw (css::uno::RuntimeException) + { return getStringProperty("Palette"); } + virtual void SAL_CALL setPalette(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Palette", p1); } + virtual OUString SAL_CALL getPlugin() throw (css::uno::RuntimeException) + { return getStringProperty("Plugin"); } + virtual void SAL_CALL setPlugin(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Plugin", p1); } + virtual OUString SAL_CALL getStorage() throw (css::uno::RuntimeException) + { return getStringProperty("Storage"); } + virtual void SAL_CALL setStorage(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Storage", p1); } + virtual OUString SAL_CALL getTemp() throw (css::uno::RuntimeException) + { return getStringProperty("Temp"); } + virtual void SAL_CALL setTemp(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Temp", p1); } + virtual OUString SAL_CALL getTemplate() throw (css::uno::RuntimeException) + { return getStringProperty("Template"); } + virtual void SAL_CALL setTemplate(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Template", p1); } + virtual OUString SAL_CALL getUIConfig() throw (css::uno::RuntimeException) + { return getStringProperty("UIConfig"); } + virtual void SAL_CALL setUIConfig(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("UIConfig", p1); } + virtual OUString SAL_CALL getUserConfig() throw (css::uno::RuntimeException) + { return getStringProperty("UserConfig"); } + virtual void SAL_CALL setUserConfig(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("UserConfig", p1); } + virtual OUString SAL_CALL getUserDictionary() throw (css::uno::RuntimeException) + { return getStringProperty("UserDictionary"); } + virtual void SAL_CALL setUserDictionary(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("UserDictionary", p1); } + virtual OUString SAL_CALL getWork() throw (css::uno::RuntimeException) + { return getStringProperty("Work"); } + virtual void SAL_CALL setWork(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("Work", p1); } + virtual OUString SAL_CALL getBasePathShareLayer() throw (css::uno::RuntimeException) + { return getStringProperty("UIConfig"); } + virtual void SAL_CALL setBasePathShareLayer(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("UIConfig", p1); } + virtual OUString SAL_CALL getBasePathUserLayer() throw (css::uno::RuntimeException) + { return getStringProperty("UserConfig"); } + virtual void SAL_CALL setBasePathUserLayer(const OUString& p1) throw (css::uno::RuntimeException) + { setStringProperty("UserConfig", p1); } + + + + /** + * overrides to resolve inheritance ambiguity + */ + virtual void SAL_CALL setPropertyValue(const OUString& p1, const css::uno::Any& p2) + throw (css::beans::UnknownPropertyException, css::beans::PropertyVetoException, css::lang::IllegalArgumentException, css::lang::WrappedTargetException, css::uno::RuntimeException) + { ::cppu::OPropertySetHelper::setPropertyValue(p1, p2); } + virtual css::uno::Any SAL_CALL getPropertyValue(const OUString& p1) + throw (css::beans::UnknownPropertyException, css::lang::WrappedTargetException, css::uno::RuntimeException) + { return ::cppu::OPropertySetHelper::getPropertyValue(p1); } + virtual void SAL_CALL addPropertyChangeListener(const OUString& p1, const css::uno::Reference<css::beans::XPropertyChangeListener>& p2) + throw (css::beans::UnknownPropertyException, css::lang::WrappedTargetException, css::uno::RuntimeException) + { ::cppu::OPropertySetHelper::addPropertyChangeListener(p1, p2); } + virtual void SAL_CALL removePropertyChangeListener(const OUString& p1, const css::uno::Reference<css::beans::XPropertyChangeListener>& p2) + throw (css::beans::UnknownPropertyException, css::lang::WrappedTargetException, css::uno::RuntimeException) + { ::cppu::OPropertySetHelper::removePropertyChangeListener(p1, p2); } + virtual void SAL_CALL addVetoableChangeListener(const OUString& p1, const css::uno::Reference<css::beans::XVetoableChangeListener>& p2) + throw (css::beans::UnknownPropertyException, css::lang::WrappedTargetException, css::uno::RuntimeException) + { ::cppu::OPropertySetHelper::addVetoableChangeListener(p1, p2); } + virtual void SAL_CALL removeVetoableChangeListener(const OUString& p1, const css::uno::Reference<css::beans::XVetoableChangeListener>& p2) + throw (css::beans::UnknownPropertyException, css::lang::WrappedTargetException, css::uno::RuntimeException) + { ::cppu::OPropertySetHelper::removeVetoableChangeListener(p1, p2); } + + /** read all configured paths and create all needed internal structures. */ + void impl_readAll(); + +private: + + OUString getStringProperty(const OUString& p1) + throw(css::uno::RuntimeException); + + void setStringProperty(const OUString& p1, const OUString& p2) + throw(css::uno::RuntimeException); + + /** read a path info using the old cfg schema. + This is needed for "migration on demand" reasons only. + Can be removed for next major release .-) */ + OUStringList impl_readOldFormat(const OUString& sPath); + + /** read a path info using the new cfg schema. */ + PathSettings::PathInfo impl_readNewFormat(const OUString& sPath); + + /** filter "real user defined paths" from the old configuration schema + and set it as UserPaths on the new schema. + Can be removed with new major release ... */ + + void impl_mergeOldUserPaths( PathSettings::PathInfo& rPath, + const OUStringList& lOld ); + + /** reload one path directly from the new configuration schema (because + it was updated by any external code) */ + PathSettings::EChangeOp impl_updatePath(const OUString& sPath , + sal_Bool bNotifyListener); + + /** replace all might existing placeholder variables inside the given path ... + or check if the given path value uses paths, which can be replaced with predefined + placeholder variables ... + */ + void impl_subst( OUStringList& lVals , + const css::uno::Reference< css::util::XStringSubstitution >& xSubst , + sal_Bool bReSubst); + + void impl_subst(PathSettings::PathInfo& aPath , + sal_Bool bReSubst); + + + /** converts our new string list schema to the old ";" separated schema ... */ + OUString impl_convertPath2OldStyle(const PathSettings::PathInfo& rPath ) const; + OUStringList impl_convertOldStyle2Path(const OUString& sOldStylePath) const; + + /** remove still known paths from the given lList argument. + So real user defined paths can be extracted from the list of + fix internal paths ! + */ + void impl_purgeKnownPaths(const PathSettings::PathInfo& rPath, + OUStringList& lList); + + /** rebuild the member m_lPropDesc using the path list m_lPaths. */ + void impl_rebuildPropertyDescriptor(); + + /** provides direct access to the list of path values + using it's internal property id. + */ + css::uno::Any impl_getPathValue( sal_Int32 nID ) const; + void impl_setPathValue( sal_Int32 nID , + const css::uno::Any& aVal); + + /** check the given handle and return the corresponding PathInfo reference. + These reference can be used then directly to manipulate these path. */ + PathSettings::PathInfo* impl_getPathAccess (sal_Int32 nHandle); + const PathSettings::PathInfo* impl_getPathAccessConst(sal_Int32 nHandle) const; + + /** it checks, if the given path value seams to be a valid URL or system path. */ + sal_Bool impl_isValidPath(const OUString& sPath) const; + sal_Bool impl_isValidPath(const OUStringList& lPath) const; + + void impl_storePath(const PathSettings::PathInfo& aPath); + + css::uno::Sequence< sal_Int32 > impl_mapPathName2IDList(const OUString& sPath); + + void impl_notifyPropListener( PathSettings::EChangeOp eOp , + const OUString& sPath , + const PathSettings::PathInfo* pPathOld, + const PathSettings::PathInfo* pPathNew); + + + // OPropertySetHelper + virtual sal_Bool SAL_CALL convertFastPropertyValue ( css::uno::Any& aConvertedValue , + css::uno::Any& aOldValue , + sal_Int32 nHandle , + const css::uno::Any& aValue ) throw(css::lang::IllegalArgumentException); + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle , + const css::uno::Any& aValue ) throw(css::uno::Exception); + using cppu::OPropertySetHelper::getFastPropertyValue; + virtual void SAL_CALL getFastPropertyValue ( css::uno::Any& aValue , + sal_Int32 nHandle ) const; + virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper ( ); + virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo ( ) throw(::css::uno::RuntimeException); + + /** factory methods to guarantee right (but on demand) initialized members ... */ + css::uno::Reference< css::util::XStringSubstitution > fa_getSubstitution(); + css::uno::Reference< css::container::XNameAccess > fa_getCfgOld(); + css::uno::Reference< css::container::XNameAccess > fa_getCfgNew(); +}; //----------------------------------------------------------------------------- PathSettings::PathSettings( const css::uno::Reference< css::uno::XComponentContext >& xContext ) @@ -1154,6 +1524,35 @@ css::uno::Reference< css::container::XNameAccess > PathSettings::fa_getCfgNew() return xCfg; } -} // namespace framework +struct Instance { + explicit Instance( + css::uno::Reference<css::uno::XComponentContext> const & context): + instance( + static_cast<cppu::OWeakObject *>(new PathSettings(context))) + { + // fill cache + static_cast<PathSettings *>(static_cast<cppu::OWeakObject *> + (instance.get()))->impl_readAll(); + } + + css::uno::Reference<css::uno::XInterface> instance; +}; + +struct Singleton: + public rtl::StaticWithArg< + Instance, css::uno::Reference<css::uno::XComponentContext>, Singleton> +{}; + +} + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL +com_sun_star_comp_framework_PathSettings_get_implementation( + css::uno::XComponentContext *context, + css::uno::Sequence<css::uno::Any> const &) +{ + css::uno::XInterface *inst = Singleton::get(context).instance.get(); + inst->acquire(); + return inst; +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/util/fwk.component b/framework/util/fwk.component index 336052e47144..e08b966311e9 100644 --- a/framework/util/fwk.component +++ b/framework/util/fwk.component @@ -90,7 +90,8 @@ constructor="com_sun_star_comp_framework_ObjectMenuController_get_implementation"> <service name="com.sun.star.frame.PopupMenuController"/> </implementation> - <implementation name="com.sun.star.comp.framework.PathSettings"> + <implementation name="com.sun.star.comp.framework.PathSettings" + constructor="com_sun_star_comp_framework_PathSettings_get_implementation"> <service name="com.sun.star.util.PathSettings"/> </implementation> <implementation name="com.sun.star.comp.framework.PathSubstitution"> |