summaryrefslogtreecommitdiff
path: root/stoc/source/simpleregistry
diff options
context:
space:
mode:
Diffstat (limited to 'stoc/source/simpleregistry')
-rw-r--r--stoc/source/simpleregistry/makefile.mk46
-rw-r--r--stoc/source/simpleregistry/simpleregistry.cxx1306
2 files changed, 1352 insertions, 0 deletions
diff --git a/stoc/source/simpleregistry/makefile.mk b/stoc/source/simpleregistry/makefile.mk
new file mode 100644
index 000000000000..510e7b466d83
--- /dev/null
+++ b/stoc/source/simpleregistry/makefile.mk
@@ -0,0 +1,46 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..$/..
+
+PRJNAME= stoc
+TARGET = simplereg
+ENABLE_EXCEPTIONS=TRUE
+BOOTSTRAP_SERVICE=TRUE
+UNOUCROUT=$(OUT)$/inc$/bootstrap
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# ------------------------------------------------------------------
+
+SLOFILES= \
+ $(SLO)$/simpleregistry.obj
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/stoc/source/simpleregistry/simpleregistry.cxx b/stoc/source/simpleregistry/simpleregistry.cxx
new file mode 100644
index 000000000000..4ae9875bdab1
--- /dev/null
+++ b/stoc/source/simpleregistry/simpleregistry.cxx
@@ -0,0 +1,1306 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_stoc.hxx"
+#include <osl/diagnose.h>
+#include <osl/mutex.hxx>
+#include <rtl/alloc.h>
+#ifndef _RTL_USTRBUF_H_
+#include <rtl/ustrbuf.hxx>
+#endif
+#include <cppuhelper/queryinterface.hxx>
+#include <cppuhelper/weak.hxx>
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/implbase1.hxx>
+#include <cppuhelper/implbase2.hxx>
+#ifndef _CPPUHELPER_IMPLEMENTATIONENTRY_HXX_
+#include <cppuhelper/implementationentry.hxx>
+#endif
+#include <registry/registry.hxx>
+
+#include <com/sun/star/registry/XSimpleRegistry.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+
+using namespace com::sun::star::uno;
+using namespace com::sun::star::registry;
+using namespace com::sun::star::lang;
+using namespace cppu;
+using namespace osl;
+using namespace rtl;
+
+#define SERVICENAME "com.sun.star.registry.SimpleRegistry"
+#define IMPLNAME "com.sun.star.comp.stoc.SimpleRegistry"
+
+extern rtl_StandardModuleCount g_moduleCount;
+
+namespace stoc_bootstrap
+{
+Sequence< OUString > simreg_getSupportedServiceNames()
+{
+ static Sequence < OUString > *pNames = 0;
+ if( ! pNames )
+ {
+ MutexGuard guard( Mutex::getGlobalMutex() );
+ if( !pNames )
+ {
+ static Sequence< OUString > seqNames(1);
+ seqNames.getArray()[0] = OUString(RTL_CONSTASCII_USTRINGPARAM(SERVICENAME));
+ pNames = &seqNames;
+ }
+ }
+ return *pNames;
+}
+
+OUString simreg_getImplementationName()
+{
+ static OUString *pImplName = 0;
+ if( ! pImplName )
+ {
+ MutexGuard guard( Mutex::getGlobalMutex() );
+ if( ! pImplName )
+ {
+ static OUString implName( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME ) );
+ pImplName = &implName;
+ }
+ }
+ return *pImplName;
+}
+}
+
+namespace stoc_simreg {
+
+//*************************************************************************
+// class RegistryKeyImpl the implenetation of interface XRegistryKey
+//*************************************************************************
+class RegistryKeyImpl;
+
+//*************************************************************************
+// SimpleRegistryImpl
+//*************************************************************************
+class SimpleRegistryImpl : public WeakImplHelper2< XSimpleRegistry, XServiceInfo >
+{
+public:
+ SimpleRegistryImpl( const Registry& rRegistry );
+
+ ~SimpleRegistryImpl();
+
+ // XServiceInfo
+ virtual OUString SAL_CALL getImplementationName( ) throw(RuntimeException);
+ virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw(RuntimeException);
+ virtual Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw(RuntimeException);
+
+ // XSimpleRegistry
+ virtual OUString SAL_CALL getURL() throw(RuntimeException);
+ virtual void SAL_CALL open( const OUString& rURL, sal_Bool bReadOnly, sal_Bool bCreate ) throw(InvalidRegistryException, RuntimeException);
+ virtual sal_Bool SAL_CALL isValid( ) throw(RuntimeException);
+ virtual void SAL_CALL close( ) throw(InvalidRegistryException, RuntimeException);
+ virtual void SAL_CALL destroy( ) throw(InvalidRegistryException, RuntimeException);
+ virtual Reference< XRegistryKey > SAL_CALL getRootKey( ) throw(InvalidRegistryException, RuntimeException);
+ virtual sal_Bool SAL_CALL isReadOnly( ) throw(InvalidRegistryException, RuntimeException);
+ virtual void SAL_CALL mergeKey( const OUString& aKeyName, const OUString& aUrl ) throw(InvalidRegistryException, MergeConflictException, RuntimeException);
+
+ friend class RegistryKeyImpl;
+protected:
+ Mutex m_mutex;
+ OUString m_url;
+ Registry m_registry;
+};
+
+
+class RegistryKeyImpl : public WeakImplHelper1< XRegistryKey >
+{
+public:
+ RegistryKeyImpl( const RegistryKey& rKey, SimpleRegistryImpl* pRegistry );
+
+ RegistryKeyImpl( const OUString& rKeyName, SimpleRegistryImpl* pRegistry );
+
+ ~RegistryKeyImpl();
+
+ // XRegistryKey
+ virtual OUString SAL_CALL getKeyName() throw(RuntimeException);
+ virtual sal_Bool SAL_CALL isReadOnly( ) throw(InvalidRegistryException, RuntimeException);
+ virtual sal_Bool SAL_CALL isValid( ) throw(RuntimeException);
+ virtual RegistryKeyType SAL_CALL getKeyType( const OUString& rKeyName ) throw(InvalidRegistryException, RuntimeException);
+ virtual RegistryValueType SAL_CALL getValueType( ) throw(InvalidRegistryException, RuntimeException);
+ virtual sal_Int32 SAL_CALL getLongValue( ) throw(InvalidRegistryException, InvalidValueException, RuntimeException);
+ virtual void SAL_CALL setLongValue( sal_Int32 value ) throw(InvalidRegistryException, RuntimeException);
+ virtual Sequence< sal_Int32 > SAL_CALL getLongListValue( ) throw(InvalidRegistryException, InvalidValueException, RuntimeException);
+ virtual void SAL_CALL setLongListValue( const ::com::sun::star::uno::Sequence< sal_Int32 >& seqValue ) throw(InvalidRegistryException, RuntimeException);
+ virtual OUString SAL_CALL getAsciiValue( ) throw(InvalidRegistryException, InvalidValueException, RuntimeException);
+ virtual void SAL_CALL setAsciiValue( const OUString& value ) throw(InvalidRegistryException, RuntimeException);
+ virtual Sequence< OUString > SAL_CALL getAsciiListValue( ) throw(InvalidRegistryException, InvalidValueException, RuntimeException);
+ virtual void SAL_CALL setAsciiListValue( const ::com::sun::star::uno::Sequence< OUString >& seqValue ) throw(InvalidRegistryException, RuntimeException);
+ virtual OUString SAL_CALL getStringValue( ) throw(InvalidRegistryException, InvalidValueException, RuntimeException);
+ virtual void SAL_CALL setStringValue( const OUString& value ) throw(InvalidRegistryException, RuntimeException);
+ virtual Sequence< OUString > SAL_CALL getStringListValue( ) throw(InvalidRegistryException, InvalidValueException, RuntimeException);
+ virtual void SAL_CALL setStringListValue( const ::com::sun::star::uno::Sequence< OUString >& seqValue ) throw(InvalidRegistryException, RuntimeException);
+ virtual Sequence< sal_Int8 > SAL_CALL getBinaryValue( ) throw(InvalidRegistryException, InvalidValueException, RuntimeException);
+ virtual void SAL_CALL setBinaryValue( const ::com::sun::star::uno::Sequence< sal_Int8 >& value ) throw(InvalidRegistryException, RuntimeException);
+ virtual Reference< XRegistryKey > SAL_CALL openKey( const OUString& aKeyName ) throw(InvalidRegistryException, RuntimeException);
+ virtual Reference< XRegistryKey > SAL_CALL createKey( const OUString& aKeyName ) throw(InvalidRegistryException, RuntimeException);
+ virtual void SAL_CALL closeKey( ) throw(InvalidRegistryException, RuntimeException);
+ virtual void SAL_CALL deleteKey( const OUString& rKeyName ) throw(InvalidRegistryException, RuntimeException);
+ virtual Sequence< Reference< XRegistryKey > > SAL_CALL openKeys( ) throw(InvalidRegistryException, RuntimeException);
+ virtual Sequence< OUString > SAL_CALL getKeyNames( ) throw(InvalidRegistryException, RuntimeException);
+ virtual sal_Bool SAL_CALL createLink( const OUString& aLinkName, const OUString& aLinkTarget ) throw(InvalidRegistryException, RuntimeException);
+ virtual void SAL_CALL deleteLink( const OUString& rLinkName ) throw(InvalidRegistryException, RuntimeException);
+ virtual OUString SAL_CALL getLinkTarget( const OUString& rLinkName ) throw(InvalidRegistryException, RuntimeException);
+ virtual OUString SAL_CALL getResolvedName( const OUString& aKeyName ) throw(InvalidRegistryException, RuntimeException);
+
+protected:
+ OUString m_name;
+ RegistryKey m_key;
+ SimpleRegistryImpl* m_pRegistry;
+};
+
+//*************************************************************************
+RegistryKeyImpl::RegistryKeyImpl( const RegistryKey& key, SimpleRegistryImpl* pRegistry )
+ : m_key(key)
+ , m_pRegistry(pRegistry)
+{
+ m_pRegistry->acquire();
+ m_name = m_key.getName();
+}
+
+//*************************************************************************
+RegistryKeyImpl::RegistryKeyImpl( const OUString& rKeyName,
+ SimpleRegistryImpl* pRegistry )
+ : m_pRegistry(pRegistry)
+{
+ m_pRegistry->acquire();
+
+ RegistryKey rootKey;
+ if (!pRegistry->m_registry.isValid() ||
+ pRegistry->m_registry.openRootKey(rootKey))
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ if ( rootKey.openKey(rKeyName, m_key) )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ m_name = rKeyName;
+ }
+ }
+}
+
+//*************************************************************************
+RegistryKeyImpl::~RegistryKeyImpl()
+{
+ m_pRegistry->release();
+}
+
+//*************************************************************************
+OUString SAL_CALL RegistryKeyImpl::getKeyName() throw(RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ return m_name;
+}
+
+//*************************************************************************
+sal_Bool SAL_CALL RegistryKeyImpl::isReadOnly( )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if (m_key.isValid())
+ {
+ return(m_key.isReadOnly());
+ } else
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ }
+}
+
+//*************************************************************************
+sal_Bool SAL_CALL RegistryKeyImpl::isValid( ) throw(RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ return m_key.isValid();
+}
+
+//*************************************************************************
+RegistryKeyType SAL_CALL RegistryKeyImpl::getKeyType( const OUString& rKeyName )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( m_key.isValid() )
+ {
+ RegKeyType keyType;
+ if ( !m_key.getKeyType(rKeyName, &keyType) )
+ {
+ switch (keyType)
+ {
+ case RG_KEYTYPE:
+ return RegistryKeyType_KEY;
+ case RG_LINKTYPE:
+ return RegistryKeyType_LINK;
+ }
+ } else
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ }
+ } else
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ }
+
+ return RegistryKeyType_KEY;
+}
+
+//*************************************************************************
+RegistryValueType SAL_CALL RegistryKeyImpl::getValueType( )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if (!m_key.isValid())
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegValueType type;
+ sal_uInt32 size;
+
+ if (m_key.getValueInfo(OUString(), &type, &size))
+ {
+ return RegistryValueType_NOT_DEFINED;
+ } else
+ {
+ switch (type)
+ {
+ case RG_VALUETYPE_LONG: return RegistryValueType_LONG;
+ case RG_VALUETYPE_STRING: return RegistryValueType_ASCII;
+ case RG_VALUETYPE_UNICODE: return RegistryValueType_STRING;
+ case RG_VALUETYPE_BINARY: return RegistryValueType_BINARY;
+ case RG_VALUETYPE_LONGLIST: return RegistryValueType_LONGLIST;
+ case RG_VALUETYPE_STRINGLIST: return RegistryValueType_ASCIILIST;
+ case RG_VALUETYPE_UNICODELIST: return RegistryValueType_STRINGLIST;
+ default: return RegistryValueType_NOT_DEFINED;
+ }
+ }
+ }
+
+ return RegistryValueType_NOT_DEFINED;
+}
+
+//*************************************************************************
+sal_Int32 SAL_CALL RegistryKeyImpl::getLongValue( )
+ throw(InvalidRegistryException, InvalidValueException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if (!m_key.isValid())
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegValueType type;
+ sal_uInt32 size;
+
+ if ( !m_key.getValueInfo(OUString(), &type, &size) )
+ {
+ if (type == RG_VALUETYPE_LONG)
+ {
+ sal_Int32 value;
+ if ( !m_key.getValue(OUString(), (RegValue)&value) )
+ {
+ return value;
+ }
+ }
+ }
+
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+}
+
+//*************************************************************************
+void SAL_CALL RegistryKeyImpl::setLongValue( sal_Int32 value )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ if (m_key.setValue(OUString(), RG_VALUETYPE_LONG, &value, sizeof(sal_Int32)))
+ {
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+ }
+}
+
+//*************************************************************************
+Sequence< sal_Int32 > SAL_CALL RegistryKeyImpl::getLongListValue( )
+ throw(InvalidRegistryException, InvalidValueException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegValueType type;
+ sal_uInt32 size;
+
+ if ( !m_key.getValueInfo(OUString(), &type, &size) )
+ {
+ if (type == RG_VALUETYPE_LONGLIST)
+ {
+ RegistryValueList<sal_Int32> tmpValue;
+ if ( !m_key.getLongListValue(OUString(), tmpValue) )
+ {
+ Sequence<sal_Int32> seqValue(size);
+
+ for (sal_uInt32 i=0; i < size; i++)
+ {
+ seqValue.getArray()[i] = tmpValue.getElement(i);
+ }
+
+ return seqValue;
+ }
+ }
+ }
+
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+}
+
+//*************************************************************************
+void SAL_CALL RegistryKeyImpl::setLongListValue( const Sequence< sal_Int32 >& seqValue )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ sal_uInt32 length = seqValue.getLength();
+ sal_Int32* tmpValue = new sal_Int32[length];
+
+ for (sal_uInt32 i=0; i < length; i++)
+ {
+ tmpValue[i] = seqValue.getConstArray()[i];
+ }
+
+ if ( m_key.setLongListValue(OUString(), tmpValue, length) )
+ {
+ delete[] tmpValue;
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+
+ delete[] tmpValue;
+ }
+}
+
+//*************************************************************************
+OUString SAL_CALL RegistryKeyImpl::getAsciiValue( )
+ throw(InvalidRegistryException, InvalidValueException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if (!m_key.isValid())
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegValueType type;
+ sal_uInt32 size;
+
+ if ( !m_key.getValueInfo(OUString(), &type, &size) )
+ {
+ if ( type == RG_VALUETYPE_STRING )
+ {
+ char* value = new char[size];
+ if ( m_key.getValue(OUString(), (RegValue)value) )
+ {
+ delete [] value;
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ OUString ret(OStringToOUString(value, RTL_TEXTENCODING_UTF8));
+ delete [] value;
+ return ret;
+ }
+ }
+ }
+
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+}
+
+//*************************************************************************
+void SAL_CALL RegistryKeyImpl::setAsciiValue( const OUString& value )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ OString sValue = OUStringToOString(value, RTL_TEXTENCODING_UTF8);
+ sal_uInt32 size = sValue.getLength()+1;
+ if ( m_key.setValue(OUString(), RG_VALUETYPE_STRING,
+ (RegValue)(sValue.getStr()), size) )
+ {
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+ }
+}
+
+//*************************************************************************
+Sequence< OUString > SAL_CALL RegistryKeyImpl::getAsciiListValue( )
+ throw(InvalidRegistryException, InvalidValueException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegValueType type;
+ sal_uInt32 size;
+
+ if ( !m_key.getValueInfo(OUString(), &type, &size) )
+ {
+ if (type == RG_VALUETYPE_STRINGLIST)
+ {
+ RegistryValueList<char*> tmpValue;
+ if ( !m_key.getStringListValue(OUString(), tmpValue) )
+ {
+ Sequence<OUString> seqValue(size);
+
+ for (sal_uInt32 i=0; i < size; i++)
+ {
+ seqValue.getArray()[i] =
+ OStringToOUString(tmpValue.getElement(i), RTL_TEXTENCODING_UTF8);
+ }
+
+ return seqValue;
+ }
+ }
+ }
+
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+}
+
+//*************************************************************************
+void SAL_CALL RegistryKeyImpl::setAsciiListValue( const Sequence< OUString >& seqValue )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ sal_uInt32 length = seqValue.getLength();
+ OString* pSValue = new OString[length];
+ char** tmpValue = new char*[length];
+
+ for (sal_uInt32 i=0; i < length; i++)
+ {
+ pSValue[i] = OUStringToOString(seqValue.getConstArray()[i], RTL_TEXTENCODING_UTF8);
+ tmpValue[i] = (char*)pSValue[i].getStr();
+ }
+
+ if ( m_key.setStringListValue(OUString(), tmpValue, length) )
+ {
+ delete[] pSValue;
+ delete[] tmpValue;
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+
+ delete[] pSValue;
+ delete[] tmpValue;
+ }
+}
+
+//*************************************************************************
+OUString SAL_CALL RegistryKeyImpl::getStringValue( )
+ throw(InvalidRegistryException, InvalidValueException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegValueType type;
+ sal_uInt32 size;
+
+ if ( !m_key.getValueInfo(OUString(), &type, &size) )
+ {
+ if (type == RG_VALUETYPE_UNICODE)
+ {
+ sal_Unicode* value = new sal_Unicode[size];
+ if ( m_key.getValue(OUString(), (RegValue)value) )
+ {
+ delete [] value;
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ OUString ret(value);
+ delete [] value;
+ return ret;
+ }
+ }
+ }
+
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+}
+
+//*************************************************************************
+void SAL_CALL RegistryKeyImpl::setStringValue( const OUString& value )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ sal_uInt32 size = (value.getLength() + 1) * sizeof(sal_Unicode);
+ if ( m_key.setValue(OUString(), RG_VALUETYPE_UNICODE,
+ (RegValue)(value.getStr()), size) )
+ {
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+ }
+}
+
+//*************************************************************************
+Sequence< OUString > SAL_CALL RegistryKeyImpl::getStringListValue( )
+ throw(InvalidRegistryException, InvalidValueException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegValueType type;
+ sal_uInt32 size;
+
+ if ( !m_key.getValueInfo(OUString(), &type, &size) )
+ {
+ if (type == RG_VALUETYPE_UNICODELIST)
+ {
+ RegistryValueList<sal_Unicode*> tmpValue;
+ if ( !m_key.getUnicodeListValue(OUString(), tmpValue) )
+ {
+ Sequence<OUString> seqValue(size);
+
+ for (sal_uInt32 i=0; i < size; i++)
+ {
+ seqValue.getArray()[i] = OUString(tmpValue.getElement(i));
+ }
+
+ return seqValue;
+ }
+ }
+ }
+
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+}
+
+//*************************************************************************
+void SAL_CALL RegistryKeyImpl::setStringListValue( const Sequence< OUString >& seqValue )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ sal_uInt32 length = seqValue.getLength();
+ sal_Unicode** tmpValue = new sal_Unicode*[length];
+
+ for (sal_uInt32 i=0; i < length; i++)
+ {
+ tmpValue[i] = (sal_Unicode*)seqValue.getConstArray()[i].getStr();
+ }
+
+ if (m_key.setUnicodeListValue(OUString(), tmpValue, length))
+ {
+ delete[] tmpValue;
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+
+ delete[] tmpValue;
+ }
+}
+
+//*************************************************************************
+Sequence< sal_Int8 > SAL_CALL RegistryKeyImpl::getBinaryValue( )
+ throw(InvalidRegistryException, InvalidValueException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegValueType type;
+ sal_uInt32 size;
+
+ if ( !m_key.getValueInfo(OUString(), &type, &size) )
+ {
+ if (type == RG_VALUETYPE_BINARY)
+ {
+ sal_Int8* value = new sal_Int8[size];
+ if (m_key.getValue(OUString(), (RegValue)value))
+ {
+ delete [] value;
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ Sequence<sal_Int8> seqBytes(value, size);
+ delete [] value;
+ return seqBytes;
+ }
+ }
+ }
+
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+}
+
+//*************************************************************************
+void SAL_CALL RegistryKeyImpl::setBinaryValue( const Sequence< sal_Int8 >& value )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ sal_uInt32 size = value.getLength();
+ if ( m_key.setValue(OUString(), RG_VALUETYPE_BINARY,
+ (RegValue)(value.getConstArray()), size) )
+ {
+ throw InvalidValueException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidValueException") ),
+ (OWeakObject *)this );
+ }
+ }
+}
+
+//*************************************************************************
+Reference< XRegistryKey > SAL_CALL RegistryKeyImpl::openKey( const OUString& aKeyName )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ RegistryKey newKey;
+
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegError _ret = m_key.openKey(aKeyName, newKey);
+ if ( _ret )
+ {
+ if ( _ret == REG_INVALID_KEY )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ }
+
+ return Reference<XRegistryKey>();
+ } else
+ {
+ return ((XRegistryKey*)new RegistryKeyImpl(newKey, m_pRegistry));
+ }
+ }
+}
+
+//*************************************************************************
+Reference< XRegistryKey > SAL_CALL RegistryKeyImpl::createKey( const OUString& aKeyName )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ RegistryKey newKey;
+
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegError _ret = m_key.createKey(aKeyName, newKey);
+ if ( _ret )
+ {
+ if (_ret == REG_INVALID_KEY)
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ }
+
+ return Reference<XRegistryKey>();
+ } else
+ {
+ return ((XRegistryKey*)new RegistryKeyImpl(newKey, m_pRegistry));
+ }
+ }
+}
+
+//*************************************************************************
+void SAL_CALL RegistryKeyImpl::closeKey( )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( m_key.isValid() )
+ {
+ if ( !m_key.closeKey() )
+ return;
+ }
+
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+}
+
+//*************************************************************************
+void SAL_CALL RegistryKeyImpl::deleteKey( const OUString& rKeyName )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( m_key.isValid() )
+ {
+ if ( !m_key.deleteKey(rKeyName) )
+ return;
+ }
+
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+}
+
+//*************************************************************************
+Sequence< Reference< XRegistryKey > > SAL_CALL RegistryKeyImpl::openKeys( )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegistryKeyArray subKeys;
+ RegError _ret = REG_NO_ERROR;
+ if ( (_ret = m_key.openSubKeys(OUString(), subKeys)) )
+ {
+ if ( _ret == REG_INVALID_KEY )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ }
+
+ return Sequence< Reference<XRegistryKey> >();
+ } else
+ {
+ sal_uInt32 length = subKeys.getLength();
+ Sequence< Reference<XRegistryKey> > seqKeys(length);
+
+ for (sal_uInt32 i=0; i < length; i++)
+ {
+ seqKeys.getArray()[i] =
+ (XRegistryKey*) new RegistryKeyImpl(subKeys.getElement(i), m_pRegistry);
+ }
+ return seqKeys;
+ }
+ }
+}
+
+//*************************************************************************
+Sequence< OUString > SAL_CALL RegistryKeyImpl::getKeyNames( )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegistryKeyNames subKeys;
+ RegError _ret = REG_NO_ERROR;
+ if ( (_ret = m_key.getKeyNames(OUString(), subKeys)) )
+ {
+ if ( _ret == REG_INVALID_KEY )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ }
+
+ return Sequence<OUString>();
+ } else
+ {
+ sal_uInt32 length = subKeys.getLength();
+ Sequence<OUString> seqKeys(length);
+
+ for (sal_uInt32 i=0; i < length; i++)
+ {
+ seqKeys.getArray()[i] = subKeys.getElement(i);
+ }
+ return seqKeys;
+ }
+ }
+}
+
+//*************************************************************************
+sal_Bool SAL_CALL RegistryKeyImpl::createLink( const OUString& aLinkName, const OUString& aLinkTarget )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegError ret = m_key.createLink(aLinkName, aLinkTarget);
+ if ( ret )
+ {
+ if ( ret == REG_DETECT_RECURSION ||
+ ret == REG_INVALID_KEY )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ return sal_False;
+ }
+ }
+ }
+ return sal_True;
+}
+
+//*************************************************************************
+void SAL_CALL RegistryKeyImpl::deleteLink( const OUString& rLinkName )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ if ( m_key.deleteLink(rLinkName) )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ }
+ }
+}
+
+//*************************************************************************
+OUString SAL_CALL RegistryKeyImpl::getLinkTarget( const OUString& rLinkName )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ OUString linkTarget;
+
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegError ret = m_key.getLinkTarget(rLinkName, linkTarget);
+ if ( ret )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ }
+ }
+
+ return linkTarget;
+}
+
+//*************************************************************************
+OUString SAL_CALL RegistryKeyImpl::getResolvedName( const OUString& aKeyName )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ OUString resolvedName;
+
+ Guard< Mutex > aGuard( m_pRegistry->m_mutex );
+ if ( !m_key.isValid() )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ } else
+ {
+ RegError ret = m_key.getResolvedKeyName(
+ aKeyName, sal_True, resolvedName);
+ if ( ret )
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ }
+ }
+
+ return resolvedName;
+}
+
+//*************************************************************************
+SimpleRegistryImpl::SimpleRegistryImpl( const Registry& rRegistry )
+ : m_registry(rRegistry)
+{
+ g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
+}
+
+//*************************************************************************
+SimpleRegistryImpl::~SimpleRegistryImpl()
+{
+ g_moduleCount.modCnt.release( &g_moduleCount.modCnt );
+}
+
+//*************************************************************************
+OUString SAL_CALL SimpleRegistryImpl::getImplementationName( )
+ throw(RuntimeException)
+{
+ return stoc_bootstrap::simreg_getImplementationName();
+}
+
+//*************************************************************************
+sal_Bool SAL_CALL SimpleRegistryImpl::supportsService( const OUString& ServiceName )
+ throw(RuntimeException)
+{
+ Guard< Mutex > aGuard( m_mutex );
+ Sequence< OUString > aSNL = getSupportedServiceNames();
+ const OUString * pArray = aSNL.getArray();
+ for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
+ if( pArray[i] == ServiceName )
+ return sal_True;
+ return sal_False;
+}
+
+//*************************************************************************
+Sequence<OUString> SAL_CALL SimpleRegistryImpl::getSupportedServiceNames( )
+ throw(RuntimeException)
+{
+ return stoc_bootstrap::simreg_getSupportedServiceNames();
+}
+
+//*************************************************************************
+OUString SAL_CALL SimpleRegistryImpl::getURL() throw(RuntimeException)
+{
+ Guard< Mutex > aGuard( m_mutex );
+ return m_url;
+}
+
+//*************************************************************************
+void SAL_CALL SimpleRegistryImpl::open( const OUString& rURL, sal_Bool bReadOnly, sal_Bool bCreate )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_mutex );
+ if ( m_registry.isValid() )
+ {
+ m_registry.close();
+ }
+
+ RegAccessMode accessMode = REG_READWRITE;
+
+ if ( bReadOnly )
+ accessMode = REG_READONLY;
+
+ if ( !m_registry.open(rURL, accessMode) )
+ {
+ m_url = rURL;
+ return;
+ }
+
+ if ( bCreate )
+ {
+ if ( !m_registry.create(rURL) )
+ {
+ m_url = rURL;
+ return;
+ }
+ }
+
+ m_url = OUString();
+
+ OUStringBuffer reason( 128 );
+ reason.appendAscii( RTL_CONSTASCII_STRINGPARAM("Couldn't ") );
+ if( bCreate )
+ {
+ reason.appendAscii( RTL_CONSTASCII_STRINGPARAM("create") );
+ }
+ else
+ {
+ reason.appendAscii( RTL_CONSTASCII_STRINGPARAM("open") );
+ }
+ reason.appendAscii( RTL_CONSTASCII_STRINGPARAM(" registry ") );
+ reason.append( rURL );
+ if( bReadOnly )
+ {
+ reason.appendAscii( RTL_CONSTASCII_STRINGPARAM(" for reading") );
+ }
+ else
+ {
+ reason.appendAscii( RTL_CONSTASCII_STRINGPARAM(" for writing" ) );
+ }
+ throw InvalidRegistryException( reason.makeStringAndClear() , Reference< XInterface >() );
+}
+
+//*************************************************************************
+sal_Bool SAL_CALL SimpleRegistryImpl::isValid( ) throw(RuntimeException)
+{
+ Guard< Mutex > aGuard( m_mutex );
+ return m_registry.isValid();
+}
+
+//*************************************************************************
+void SAL_CALL SimpleRegistryImpl::close( )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_mutex );
+ if ( m_registry.isValid() )
+ {
+ if ( !m_registry.close() )
+ {
+ m_url = OUString();
+ return;
+ }
+ }
+
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+}
+
+//*************************************************************************
+void SAL_CALL SimpleRegistryImpl::destroy( )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_mutex );
+ if ( m_registry.isValid() )
+ {
+ if ( !m_registry.destroy(OUString()) )
+ {
+ m_url = OUString();
+ return;
+ }
+ }
+
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+}
+
+//*************************************************************************
+Reference< XRegistryKey > SAL_CALL SimpleRegistryImpl::getRootKey( )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_mutex );
+ if ( m_registry.isValid() )
+ return ((XRegistryKey*)new RegistryKeyImpl(OUString( RTL_CONSTASCII_USTRINGPARAM("/") ), this));
+ else
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ }
+}
+
+//*************************************************************************
+sal_Bool SAL_CALL SimpleRegistryImpl::isReadOnly( )
+ throw(InvalidRegistryException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_mutex );
+ if ( m_registry.isValid() )
+ return m_registry.isReadOnly();
+ else
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ }
+}
+
+//*************************************************************************
+void SAL_CALL SimpleRegistryImpl::mergeKey( const OUString& aKeyName, const OUString& aUrl )
+ throw(InvalidRegistryException, MergeConflictException, RuntimeException)
+{
+ Guard< Mutex > aGuard( m_mutex );
+ if ( m_registry.isValid() )
+ {
+ RegistryKey rootKey;
+ if ( !m_registry.openRootKey(rootKey) )
+ {
+ RegError ret = m_registry.mergeKey(rootKey, aKeyName, aUrl, sal_False, sal_False);
+ if (ret)
+ {
+ if ( ret == REG_MERGE_CONFLICT )
+ return;
+ if ( ret == REG_MERGE_ERROR )
+ {
+ throw MergeConflictException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("MergeConflictException") ),
+ (OWeakObject *)this );
+ }
+ else
+ {
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+ }
+ }
+
+ return;
+ }
+ }
+
+ throw InvalidRegistryException(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("InvalidRegistryException") ),
+ (OWeakObject *)this );
+}
+}
+
+namespace stoc_bootstrap
+{
+//*************************************************************************
+Reference<XInterface> SAL_CALL SimpleRegistry_CreateInstance( const Reference<XComponentContext>& )
+{
+ Reference<XInterface> xRet;
+
+ Registry reg;
+
+ XSimpleRegistry *pRegistry = (XSimpleRegistry*) new stoc_simreg::SimpleRegistryImpl(reg);
+
+ if (pRegistry)
+ {
+ xRet = Reference<XInterface>::query(pRegistry);
+ }
+
+ return xRet;
+}
+}
+