blob: 368436cc7a85571df393ee8fe49559a9498d44a2 [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.
*
*************************************************************/
#include "precompiled_stoc.hxx"
#include "sal/config.h"
#include <cstdlib>
#include <memory>
#include <vector>
#include "com/sun/star/lang/XServiceInfo.hpp"
#include "com/sun/star/registry/InvalidRegistryException.hpp"
#include "com/sun/star/registry/InvalidValueException.hpp"
#include "com/sun/star/registry/MergeConflictException.hpp"
#include "com/sun/star/registry/RegistryKeyType.hpp"
#include "com/sun/star/registry/XRegistryKey.hpp"
#include "com/sun/star/registry/XSimpleRegistry.hpp"
#include "com/sun/star/uno/Reference.hxx"
#include "com/sun/star/uno/RuntimeException.hpp"
#include "com/sun/star/uno/XComponentContext.hpp"
#include "com/sun/star/uno/XInterface.hpp"
#include "com/sun/star/uno/Sequence.hxx"
#include "cppuhelper/implbase1.hxx"
#include "cppuhelper/implbase2.hxx"
#include "cppuhelper/weak.hxx"
#include "osl/mutex.hxx"
#include "registry/registry.hxx"
#include "registry/regtype.h"
#include "rtl/ref.hxx"
#include "rtl/string.h"
#include "rtl/string.hxx"
#include "rtl/textcvt.h"
#include "rtl/textenc.h"
#include "rtl/unload.h"
#include "rtl/ustring.h"
#include "rtl/ustring.hxx"
#include "sal/types.h"
#include "bootstrapservices.hxx"
#include "textualservices.hxx"
extern rtl_StandardModuleCount g_moduleCount;
namespace {
namespace css = com::sun::star;
class SimpleRegistry:
public cppu::WeakImplHelper2<
css::registry::XSimpleRegistry, css::lang::XServiceInfo >
{
public:
SimpleRegistry() { g_moduleCount.modCnt.acquire(&g_moduleCount.modCnt); }
~SimpleRegistry() { g_moduleCount.modCnt.release(&g_moduleCount.modCnt); }
osl::Mutex mutex_;
private:
virtual rtl::OUString SAL_CALL getURL() throw (css::uno::RuntimeException);
virtual void SAL_CALL open(
rtl::OUString const & rURL, sal_Bool bReadOnly, sal_Bool bCreate)
throw (
css::registry::InvalidRegistryException,
css::uno::RuntimeException);
virtual sal_Bool SAL_CALL isValid() throw (css::uno::RuntimeException);
virtual void SAL_CALL close() throw (
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual void SAL_CALL destroy() throw(
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual css::uno::Reference< css::registry::XRegistryKey > SAL_CALL
getRootKey() throw(
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual sal_Bool SAL_CALL isReadOnly() throw(
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual void SAL_CALL mergeKey(
rtl::OUString const & aKeyName, rtl::OUString const & aUrl)
throw (
css::registry::InvalidRegistryException,
css::registry::MergeConflictException, css::uno::RuntimeException);
virtual rtl::OUString SAL_CALL getImplementationName()
throw (css::uno::RuntimeException)
{ return stoc_bootstrap::simreg_getImplementationName(); }
virtual sal_Bool SAL_CALL supportsService(rtl::OUString const & ServiceName)
throw (css::uno::RuntimeException)
{ return ServiceName == getSupportedServiceNames()[0]; }
virtual css::uno::Sequence< rtl::OUString > SAL_CALL
getSupportedServiceNames() throw (css::uno::RuntimeException)
{ return stoc_bootstrap::simreg_getSupportedServiceNames(); }
Registry registry_;
std::auto_ptr< stoc::simpleregistry::TextualServices > textual_;
};
class Key: public cppu::WeakImplHelper1< css::registry::XRegistryKey > {
public:
Key(
rtl::Reference< SimpleRegistry > const & registry,
RegistryKey const & key):
registry_(registry), key_(key) {}
private:
virtual rtl::OUString SAL_CALL getKeyName()
throw (css::uno::RuntimeException);
virtual sal_Bool SAL_CALL isReadOnly() throw (
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual sal_Bool SAL_CALL isValid() throw(css::uno::RuntimeException);
virtual css::registry::RegistryKeyType SAL_CALL getKeyType(
rtl::OUString const & rKeyName)
throw (
css::registry::InvalidRegistryException,
css::uno::RuntimeException);
virtual css::registry::RegistryValueType SAL_CALL getValueType() throw(
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual sal_Int32 SAL_CALL getLongValue() throw (
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException);
virtual void SAL_CALL setLongValue(sal_Int32 value) throw (
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual css::uno::Sequence< sal_Int32 > SAL_CALL getLongListValue() throw(
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException);
virtual void SAL_CALL setLongListValue(
com::sun::star::uno::Sequence< sal_Int32 > const & seqValue)
throw (
css::registry::InvalidRegistryException,
css::uno::RuntimeException);
virtual rtl::OUString SAL_CALL getAsciiValue() throw (
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException);
virtual void SAL_CALL setAsciiValue(rtl::OUString const & value) throw (
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual css::uno::Sequence< rtl::OUString > SAL_CALL getAsciiListValue()
throw (
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException);
virtual void SAL_CALL setAsciiListValue(
css::uno::Sequence< rtl::OUString > const & seqValue)
throw (
css::registry::InvalidRegistryException,
css::uno::RuntimeException);
virtual rtl::OUString SAL_CALL getStringValue() throw(
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException);
virtual void SAL_CALL setStringValue(rtl::OUString const & value) throw (
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual css::uno::Sequence< rtl::OUString > SAL_CALL getStringListValue()
throw (
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException);
virtual void SAL_CALL setStringListValue(
css::uno::Sequence< rtl::OUString > const & seqValue)
throw (
css::registry::InvalidRegistryException,
css::uno::RuntimeException);
virtual css::uno::Sequence< sal_Int8 > SAL_CALL getBinaryValue() throw (
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException);
virtual void SAL_CALL setBinaryValue(
css::uno::Sequence< sal_Int8 > const & value)
throw (
css::registry::InvalidRegistryException,
css::uno::RuntimeException);
virtual css::uno::Reference< css::registry::XRegistryKey > SAL_CALL openKey(
rtl::OUString const & aKeyName)
throw (
css::registry::InvalidRegistryException,
css::uno::RuntimeException);
virtual css::uno::Reference< css::registry::XRegistryKey > SAL_CALL
createKey(rtl::OUString const & aKeyName) throw (
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual void SAL_CALL closeKey() throw (
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual void SAL_CALL deleteKey(rtl::OUString const & rKeyName) throw (
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual
css::uno::Sequence< css::uno::Reference< css::registry::XRegistryKey > >
SAL_CALL openKeys() throw (
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual css::uno::Sequence< rtl::OUString > SAL_CALL getKeyNames() throw (
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual sal_Bool SAL_CALL createLink(
rtl::OUString const & aLinkName, rtl::OUString const & aLinkTarget)
throw (
css::registry::InvalidRegistryException,
css::uno::RuntimeException);
virtual void SAL_CALL deleteLink(rtl::OUString const & rLinkName) throw (
css::registry::InvalidRegistryException, css::uno::RuntimeException);
virtual rtl::OUString SAL_CALL getLinkTarget(
rtl::OUString const & rLinkName)
throw (
css::registry::InvalidRegistryException,
css::uno::RuntimeException);
virtual rtl::OUString SAL_CALL getResolvedName(
rtl::OUString const & aKeyName)
throw (
css::registry::InvalidRegistryException,
css::uno::RuntimeException);
rtl::Reference< SimpleRegistry > registry_;
RegistryKey key_;
};
rtl::OUString Key::getKeyName() throw (css::uno::RuntimeException) {
osl::MutexGuard guard(registry_->mutex_);
return key_.getName();
}
sal_Bool Key::isReadOnly()
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
return key_.isReadOnly();
}
sal_Bool Key::isValid() throw (css::uno::RuntimeException) {
osl::MutexGuard guard(registry_->mutex_);
return key_.isValid();
}
css::registry::RegistryKeyType Key::getKeyType(rtl::OUString const & rKeyName)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegKeyType type;
RegError err = key_.getKeyType(rKeyName, &type);
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getKeyType:"
" underlying RegistryKey::getKeyType() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
switch (type) {
default:
std::abort(); // this cannot happen
// pseudo-fall-through to avoid warnings on MSC
case RG_KEYTYPE:
return css::registry::RegistryKeyType_KEY;
case RG_LINKTYPE:
return css::registry::RegistryKeyType_LINK;
}
}
css::registry::RegistryValueType Key::getValueType()
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegValueType type;
sal_uInt32 size;
RegError err = key_.getValueInfo(rtl::OUString(), &type, &size);
switch (err) {
case REG_NO_ERROR:
break;
case REG_INVALID_VALUE:
type = RG_VALUETYPE_NOT_DEFINED;
break;
default:
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getValueType:"
" underlying RegistryKey::getValueInfo() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
switch (type) {
default:
std::abort(); // this cannot happen
// pseudo-fall-through to avoid warnings on MSC
case RG_VALUETYPE_NOT_DEFINED:
return css::registry::RegistryValueType_NOT_DEFINED;
case RG_VALUETYPE_LONG:
return css::registry::RegistryValueType_LONG;
case RG_VALUETYPE_STRING:
return css::registry::RegistryValueType_ASCII;
case RG_VALUETYPE_UNICODE:
return css::registry::RegistryValueType_STRING;
case RG_VALUETYPE_BINARY:
return css::registry::RegistryValueType_BINARY;
case RG_VALUETYPE_LONGLIST:
return css::registry::RegistryValueType_LONGLIST;
case RG_VALUETYPE_STRINGLIST:
return css::registry::RegistryValueType_ASCIILIST;
case RG_VALUETYPE_UNICODELIST:
return css::registry::RegistryValueType_STRINGLIST;
}
}
sal_Int32 Key::getLongValue() throw (
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
sal_Int32 value;
RegError err = key_.getValue(rtl::OUString(), &value);
switch (err) {
case REG_NO_ERROR:
break;
case REG_INVALID_VALUE:
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getLongValue:"
" underlying RegistryKey::getValue() = REG_INVALID_VALUE")),
static_cast< OWeakObject * >(this));
default:
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getLongValue:"
" underlying RegistryKey::getValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
return value;
}
void Key::setLongValue(sal_Int32 value)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegError err = key_.setValue(
rtl::OUString(), RG_VALUETYPE_LONG, &value, sizeof (sal_Int32));
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key setLongValue:"
" underlying RegistryKey::setValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
css::uno::Sequence< sal_Int32 > Key::getLongListValue() throw (
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegistryValueList< sal_Int32 > list;
RegError err = key_.getLongListValue(rtl::OUString(), list);
switch (err) {
case REG_NO_ERROR:
break;
case REG_VALUE_NOT_EXISTS:
return css::uno::Sequence< sal_Int32 >();
case REG_INVALID_VALUE:
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getLongListValue:"
" underlying RegistryKey::getLongListValue() ="
" REG_INVALID_VALUE")),
static_cast< OWeakObject * >(this));
default:
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getLongListValue:"
" underlying RegistryKey::getLongListValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
sal_uInt32 n = list.getLength();
if (n > SAL_MAX_INT32) {
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getLongListValue:"
" underlying RegistryKey::getLongListValue() too large")),
static_cast< OWeakObject * >(this));
}
css::uno::Sequence< sal_Int32 > value(static_cast< sal_Int32 >(n));
for (sal_uInt32 i = 0; i < n; ++i) {
value[static_cast< sal_Int32 >(i)] = list.getElement(i);
}
return value;
}
void Key::setLongListValue(css::uno::Sequence< sal_Int32 > const & seqValue)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
std::vector< sal_Int32 > list;
for (sal_Int32 i = 0; i < seqValue.getLength(); ++i) {
list.push_back(seqValue[i]);
}
RegError err = key_.setLongListValue(
rtl::OUString(), list.empty() ? 0 : &list[0],
static_cast< sal_uInt32 >(list.size()));
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key setLongListValue:"
" underlying RegistryKey::setLongListValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
rtl::OUString Key::getAsciiValue() throw (
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegValueType type;
sal_uInt32 size;
RegError err = key_.getValueInfo(rtl::OUString(), &type, &size);
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getAsciiValue:"
" underlying RegistryKey::getValueInfo() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
if (type != RG_VALUETYPE_STRING) {
throw css::registry::InvalidValueException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getAsciiValue:"
" underlying RegistryKey type = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(type))),
static_cast< OWeakObject * >(this));
}
// size contains terminating null (error in underlying registry.cxx):
if (size == 0) {
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getAsciiValue:"
" underlying RegistryKey size 0 cannot happen due to"
" design error")),
static_cast< OWeakObject * >(this));
}
if (size > SAL_MAX_INT32) {
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getAsciiValue:"
" underlying RegistryKey size too large")),
static_cast< OWeakObject * >(this));
}
std::vector< char > list(size);
err = key_.getValue(rtl::OUString(), &list[0]);
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getAsciiValue:"
" underlying RegistryKey::getValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
if (list[size - 1] != '\0') {
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getAsciiValue:"
" underlying RegistryKey value must be null-terminated due"
" to design error")),
static_cast< OWeakObject * >(this));
}
rtl::OUString value;
if (!rtl_convertStringToUString(
&value.pData, &list[0],
static_cast< sal_Int32 >(size - 1), RTL_TEXTENCODING_UTF8,
(RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)))
{
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getAsciiValue:"
" underlying RegistryKey not UTF-8")),
static_cast< OWeakObject * >(this));
}
return value;
}
void Key::setAsciiValue(rtl::OUString const & value)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
rtl::OString utf8;
if (!value.convertToString(
&utf8, RTL_TEXTENCODING_UTF8,
(RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR)))
{
throw css::uno::RuntimeException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key setAsciiValue:"
" value not UTF-16")),
static_cast< OWeakObject * >(this));
}
RegError err = key_.setValue(
rtl::OUString(), RG_VALUETYPE_STRING,
const_cast< char * >(utf8.getStr()), utf8.getLength() + 1);
// +1 for terminating null (error in underlying registry.cxx)
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key setAsciiValue:"
" underlying RegistryKey::setValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
css::uno::Sequence< rtl::OUString > Key::getAsciiListValue() throw (
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegistryValueList< char * > list;
RegError err = key_.getStringListValue(rtl::OUString(), list);
switch (err) {
case REG_NO_ERROR:
break;
case REG_VALUE_NOT_EXISTS:
return css::uno::Sequence< rtl::OUString >();
case REG_INVALID_VALUE:
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key"
" getAsciiListValue: underlying"
" RegistryKey::getStringListValue() = REG_INVALID_VALUE")),
static_cast< OWeakObject * >(this));
default:
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key"
" getAsciiListValue: underlying"
" RegistryKey::getStringListValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
sal_uInt32 n = list.getLength();
if (n > SAL_MAX_INT32) {
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key"
" getAsciiListValue: underlying"
" RegistryKey::getStringListValue() too large")),
static_cast< OWeakObject * >(this));
}
css::uno::Sequence< rtl::OUString > value(static_cast< sal_Int32 >(n));
for (sal_uInt32 i = 0; i < n; ++i) {
char * el = list.getElement(i);
sal_Int32 size = rtl_str_getLength(el);
if (!rtl_convertStringToUString(
&value[static_cast< sal_Int32 >(i)].pData, el, size,
RTL_TEXTENCODING_UTF8,
(RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)))
{
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key"
" getAsciiListValue: underlying RegistryKey not"
" UTF-8")),
static_cast< OWeakObject * >(this));
}
}
return value;
}
void Key::setAsciiListValue(
css::uno::Sequence< rtl::OUString > const & seqValue)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
std::vector< rtl::OString > list;
for (sal_Int32 i = 0; i < seqValue.getLength(); ++i) {
rtl::OString utf8;
if (!seqValue[i].convertToString(
&utf8, RTL_TEXTENCODING_UTF8,
(RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR)))
{
throw css::uno::RuntimeException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key"
" setAsciiListValue: value not UTF-16")),
static_cast< OWeakObject * >(this));
}
list.push_back(utf8);
}
std::vector< char * > list2;
for (std::vector< rtl::OString >::iterator i(list.begin()); i != list.end();
++i)
{
list2.push_back(const_cast< char * >(i->getStr()));
}
RegError err = key_.setStringListValue(
rtl::OUString(), list2.empty() ? 0 : &list2[0],
static_cast< sal_uInt32 >(list2.size()));
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key"
" setAsciiListValue: underlying"
" RegistryKey::setStringListValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
rtl::OUString Key::getStringValue() throw (
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegValueType type;
sal_uInt32 size;
RegError err = key_.getValueInfo(rtl::OUString(), &type, &size);
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getStringValue:"
" underlying RegistryKey::getValueInfo() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
if (type != RG_VALUETYPE_UNICODE) {
throw css::registry::InvalidValueException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getStringValue:"
" underlying RegistryKey type = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(type))),
static_cast< OWeakObject * >(this));
}
// size contains terminating null and is *2 (error in underlying
// registry.cxx):
if (size == 0 || (size & 1) == 1) {
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getStringValue:"
" underlying RegistryKey size 0 or odd cannot happen due to"
" design error")),
static_cast< OWeakObject * >(this));
}
if (size > SAL_MAX_INT32) {
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getStringValue:"
" underlying RegistryKey size too large")),
static_cast< OWeakObject * >(this));
}
std::vector< sal_Unicode > list(size);
err = key_.getValue(rtl::OUString(), &list[0]);
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getStringValue:"
" underlying RegistryKey::getValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
if (list[size/2 - 1] != 0) {
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getStringValue:"
" underlying RegistryKey value must be null-terminated due"
" to design error")),
static_cast< OWeakObject * >(this));
}
return rtl::OUString(&list[0], static_cast< sal_Int32 >(size/2 - 1));
}
void Key::setStringValue(rtl::OUString const & value)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegError err = key_.setValue(
rtl::OUString(), RG_VALUETYPE_UNICODE,
const_cast< sal_Unicode * >(value.getStr()),
(value.getLength() + 1) * sizeof (sal_Unicode));
// +1 for terminating null (error in underlying registry.cxx)
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key setStringValue:"
" underlying RegistryKey::setValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
css::uno::Sequence< rtl::OUString > Key::getStringListValue() throw (
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegistryValueList< sal_Unicode * > list;
RegError err = key_.getUnicodeListValue(rtl::OUString(), list);
switch (err) {
case REG_NO_ERROR:
break;
case REG_VALUE_NOT_EXISTS:
return css::uno::Sequence< rtl::OUString >();
case REG_INVALID_VALUE:
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key"
" getStringListValue: underlying"
" RegistryKey::getUnicodeListValue() = REG_INVALID_VALUE")),
static_cast< OWeakObject * >(this));
default:
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key"
" getStringListValue: underlying"
" RegistryKey::getUnicodeListValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
sal_uInt32 n = list.getLength();
if (n > SAL_MAX_INT32) {
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key"
" getStringListValue: underlying"
" RegistryKey::getUnicodeListValue() too large")),
static_cast< OWeakObject * >(this));
}
css::uno::Sequence< rtl::OUString > value(static_cast< sal_Int32 >(n));
for (sal_uInt32 i = 0; i < n; ++i) {
value[static_cast< sal_Int32 >(i)] = list.getElement(i);
}
return value;
}
void Key::setStringListValue(
css::uno::Sequence< rtl::OUString > const & seqValue)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
std::vector< sal_Unicode * > list;
for (sal_Int32 i = 0; i < seqValue.getLength(); ++i) {
list.push_back(const_cast< sal_Unicode * >(seqValue[i].getStr()));
}
RegError err = key_.setUnicodeListValue(
rtl::OUString(), list.empty() ? 0 : &list[0],
static_cast< sal_uInt32 >(list.size()));
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key"
" setStringListValue: underlying"
" RegistryKey::setUnicodeListValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
css::uno::Sequence< sal_Int8 > Key::getBinaryValue()
throw (
css::registry::InvalidRegistryException,
css::registry::InvalidValueException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegValueType type;
sal_uInt32 size;
RegError err = key_.getValueInfo(rtl::OUString(), &type, &size);
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getBinaryValue:"
" underlying RegistryKey::getValueInfo() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
if (type != RG_VALUETYPE_BINARY) {
throw css::registry::InvalidValueException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getBinaryValue:"
" underlying RegistryKey type = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(type))),
static_cast< OWeakObject * >(this));
}
if (size > SAL_MAX_INT32) {
throw css::registry::InvalidValueException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getBinaryValue:"
" underlying RegistryKey size too large")),
static_cast< OWeakObject * >(this));
}
css::uno::Sequence< sal_Int8 > value(static_cast< sal_Int32 >(size));
err = key_.getValue(rtl::OUString(), value.getArray());
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getBinaryValue:"
" underlying RegistryKey::getValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
return value;
}
void Key::setBinaryValue(css::uno::Sequence< sal_Int8 > const & value)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegError err = key_.setValue(
rtl::OUString(), RG_VALUETYPE_BINARY,
const_cast< sal_Int8 * >(value.getConstArray()),
static_cast< sal_uInt32 >(value.getLength()));
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key setBinaryValue:"
" underlying RegistryKey::setValue() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
css::uno::Reference< css::registry::XRegistryKey > Key::openKey(
rtl::OUString const & aKeyName)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegistryKey key;
RegError err = key_.openKey(aKeyName, key);
switch (err) {
case REG_NO_ERROR:
return new Key(registry_, key);
case REG_KEY_NOT_EXISTS:
return css::uno::Reference< css::registry::XRegistryKey >();
default:
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key openKey:"
" underlying RegistryKey::openKey() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
css::uno::Reference< css::registry::XRegistryKey > Key::createKey(
rtl::OUString const & aKeyName)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegistryKey key;
RegError err = key_.createKey(aKeyName, key);
switch (err) {
case REG_NO_ERROR:
return new Key(registry_, key);
case REG_INVALID_KEYNAME:
return css::uno::Reference< css::registry::XRegistryKey >();
default:
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key createKey:"
" underlying RegistryKey::createKey() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
void Key::closeKey()
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegError err = key_.closeKey();
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key closeKey:"
" underlying RegistryKey::closeKey() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
void Key::deleteKey(rtl::OUString const & rKeyName)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegError err = key_.deleteKey(rKeyName);
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key deleteKey:"
" underlying RegistryKey::deleteKey() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
css::uno::Sequence< css::uno::Reference< css::registry::XRegistryKey > >
Key::openKeys()
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegistryKeyArray list;
RegError err = key_.openSubKeys(rtl::OUString(), list);
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key openKeys:"
" underlying RegistryKey::openSubKeys() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
sal_uInt32 n = list.getLength();
if (n > SAL_MAX_INT32) {
throw css::registry::InvalidRegistryException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getKeyNames:"
" underlying RegistryKey::getKeyNames() too large")),
static_cast< OWeakObject * >(this));
}
css::uno::Sequence< css::uno::Reference< css::registry::XRegistryKey > >
keys(static_cast< sal_Int32 >(n));
for (sal_uInt32 i = 0; i < n; ++i) {
keys[static_cast< sal_Int32 >(i)] = new Key(
registry_, list.getElement(i));
}
return keys;
}
css::uno::Sequence< rtl::OUString > Key::getKeyNames()
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegistryKeyNames list;
RegError err = key_.getKeyNames(rtl::OUString(), list);
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getKeyNames:"
" underlying RegistryKey::getKeyNames() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
sal_uInt32 n = list.getLength();
if (n > SAL_MAX_INT32) {
throw css::registry::InvalidRegistryException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getKeyNames:"
" underlying RegistryKey::getKeyNames() too large")),
static_cast< OWeakObject * >(this));
}
css::uno::Sequence< rtl::OUString > names(static_cast< sal_Int32 >(n));
for (sal_uInt32 i = 0; i < n; ++i) {
names[static_cast< sal_Int32 >(i)] = list.getElement(i);
}
return names;
}
sal_Bool Key::createLink(
rtl::OUString const & aLinkName, rtl::OUString const & aLinkTarget)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegError err = key_.createLink(aLinkName, aLinkTarget);
switch (err) {
case REG_NO_ERROR:
return true;
case REG_INVALID_KEY:
case REG_DETECT_RECURSION:
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key createLink:"
" underlying RegistryKey::createLink() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
default:
return false;
}
}
void Key::deleteLink(rtl::OUString const & rLinkName)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
RegError err = key_.deleteLink(rLinkName);
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key deleteLink:"
" underlying RegistryKey::deleteLink() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
rtl::OUString Key::getLinkTarget(rtl::OUString const & rLinkName)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
rtl::OUString target;
RegError err = key_.getLinkTarget(rLinkName, target);
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getLinkTarget:"
" underlying RegistryKey::getLinkTarget() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
return target;
}
rtl::OUString Key::getResolvedName(rtl::OUString const & aKeyName)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(registry_->mutex_);
rtl::OUString resolved;
RegError err = key_.getResolvedKeyName(aKeyName, true, resolved);
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry key getResolvedName:"
" underlying RegistryKey::getResolvedName() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
return resolved;
}
rtl::OUString SimpleRegistry::getURL() throw (css::uno::RuntimeException) {
osl::MutexGuard guard(mutex_);
return textual_.get() == 0 ? registry_.getName() : textual_->getUri();
}
void SimpleRegistry::open(
rtl::OUString const & rURL, sal_Bool bReadOnly, sal_Bool bCreate)
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(mutex_);
if (textual_.get() != 0) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry.open(")) +
rURL +
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"): instance already open"))),
static_cast< OWeakObject * >(this));
}
RegError err = (rURL.getLength() == 0 && bCreate)
? REG_REGISTRY_NOT_EXISTS
: registry_.open(rURL, bReadOnly ? REG_READONLY : REG_READWRITE);
if (err == REG_REGISTRY_NOT_EXISTS && bCreate) {
err = registry_.create(rURL);
}
switch (err) {
case REG_NO_ERROR:
break;
case REG_INVALID_REGISTRY:
if (bReadOnly && !bCreate) {
textual_.reset(new stoc::simpleregistry::TextualServices(rURL));
break;
}
// fall through
default:
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry.open(")) +
rURL +
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"): underlying Registry::open/create() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
sal_Bool SimpleRegistry::isValid() throw (css::uno::RuntimeException) {
osl::MutexGuard guard(mutex_);
return textual_.get() != 0 || registry_.isValid();
}
void SimpleRegistry::close()
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(mutex_);
if (textual_.get() != 0) {
textual_.reset();
return;
}
RegError err = registry_.close();
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry.close:"
" underlying Registry::close() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
void SimpleRegistry::destroy()
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(mutex_);
if (textual_.get() != 0) {
textual_.reset();
return;
}
RegError err = registry_.destroy(rtl::OUString());
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry.destroy:"
" underlying Registry::destroy() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
css::uno::Reference< css::registry::XRegistryKey > SimpleRegistry::getRootKey()
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(mutex_);
if (textual_.get() != 0) {
return textual_->getRootKey();
}
RegistryKey root;
RegError err = registry_.openRootKey(root);
if (err != REG_NO_ERROR) {
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry.getRootKey:"
" underlying Registry::getRootKey() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
return new Key(this, root);
}
sal_Bool SimpleRegistry::isReadOnly()
throw (css::registry::InvalidRegistryException, css::uno::RuntimeException)
{
osl::MutexGuard guard(mutex_);
return textual_.get() != 0 || registry_.isReadOnly();
}
void SimpleRegistry::mergeKey(
rtl::OUString const & aKeyName, rtl::OUString const & aUrl)
throw (
css::registry::InvalidRegistryException,
css::registry::MergeConflictException, css::uno::RuntimeException)
{
osl::MutexGuard guard(mutex_);
if (textual_.get() != 0) {
throw css::uno::RuntimeException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry.mergeKey: not"
" supported for textual representation")),
static_cast< cppu::OWeakObject * >(this));
}
RegistryKey root;
RegError err = registry_.openRootKey(root);
if (err == REG_NO_ERROR) {
err = registry_.mergeKey(root, aKeyName, aUrl, false, false);
}
switch (err) {
case REG_NO_ERROR:
case REG_MERGE_CONFLICT:
break;
case REG_MERGE_ERROR:
throw css::registry::MergeConflictException(
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry.mergeKey:"
" underlying Registry::mergeKey() = REG_MERGE_ERROR")),
static_cast< cppu::OWeakObject * >(this));
default:
throw css::registry::InvalidRegistryException(
(rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.registry.SimpleRegistry.mergeKey:"
" underlying Registry::getRootKey/mergeKey() = ")) +
rtl::OUString::valueOf(static_cast< sal_Int32 >(err))),
static_cast< OWeakObject * >(this));
}
}
}
namespace stoc_bootstrap {
css::uno::Reference< css::uno::XInterface > SimpleRegistry_CreateInstance(
css::uno::Reference< css::uno::XComponentContext > const &)
{
return static_cast< cppu::OWeakObject * >(new SimpleRegistry);
}
css::uno::Sequence< rtl::OUString > simreg_getSupportedServiceNames() {
css::uno::Sequence< rtl::OUString > names(1);
names[0] = rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM("com.sun.star.registry.SimpleRegistry"));
return names;
}
rtl::OUString simreg_getImplementationName() {
return rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.stoc.SimpleRegistry"));
}
}