office-gobmx/include/comphelper/configuration.hxx
Bjoern Michaelsen b9337e22ce execute move of global headers
see https://gerrit.libreoffice.org/#/c/3367/
and Change-Id: I00c96fa77d04b33a6f8c8cd3490dfcd9bdc9e84a for details

Change-Id: I199a75bc4042af20817265d5ef85b1134a96ff5a
2013-04-23 22:20:31 +02:00

331 lines
12 KiB
C++

/* -*- 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/.
*/
#ifndef INCLUDED_COMPHELPER_CONFIGURATION_HXX
#define INCLUDED_COMPHELPER_CONFIGURATION_HXX
#include "sal/config.h"
#include "boost/noncopyable.hpp"
#include "boost/optional.hpp"
#include "boost/shared_ptr.hpp"
#include "com/sun/star/uno/Any.hxx"
#include "com/sun/star/uno/Reference.hxx"
#include "comphelper/comphelperdllapi.h"
#include "comphelper/processfactory.hxx"
#include "sal/types.h"
namespace com { namespace sun { namespace star {
namespace configuration { class XReadWriteAccess; }
namespace container {
class XHierarchicalNameAccess;
class XHierarchicalNameReplace;
class XNameAccess;
class XNameContainer;
}
namespace uno { class XComponentContext; }
} } }
namespace comphelper {
namespace detail { class ConfigurationWrapper; }
/// A batch of configuration changes that is committed as a whole.
///
/// Client code needs to call commit explicitly; otherwise the changes are lost
/// when the instance is destroyed.
///
/// This is the only class from this header file that client code should use
/// directly.
class COMPHELPER_DLLPUBLIC ConfigurationChanges: private boost::noncopyable {
public:
static boost::shared_ptr< ConfigurationChanges > create(
com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >
const & context = comphelper::getProcessComponentContext());
~ConfigurationChanges();
void commit() const;
private:
SAL_DLLPRIVATE ConfigurationChanges(
com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >
const & context);
SAL_DLLPRIVATE void setPropertyValue(
OUString const & path, com::sun::star::uno::Any const & value)
const;
SAL_DLLPRIVATE com::sun::star::uno::Reference<
com::sun::star::container::XHierarchicalNameReplace >
getGroup(OUString const & path) const;
SAL_DLLPRIVATE
com::sun::star::uno::Reference< com::sun::star::container::XNameContainer >
getSet(OUString const & path) const;
com::sun::star::uno::Reference<
com::sun::star::configuration::XReadWriteAccess > access_;
friend class detail::ConfigurationWrapper;
};
namespace detail {
/// @internal
class COMPHELPER_DLLPUBLIC ConfigurationWrapper: private boost::noncopyable {
public:
static ConfigurationWrapper const & get(
com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >
const & context);
SAL_DLLPRIVATE explicit ConfigurationWrapper(
com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >
const & context);
SAL_DLLPRIVATE ~ConfigurationWrapper();
com::sun::star::uno::Any getPropertyValue(OUString const & path) const;
void setPropertyValue(
boost::shared_ptr< ConfigurationChanges > const & batch,
OUString const & path, com::sun::star::uno::Any const & value)
const;
com::sun::star::uno::Any getLocalizedPropertyValue(
OUString const & path) const;
void setLocalizedPropertyValue(
boost::shared_ptr< ConfigurationChanges > const & batch,
OUString const & path, com::sun::star::uno::Any const & value)
const;
com::sun::star::uno::Reference<
com::sun::star::container::XHierarchicalNameAccess >
getGroupReadOnly(OUString const & path) const;
com::sun::star::uno::Reference<
com::sun::star::container::XHierarchicalNameReplace >
getGroupReadWrite(
boost::shared_ptr< ConfigurationChanges > const & batch,
OUString const & path) const;
com::sun::star::uno::Reference< com::sun::star::container::XNameAccess >
getSetReadOnly(OUString const & path) const;
com::sun::star::uno::Reference< com::sun::star::container::XNameContainer >
getSetReadWrite(
boost::shared_ptr< ConfigurationChanges > const & batch,
OUString const & path) const;
boost::shared_ptr< ConfigurationChanges > createChanges() const;
private:
com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >
context_;
com::sun::star::uno::Reference<
com::sun::star::container::XHierarchicalNameAccess > access_;
};
/// @internal
template< typename T > struct Convert: private boost::noncopyable {
static com::sun::star::uno::Any toAny(T const & value)
{ return com::sun::star::uno::makeAny(value); }
static T fromAny(com::sun::star::uno::Any const & value)
{ return value.get< T >(); }
private:
Convert(); // not defined
~Convert(); // not defined
};
/// @internal
template< typename T > struct Convert< boost::optional< T > >:
private boost::noncopyable
{
static com::sun::star::uno::Any toAny(boost::optional< T > const & value) {
return value
? com::sun::star::uno::makeAny(value.get())
: com::sun::star::uno::Any();
}
static boost::optional< T > fromAny(com::sun::star::uno::Any const & value)
{
return value.hasValue()
? boost::optional< T >(value.get< T >()) : boost::optional< T >();
}
private:
Convert(); // not defined
~Convert(); // not defined
};
}
/// A type-safe wrapper around a (non-localized) configuration property.
///
/// Automatically generated headers for the various configuration properties
/// derive from this template and make available its member functions to access
/// each given configuration property.
template< typename T, typename U > struct ConfigurationProperty:
private boost::noncopyable
{
/// Get the value of the given (non-localized) configuration property.
///
/// For nillable properties, U is of type boost::optional<U'>.
static U get(
com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >
const & context = comphelper::getProcessComponentContext())
{
// Folding this into one statement causes a bogus error at least with
// Red Hat GCC 4.6.2-1:
com::sun::star::uno::Any a(
detail::ConfigurationWrapper::get(context).getPropertyValue(
T::path()));
return detail::Convert< U >::fromAny(a);
}
/// Set the value of the given (non-localized) configuration property, via a
/// given changes batch.
///
/// For nillable properties, U is of type boost::optional<U'>.
static void set(
U const & value,
boost::shared_ptr< ConfigurationChanges > const & batch,
com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >
const & context = comphelper::getProcessComponentContext())
{
detail::ConfigurationWrapper::get(context).setPropertyValue(
batch, T::path(), detail::Convert< U >::toAny(value));
}
private:
ConfigurationProperty(); // not defined
~ConfigurationProperty(); // not defined
};
/// A type-safe wrapper around a localized configuration property.
///
/// Automatically generated headers for the various localized configuration
/// properties derive from this template and make available its member functions
/// to access each given localized configuration property.
template< typename T, typename U > struct ConfigurationLocalizedProperty:
private boost::noncopyable
{
/// Get the value of the given localized configuration property, for the
/// locale currently set at the
/// com.sun.star.configuration.theDefaultProvider.
///
/// For nillable properties, U is of type boost::optional<U'>.
static U get(
com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >
const & context = comphelper::getProcessComponentContext())
{
// Folding this into one statement causes a bogus error at least with
// Red Hat GCC 4.6.2-1:
com::sun::star::uno::Any a(
detail::ConfigurationWrapper::get(context).
getLocalizedPropertyValue(T::path()));
return detail::Convert< U >::fromAny(a);
}
/// Set the value of the given localized configuration property, for the
/// locale currently set at the
/// com.sun.star.configuration.theDefaultProvider, via a given changes
/// batch.
///
/// For nillable properties, U is of type boost::optional<U'>.
static void set(
U const & value,
boost::shared_ptr< ConfigurationChanges > const & batch,
com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >
const & context = comphelper::getProcessComponentContext())
{
detail::ConfigurationWrapper::get(context).setLocalizedPropertyValue(
batch, T::path(), detail::Convert< U >::toAny(value));
}
private:
ConfigurationLocalizedProperty(); // not defined
~ConfigurationLocalizedProperty(); // not defined
};
/// A type-safe wrapper around a configuration group.
///
/// Automatically generated headers for the various configuration groups derive
/// from this template and make available its member functions to access each
/// given configuration group.
template< typename T > struct ConfigurationGroup: private boost::noncopyable {
/// Get read-only access to the given configuration group.
static com::sun::star::uno::Reference<
com::sun::star::container::XHierarchicalNameAccess >
get(com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >
const & context = comphelper::getProcessComponentContext())
{
return detail::ConfigurationWrapper::get(context).getGroupReadOnly(
T::path());
}
/// Get read/write access to the given configuration group, storing any
/// modifications via the given changes batch.
static com::sun::star::uno::Reference<
com::sun::star::container::XHierarchicalNameReplace >
get(boost::shared_ptr< ConfigurationChanges > const & batch,
com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >
const & context = comphelper::getProcessComponentContext())
{
return detail::ConfigurationWrapper::get(context).getGroupReadWrite(
batch, T::path());
}
private:
ConfigurationGroup(); // not defined
~ConfigurationGroup(); // not defined
};
/// A type-safe wrapper around a configuration set.
///
/// Automatically generated headers for the various configuration sets derive
/// from this template and make available its member functions to access each
/// given configuration set.
template< typename T > struct ConfigurationSet: private boost::noncopyable {
/// Get read-only access to the given configuration set.
static
com::sun::star::uno::Reference< com::sun::star::container::XNameAccess >
get(com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >
const & context = comphelper::getProcessComponentContext())
{
return detail::ConfigurationWrapper::get(context).getSetReadOnly(
T::path());
}
/// Get read/write access to the given configuration set, storing any
/// modifications via the given changes batch.
static
com::sun::star::uno::Reference< com::sun::star::container::XNameContainer >
get(boost::shared_ptr< ConfigurationChanges > const & batch,
com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >
const & context = comphelper::getProcessComponentContext())
{
return detail::ConfigurationWrapper::get(context).getSetReadWrite(
batch, T::path());
}
private:
ConfigurationSet(); // not defined
~ConfigurationSet(); // not defined
};
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */