diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2012-07-25 18:54:38 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2012-07-25 19:10:19 +0200 |
commit | cf7c9599e776eba8e14614cecb528d3da5778190 (patch) | |
tree | b71a0f46f1975e298197eac6d70a186b3048ada2 /configmgr/source/readwriteaccess.cxx | |
parent | More helpful error message. (diff) | |
download | core-cf7c9599e776eba8e14614cecb528d3da5778190.tar.gz core-cf7c9599e776eba8e14614cecb528d3da5778190.zip |
Make comphelper/configuration.hxx work for localized properties
See aebf5bf22304c73e121b16dc0b51f909c5f34c28 "fdo#52232 ConfigurationSet wrapper
unusable for localized properties" for a discussion of the problems with the
original design.
1 Redesigned configmgr's localized property access to understand ['*<locale>']
paths that select the best existing value match for the requested <locale>.
Adapted ConfigurationWrapper::getLocalizedPropertyValue accordingly.
2 Redesigned ConfigurationChanges to fix the locale at instantiation time.
That takes care of ConfigurationWrapper::setLocalizedPropertyValue,
ConfigurationWrapper::getGroupReadWrite, and
ConfigurationWrapper::getSetReadWrite. (This required an additional constructor
parameter for the ReadWriteAccess service, to specify a locale at instantiation
time.)
3 Redesigned ReadOnlyAccess to be a service that fixes the locale at
instantiation time. That allows to take care of
ConfigurationWrapper::getGroupReadOnly and ConfigurationWrapper::getSetReadOnly.
Change-Id: I2ae7342b278b6f4222a0189a1deb2a53e204059f
Diffstat (limited to 'configmgr/source/readwriteaccess.cxx')
-rw-r--r-- | configmgr/source/readwriteaccess.cxx | 74 |
1 files changed, 55 insertions, 19 deletions
diff --git a/configmgr/source/readwriteaccess.cxx b/configmgr/source/readwriteaccess.cxx index 0e4415fd44ed..5d8d1dedd800 100644 --- a/configmgr/source/readwriteaccess.cxx +++ b/configmgr/source/readwriteaccess.cxx @@ -30,18 +30,24 @@ #include "sal/config.h" #include "boost/noncopyable.hpp" -#include "cppuhelper/implbase2.hxx" +#include "com/sun/star/configuration/XReadWriteAccess.hpp" +#include "com/sun/star/container/NoSuchElementException.hpp" #include "com/sun/star/lang/IllegalArgumentException.hpp" +#include "com/sun/star/lang/NotInitializedException.hpp" #include "com/sun/star/lang/WrappedTargetException.hpp" +#include "com/sun/star/lang/XInitialization.hpp" #include "com/sun/star/lang/XServiceInfo.hpp" -#include "com/sun/star/container/NoSuchElementException.hpp" -#include "com/sun/star/configuration/XReadWriteAccess.hpp" +#include "com/sun/star/uno/Any.hxx" +#include "com/sun/star/uno/Exception.hpp" #include "com/sun/star/uno/Reference.hxx" #include "com/sun/star/uno/RuntimeException.hpp" #include "com/sun/star/uno/Sequence.hxx" #include "com/sun/star/uno/XComponentContext.hpp" #include "com/sun/star/uno/XInterface.hpp" #include "com/sun/star/util/ChangesSet.hpp" +#include "cppuhelper/implbase3.hxx" +#include "cppuhelper/weak.hxx" +#include "osl/mutex.hxx" #include "rtl/ref.hxx" #include "rtl/ustring.h" #include "rtl/ustring.hxx" @@ -59,12 +65,15 @@ namespace { namespace css = com::sun::star; class Service: - public cppu::WeakImplHelper2< - css::lang::XServiceInfo, css::configuration::XReadWriteAccess >, + public cppu::WeakImplHelper3< + css::lang::XServiceInfo, css::lang::XInitialization, + css::configuration::XReadWriteAccess >, private boost::noncopyable { public: - Service(css::uno::Reference< css::uno::XComponentContext > const & context); + explicit Service( + css::uno::Reference< css::uno::XComponentContext > const & context): + context_(context) {} private: virtual ~Service() {} @@ -81,15 +90,19 @@ private: getSupportedServiceNames() throw (css::uno::RuntimeException) { return read_write_access::getSupportedServiceNames(); } + virtual void SAL_CALL initialize( + css::uno::Sequence< css::uno::Any > const & aArguments) + throw (css::uno::Exception, css::uno::RuntimeException); + virtual css::uno::Any SAL_CALL getByHierarchicalName( rtl::OUString const & aName) throw ( css::container::NoSuchElementException, css::uno::RuntimeException) - { return root_->getByHierarchicalName(aName); } + { return getRoot()->getByHierarchicalName(aName); } virtual sal_Bool SAL_CALL hasByHierarchicalName(rtl::OUString const & aName) throw (css::uno::RuntimeException) - { return root_->hasByHierarchicalName(aName); } + { return getRoot()->hasByHierarchicalName(aName); } virtual void SAL_CALL replaceByHierarchicalName( rtl::OUString const & aName, css::uno::Any const & aElement) @@ -97,34 +110,57 @@ private: css::lang::IllegalArgumentException, css::container::NoSuchElementException, css::lang::WrappedTargetException, css::uno::RuntimeException) - { root_->replaceByHierarchicalName(aName, aElement); } + { getRoot()->replaceByHierarchicalName(aName, aElement); } virtual void SAL_CALL commitChanges() throw (css::lang::WrappedTargetException, css::uno::RuntimeException) - { root_->commitChanges(); } + { getRoot()->commitChanges(); } virtual sal_Bool SAL_CALL hasPendingChanges() throw (css::uno::RuntimeException) - { return root_->hasPendingChanges(); } + { return getRoot()->hasPendingChanges(); } virtual css::util::ChangesSet SAL_CALL getPendingChanges() throw (css::uno::RuntimeException) - { return root_->getPendingChanges(); } + { return getRoot()->getPendingChanges(); } + rtl::Reference< RootAccess > getRoot(); + + css::uno::Reference< css::uno::XComponentContext > context_; + + osl::Mutex mutex_; rtl::Reference< RootAccess > root_; }; -Service::Service( - css::uno::Reference< css::uno::XComponentContext > const & context) +void Service::initialize(css::uno::Sequence< css::uno::Any > const & aArguments) + throw (css::uno::Exception, css::uno::RuntimeException) { - osl::MutexGuard guard(*lock()); - Components & components = Components::getSingleton(context); - root_ = new RootAccess( - components, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")), - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("*")), true); + OUString locale; + if (aArguments.getLength() != 1 || !(aArguments[0] >>= locale)) { + throw css::lang::IllegalArgumentException( + "not exactly one string argument", + static_cast< cppu::OWeakObject * >(this), -1); + } + osl::MutexGuard g1(mutex_); + if (root_.is()) { + throw css::uno::RuntimeException( + "already initialized", static_cast< cppu::OWeakObject * >(this)); + } + osl::MutexGuard g2(*lock()); + Components & components = Components::getSingleton(context_); + root_ = new RootAccess(components, "/", locale, true); components.addRootAccess(root_); } +rtl::Reference< RootAccess > Service::getRoot() { + osl::MutexGuard g(mutex_); + if (!root_.is()) { + throw css::lang::NotInitializedException( + "not initialized", static_cast< cppu::OWeakObject * >(this)); + } + return root_; +} + } css::uno::Reference< css::uno::XInterface > create( |