blob: b3c8bdd582d3b7dae0573ee295ac696e6aa37bd6 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_extensions.hxx"
#include "myconfigurationhelper.hxx"
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/container/XNameContainer.hpp>
#include <com/sun/star/lang/XSingleServiceFactory.hpp>
#include <rtl/ustrbuf.hxx>
#include <vector>
namespace css = ::com::sun::star;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::uno;
using ::rtl::OUString;
using ::rtl::OUStringBuffer;
using ::std::vector;
namespace
{
static const Sequence<Any> sequenceFromVector(const vector<Any>& vec)
{
Sequence<Any> result(vec.size());
for(size_t idx = 0; idx < vec.size(); ++idx)
result[idx] = vec[idx];
return result;
};
static const OUString noSuchElement(const OUString& path)
{
OUStringBuffer buf(256);
buf.appendAscii("The requested path \"");
buf.append(path);
buf.appendAscii("\" does not exists.");
return buf.makeStringAndClear();
};
}
namespace oooimprovement
{
Reference<XInterface> MyConfigurationHelper::openConfig(
const Reference<XMultiServiceFactory> xSMGR,
const OUString& sPackage,
sal_Int32 eMode)
{
Reference<XMultiServiceFactory> xConfigProvider(
xSMGR->createInstance(OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider")),
UNO_QUERY_THROW);
vector<Any> lParams;
css::beans::PropertyValue aParam;
// set root path
aParam.Name = OUString::createFromAscii("nodepath");
aParam.Value <<= sPackage;
lParams.push_back(makeAny(aParam));
// enable all locales mode
if ((eMode & MyConfigurationHelper::E_ALL_LOCALES)==MyConfigurationHelper::E_ALL_LOCALES)
{
aParam.Name = OUString::createFromAscii("locale");
aParam.Value <<= OUString::createFromAscii("*");
lParams.push_back(makeAny(aParam));
}
// enable lazy writing
sal_Bool bLazy = ((eMode & MyConfigurationHelper::E_LAZY_WRITE)==MyConfigurationHelper::E_LAZY_WRITE);
aParam.Name = OUString::createFromAscii("lazywrite");
aParam.Value = makeAny(bLazy);
lParams.push_back(makeAny(aParam));
// open it
Reference<XInterface> xCFG;
sal_Bool bReadOnly = ((eMode & MyConfigurationHelper::E_READONLY)==MyConfigurationHelper::E_READONLY);
if (bReadOnly)
xCFG = xConfigProvider->createInstanceWithArguments(
OUString::createFromAscii("com.sun.star.configuration.ConfigurationAccess"),
sequenceFromVector(lParams));
else
xCFG = xConfigProvider->createInstanceWithArguments(
OUString::createFromAscii("com.sun.star.configuration.ConfigurationUpdateAccess"),
sequenceFromVector(lParams));
return xCFG;
}
Any MyConfigurationHelper::readRelativeKey(
const Reference<XInterface> xCFG,
const OUString& sRelPath,
const OUString& sKey)
{
Reference<css::container::XHierarchicalNameAccess> xAccess(xCFG, UNO_QUERY_THROW);
Reference<css::beans::XPropertySet> xProps;
xAccess->getByHierarchicalName(sRelPath) >>= xProps;
if (!xProps.is())
throw css::container::NoSuchElementException(
noSuchElement(sRelPath),
Reference<XInterface>());
return xProps->getPropertyValue(sKey);
}
void MyConfigurationHelper::writeRelativeKey(
const Reference<XInterface> xCFG,
const OUString& sRelPath,
const OUString& sKey,
const Any& aValue)
{
Reference<css::container::XHierarchicalNameAccess> xAccess(xCFG, UNO_QUERY_THROW);
Reference<css::beans::XPropertySet> xProps;
xAccess->getByHierarchicalName(sRelPath) >>= xProps;
if (!xProps.is())
throw css::container::NoSuchElementException(
noSuchElement(sRelPath),
Reference<XInterface>());
xProps->setPropertyValue(sKey, aValue);
}
Any MyConfigurationHelper::readDirectKey(
const Reference<XMultiServiceFactory> xSMGR,
const OUString& sPackage,
const OUString& sRelPath,
const OUString& sKey,
sal_Int32 eMode)
{
Reference<XInterface> xCFG = MyConfigurationHelper::openConfig(xSMGR, sPackage, eMode);
return MyConfigurationHelper::readRelativeKey(xCFG, sRelPath, sKey);
}
void MyConfigurationHelper::writeDirectKey(
const Reference<XMultiServiceFactory> xSMGR,
const OUString& sPackage,
const OUString& sRelPath,
const OUString& sKey,
const Any& aValue,
sal_Int32 eMode)
{
Reference<XInterface> xCFG = MyConfigurationHelper::openConfig(xSMGR, sPackage, eMode);
MyConfigurationHelper::writeRelativeKey(xCFG, sRelPath, sKey, aValue);
MyConfigurationHelper::flush(xCFG);
}
void MyConfigurationHelper::flush(const Reference<XInterface>& xCFG)
{
Reference<css::util::XChangesBatch> xBatch(xCFG, UNO_QUERY_THROW);
xBatch->commitChanges();
}
}