summaryrefslogtreecommitdiff
path: root/configmgr/source/registry/cfgregistrykey.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/source/registry/cfgregistrykey.cxx')
-rw-r--r--configmgr/source/registry/cfgregistrykey.cxx1482
1 files changed, 0 insertions, 1482 deletions
diff --git a/configmgr/source/registry/cfgregistrykey.cxx b/configmgr/source/registry/cfgregistrykey.cxx
deleted file mode 100644
index 3c5242a960c6..000000000000
--- a/configmgr/source/registry/cfgregistrykey.cxx
+++ /dev/null
@@ -1,1482 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: cfgregistrykey.cxx,v $
- * $Revision: 1.18 $
- *
- * 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_configmgr.hxx"
-#include "cfgregistrykey.hxx"
-#include "datalock.hxx"
-#include "typeconverter.hxx"
-#include <osl/diagnose.h>
-#include <cppuhelper/extract.hxx>
-#include <com/sun/star/container/XNameContainer.hpp>
-#include <com/sun/star/container/XNamed.hpp>
-#include <com/sun/star/container/XChild.hpp>
-#include <com/sun/star/container/XHierarchicalName.hpp>
-#include <com/sun/star/lang/XSingleServiceFactory.hpp>
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/beans/Property.hpp>
-#include <com/sun/star/beans/PropertyAttribute.hpp>
-#include <com/sun/star/beans/XProperty.hpp>
-#include <com/sun/star/util/XStringEscape.hpp>
-#include <com/sun/star/uno/Sequence.hxx>
-#include <typelib/typedescription.hxx>
-
-#include <limits>
-
-#define THISREF() static_cast< ::cppu::OWeakObject* >(this)
-#define UNISTRING(c) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(c) )
-
-//..........................................................................
-namespace configmgr
-{
-//..........................................................................
-
-//--------------------------------------------------------------------------
-namespace {
- inline
- com::sun::star::uno::Type getBinaryDataType()
- {
- com::sun::star::uno::Sequence<sal_Int8> const * const p= 0;
- return ::getCppuType(p);
- }
- inline
- bool isAscii(sal_Unicode ch)
- {
- return 0 < ch && ch < 128;
- }
- inline
- bool isAscii(sal_Unicode const * ps, sal_Int32 nLen )
- {
- for (int i= 0; i< nLen; ++i)
- if ( !isAscii( ps[i] ) )
- return false;
- return true;
- }
- inline
- bool isAscii(rtl::OUString const& str)
- {
- return isAscii(str.getStr(),str.getLength());
- }
- inline
- bool isAscii(com::sun::star::uno::Sequence< rtl::OUString > const& strList)
- {
- for (int i= 0; i< strList.getLength(); ++i)
- if ( !isAscii( strList[i] ) )
- return false;
- return true;
- }
-}
-// temporary helper
-inline static void checkNullable() {}
-
-//==========================================================================
-//= OConfigurationRegistryKey
-//==========================================================================
-
-static
-rtl::OUString getNodeName(const com::sun::star::uno::Reference< com::sun::star::container::XNameAccess >& _xNode)
-{
- com::sun::star::uno::Reference< com::sun::star::container::XNamed > xName( _xNode, com::sun::star::uno::UNO_QUERY );
- if (xName.is())
- return xName->getName();
-
- OSL_ENSURE( !_xNode.is(), "Cannot get name of node");
- return rtl::OUString();
-}
-//--------------------------------------------------------------------------
-
-static bool splitPath(const rtl::OUString& _sPath, rtl::OUString& _rsParentPath, rtl::OUString& _rsLocalName);
-//--------------------------------------------------------------------------
-
-OConfigurationRegistryKey::OConfigurationRegistryKey
- (const com::sun::star::uno::Reference< com::sun::star::container::XNameAccess >& _rxRootNode
- ,sal_Bool _bWriteable
- ,SubtreeRoot
- )
- :m_bReadOnly(!_bWriteable)
- ,m_xNode(_rxRootNode)
- ,m_xParentNode()
- ,m_sLocalName() // this will be treated as root - maybe use hierarchical name (ß)
-{
- OSL_ENSURE(m_xNode.is(), "OConfigurationRegistryKey::OConfigurationRegistryKey : invalid config node param !");
-}
-
-//--------------------------------------------------------------------------
-OConfigurationRegistryKey::OConfigurationRegistryKey
- (const com::sun::star::uno::Reference< com::sun::star::container::XNameAccess >& _rxNode
- ,sal_Bool _bWriteable
- )
- :m_bReadOnly(!_bWriteable)
- ,m_xNode(_rxNode)
- ,m_xParentNode()
- ,m_sLocalName( getNodeName(_rxNode) ) // this will not be treated as root
-{
- OSL_ENSURE(m_xNode.is(), "OConfigurationRegistryKey::OConfigurationRegistryKey : invalid config node param !");
-}
-
-//--------------------------------------------------------------------------
-OConfigurationRegistryKey::OConfigurationRegistryKey(
- com::sun::star::uno::Any _rCurrentValue,
- const com::sun::star::uno::Reference< com::sun::star::container::XNameAccess >& _rxParentNode,
- const ::rtl::OUString& _rLocalName,
- sal_Bool _bWriteable)
- :m_bReadOnly(!_bWriteable)
- ,m_xNode()
- ,m_xParentNode(_rxParentNode)
- ,m_sLocalName(_rLocalName)
-{
- OSL_ENSURE(m_xParentNode.is(), "OConfigurationRegistryKey::OConfigurationRegistryKey : invalid parent node param !");
- OSL_ENSURE(m_sLocalName.getLength(), "OConfigurationRegistryKey::OConfigurationRegistryKey : invalid relative name !");
- OSL_ENSURE(m_xParentNode->hasByName( m_sLocalName ), "OConfigurationRegistryKey::OConfigurationRegistryKey : key not found in parent node !" ); //
- OSL_ENSURE(m_xParentNode->getByName( m_sLocalName ) == _rCurrentValue, "OConfigurationRegistryKey::OConfigurationRegistryKey : wrong value parameter !" ); //
-
- _rCurrentValue >>= m_xNode; // we don't care if that fails
-}
-//--------------------------------------------------------------------------
-
-com::sun::star::uno::Reference<com::sun::star::beans::XPropertySetInfo> OConfigurationRegistryKey::implGetParentPropertyInfo() throw(com::sun::star::uno::RuntimeException)
-{
- if (!m_xParentNode.is())
- {
- com::sun::star::uno::Reference< com::sun::star::container::XChild > xChild(m_xNode, com::sun::star::uno::UNO_QUERY);
- if (xChild.is())
- m_xParentNode = m_xParentNode.query(xChild->getParent());
- }
-
- com::sun::star::uno::Reference< com::sun::star::beans::XPropertySetInfo > xParentInfo; // the result
-
- com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xParentProperties(m_xParentNode, com::sun::star::uno::UNO_QUERY);
- if (xParentProperties.is())
- {
- xParentInfo = xParentProperties->getPropertySetInfo();
- if (xParentInfo.is() && !xParentInfo->hasPropertyByName(m_sLocalName))
- {
- OSL_ENSURE(false, "OConfigurationRegistryKey: This key is unknown in the parent node's PropertySetInfo !");
- xParentInfo.clear(); // this key is unknow, so don't return the info
- }
- }
-
- return xParentInfo;
-}
-//--------------------------------------------------------------------------
-
-static
-sal_Bool isNodeReadOnly(com::sun::star::uno::Reference< com::sun::star::uno::XInterface > const& _xNode) throw(com::sun::star::uno::RuntimeException)
-{
- OSL_ASSERT( _xNode.is() );
-
- com::sun::star::uno::Reference< com::sun::star::beans::XProperty > xProperty(_xNode, com::sun::star::uno::UNO_QUERY);
- if (xProperty.is())
- {
- com::sun::star::beans::Property aProperty = xProperty->getAsProperty();
-
- return (aProperty.Attributes & com::sun::star::beans::PropertyAttribute::READONLY) != 0;
- }
-
- com::sun::star::uno::Reference< com::sun::star::lang::XServiceInfo > xServiceInfo( _xNode, com::sun::star::uno::UNO_QUERY );
- if (xServiceInfo.is())
- {
- // does it announce update capability ?
- if (xServiceInfo->supportsService(UNISTRING("com.sun.star.configuration.ConfigurationUpdateAccess")))
- return false;
-
- // else does it announce the expected service at all ?
- else if (xServiceInfo->supportsService(UNISTRING("com.sun.star.configuration.ConfigurationAccess")))
- return true;
- }
-
- // no XProperty, no (meaningful) ServiceInfo - what can we do
- return false;
-}
-
-//--------------------------------------------------------------------------
-
-sal_Bool OConfigurationRegistryKey::implIsReadOnly() throw (com::sun::star::uno::RuntimeException)
-{
- sal_Bool bResult = m_bReadOnly;;
-
- // do checks only if this was requested to be writable
- if (m_bReadOnly)
- {
- // nothing to check
- }
-
- // try to ask the node itself
- else if (m_xNode.is())
- {
- bResult = m_bReadOnly = isNodeReadOnly( m_xNode );
- }
-
- // else use the parent
- else if (m_xParentNode.is())
- {
- com::sun::star::uno::Reference< com::sun::star::beans::XPropertySetInfo > xParentInfo = implGetParentPropertyInfo();
-
- if (xParentInfo.is())
- {
- com::sun::star::beans::Property aProperty = xParentInfo->getPropertyByName(m_sLocalName);
-
- bResult = m_bReadOnly = ((aProperty.Attributes & com::sun::star::beans::PropertyAttribute::READONLY) != 0);
- }
- else
- {
- // no property info about this key ? - check if the parent itself is writable
-
- // NOTE: do not set m_bReadOnly here, as we haven't really found out about this object
- bResult = isNodeReadOnly( m_xParentNode );
- }
- }
- else
- {
- // no data at all
- OSL_ENSURE(false, "implIsReadOnly called for invalid object");
- bResult = true; // no object is certainly not writable ;-)
- }
-
- return bResult;
-}
-//--------------------------------------------------------------------------
-
-sal_Bool OConfigurationRegistryKey::implEnsureNode() throw (com::sun::star::registry::InvalidRegistryException,com::sun::star::uno::RuntimeException)
-{
- if (!m_xNode.is())
- {
- OSL_ENSURE( m_xParentNode.is(), "implEnsureNode called for invalid registry key");
- if (m_xParentNode.is())
- {
- try
- {
- com::sun::star::uno::Any aNode = m_xParentNode->getByName( m_sLocalName );
-
- if ( !(aNode >>= m_xNode) )
- OSL_ENSURE( ! (aNode.hasValue() && aNode.getValueTypeClass() == com::sun::star::uno::TypeClass_INTERFACE),
- "OConfigurationRegistryKey: Node object does not implement expected interface");
- }
- catch (com::sun::star::container::NoSuchElementException& e)
- {
- m_xParentNode.clear();
-
- rtl::OUString sMessage = UNISTRING("Invalid OConfigurationRegistryKey. The node \"");
- sMessage += m_sLocalName;
- sMessage += UNISTRING("\" was not found in the parent. Parent error message: \n");
- sMessage += e.Message;
-
- throw com::sun::star::registry::InvalidRegistryException(sMessage, THISREF());
- }
- }
- }
- return m_xNode.is();
-}
-//--------------------------------------------------------------------------
-
-com::sun::star::uno::Type OConfigurationRegistryKey::implGetUnoType() throw (com::sun::star::uno::RuntimeException)
-{
- com::sun::star::uno::Type aType;
- if (m_xNode.is())
- {
- aType = getCppuType(&m_xNode); // Its just an interface type
- }
- else if (m_xParentNode.is())
- {
-
- com::sun::star::uno::Reference< com::sun::star::beans::XPropertySetInfo > xParentInfo = implGetParentPropertyInfo();
- if (xParentInfo.is())
- {
- aType = xParentInfo->getPropertyByName( m_sLocalName ).Type;
- }
- else
- {
- aType = m_xParentNode->getElementType();
- }
- }
- else
- {
- OSL_ASSERT( aType.getTypeClass() == com::sun::star::uno::TypeClass_VOID );
- OSL_ENSURE( false, "implGetUnoType called for invalid registry key");
- }
- return aType;
-}
-//--------------------------------------------------------------------------
-
-sal_Bool OConfigurationRegistryKey::implEnsureValue() throw (com::sun::star::uno::RuntimeException)
-{
- if (m_xNode.is())
- return false;
-
- OSL_ENSURE( m_xParentNode.is(), "implEnsureValue called for invalid registry key");
- if (!m_xParentNode.is())
- return false;
-
- switch (implGetUnoType().getTypeClass())
- {
- case com::sun::star::uno::TypeClass_INTERFACE:
- return false;
-
- case com::sun::star::uno::TypeClass_BYTE:
- case com::sun::star::uno::TypeClass_UNSIGNED_SHORT:
- case com::sun::star::uno::TypeClass_UNSIGNED_LONG:
- case com::sun::star::uno::TypeClass_UNSIGNED_HYPER:
- case com::sun::star::uno::TypeClass_FLOAT:
- OSL_ENSURE(false, "Unexpected (UNSIGNED INTERGRAL or FLOAT) type found for configuration node");
-
- case com::sun::star::uno::TypeClass_STRING:
- case com::sun::star::uno::TypeClass_BOOLEAN:
- case com::sun::star::uno::TypeClass_SHORT:
- case com::sun::star::uno::TypeClass_LONG:
- case com::sun::star::uno::TypeClass_HYPER:
- case com::sun::star::uno::TypeClass_DOUBLE:
- case com::sun::star::uno::TypeClass_SEQUENCE:
- return true;
-
- case com::sun::star::uno::TypeClass_ANY:
- return true;
-
- case com::sun::star::uno::TypeClass_VOID:
- OSL_ENSURE(false, "OConfigurationRegistryKey: Key does not exist or has VOID type");
- return false;
-
- default:
- OSL_ENSURE(false, "OConfigurationRegistryKey: Key has unexpected UNO type (class)");
- return false;
- }
-}
-//--------------------------------------------------------------------------
-
-sal_Bool OConfigurationRegistryKey::implIsValid() throw ()
-{
- return m_xNode.is() || (m_xParentNode.is() && m_xParentNode->hasByName( m_sLocalName ) );
-}
-//--------------------------------------------------------------------------
-
-void OConfigurationRegistryKey::checkValid(KEY_ACCESS_TYPE _eIntentedAccess) throw (com::sun::star::registry::InvalidRegistryException,com::sun::star::uno::RuntimeException)
-{
- if (!implIsValid())
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("The registry is not bound to a configuration node anymore."), THISREF());
- // "anymore", because at the moment the ctor was called it probably was bound ....
-
- switch (_eIntentedAccess)
- {
- case KAT_VALUE_WRITE:
- if (implIsReadOnly())
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("This configuration node is not writeable."), THISREF());
-
- // !!! NO !!! BREAK !!!
- case KAT_VALUE:
- if (m_xNode.is())
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("This configuration node is not a value, but an internal container."), THISREF());
-
- if (!m_xParentNode.is())
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("This configuration node is invalid. It has no parent."), THISREF());
-
- if (!implEnsureValue())
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("This configuration does not have a legal value type."), THISREF());
- break;
-
- case KAT_CHILD:
- if (!implEnsureNode())
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("This configuration node does not have children, it is a value node."), THISREF());
- break;
-
- case KAT_META:
- break;
- }
-}
-
-//--------------------------------------------------------------------------
-com::sun::star::uno::Any OConfigurationRegistryKey::implCreateDefaultElement(com::sun::star::uno::Type const& _aValueType) throw (com::sun::star::uno::RuntimeException)
-{
- com::sun::star::uno::Any aReturn;
-
- switch (_aValueType.getTypeClass())
- {
- case com::sun::star::uno::TypeClass_STRING:
- aReturn <<= rtl::OUString();
- break;
-
- // we don't distinguish between the different integer types or boolean
- // (the RegistryKeyType is not granular enough),
- // but we can't handle them all the same way here
- case com::sun::star::uno::TypeClass_BYTE:
- case com::sun::star::uno::TypeClass_UNSIGNED_SHORT:
- case com::sun::star::uno::TypeClass_SHORT:
- aReturn <<= (sal_Int16)0;
- break;
-
- case com::sun::star::uno::TypeClass_UNSIGNED_LONG:
- case com::sun::star::uno::TypeClass_LONG:
- aReturn <<= (sal_Int32)0;
- break;
-
- case com::sun::star::uno::TypeClass_BOOLEAN:
- aReturn <<= sal_Bool(false);
- break;
-
- // we cannot really handle 64-bit ints in the registry (but here we can)
- case com::sun::star::uno::TypeClass_UNSIGNED_HYPER:
- case com::sun::star::uno::TypeClass_HYPER:
- OSL_ENSURE(false, "Warning: cannot handle 64-bit values correctly in registry");
- aReturn <<= (sal_Int64)0;
- break;
-
- // we cannot really handle doubles in the registry (but here we can)
- case com::sun::star::uno::TypeClass_FLOAT:
- case com::sun::star::uno::TypeClass_DOUBLE:
- OSL_ENSURE(false, "Warning: cannot handle DOUBLE correctly in registry");
- aReturn <<= (double)0;
- break;
-
- // we really want to leave an Any as NULL - hopefully this is acceptable to the set
- case com::sun::star::uno::TypeClass_ANY:
- break;
-
- case com::sun::star::uno::TypeClass_SEQUENCE:
- if (_aValueType == getBinaryDataType())
- aReturn <<= com::sun::star::uno::Sequence< sal_Int8 >();
-
- else
- {
- com::sun::star::uno::Type aElementType = getSequenceElementType(_aValueType);
- switch (aElementType.getTypeClass())
- {
- case com::sun::star::uno::TypeClass_STRING:
- aReturn <<= com::sun::star::uno::Sequence< rtl::OUString >();
- break;
-
- case com::sun::star::uno::TypeClass_BYTE:
- case com::sun::star::uno::TypeClass_UNSIGNED_SHORT:
- case com::sun::star::uno::TypeClass_SHORT:
- aReturn <<= com::sun::star::uno::Sequence< sal_Int16 >();
- break;
-
- case com::sun::star::uno::TypeClass_UNSIGNED_LONG:
- case com::sun::star::uno::TypeClass_LONG:
- aReturn <<= com::sun::star::uno::Sequence< sal_Int32 >();
- break;
-
- case com::sun::star::uno::TypeClass_BOOLEAN:
- aReturn <<= com::sun::star::uno::Sequence< sal_Bool >();
- break;
-
- case com::sun::star::uno::TypeClass_UNSIGNED_HYPER:
- case com::sun::star::uno::TypeClass_HYPER:
- aReturn <<= com::sun::star::uno::Sequence< sal_Int64 >();
- break;
-
- case com::sun::star::uno::TypeClass_FLOAT:
- case com::sun::star::uno::TypeClass_DOUBLE:
- aReturn <<= com::sun::star::uno::Sequence< double >();
- break;
-
- case com::sun::star::uno::TypeClass_SEQUENCE:
- OSL_ENSURE(false, "Warning: cannot handle Sequence< BINARY > correctly in registry");
- if (aElementType == getBinaryDataType())
- {
- OSL_ENSURE(false, "Warning: cannot handle Sequence< BINARY > correctly in registry");
- aReturn <<= com::sun::star::uno::Sequence< com::sun::star::uno::Sequence< sal_Int8 > >();
- break;
- }
-
- // else FALL THRU to default
- default:
- OSL_ENSURE(false, "Unexpected sequence element type for configuration node - returning NULL");
- // throw here ??
- break;
- }
- }
- break;
-
- case com::sun::star::uno::TypeClass_INTERFACE:
- OSL_ENSURE(false, "Invalid call to OConfigurationRegistryKey::implCreateDefaultElement. Inner nodes must be created by a factory");
- break;
-
- default:
- OSL_ENSURE(false, "Unexpected value type for configuration node - returning NULL");
- // throw here ??
- break;
- }
-
- OSL_ENSURE( aReturn.getValueType() == _aValueType || (_aValueType.getTypeClass() == com::sun::star::uno::TypeClass_ANY && !aReturn.hasValue()),
- "Warning: Unexpected data type found in Registry - returning similar value or NULL");
- return aReturn;
-}
-
-//--------------------------------------------------------------------------
-com::sun::star::uno::Any OConfigurationRegistryKey::implGetDescendant(const rtl::OUString& _rDescendantName) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- com::sun::star::uno::Any aElementReturn;
-
- try
- {
- if (!m_xNode.is())
- {
- // implEnsureNode should have been called before this method
- OSL_ENSURE(sal_False, "OConfigurationRegistryKey::getDescendant : invalid call !");
-
- // this method should not be called if the object does not represent a container node ...
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("invalid object."), THISREF());
- }
-
- try
- {
- // look for a local member first
- aElementReturn = m_xNode->getByName(_rDescendantName);
- }
- catch(com::sun::star::container::NoSuchElementException&)
- {
- // is it a (possibly) hierarchical name ?
- if ( _rDescendantName.indexOf('/') <0 ) throw;
-
- // Yes, so try deep access
- com::sun::star::uno::Reference< com::sun::star::container::XHierarchicalNameAccess > xDeepAccess( m_xNode, com::sun::star::uno::UNO_QUERY );
- if (!xDeepAccess.is())
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("Nested element access not supported by this node."), THISREF());
-
- aElementReturn = xDeepAccess->getByHierarchicalName(_rDescendantName);
- }
- }
- catch(com::sun::star::container::NoSuchElementException&)
- { // not allowed to leave the method, wrap it
- rtl::OUString sMessage(UNISTRING("There is no element named "));
- sMessage += _rDescendantName;
- sMessage += UNISTRING(".");
- throw com::sun::star::registry::InvalidRegistryException(sMessage, THISREF());
- }
- catch(com::sun::star::lang::WrappedTargetException& wte)
- { // allowed to be thrown by XNameAccess::getByName, but not allowed to leave this method
- rtl::OUString sMessage(UNISTRING("The configuration node could not provide an element for "));
- sMessage += _rDescendantName;
- sMessage += UNISTRING(". Original Error: ");
- sMessage += wte.Message;
- throw com::sun::star::registry::InvalidRegistryException(sMessage, THISREF());
- }
-
- return aElementReturn;
-}
-
-//--------------------------------------------------------------------------
-void OConfigurationRegistryKey::implSetValue(const com::sun::star::uno::Any& _rValue) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- checkValid(KAT_VALUE_WRITE);
-
- // one possible interface
- com::sun::star::uno::Reference< com::sun::star::container::XNameReplace > xParentValueAccess(m_xParentNode, com::sun::star::uno::UNO_QUERY);
- if (xParentValueAccess.is())
- {
- try
- {
- xParentValueAccess->replaceByName(m_sLocalName, _rValue);
- }
- catch(com::sun::star::lang::IllegalArgumentException& iae)
- {
- rtl::OUString sMessage = UNISTRING("Unable to replace the old value. The configuration node threw an ");
- sMessage += UNISTRING("IllegalArgumentException: ");
- sMessage += iae.Message;
- throw com::sun::star::registry::InvalidRegistryException(sMessage, THISREF());
- }
- catch(com::sun::star::container::NoSuchElementException& nse)
- {
- OSL_ENSURE(false, "OConfigurationRegistryKey::writeValueNode : a NoSuchElementException should be impossible !");
-
- rtl::OUString sMessage = UNISTRING("Unable to replace the old value. The configuration node threw an ");
- sMessage += UNISTRING("NoSuchElementException: ");
- sMessage += nse.Message;
- throw com::sun::star::registry::InvalidRegistryException(sMessage, THISREF());
- }
- catch(com::sun::star::lang::WrappedTargetException& wte)
- {
- rtl::OUString sMessage = UNISTRING("Unable to replace the old value. The configuration node threw an ");
- sMessage += UNISTRING("WrappedTargetException: ");
- sMessage += wte.Message;
- throw com::sun::star::registry::InvalidRegistryException(sMessage, THISREF());
- }
- return;
- }
-
- // not found - try other interface
- com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xParentPropertySet(m_xParentNode, com::sun::star::uno::UNO_QUERY);
- if (xParentPropertySet.is())
- {
- try
- {
- xParentPropertySet->setPropertyValue(m_sLocalName, _rValue);
- }
- catch(com::sun::star::lang::IllegalArgumentException& iae)
- {
- rtl::OUString sMessage = UNISTRING("Unable to set a new value. The configuration node threw an ");
- sMessage += UNISTRING("IllegalArgumentException: ");
- sMessage += iae.Message;
- throw com::sun::star::registry::InvalidRegistryException(sMessage, THISREF());
- }
- catch(com::sun::star::beans::UnknownPropertyException& upe)
- {
- OSL_ENSURE(false, "OConfigurationRegistryKey::writeValueNode : a UnknownPropertyException should be impossible !");
-
- rtl::OUString sMessage = UNISTRING("Unable to set a new value. The configuration node threw an ");
- sMessage += UNISTRING("UnknownPropertyException: ");
- sMessage += upe.Message;
- throw com::sun::star::registry::InvalidRegistryException(sMessage, THISREF());
- }
- catch(com::sun::star::beans::PropertyVetoException& pve)
- {
- rtl::OUString sMessage = UNISTRING("Unable to set a new value. The configuration node threw an ");
- sMessage += UNISTRING("PropertyVetoException: ");
- sMessage += pve.Message;
- throw com::sun::star::registry::InvalidRegistryException(sMessage, THISREF());
- }
- catch(com::sun::star::lang::WrappedTargetException& wte)
- {
- rtl::OUString sMessage = UNISTRING("Unable to set a new value. The configuration node threw an ");
- sMessage += UNISTRING("WrappedTargetException: ");
- sMessage += wte.Message;
- throw com::sun::star::registry::InvalidRegistryException(sMessage, THISREF());
- }
- return;
- }
-
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("No interface found on parent node for writing to configuration value node."), THISREF());
-}
-
-//--------------------------------------------------------------------------
-::rtl::OUString SAL_CALL OConfigurationRegistryKey::getKeyName() throw(com::sun::star::uno::RuntimeException)
-{
- return m_sLocalName;
-}
-
-//--------------------------------------------------------------------------
-sal_Bool SAL_CALL OConfigurationRegistryKey::isReadOnly() throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- OSL_ASSERT(UnoApiLock::isHeld());
- checkValid(KAT_META);
- return m_bReadOnly;
-}
-
-//--------------------------------------------------------------------------
-sal_Bool SAL_CALL OConfigurationRegistryKey::isValid() throw(com::sun::star::uno::RuntimeException)
-{
- OSL_ASSERT(UnoApiLock::isHeld());
- // TODO : perhaps if the registry we're a part of is closed ....
- return implIsValid();
-}
-
-//--------------------------------------------------------------------------
-com::sun::star::registry::RegistryKeyType SAL_CALL OConfigurationRegistryKey::getKeyType( const ::rtl::OUString& /*_rKeyName*/ ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- OSL_ASSERT(UnoApiLock::isHeld());
-
- // no further checks are made (for performance reasons) ...
- // Maybe we should check only KAT_META for consistency ?
- checkValid(KAT_CHILD);
-
- return com::sun::star::registry::RegistryKeyType_KEY;
-}
-
-//--------------------------------------------------------------------------
-com::sun::star::registry::RegistryValueType SAL_CALL OConfigurationRegistryKey::getValueType() throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- checkValid(KAT_META);
-
- const com::sun::star::uno::Type aUnoType = implGetUnoType();
-
- switch (aUnoType.getTypeClass())
- {
- case com::sun::star::uno::TypeClass_INTERFACE: // this is really a case of 'no value type'
- return com::sun::star::registry::RegistryValueType_NOT_DEFINED;
-
- case com::sun::star::uno::TypeClass_ANY: // this is really a case of 'all value types allowed'
- return com::sun::star::registry::RegistryValueType_NOT_DEFINED;
-
- case com::sun::star::uno::TypeClass_STRING:
- return com::sun::star::registry::RegistryValueType_STRING;
-
- case com::sun::star::uno::TypeClass_BYTE:
- case com::sun::star::uno::TypeClass_UNSIGNED_SHORT:
- case com::sun::star::uno::TypeClass_UNSIGNED_LONG:
- OSL_ENSURE(false, "Unexpected UNSIGNED type found for configuration node");
- // FALL THRU
-
- case com::sun::star::uno::TypeClass_BOOLEAN:
- case com::sun::star::uno::TypeClass_SHORT:
- case com::sun::star::uno::TypeClass_LONG:
- return com::sun::star::registry::RegistryValueType_LONG;
-
- case com::sun::star::uno::TypeClass_FLOAT:
- case com::sun::star::uno::TypeClass_DOUBLE:
- OSL_ENSURE(sal_False, "OConfigurationRegistryKey::getValueType : registry does not support floating point numbers !");
- return com::sun::star::registry::RegistryValueType_LONG;
-
- case com::sun::star::uno::TypeClass_UNSIGNED_HYPER:
- case com::sun::star::uno::TypeClass_HYPER:
- OSL_ENSURE(sal_False, "OConfigurationRegistryKey::getValueType : registry does not support 64-bit integer numbers !");
- return com::sun::star::registry::RegistryValueType_LONG;
-
- case com::sun::star::uno::TypeClass_SEQUENCE:
- if ( aUnoType.equals( getBinaryDataType() ) )
- return com::sun::star::registry::RegistryValueType_BINARY;
-
- else
- {
- com::sun::star::uno::Type aElementType = getSequenceElementType(aUnoType);
-
- switch (aElementType.getTypeClass())
- {
- case com::sun::star::uno::TypeClass_STRING:
- return com::sun::star::registry::RegistryValueType_STRINGLIST;
-
- case com::sun::star::uno::TypeClass_BYTE:
- OSL_ASSERT(false); // this is caught by the 'binary' case
-
- case com::sun::star::uno::TypeClass_UNSIGNED_SHORT:
- case com::sun::star::uno::TypeClass_UNSIGNED_LONG:
- OSL_ENSURE(false, "Unexpected UNSIGNED-List type found for configuration node");
- // FALL THRU
-
- case com::sun::star::uno::TypeClass_BOOLEAN:
- case com::sun::star::uno::TypeClass_SHORT:
- case com::sun::star::uno::TypeClass_LONG:
- return com::sun::star::registry::RegistryValueType_LONGLIST;
-
- case com::sun::star::uno::TypeClass_FLOAT:
- case com::sun::star::uno::TypeClass_DOUBLE:
- OSL_ENSURE(sal_False, "OConfigurationRegistryKey::getValueType : registry does not support floating point number lists !");
- return com::sun::star::registry::RegistryValueType_LONGLIST;
-
- case com::sun::star::uno::TypeClass_UNSIGNED_HYPER:
- case com::sun::star::uno::TypeClass_HYPER:
- OSL_ENSURE(sal_False, "OConfigurationRegistryKey::getValueType : registry does not support 64-bit integer number lists !");
- return com::sun::star::registry::RegistryValueType_LONGLIST;
-
- case com::sun::star::uno::TypeClass_ANY:
- OSL_ENSURE(sal_False, "OConfigurationRegistryKey::getValueType : Unexpected: Any as sequence element type !");
- return com::sun::star::registry::RegistryValueType_NOT_DEFINED;
-
- default:
- if (aElementType.equals(getBinaryDataType()))
- OSL_ENSURE(sal_False,"OConfigurationRegistryKey::getValueType : Registry cannot support LIST of BINARY");
- else
- OSL_ENSURE(sal_False, "OConfigurationRegistryKey::getValueType : unknown sequence element type !");
-
- return com::sun::star::registry::RegistryValueType_NOT_DEFINED;
- }
- }
-
- default:
- OSL_ENSURE(sal_False, "OConfigurationRegistryKey::getValueType : unknown entry type !");
- return com::sun::star::registry::RegistryValueType_NOT_DEFINED;
- }
-}
-
-//--------------------------------------------------------------------------
-
-com::sun::star::uno::Any OConfigurationRegistryKey::implGetValue() throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- checkValid(KAT_VALUE);
-
- return m_xParentNode->getByName( m_sLocalName );
-}
-
-//--------------------------------------------------------------------------
-sal_Int32 SAL_CALL OConfigurationRegistryKey::getLongValue() throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::registry::InvalidValueException, com::sun::star::uno::RuntimeException)
-{
- com::sun::star::uno::Any aValue = implGetValue();
-
- sal_Int32 nLongValue(0);
- switch (aValue.getValueTypeClass())
- {
- // integral types that are small enough are straightforward
- case com::sun::star::uno::TypeClass_BYTE : { sal_Int8 nNativeValue = 0; aValue >>= nNativeValue; nLongValue = nNativeValue; } break;
- case com::sun::star::uno::TypeClass_BOOLEAN : { sal_Bool nNativeValue = false; aValue >>= nNativeValue; nLongValue = nNativeValue; } break;
- case com::sun::star::uno::TypeClass_SHORT : { sal_Int16 nNativeValue; aValue >>= nNativeValue; nLongValue = nNativeValue; } break;
- case com::sun::star::uno::TypeClass_UNSIGNED_SHORT : { sal_uInt16 nNativeValue; aValue >>= nNativeValue; nLongValue = nNativeValue; } break;
- case com::sun::star::uno::TypeClass_LONG : { sal_Int32 nNativeValue; aValue >>= nNativeValue; nLongValue = nNativeValue; } break;
-
- // this is lossless, but not value-preserving - use cast to avoid warnings
- case com::sun::star::uno::TypeClass_UNSIGNED_LONG:
- {
- sal_uInt32 nNativeValue;
- aValue >>= nNativeValue;
- nLongValue = sal_Int32(nNativeValue);
- }
- break;
-
- // the following are larger than Long - check for loss and throw if applicable
- case com::sun::star::uno::TypeClass_HYPER:
- {
- sal_Int64 nNativeValue;
- aValue >>= nNativeValue;
- nLongValue = sal_Int32(nNativeValue);
-
- // check for data loss
- if (sal_Int64(nLongValue) != nNativeValue)
- throw com::sun::star::registry::InvalidValueException(UNISTRING("Unsigned Hyper value too large for long; Value cannot be retrieved using registry."), THISREF());
- }
- break;
-
- case com::sun::star::uno::TypeClass_UNSIGNED_HYPER:
- {
- sal_uInt64 nNativeValue;
- aValue >>= nNativeValue;
- nLongValue = sal_Int32(nNativeValue);
-
- // check for data loss
- if (sal_uInt64(sal_uInt32(nLongValue)) != nNativeValue)
- throw com::sun::star::registry::InvalidValueException(UNISTRING("Unsigned Hyper value too large for long; Value cannot be retrieved using registry."), THISREF());
- }
- break;
-
- // for floating point types we need a limit for loss checking
- case com::sun::star::uno::TypeClass_FLOAT:
- OSL_ENSURE(false, "Unexpected type FLOAT in configuration node");
- {
- // treat as double
- float fNativeValue = 0;
- if (aValue >>= fNativeValue)
- aValue <<= double(fNativeValue);
- }
- // fall thru
-
- case com::sun::star::uno::TypeClass_DOUBLE:
- {
- double fNativeValue = 0;
- aValue >>= fNativeValue;
-
- // find a reasonable allowed imprecision
- const double fEps = (2.*fNativeValue + 5.) * std::numeric_limits<double>::epsilon();
-
- // should be rounding here
- nLongValue = sal_Int32(fNativeValue);
-
- // check for data loss
- bool bRecheck = false;
-
- double diff = fNativeValue-double(nLongValue);
- if ( diff > fEps)
- {
- // substitute for rounding here
- if (diff > .5)
- {
- ++nLongValue;
- diff = fNativeValue-double(nLongValue);
- }
- bRecheck = true;
- }
- else if ( diff < -fEps)
- {
- // substitute for rounding here
- if (diff < -.5)
- {
- --nLongValue;
- diff = fNativeValue-double(nLongValue);
- }
- bRecheck = true;
- }
-
- if (bRecheck)
- {
- if (diff > fEps || diff < -fEps)
- throw com::sun::star::registry::InvalidValueException(UNISTRING("Double value cannot fit in Long; Value cannot be retrieved using registry."), THISREF());
- }
- }
- break;
-
- case com::sun::star::uno::TypeClass_VOID:
- // allow NULL values, if we maybe advertise this node as long
- if (this->getValueType() == com::sun::star::registry::RegistryValueType_LONG)
- break;
- // else FALL THRU to exception
-
- default:
- throw com::sun::star::registry::InvalidValueException(UNISTRING("This node does not contain a long (or a compatible) value."), THISREF());
- }
- return nLongValue;
-}
-
-//--------------------------------------------------------------------------
-void SAL_CALL OConfigurationRegistryKey::setLongValue( sal_Int32 _nValue ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- implSetValue(com::sun::star::uno::makeAny(_nValue));
-}
-
-//--------------------------------------------------------------------------
-com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL OConfigurationRegistryKey::getLongListValue() throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::registry::InvalidValueException, com::sun::star::uno::RuntimeException)
-{
- com::sun::star::uno::Any aValue = implGetValue();
-
- com::sun::star::uno::Sequence< sal_Int32 > aReturn;
- if (!aValue.hasValue())
- checkNullable();// let NULL values pass
-
- else if (!(aValue >>= aReturn))
- {
- // TODO : maybe it's a sequence of sal_Int8 or anything like that which we're able to convert ....
-
- throw com::sun::star::registry::InvalidValueException(UNISTRING("This configuration node does not contain a list of longs !"), THISREF());
- }
-
- return aReturn;
-}
-
-//--------------------------------------------------------------------------
-void SAL_CALL OConfigurationRegistryKey::setLongListValue( const com::sun::star::uno::Sequence< sal_Int32 >& _seqValue ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- implSetValue(com::sun::star::uno::makeAny(_seqValue));
-}
-
-//--------------------------------------------------------------------------
-rtl::OUString SAL_CALL OConfigurationRegistryKey::getAsciiValue() throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::registry::InvalidValueException, com::sun::star::uno::RuntimeException)
-{
- rtl::OUString sReturn = getStringValue();
-
- if (!isAscii(sReturn))
- throw com::sun::star::registry::InvalidValueException(UNISTRING("This configuration node value (a string) is not pure ASCII !"), THISREF());
-
- return sReturn;
-}
-
-//--------------------------------------------------------------------------
-void SAL_CALL OConfigurationRegistryKey::setAsciiValue( const ::rtl::OUString& _rValue ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- OSL_ENSURE( isAscii(_rValue), "The string passesd to OConfigurationRegistryKey::setAsciiValue is not pure ASCII");
-
- setStringValue(_rValue);
-}
-
-//--------------------------------------------------------------------------
-com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL OConfigurationRegistryKey::getAsciiListValue() throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::registry::InvalidValueException, com::sun::star::uno::RuntimeException)
-{
- com::sun::star::uno::Sequence<rtl::OUString> aReturn = getStringListValue();
-
- if (!isAscii(aReturn))
- throw com::sun::star::registry::InvalidValueException(UNISTRING("This configuration node value (a string list) is not pure ASCII !"), THISREF());
-
- return aReturn;
-}
-
-//--------------------------------------------------------------------------
-void SAL_CALL OConfigurationRegistryKey::setAsciiListValue( const com::sun::star::uno::Sequence< ::rtl::OUString >& _seqValue ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- OSL_ENSURE( isAscii(_seqValue), "The string passesd to OConfigurationRegistryKey::setAsciiValue is not pure ASCII");
-
- setStringListValue(_seqValue);
-}
-
-//--------------------------------------------------------------------------
-::rtl::OUString SAL_CALL OConfigurationRegistryKey::getStringValue() throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::registry::InvalidValueException, com::sun::star::uno::RuntimeException)
-{
- com::sun::star::uno::Any aValue = implGetValue();
-
- rtl::OUString sReturn;
- if (!aValue.hasValue())
- checkNullable();// let NULL values pass
-
- else if (!(aValue >>= sReturn))
- throw com::sun::star::registry::InvalidValueException(UNISTRING("This node does not contain a string value."), THISREF());
-
- return sReturn;
-}
-
-//--------------------------------------------------------------------------
-void SAL_CALL OConfigurationRegistryKey::setStringValue( const ::rtl::OUString& _rValue ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- implSetValue(com::sun::star::uno::makeAny(_rValue));
-}
-
-//--------------------------------------------------------------------------
-com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL OConfigurationRegistryKey::getStringListValue() throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::registry::InvalidValueException, com::sun::star::uno::RuntimeException)
-{
- com::sun::star::uno::Any aValue = implGetValue();
-
- com::sun::star::uno::Sequence< rtl::OUString > aReturn;
- if (!aValue.hasValue())
- checkNullable();// let NULL values pass
-
- else if (!(aValue >>= aReturn))
- throw com::sun::star::registry::InvalidValueException(UNISTRING("This configuration node does not contain a list of strings !"), THISREF());
-
- return aReturn;
-}
-
-//--------------------------------------------------------------------------
-void SAL_CALL OConfigurationRegistryKey::setStringListValue( const com::sun::star::uno::Sequence< ::rtl::OUString >& _seqValue ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- implSetValue(com::sun::star::uno::makeAny(_seqValue));
-}
-
-//--------------------------------------------------------------------------
-com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL OConfigurationRegistryKey::getBinaryValue() throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::registry::InvalidValueException, com::sun::star::uno::RuntimeException)
-{
- com::sun::star::uno::Any aValue = implGetValue();
-
- com::sun::star::uno::Sequence< sal_Int8 > aReturn;
- if (!aValue.hasValue())
- checkNullable();// let NULL values pass
-
- else if (!(aValue >>= aReturn))
- return aReturn;
-
- throw com::sun::star::registry::InvalidValueException(UNISTRING("This configuration node does not contain a list of strings !"), THISREF());
-}
-
-//--------------------------------------------------------------------------
-void SAL_CALL OConfigurationRegistryKey::setBinaryValue( const com::sun::star::uno::Sequence< sal_Int8 >& _rValue ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- implSetValue(com::sun::star::uno::makeAny(_rValue));
-}
-
-//--------------------------------------------------------------------------
-com::sun::star::uno::Reference< com::sun::star::registry::XRegistryKey > OConfigurationRegistryKey::implGetKey( const ::rtl::OUString& _rKeyName )
- throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- com::sun::star::uno::Any aDescendant = implGetDescendant(_rKeyName);
- if (aDescendant.getValueType().getTypeClass() == com::sun::star::uno::TypeClass_INTERFACE)
- {
- com::sun::star::uno::Reference< com::sun::star::container::XNameAccess > xNode;
- ::cppu::extractInterface(xNode, aDescendant);
- if (!xNode.is())
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("invalid descendant node. No XNameAccess found."), THISREF());
- return new OConfigurationRegistryKey(xNode, !m_bReadOnly);
- }
- else
- {
-#if OSL_DEBUG_LEVEL > 1
- switch (aDescendant.getValueType().getTypeClass())
- {
- case com::sun::star::uno::TypeClass_STRING:
- case com::sun::star::uno::TypeClass_SHORT:
- case com::sun::star::uno::TypeClass_UNSIGNED_SHORT:
- case com::sun::star::uno::TypeClass_BYTE:
- case com::sun::star::uno::TypeClass_LONG:
- case com::sun::star::uno::TypeClass_UNSIGNED_LONG:
- case com::sun::star::uno::TypeClass_BOOLEAN:
- case com::sun::star::uno::TypeClass_SEQUENCE:
- break;
- case com::sun::star::uno::TypeClass_VOID: // NULL value found
- break;
- default:
- OSL_ENSURE(sal_False, "OConfigurationRegistryKey::openKey : unknown, invalid or unhandled descendant value type !");
- }
-#endif
-
- OSL_ASSERT(m_xNode.is());
-
- com::sun::star::uno::Reference< com::sun::star::container::XNameAccess > xDescParent(m_xNode); // the parent config node of the descandent
- rtl::OUString sDescRelativeName( _rKeyName ); // local name of the descendant within xDescParent
-
- if (!m_xNode->hasByName(_rKeyName)) // it is a hierarchical Path -> more work
- {
- rtl::OUString sParentLocation;
-
- if ( !splitPath(_rKeyName, sParentLocation, sDescRelativeName) )
- {
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("Cannot split path for value. The internal registry structure seems to be corrupt."), THISREF());
- }
-
- if (sParentLocation.getLength())
- {
- com::sun::star::uno::Any aDescParent = implGetDescendant(sParentLocation);
- ::cppu::extractInterface(xDescParent, aDescParent);
- if (!xDescParent.is())
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("The internal registry structure seems to be corrupt."), THISREF());
- }
- }
-
- OSL_ENSURE(xDescParent.is(), "No Parent Node found for value ?");
- OSL_ENSURE(xDescParent->hasByName(sDescRelativeName), "Parent Node does not contain found value ?");
-
- return new OConfigurationRegistryKey(aDescendant, xDescParent, sDescRelativeName, !m_bReadOnly);
- }
-}
-
-//--------------------------------------------------------------------------
-com::sun::star::uno::Reference< com::sun::star::registry::XRegistryKey > SAL_CALL OConfigurationRegistryKey::openKey( const ::rtl::OUString& _rKeyName ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- checkValid(KAT_CHILD);
-
- return implGetKey(_rKeyName);
-}
-//--------------------------------------------------------------------------
-bool OConfigurationRegistryKey::checkRelativeKeyName(rtl::OUString& _rKeyName) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- // no empty names allowed
- if (!_rKeyName.getLength())
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("The key name is invalid."), THISREF());
-
- bool bCleanPath = true;
-
- // cut trailing slashes
- sal_Int32 nCleanEnd = _rKeyName.getLength();
- while (nCleanEnd > 0 && _rKeyName[nCleanEnd - 1] == '/' )
- --nCleanEnd;
-
- if (m_xNode.is())
- {
- if (m_xNode-> hasByName(_rKeyName))
- {
- bCleanPath = false;
- }
-
- else
- {
- com::sun::star::uno::Reference< com::sun::star::util::XStringEscape > xSE(m_xNode, com::sun::star::uno::UNO_QUERY);
-
- sal_Bool bPreferLocal = xSE.is();
-
- if (!bPreferLocal)
- {
- com::sun::star::uno::Reference< com::sun::star::lang::XServiceInfo > xSI(m_xNode, com::sun::star::uno::UNO_QUERY);
- if (xSI.is() && xSI->supportsService(rtl::OUString::createFromAscii("com.sun.star.configuration.SetAccess")))
- bPreferLocal = true;
- }
-
- if (bPreferLocal)
- {
- com::sun::star::uno::Reference< com::sun::star::container::XHierarchicalNameAccess > xHA(m_xNode, com::sun::star::uno::UNO_QUERY);
- rtl::OUString sCleanName = _rKeyName.copy(0, nCleanEnd);
-
- if (xHA.is() && xHA->hasByHierarchicalName(sCleanName))
- bPreferLocal = false;
- }
-
- if (bPreferLocal && xSE.is())
- {
- _rKeyName = xSE->escapeString(_rKeyName);
- }
- bCleanPath = !bPreferLocal;
- }
- }
-
- if (bCleanPath)
- {
- // no absolute names ("/...") allowed
- if (_rKeyName.getStr()[0] == '/')
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("The key name is invalid. It must be a relative, not an absolute name."), THISREF());
-
- if (nCleanEnd <= 0)
- // the original name consists of slashes only
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("The key name is invalid."), THISREF());
-
-
- _rKeyName = _rKeyName.copy(0, nCleanEnd);
- }
- return bCleanPath;
-}
-
-//--------------------------------------------------------------------------
-com::sun::star::uno::Reference< com::sun::star::registry::XRegistryKey > SAL_CALL OConfigurationRegistryKey::createKey( const ::rtl::OUString& _rKeyName ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- checkValid(KAT_CHILD);
-
- if (m_bReadOnly)
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("The key is read only."), THISREF());
-
- OSL_ENSURE(m_xNode.is(), "OConfigurationRegistryKey::createKey : somebody changed the checkValid(KAT_CHILD) behaviour !");
-
- rtl::OUString sKeyName(_rKeyName);
- if (checkRelativeKeyName(sKeyName))
- {
- rtl::OUString sParentName, sLocalName;
-
- if (!splitPath(sKeyName,sParentName, sLocalName))
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("The key name is invalid."), THISREF());
-
- if (sParentName.getLength()) // it's a nested key name
- {
- // check if we have the key already
- com::sun::star::uno::Reference< com::sun::star::container::XHierarchicalNameAccess > xDeepAccess(m_xNode, com::sun::star::uno::UNO_QUERY);
- if (xDeepAccess.is() && xDeepAccess->hasByHierarchicalName(sKeyName))
- {
- // already there - just open it
- return implGetKey(sKeyName);
- }
-
- // deep access, but not found. delegate it to a registry key which is one level above the to-be-created one
- com::sun::star::uno::Reference< com::sun::star::registry::XRegistryKey > xSetNode = implGetKey(sParentName);
- if (!xSetNode.is())
- {
- OSL_ENSURE(sal_False, "OConfigurationRegistryKey::createKey : somebody changed the implGetKey behaviour !");
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("An internal error occured."), THISREF());
- }
- return xSetNode->createKey(sLocalName); // problem: request for a/['b/c'] might find a/b/c
- }
- else
- sKeyName = sLocalName;
- }
-
- // The requested new key is one level below ourself. Can't delegate the creation.
- if (m_xNode->hasByName(sKeyName) )
- {
- // already there - just open it
- return implGetKey(sKeyName);
- }
-
- com::sun::star::uno::Reference< com::sun::star::container::XNameContainer > xContainer(m_xNode, com::sun::star::uno::UNO_QUERY);
- if (!xContainer.is())
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("The configuration node represented by this key is not a set node, you can't insert keys."), THISREF());
-
- com::sun::star::uno::Any aValueToInsert;
-
- com::sun::star::uno::Reference< com::sun::star::lang::XSingleServiceFactory > xChildFactory(xContainer, com::sun::star::uno::UNO_QUERY);
- if (xChildFactory.is())
- {
- // In the configuration API, the creation of a new child is two-stage process : first you create a child which
- // is "floating", i.e. does not belong to the configuration tree, yet. After filling it with values, you insert
- // it into the container node which was used for the creation.
- // We can't map this behaviour with the registry API, so we have to combine both steps
-
- // create a new floating child for the container node
- try
- {
- com::sun::star::uno::Reference< com::sun::star::uno::XInterface > xFloatingChild = xChildFactory->createInstance();
- OSL_ENSURE( xFloatingChild.is(), "The newly created element is NULL !");
-
- com::sun::star::uno::Reference< com::sun::star::container::XNameAccess > xInsertedChild(xFloatingChild, com::sun::star::uno::UNO_QUERY);
- OSL_ENSURE( xInsertedChild.is(), "The newly created element does not provide the required interface");
-
- if (!xInsertedChild.is())
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("An internal error occured. The objects provided by the configuration API are invalid."), THISREF());
-
- aValueToInsert <<= xInsertedChild; // xFloatingChild;
- }
- catch (com::sun::star::uno::RuntimeException&)
- { // allowed to leave this method
- throw;
- }
- catch (com::sun::star::uno::Exception& e)
- { // not allowed to leave this method
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("Unable to create a new child for the configuration node. Original error message as provided by the configuration API : ") += e.Message,
- THISREF());
- }
- OSL_ENSURE(aValueToInsert.hasValue(), "New Child node did not get into the Any ?");
- }
- else
- {
- // If the elements of the set are simple values, we need to create a matching value
- com::sun::star::uno::Type aElementType = xContainer->getElementType();
- aValueToInsert = implCreateDefaultElement(aElementType);
-
- OSL_ENSURE(aValueToInsert.hasValue() || aElementType.getTypeClass() == com::sun::star::uno::TypeClass_ANY, "Internal error: NULL value created for new value element ?");
- }
-
- // and immediately insert it into the container
- try
- {
- xContainer->insertByName(sKeyName, aValueToInsert);
- }
- catch (com::sun::star::lang::IllegalArgumentException& e)
- {
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("illegal argument to InsertByName: ") += e.Message, THISREF());
- }
- catch (com::sun::star::container::ElementExistException& e)
- {
- OSL_ENSURE(false, "There was an element of the same name inserted just now");
-
- // try to return that one
- try { return implGetKey(sKeyName); }
- catch (com::sun::star::uno::Exception&) { OSL_ENSURE(false, "But the other element cannot be retrieved"); }
-
-
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("Inserting raised a NoSuchElementException for an unavailable element ! Original error message : ") += e.Message, THISREF());
- }
- catch (com::sun::star::lang::WrappedTargetException& e)
- {
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("Inserting raised a WrappedTargetException. Original error message : ") += e.Message, THISREF());
- }
-
- return new OConfigurationRegistryKey(aValueToInsert, m_xNode, sKeyName, !m_bReadOnly);
-}
-
-//--------------------------------------------------------------------------
-void SAL_CALL OConfigurationRegistryKey::closeKey() throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- OSL_ASSERT(UnoApiLock::isHeld());
- checkValid(KAT_META);
-
- bool bRoot = (m_sLocalName.getLength() == 0);
-
- if (!bRoot) // don't close, if this is the root key ..
- {
- m_xNode.clear();
- m_xParentNode.clear();
-// m_sLocalName = rtl::OUString(); - local name is const ...
- }
-}
-
-//--------------------------------------------------------------------------
-void SAL_CALL OConfigurationRegistryKey::deleteKey( const rtl::OUString& _rKeyName ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- checkValid(KAT_CHILD);
- if (m_bReadOnly)
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("The key is read only."), THISREF());
-
- rtl::OUString sKeyName(_rKeyName);
- if (checkRelativeKeyName(sKeyName))
- {
- rtl::OUString sParentName, sLocalName;
-
- if (!splitPath(sKeyName,sParentName, sLocalName))
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("The key name is invalid."), THISREF());
-
- if (sParentName.getLength()) // it's a nested key name
- {
- com::sun::star::uno::Reference< com::sun::star::registry::XRegistryKey > xSetNode = implGetKey(sParentName);
- if (!xSetNode.is())
- {
- OSL_ENSURE(sal_False, "OConfigurationRegistryKey::createKey : somebody changed the implGetKey behaviour !");
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("An internal error occured."), THISREF());
- }
- xSetNode->deleteKey(sLocalName);
- return;
- }
- else
- sKeyName = sLocalName;
- }
-
- // The requested new key is one level below ourself. Can't delegate the creation.
- com::sun::star::uno::Reference< com::sun::star::container::XNameContainer > xContainer(m_xNode, com::sun::star::uno::UNO_QUERY);
- if (!xContainer.is())
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("The configuration node represented by this key is not a set node, you can't remove keys."), THISREF());
-
- // and immediately remove it from the container
- try
- {
- xContainer->removeByName(sKeyName);
- }
- catch (com::sun::star::container::NoSuchElementException& e)
- {
- if (e.Message.getLength())
- throw com::sun::star::registry::InvalidRegistryException(e.Message, THISREF());
- else
- throw com::sun::star::registry::InvalidRegistryException((UNISTRING("There is no element named ") += sKeyName) += UNISTRING(" to remove."), THISREF());
- }
- catch (com::sun::star::lang::WrappedTargetException& e)
- {
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("Removing a node caused a WrappedTargetException. Original error message : ") += e.Message, THISREF());
- }
-}
-
-//--------------------------------------------------------------------------
-com::sun::star::uno::Sequence< com::sun::star::uno::Reference< com::sun::star::registry::XRegistryKey > > SAL_CALL OConfigurationRegistryKey::openKeys() throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- checkValid(KAT_CHILD);
-
- com::sun::star::uno::Sequence< ::rtl::OUString > aNames(m_xNode->getElementNames());
-
- sal_Int32 const nCount = aNames.getLength();
-
- com::sun::star::uno::Sequence< com::sun::star::uno::Reference< com::sun::star::registry::XRegistryKey > > aReturn(nCount);
-
- for (sal_Int32 i=0; i<nCount; ++i)
- aReturn[i] = implGetKey(aNames[i]);
-
- return aReturn;
-}
-
-//--------------------------------------------------------------------------
-com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL OConfigurationRegistryKey::getKeyNames() throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- checkValid(KAT_CHILD);
- return m_xNode->getElementNames();
-}
-
-//--------------------------------------------------------------------------
-sal_Bool SAL_CALL OConfigurationRegistryKey::createLink( const ::rtl::OUString& /*aLinkName*/, const ::rtl::OUString& /*aLinkTarget*/ ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("This registry, which is base on a configuration tree, does not support links."), THISREF());
-}
-
-//--------------------------------------------------------------------------
-void SAL_CALL OConfigurationRegistryKey::deleteLink( const ::rtl::OUString& /*rLinkName*/ ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("This registry, which is base on a configuration tree, does not support links."), THISREF());
-}
-
-//--------------------------------------------------------------------------
-::rtl::OUString SAL_CALL OConfigurationRegistryKey::getLinkTarget( const ::rtl::OUString& /*rLinkName*/ ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("This registry, which is base on a configuration tree, does not support links."), THISREF());
-}
-
-//--------------------------------------------------------------------------
-::rtl::OUString SAL_CALL OConfigurationRegistryKey::getResolvedName( const ::rtl::OUString& /*aKeyName*/ ) throw(com::sun::star::registry::InvalidRegistryException, com::sun::star::uno::RuntimeException)
-{
- throw com::sun::star::registry::InvalidRegistryException(UNISTRING("This registry, which is base on a configuration tree, does not support links."), THISREF());
-}
-//--------------------------------------------------------------------------
-//..........................................................................
-} // namespace configmgr
-//..........................................................................
-// split path
-#include "configpath.hxx"
-#include "configexcept.hxx"
-
-bool configmgr::splitPath(const rtl::OUString& _sPath, rtl::OUString& _rsParentPath, rtl::OUString& _rsLocalName)
-{
- bool bResult = false;
- try
- {
- bool bAbsolute = configmgr::configuration::Path::isAbsolutePath(_sPath);
- configmgr::configuration::Path::Rep aPath ;
-
- if (bAbsolute)
- {
- configmgr::configuration::AbsolutePath parsedPath = configmgr::configuration::AbsolutePath::parse(_sPath) ;
-
- aPath = parsedPath.rep() ;
- }
- else
- {
- configmgr::configuration::RelativePath parsedPath = configmgr::configuration::RelativePath::parse(_sPath) ;
-
- aPath = parsedPath.rep() ;
- }
- //configmgr::configuration::Path::Rep aPath = bAbsolute ? configmgr::configuration::AbsolutePath::parse(_sPath).rep() : configmgr::configuration::RelativePath::parse(_sPath).rep();
-
- OSL_ENSURE(!aPath.isEmpty(), "Trying to split an empty or root path");
- std::vector<configuration::Path::Component>::const_reverse_iterator aFirst = aPath.begin(), aLast = aPath.end();
-
- if (aFirst != aLast)
- {
- --aLast;
-
- _rsLocalName = aLast->getName();
- _rsParentPath = configmgr::configuration::Path::Rep(aFirst,aLast).toString(bAbsolute);
-
- bResult = true;
- }
- // else go on to fail
- }
- catch (configuration::Exception&)
- {
- }
- return bResult;
-}
-//..........................................................................
-
-