summaryrefslogtreecommitdiff
path: root/comphelper/source
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2012-01-31 15:36:49 +0100
committerStephan Bergmann <sbergman@redhat.com>2012-01-31 15:50:10 +0100
commitca3e3e7e3198f492b2d4608ffc5420e657d99b00 (patch)
tree98b28439bf0cf0a45b8e87bbcb45aea0431d99c3 /comphelper/source
parent9babbf346c4d6f76e8b3a243a00e73a173c16ba6 (diff)
Move unotools/configuration.hxx to comphelper
...so that other code in comphelper can use it.
Diffstat (limited to 'comphelper/source')
-rw-r--r--comphelper/source/misc/configuration.cxx233
1 files changed, 233 insertions, 0 deletions
diff --git a/comphelper/source/misc/configuration.cxx b/comphelper/source/misc/configuration.cxx
new file mode 100644
index 000000000000..8954f4fbc0c3
--- /dev/null
+++ b/comphelper/source/misc/configuration.cxx
@@ -0,0 +1,233 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License or as specified alternatively below. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * Major Contributor(s):
+ * Copyright (C) 2011 Red Hat, Inc., Stephan Bergmann <sbergman@redhat.com>
+ * (initial developer)
+ *
+ * All Rights Reserved.
+ *
+ * For minor contributions see the git repository.
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+
+#include "sal/config.h"
+
+#include <cassert>
+
+#include "boost/shared_ptr.hpp"
+#include "com/sun/star/configuration/ReadOnlyAccess.hpp"
+#include "com/sun/star/configuration/ReadWriteAccess.hpp"
+#include "com/sun/star/configuration/XReadWriteAccess.hpp"
+#include "com/sun/star/configuration/theDefaultProvider.hpp"
+#include "com/sun/star/container/XHierarchicalNameAccess.hpp"
+#include "com/sun/star/container/XHierarchicalNameReplace.hpp"
+#include "com/sun/star/container/XNameAccess.hpp"
+#include "com/sun/star/container/XNameContainer.hpp"
+#include "com/sun/star/lang/Locale.hpp"
+#include "com/sun/star/lang/XLocalizable.hpp"
+#include "com/sun/star/uno/Any.hxx"
+#include "com/sun/star/uno/Reference.hxx"
+#include "com/sun/star/uno/XComponentContext.hpp"
+#include "comphelper/configuration.hxx"
+#include "rtl/instance.hxx"
+#include "rtl/oustringostreaminserter.hxx"
+#include "rtl/ustrbuf.hxx"
+#include "rtl/ustring.h"
+#include "rtl/ustring.hxx"
+#include "sal/log.hxx"
+
+namespace {
+
+namespace css = com::sun::star;
+
+struct TheConfigurationWrapper:
+ public rtl::StaticWithArg<
+ comphelper::detail::ConfigurationWrapper,
+ css::uno::Reference< css::uno::XComponentContext >,
+ TheConfigurationWrapper >
+{};
+
+}
+
+boost::shared_ptr< comphelper::ConfigurationChanges >
+comphelper::ConfigurationChanges::create(
+ css::uno::Reference< css::uno::XComponentContext > const & context)
+{
+ return TheConfigurationWrapper::get(context).createChanges();
+}
+
+
+comphelper::ConfigurationChanges::~ConfigurationChanges() {}
+
+void comphelper::ConfigurationChanges::commit() const {
+ access_->commitChanges();
+}
+
+comphelper::ConfigurationChanges::ConfigurationChanges(
+ css::uno::Reference< css::uno::XComponentContext > const & context):
+ access_(css::configuration::ReadWriteAccess::create(context))
+{}
+
+void comphelper::ConfigurationChanges::setPropertyValue(
+ rtl::OUString const & path, css::uno::Any const & value) const
+{
+ access_->replaceByHierarchicalName(path, value);
+}
+
+css::uno::Reference< css::container::XHierarchicalNameReplace >
+comphelper::ConfigurationChanges::getGroup(rtl::OUString const & path) const
+{
+ return css::uno::Reference< css::container::XHierarchicalNameReplace >(
+ access_->getByHierarchicalName(path), css::uno::UNO_QUERY_THROW);
+}
+
+css::uno::Reference< css::container::XNameContainer >
+comphelper::ConfigurationChanges::getSet(rtl::OUString const & path) const
+{
+ return css::uno::Reference< css::container::XNameContainer >(
+ access_->getByHierarchicalName(path), css::uno::UNO_QUERY_THROW);
+}
+
+comphelper::detail::ConfigurationWrapper const &
+comphelper::detail::ConfigurationWrapper::get(
+ css::uno::Reference< css::uno::XComponentContext > const & context)
+{
+ return TheConfigurationWrapper::get(context);
+}
+
+comphelper::detail::ConfigurationWrapper::ConfigurationWrapper(
+ css::uno::Reference< css::uno::XComponentContext > const & context):
+ context_(context), access_(css::configuration::ReadOnlyAccess::get(context))
+{}
+
+comphelper::detail::ConfigurationWrapper::~ConfigurationWrapper() {}
+
+css::uno::Any comphelper::detail::ConfigurationWrapper::getPropertyValue(
+ rtl::OUString const & path) const
+{
+ return access_->getByHierarchicalName(path);
+}
+
+void comphelper::detail::ConfigurationWrapper::setPropertyValue(
+ boost::shared_ptr< ConfigurationChanges > const & batch,
+ rtl::OUString const & path, com::sun::star::uno::Any const & value) const
+{
+ assert(batch.get() != 0);
+ batch->setPropertyValue(path, value);
+}
+
+css::uno::Any
+comphelper::detail::ConfigurationWrapper::getLocalizedPropertyValue(
+ rtl::OUString const & path) const
+{
+ return access_->getByHierarchicalName(extendLocalizedPath(path));
+}
+
+void comphelper::detail::ConfigurationWrapper::setLocalizedPropertyValue(
+ boost::shared_ptr< ConfigurationChanges > const & batch,
+ rtl::OUString const & path, com::sun::star::uno::Any const & value) const
+{
+ assert(batch.get() != 0);
+ batch->setPropertyValue(extendLocalizedPath(path), value);
+}
+
+css::uno::Reference< css::container::XHierarchicalNameAccess >
+comphelper::detail::ConfigurationWrapper::getGroupReadOnly(
+ rtl::OUString const & path) const
+{
+ return css::uno::Reference< css::container::XHierarchicalNameAccess >(
+ access_->getByHierarchicalName(path), css::uno::UNO_QUERY_THROW);
+}
+
+css::uno::Reference< css::container::XHierarchicalNameReplace >
+comphelper::detail::ConfigurationWrapper::getGroupReadWrite(
+ boost::shared_ptr< ConfigurationChanges > const & batch,
+ rtl::OUString const & path) const
+{
+ assert(batch.get() != 0);
+ return batch->getGroup(path);
+}
+
+css::uno::Reference< css::container::XNameAccess >
+comphelper::detail::ConfigurationWrapper::getSetReadOnly(
+ rtl::OUString const & path) const
+{
+ return css::uno::Reference< css::container::XNameAccess >(
+ access_->getByHierarchicalName(path), css::uno::UNO_QUERY_THROW);
+}
+
+css::uno::Reference< css::container::XNameContainer >
+comphelper::detail::ConfigurationWrapper::getSetReadWrite(
+ boost::shared_ptr< ConfigurationChanges > const & batch,
+ rtl::OUString const & path) const
+{
+ assert(batch.get() != 0);
+ return batch->getSet(path);
+}
+
+boost::shared_ptr< comphelper::ConfigurationChanges >
+comphelper::detail::ConfigurationWrapper::createChanges() const {
+ return boost::shared_ptr< ConfigurationChanges >(
+ new ConfigurationChanges(context_));
+}
+
+rtl::OUString comphelper::detail::ConfigurationWrapper::extendLocalizedPath(
+ rtl::OUString const & path) const
+{
+ rtl::OUStringBuffer buf(path);
+ buf.appendAscii(RTL_CONSTASCII_STRINGPARAM("/['"));
+ css::lang::Locale locale(
+ css::uno::Reference< css::lang::XLocalizable >(
+ css::configuration::theDefaultProvider::get(context_),
+ css::uno::UNO_QUERY_THROW)->
+ getLocale());
+ SAL_WARN_IF(
+ locale.Language.indexOf('-') == -1, "comphelper",
+ "Locale language \"" << locale.Language << "\" contains \"-\"");
+ assert(locale.Language.indexOf('&') == -1);
+ assert(locale.Language.indexOf('"') == -1);
+ assert(locale.Language.indexOf('\'') == -1);
+ buf.append(locale.Language);
+ SAL_WARN_IF(
+ locale.Country.isEmpty() && !locale.Variant.isEmpty(), "comphelper",
+ "Locale has empty country but non-empty variant \"" << locale.Variant
+ << '"');
+ if (!locale.Country.isEmpty()) {
+ buf.append('-');
+ SAL_WARN_IF(
+ locale.Country.indexOf('-') == -1, "comphelper",
+ "Locale language \"" << locale.Country << "\" contains \"-\"");
+ assert(locale.Country.indexOf('&') == -1);
+ assert(locale.Country.indexOf('"') == -1);
+ assert(locale.Country.indexOf('\'') == -1);
+ buf.append(locale.Country);
+ if (!locale.Variant.isEmpty()) {
+ buf.append('-');
+ assert(locale.Variant.indexOf('&') == -1);
+ assert(locale.Variant.indexOf('"') == -1);
+ assert(locale.Variant.indexOf('\'') == -1);
+ buf.append(locale.Variant);
+ }
+ }
+ buf.appendAscii(RTL_CONSTASCII_STRINGPARAM("']"));
+ return buf.makeStringAndClear();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */