summaryrefslogtreecommitdiff
path: root/configmgr/source/backend/layermerge.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/source/backend/layermerge.cxx')
-rw-r--r--configmgr/source/backend/layermerge.cxx1039
1 files changed, 0 insertions, 1039 deletions
diff --git a/configmgr/source/backend/layermerge.cxx b/configmgr/source/backend/layermerge.cxx
deleted file mode 100644
index e906d869b5f8..000000000000
--- a/configmgr/source/backend/layermerge.cxx
+++ /dev/null
@@ -1,1039 +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: layermerge.cxx,v $
- * $Revision: 1.28 $
- *
- * 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 "layermerge.hxx"
-#include "treenodefactory.hxx"
-#include "matchlocale.hxx"
-#include "valuetypeconverter.hxx"
-#include "typeconverter.hxx"
-#include <com/sun/star/configuration/backend/SchemaAttribute.hpp>
-#include <com/sun/star/configuration/backend/NodeAttribute.hpp>
-
-#include <rtl/ustrbuf.hxx>
-
-namespace configmgr
-{
-// -----------------------------------------------------------------------------
- namespace backend
- {
-// -----------------------------------------------------------------------------
-
- namespace SchemaAttribute = backenduno::SchemaAttribute;
- namespace NodeAttribute = backenduno::NodeAttribute;
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-//#if OSL_DEBUG_LEVEL > 0
-// currently not used in debug builds
-#if 0
- static void check_if_complete(uno::Reference< uno::XComponentContext > const & _xContext)
- {
- MergedComponentData aData;
-
- uno::Reference< backenduno::XLayerHandler >
- test(new LayerMergeHandler(_xContext, aData));
- }
-#endif
-
-// -----------------------------------------------------------------------------
-
-struct LayerMergeHandler::Converter
-{
- explicit
- Converter(uno::Reference< uno::XComponentContext > const & xContext);
-
- uno::Any convertValue(uno::Type const & _aTargetType, uno::Any const & _aValue);
-
- static uno::Reference< com::sun::star::script::XTypeConverter > createTCV(uno::Reference< uno::XComponentContext > const & xContext);
-
- ValueConverter m_aConverter;
- bool m_bConvertData;
-};
-// -----------------------------------------------------------------------------
-LayerMergeHandler::LayerMergeHandler(uno::Reference< uno::XComponentContext > const & xContext, MergedComponentData & _rData, ITemplateDataProvider* aTemplateProvider )
-: m_rData(_rData)
-//, m_aContext(xContext,static_cast<backenduno::XLayerHandler*>(this),aTemplateProvider )
-, m_aContext(xContext)
-, m_aFactory()
-, m_aLocale()
-, m_pProperty(NULL)
-, m_pConverter( new Converter(xContext) )
-, m_nSkipping(0)
-, m_bSublayer(false)
-{
- m_aContext = DataBuilderContext(xContext,static_cast<backenduno::XLayerHandler*>(this),aTemplateProvider );
- OSL_ENSURE( m_rData.hasSchema(), "Creating layer merger without default data" );
-}
-// -----------------------------------------------------------------------------
-
-LayerMergeHandler::~LayerMergeHandler( )
-{
- delete m_pConverter;
-}
-// -----------------------------------------------------------------------------
-
-void LayerMergeHandler::prepareLayer()
-{
- OSL_ENSURE(isDone(), "LayerMergeHandler: Warning: Previous layer or schema not terminated properly");
- if (!isDone())
- m_aContext.getLogger().error("Previous layer or schema not terminated properly", "prepareLayer()", "configmgr::LayerMergeHandler");
-
- m_aLocale = localehelper:: getDefaultLanguage();
- m_bSublayer = false;
-
- promoteToDefault(m_rData);
-}
-// -----------------------------------------------------------------------------
-
-bool LayerMergeHandler::prepareSublayer(rtl::OUString const & aLocale)
-{
- OSL_ENSURE(isDone(), "LayerMergeHandler: Warning: Previous layer not terminated properly");
- if (!isDone())
- m_aContext.getLogger().error("Previous layer not terminated properly", "prepareSublayer()", "configmgr::LayerMergeHandler");
-
- m_aLocale = aLocale;
- m_bSublayer = (aLocale.getLength() != 0);
-
- return m_bSublayer;
-}
-// -----------------------------------------------------------------------------
-
-namespace
-{
- struct CheckRestrictedAccessVisitor : NodeAction
- {
- node::Access m_access;
-
- CheckRestrictedAccessVisitor(node::Access _access) : m_access(_access) {}
-
- void handle(ValueNode const & _aNode) { check(_aNode); }
-
- void handle(ISubtree const & _aNode)
- {
- node::Access aNext = check(_aNode);
- CheckRestrictedAccessVisitor(aNext).applyToChildren(_aNode);
- }
-
- node::Access check(INode const & _aNode)
- {
- node::Attributes const aFoundAttr = _aNode.getAttributes();
- node::Access const aFoundAccess = aFoundAttr.getAccess();
- OSL_ENSURE(m_access <= aFoundAccess, "Subnode has more access than its parent");
-
- return aFoundAccess;
- }
- };
-// --------------------
- struct RestrictAccessVisitor : NodeModification
- {
- node::Access m_access;
-
- RestrictAccessVisitor(bool _bFinalize)
- : m_access(_bFinalize ? node::accessFinal : node::accessReadonly)
- {}
-
- void handle(ValueNode & _aNode) { restrict(_aNode); }
-
- void handle(ISubtree & _aNode)
- {
- if (restrict(_aNode))
- this->applyToChildren(_aNode);
- else
- OSL_DEBUG_ONLY(CheckRestrictedAccessVisitor(m_access).applyToNode(_aNode));
- }
-
- bool restrict(INode & _aNode)
- {
- node::Attributes const aFoundAttr = _aNode.getAttributes();
-
- if (aFoundAttr.getAccess() >= m_access) return false; // already restricted enough
-
- _aNode.modifyAccess(m_access);
- return true;
- }
- };
-}
-// -----------------------------------------------------------------------------
-void LayerMergeHandler::propagateAttributes(ISubtree & _rParent)
-{
- node::Attributes aAttributes = _rParent.getAttributes();
-
- if (aAttributes.isReadonly() || aAttributes.isFinalized())
- RestrictAccessVisitor(aAttributes.isWritable()).applyToChildren(_rParent);
-}
-// -----------------------------------------------------------------------------
-
-node::Attributes LayerMergeHandler::makePropertyAttributes(sal_Int16 aSchemaAttributes)
- SAL_THROW((com::sun::star::configuration::backend::MalformedDataException , com::sun::star::uno::RuntimeException))
-{
- const sal_uInt16 k_allPropertySchemaAttributes =
- SchemaAttribute::REQUIRED;
-
- if ((aSchemaAttributes & k_allPropertySchemaAttributes) !=
- (aSchemaAttributes & SchemaAttribute::MASK))
- {
- sal_Char const * pMsg = (aSchemaAttributes & SchemaAttribute::LOCALIZED) ?
- "Layer merging: Cannot add localized property to extensible node" :
- "Layer merging: Unreckognized Schema Attribute for new Property" ;
-
- m_aContext.raiseIllegalArgumentException(pMsg,2);
- }
- OSL_ASSERT( !(aSchemaAttributes & SchemaAttribute::LOCALIZED) ); // check the check
-
- node::Attributes aAttributes = m_aContext.getCurrentAttributes();
-
- if (aSchemaAttributes & SchemaAttribute::REQUIRED)
- aAttributes.setNullable (false);
-
- //Set state, removable and mandatory attribute flags
- aAttributes.setState(node::isAdded);
- aAttributes.setRemovability(true,true);
-
-
- return aAttributes;
-
-}
-// -----------------------------------------------------------------------------
-
-void LayerMergeHandler::checkPropertyType(uno::Type const & _aType)
- SAL_THROW((com::sun::star::configuration::backend::MalformedDataException , com::sun::star::uno::RuntimeException))
-{
- OSL_ASSERT(m_pProperty);
-
- if (ValueNode * pValue = m_pProperty->asValueNode())
- {
- if (pValue->getValueType() != _aType)
- {
- if (pValue->getValueType().getTypeClass() == uno::TypeClass_ANY)
- {
- OSL_ENSURE( pValue->isNull(), "Layer merging: Non-null 'any' value" );
-
- if (_aType != uno::Type())
- OSL_VERIFY( pValue->setValueType(_aType) );
-
- else
- {
- OSL_TRACE("Layer merging: Illegal property type: VOID overriding ANY");
- m_aContext.getLogger().warning("Illegal property type: VOID overriding ANY - ignoring",
- "checkPropertyType()", "configmgr::LayerMergeHandler");
- // m_aContext.raiseIllegalTypeException("Layer merging: Illegal property type: VOID overriding ANY");
- }
- }
- else if (_aType == uno::Type() && m_pConverter)
- m_pConverter->m_bConvertData = true;
-
- else
- m_aContext.raiseIllegalTypeException("Layer merging: Cannot merge property value: types does not match");
- }
- }
- else if (ISubtree *localisedSet = m_pProperty->asISubtree()) {
- // We're dealing with localised data.
- uno::Type valueType = parseTemplateName(
- localisedSet->getElementTemplateName()) ;
-
- if (valueType != _aType) {
- if (valueType.getTypeClass() == uno::TypeClass_ANY) {
- if (_aType == uno::Type()) {
- // VOID value
- m_aContext.raiseIllegalTypeException(
- "Layer merging: VOID value for localised ANY type") ;
- }
- // TODO Could we have to set the localised data type?
- }
- else if (_aType == uno::Type() && m_pConverter) {
- m_pConverter->m_bConvertData = sal_True ;
- }
- else {
- m_aContext.raiseIllegalTypeException("Layer merging: property value does not match localised type") ;
- }
- }
- }
-
-}
-// -----------------------------------------------------------------------------
-
-void LayerMergeHandler::setValueAndCheck(ValueNode& _rValueNode, uno::Any const & _aValue)
- SAL_THROW((com::sun::star::configuration::backend::MalformedDataException , com::sun::star::uno::RuntimeException))
-{
- if (_aValue.hasValue() && m_pConverter && m_pConverter->m_bConvertData)
- {
- uno::Any aConvertedValue = m_pConverter->convertValue(_rValueNode.getValueType(),_aValue);
- if (!aConvertedValue.hasValue())
- m_aContext.raiseIllegalTypeException("Layer merging: Cannot merge property value: cannot convert data to type of property");
-
- if (! _rValueNode.setValue(aConvertedValue) )
- m_aContext.raiseIllegalTypeException("Layer merging: Cannot merge property value: converted type does not match");
- }
- else if (! _rValueNode.setValue(_aValue) )
- {
- m_aContext.raiseIllegalTypeException("Layer merging: Cannot merge property value: type does not match");
- }
-
-}
-// -----------------------------------------------------------------------------
-
-void LayerMergeHandler::setLocalizedValue(ISubtree * pProperty, uno::Any const & _aValue, rtl::OUString const & _aLocale)
- SAL_THROW((com::sun::star::configuration::backend::MalformedDataException , com::sun::star::uno::RuntimeException))
-{
- if (ISubtree * pLocalizedCont = pProperty->asISubtree())
- {
- OSL_ENSURE(isLocalizedValueSet(*pLocalizedCont),"Layer merging: property node is not a value");
-
- if (INode * pLocale = pLocalizedCont->getChild(_aLocale))
- {
- if (ValueNode * pLocValue = pLocale->asValueNode())
- {
- setValueAndCheck(*pLocValue,_aValue);
- }
- else
- {
- OSL_ENSURE(false,"Layer merging: Localized subnode is not a value");
- m_aContext.getLogger().error("Localized subnode is not a value - ignoring data",
- "setLocalizedValue()", "configmgr::LayerMergeHandler");
- }
- }
- else {
- node::Attributes attributes = pLocalizedCont->getAttributes() ;
- uno::Type valueType = parseTemplateName(
- pLocalizedCont->getElementTemplateName()) ;
-
- attributes.setLocalized(false) ;
- OSL_ENSURE(valueType != uno::Type(),
- "Cannot determine type for localised value") ;
- std::auto_ptr<ValueNode> localisedValue =
- m_aFactory.getNodeFactory().createNullValueNode(_aLocale,
- valueType,
- attributes) ;
-
- if (_aValue.hasValue()) {
- setValueAndCheck(*localisedValue, _aValue) ;
- }
- pLocalizedCont->addChild(base_ptr(localisedValue)) ;
- }
- }
-
- else if (ValueNode * pValue = pProperty->asValueNode())
- {
- OSL_ENSURE(false, "Layer merging: Got locale-dependent value for non-localized node");
- m_aContext.getLogger().error("Got locale-dependent value for non-localized node",
- "setLocalizedValue()", "configmgr::LayerMergeHandler");
- setValueAndCheck(*pValue,_aValue);
- }
-
- else
- {
- OSL_ENSURE(false, "Layer merging: Unknown node type for localized node");
- m_aContext.getLogger().error("Unknown node type for localized node",
- "setLocalizedValue()", "configmgr::LayerMergeHandler");
- }
-}
-// -----------------------------------------------------------------------------
-
-void LayerMergeHandler::applyPropertyValue(uno::Any const & _aValue)
- SAL_THROW((com::sun::star::configuration::backend::MalformedDataException , com::sun::star::uno::RuntimeException))
-{
- OSL_ASSERT(m_pProperty);
-
- if (ValueNode * pValue = m_pProperty->asValueNode())
- {
- setValueAndCheck(*pValue,_aValue);
- }
-
- else if (ISubtree * pLocalizedCont = m_pProperty->asISubtree())
- {
- setLocalizedValue(pLocalizedCont,_aValue,m_aLocale);
- }
-
- else
- {
- OSL_ENSURE(false, "Layer merging: Unknown node type for property");
- m_aContext.getLogger().error("Unknown node type for property",
- "applyPropertyValue()", "configmgr::LayerMergeHandler");
- }
-}
-// -----------------------------------------------------------------------------
-
-void LayerMergeHandler::applyPropertyValue(uno::Any const & _aValue, rtl::OUString const & _aLocale)
- SAL_THROW((com::sun::star::configuration::backend::MalformedDataException , com::sun::star::uno::RuntimeException))
-{
- OSL_ASSERT(m_pProperty);
-
- if (_aLocale.getLength() == 0)
- m_aContext.raiseIllegalArgumentException("Locale string is empty");
-
- if (ISubtree * pLocalizedCont = m_pProperty->asISubtree())
- {
- setLocalizedValue(pLocalizedCont,_aValue, _aLocale);
- }
-
- else if (ValueNode * pValue = m_pProperty->asValueNode())
- {
- //OSL_ENSURE(false, "Layer merging: Got locale-dependent value for non localized node");
- setValueAndCheck(*pValue,_aValue);
- }
-
- else
- {
- OSL_ENSURE(false, "Layer merging: Unknown node type for localized property");
- m_aContext.getLogger().error("Unknown node type for localized property",
- "applyPropertyValue()", "configmgr::LayerMergeHandler");
- }
-}
-// -----------------------------------------------------------------------------
-
-void LayerMergeHandler::applyAttributes(INode * pNode, sal_Int16 aNodeAttributes)
- SAL_THROW((com::sun::star::configuration::backend::MalformedDataException , com::sun::star::uno::RuntimeException))
-{
- sal_Int16 const k_allNodeAttributes =
- NodeAttribute::MANDATORY |
- NodeAttribute::FINALIZED |
- NodeAttribute::READONLY;
-
- if ((aNodeAttributes & k_allNodeAttributes) !=
- (aNodeAttributes & NodeAttribute::MASK))
- {
- sal_Char const * pMsg =
- "Layer merging: Unreckognized Node Attribute" ;
-
- m_aContext.raiseIllegalArgumentException(pMsg,2);
- }
-
- if (aNodeAttributes & NodeAttribute::READONLY)
- {
- OSL_ENSURE(!(aNodeAttributes & NodeAttribute::FINALIZED),
- "Layer merging: Warning: Node is both read-only and finalized");
- if (aNodeAttributes & NodeAttribute::FINALIZED)
- m_aContext.getLogger().warning("Node is both read-only and finalized - treating as readonly",
- "applyAttributes()", "configmgr::LayerMergeHandler");
-
- pNode->modifyAccess(node::accessReadonly);
- }
- else if (aNodeAttributes & NodeAttribute::FINALIZED)
- {
- pNode->modifyAccess(node::accessFinal);
- }
-
- if ( m_aContext.isNode(pNode) )
- {
- if (aNodeAttributes & NodeAttribute::MANDATORY)
- {
- pNode->markMandatory();
- }
- }
- else if (aNodeAttributes) // do this only if there actually was something to do
- {
- if (ISubtree * pLocCont = pNode->asISubtree())
- {
- OSL_ENSURE(isLocalizedValueSet(*pLocCont),"Layer merging: Property subtree must be a localized value set");
- propagateAttributes(*pLocCont);
- }
- }
-
-
-}
-// -----------------------------------------------------------------------------
-
-static
-void doLogRejection(sal_Int16 loglevel, DataBuilderContext const & aContext,
- INode * pNode, bool bMandatory)
-{
- rtl::OUStringBuffer aMessage;
- aMessage.appendAscii("Rejecting override: Node/Property ")
- .append(aContext.getNodePath(pNode->getName()))
- .appendAscii(" is ").appendAscii(bMandatory ? "mandatory" : "finalized")
- .appendAscii(" in a prior layer.");
-
- aContext.getLogger().log(loglevel,aMessage.makeStringAndClear(),
- bMandatory ? "addOrReplace/dropNode()" : "startOverride()",
- "configmgr::LayerMergeHandler");
-}
-
-static inline
-void logRejection(DataBuilderContext const & aContext, INode * pNode, bool bMandatory=false)
-{
- const sal_Int16 loglevel = LogLevel::INFO;
- if (aContext.getLogger().isLogging(loglevel))
- {
- doLogRejection(loglevel, aContext, pNode, bMandatory);
- }
-}
-// -----------------------------------------------------------------------------
-
-bool LayerMergeHandler::startOverride(INode * pNode, sal_Bool bClear) /* ensure writable, mark merged */
- SAL_THROW(())
-{
- OSL_PRECOND(pNode,"startOverride: non-NULL base node required");
- if (!m_aContext.isWritable(pNode))
- {
- // #i41700# write-protection is enforced, unless merging localizations
- if (!m_bSublayer)
- {
- logRejection(m_aContext,pNode);
- return false;
- }
- else
- OSL_ASSERT(m_aLocale.getLength() != 0);
- }
-
- OSL_ENSURE(!bClear,"'clear' operation is not yet supported");
- if (bClear)
- m_aContext.getLogger().warning("'clear' operation is not yet supported",
- "startOverride()", "configmgr::LayerMergeHandler");
-
- return true;
-}
-// -----------------------------------------------------------------------------
-
-void LayerMergeHandler::ensureUnchanged(INode const * pNode) const
- SAL_THROW((com::sun::star::configuration::backend::MalformedDataException , com::sun::star::uno::RuntimeException))
-{
- // to do: change state handling to detect this within sets
- OSL_PRECOND(pNode,"INTERNAL ERROR: Unexpected NULL node pointer");
-
- if (!this->isInSublayer())
- if (pNode->getAttributes().state() == node::isMerged)
- m_aContext.raiseMalformedDataException("Layer merging: Duplicate node or property in this layer");
-}
-// -----------------------------------------------------------------------------
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-// XLayerHandler
-
-void SAL_CALL LayerMergeHandler::startLayer( )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- ISubtree * pSchema = m_rData.getSchemaTree();
- OSL_ENSURE(pSchema,"No base data to merge layer into");
-
- if (!pSchema)
- {
- m_aContext.getLogger().error("No schema data for merging layer", "startLayer", "configmgr::LayerMergeHandler");
- throw uno::RuntimeException(rtl::OUString::createFromAscii("Layer merging: No data to merge with"),*this);
- }
-
- m_aContext.startActiveComponent(pSchema->getName());
-
- m_pProperty = NULL;
- m_nSkipping = 0;
-
- OSL_POSTCOND( m_aContext.hasActiveComponent(), "Layer merging: could not set active component");
- OSL_POSTCOND( m_aContext.isDone(), "Layer merging: newly started component is not empty");
- OSL_POSTCOND( !this->isSkipping(), "Layer merging: newly started component is in skipping state");
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL LayerMergeHandler::endLayer( )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (this->isSkipping())
- m_aContext.raiseMalformedDataException("Layer merging: Unmatched data being skipped was not terminated properly.");
-
- m_aContext.endActiveComponent();
-
- m_bSublayer = false;
-
- OSL_POSTCOND( !m_aContext.hasActiveComponent(), "Layer merging: could not clear active component");
- OSL_POSTCOND( m_aContext.isDone(), "Layer merging: could not finish processing");
-}
-// -----------------------------------------------------------------------------
-
-void LayerMergeHandler::overrideLayerRoot( const rtl::OUString& aName, sal_Int16 aAttributes, sal_Bool bClear )
- SAL_THROW((com::sun::star::configuration::backend::MalformedDataException , com::sun::star::uno::RuntimeException))
-{
- OSL_PRECOND( m_aContext.hasActiveComponent(), "Layer merging: active component is not set");
- OSL_PRECOND( m_aContext.isDone(), "Layer merging: node is not root");
-
- if (m_aContext.getActiveComponent() != aName)
- m_aContext.raiseIllegalArgumentException("Layer merging: Name of layer being merged does not match component name",1);
-
- // check the argument
- if (ISubtree * pSchema = m_rData.getSchemaTree())
- {
- OSL_ENSURE(pSchema->getName() == aName,"Schema name does not match active component");
-
- ensureUnchanged(pSchema);
-
- if (startOverride(pSchema,bClear))
- {
- applyAttributes(pSchema,aAttributes);
-
- m_aContext.pushNode(pSchema);
-
- OSL_POSTCOND( m_aContext.hasActiveComponent(), "Layer merging: could not set active component");
- OSL_POSTCOND( !m_aContext.isDone(), "Layer merging: could not start component");
- }
- else
- this->skipNode();
- }
- else
- {
- OSL_ENSURE(false,"No base data to merge layer into");
- m_aContext.getLogger().warning("No component data in schema for merging layer",
- "overrideNode() [for layer root]", "configmgr::LayerMergeHandler");
- this->skipNode();
- }
-}
-// -----------------------------------------------------------------------------
-
-static inline
-sal_Int16 getOverrideViolationLogLevel(bool bIsSublayer)
-{ return bIsSublayer ? LogLevel::FINER : LogLevel::INFO; }
-// -----------------------------------------------------------------------------
-
-void LayerMergeHandler::implOverrideNode(
- ISubtree * node, sal_Int16 attributes, bool clear)
-{
- ensureUnchanged(node);
- if (startOverride(node, clear)) {
- applyAttributes(node, attributes);
- m_aContext.pushNode(node);
- } else {
- skipNode();
- }
-}
-
-void SAL_CALL LayerMergeHandler::overrideNode( const rtl::OUString& aName, sal_Int16 aAttributes, sal_Bool bClear )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (this->isSkipping())
- {
- this->skipNode();
- }
- else if (m_aContext.isDone())
- {
- this->overrideLayerRoot(aName,aAttributes,bClear);
- }
- else if (ISubtree * pNode = m_aContext.findNode(aName))
- {
- implOverrideNode(pNode, aAttributes, bClear);
- }
- else // ignore non-matched data
- {
- const sal_Int16 loglevel = getOverrideViolationLogLevel(m_bSublayer);
- if (m_aContext.getLogger().isLogging(loglevel))
- {
- rtl::OUStringBuffer aMessage;
- aMessage.appendAscii("Node ").append(m_aContext.getNodePath(aName))
- .appendAscii(" to be overridden does not exist - skipping");
-
- m_aContext.getLogger().log(loglevel,aMessage.makeStringAndClear(), "overrideNode()", "configmgr::LayerMergeHandler");
- }
- // m_aContext.raiseNoSuchElementException("Layer merging: The node to be overridden does not exist.",aName);
- this->skipNode();
- }
-}
-// -----------------------------------------------------------------------------
-
-void LayerMergeHandler::implAddOrReplaceNode( const rtl::OUString& aName, const backenduno::TemplateIdentifier& aTemplate, sal_Int16 aAttributes )
- SAL_THROW((com::sun::star::configuration::backend::MalformedDataException , com::sun::star::uno::RuntimeException))
-{
- ISubtree * pReplacedNode = m_aContext.findNode(aName);
- if (pReplacedNode)
- {
- if ((aAttributes & NodeAttribute::FUSE) == 0) {
- this->ensureUnchanged(pReplacedNode);
-
- if (!m_aContext.isRemovable(pReplacedNode))
- {
- logRejection(m_aContext,pReplacedNode,true);
- this->skipNode();
- return;
- }
- } else {
- implOverrideNode(
- pReplacedNode, aAttributes & ~NodeAttribute::FUSE, false);
- return;
- }
- }
-
- std::auto_ptr<INode> apNewInstance;
- if (aTemplate.Component == m_aContext.getActiveComponent())
- {
- apNewInstance = m_rData.instantiateTemplate(aName, aTemplate.Name);
- }
- else
- {
- TemplateRequest aTemplateRequest(aTemplate.Name, aTemplate.Component);
- apNewInstance = m_aContext.getTemplateData( aTemplateRequest ).extractDataAndClear();
- if (apNewInstance.get())
- apNewInstance->setName( aName );
- }
-
- if (NULL == apNewInstance.get())
- m_aContext.raiseNoSuchElementException("Layer merging: Cannot instantiate template.", aTemplate.Name);
-
- applyAttributes(apNewInstance.get(), aAttributes & ~NodeAttribute::FUSE);
- //Set removable flag
- apNewInstance->markRemovable();
-
- m_aContext.markCurrentMerged();
-
- if (pReplacedNode) m_aContext.getCurrentParent().removeChild( aName );
-
- INode * pAddedInstance = m_aContext.getCurrentParent().addChild( apNewInstance );
-
- m_aContext.pushNode(pAddedInstance->asISubtree());
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL LayerMergeHandler::addOrReplaceNode( const rtl::OUString& aName, sal_Int16 aAttributes )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (this->isSkipping())
- {
- this->skipNode();
- return;
- }
-
- implAddOrReplaceNode( aName, m_aContext.getCurrentItemType(), aAttributes);
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL LayerMergeHandler::addOrReplaceNodeFromTemplate( const rtl::OUString& aName, const backenduno::TemplateIdentifier& aTemplate, sal_Int16 aAttributes )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (this->isSkipping())
- {
- this->skipNode();
- return;
- }
-
- // TODO: correct argument position (from 2 to 3) for an illegal argument exception wrt attributes
- implAddOrReplaceNode( aName, m_aContext.getValidItemType(aTemplate), aAttributes);
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL LayerMergeHandler::endNode( )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (this->leaveSkippedNode())
- return;
-
- this->propagateAttributes(m_aContext.getCurrentParent());
-
- m_aContext.popNode();
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL LayerMergeHandler::dropNode( const rtl::OUString& aName )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (this->isSkipping())
- return;
-
- if (!m_aContext.getCurrentParent().isSetNode())
- m_aContext.raiseMalformedDataException("Layer merging: Removing child nodes is only possible in set nodes.");
-
- if (ISubtree * pDropped = m_aContext.findNode(aName))
- {
- this->ensureUnchanged(pDropped);
- if (!m_aContext.isRemovable(pDropped))
- {
- logRejection(m_aContext,pDropped,true);
- return;
- }
- }
- else
- {
- const sal_Int16 loglevel = getOverrideViolationLogLevel(m_bSublayer);
- if (m_aContext.getLogger().isLogging(loglevel))
- {
- rtl::OUStringBuffer aMessage;
- aMessage.appendAscii("Node ").append(m_aContext.getNodePath(aName))
- .appendAscii(" to be removed does not exist - ignoring");
-
- m_aContext.getLogger().log(loglevel,aMessage.makeStringAndClear(), "dropNode()", "configmgr::LayerMergeHandler");
- }
- // m_aContext.raiseNoSuchElementException("Layer merging: The node to be removed does not exist.",aName);
- }
- m_aContext.markCurrentMerged();
- m_aContext.getCurrentParent().removeChild(aName);
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL LayerMergeHandler::overrideProperty( const rtl::OUString& aName, sal_Int16 aAttributes, const uno::Type& aType, sal_Bool bClear )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (this->isSkipping())
- {
- this->skipNode();
- }
- else if (INode * pProp = m_aContext.findProperty(aName))
- {
- ensureUnchanged(pProp);
-
- if (startOverride(pProp,bClear))
- {
- applyAttributes(pProp,aAttributes);
-
- m_pProperty = pProp;
-
- checkPropertyType(aType);
- }
- else
- this->skipNode();
- }
- else // ignore non-matched data
- {
- const sal_Int16 loglevel = getOverrideViolationLogLevel(m_bSublayer);
- if (m_aContext.getLogger().isLogging(loglevel))
- {
- rtl::OUStringBuffer aMessage;
- aMessage.appendAscii("Property ").append(m_aContext.getNodePath(aName))
- .appendAscii(" to be overridden does not exist - skipping");
-
- m_aContext.getLogger().log(loglevel,aMessage.makeStringAndClear(), "overrideNode()", "configmgr::LayerMergeHandler");
- }
- // m_aContext.raiseUnknownPropertyException("Layer merging: The property to be overridden does not exist.",aName);
- this->skipNode();
- }
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL LayerMergeHandler::endProperty( )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (this->leaveSkippedNode())
- return;
-
- if (!m_pProperty)
- m_aContext.raiseMalformedDataException("Layer merging: Invalid data: Ending a property that wasn't started.");
-
- if (ISubtree * pLocalizedSet = m_pProperty->asISubtree())
- this->propagateAttributes(*pLocalizedSet);
-
- m_pProperty = NULL;
- if (m_pConverter) m_pConverter->m_bConvertData = false;
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL LayerMergeHandler::addProperty( const rtl::OUString& aName, sal_Int16 aAttributes, const uno::Type& aType )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (this->isSkipping())
- return;
-
- // TODO: add type validation
- node::Attributes aValueAttributes = makePropertyAttributes(aAttributes & SchemaAttribute::MASK);
-
- std::auto_ptr<ValueNode> aPropertyValue =
- m_aFactory.getNodeFactory().createNullValueNode(aName,aType,aValueAttributes);
-
- applyAttributes(aPropertyValue.get(),aAttributes & NodeAttribute::MASK);
-
- // can be a replace for dynamic properties (current update limitation)
- m_aContext.markCurrentMerged();
- m_aContext.addPropertyToCurrent(aPropertyValue, true);
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL LayerMergeHandler::addPropertyWithValue( const rtl::OUString& aName, sal_Int16 aAttributes, const uno::Any& aValue )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (this->isSkipping())
- return;
-
- node::Attributes aValueAttributes = makePropertyAttributes(aAttributes & SchemaAttribute::MASK);
-
- std::auto_ptr<ValueNode> aPropertyValue =
- m_aFactory.getNodeFactory().createValueNode(aName,aValue,aValueAttributes);
-
- applyAttributes(aPropertyValue.get(),aAttributes & NodeAttribute::MASK);
-
- // can be a replace for dynamic properties (current update limitation)
- m_aContext.markCurrentMerged();
- m_aContext.addPropertyToCurrent(aPropertyValue, true);
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL LayerMergeHandler::setPropertyValue( const uno::Any& aValue )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (this->isSkipping())
- return;
-
- if (!m_pProperty)
- m_aContext.raiseMalformedDataException("Layer merging: Invalid data: Overriding a value without a property.");
-
- OSL_ASSERT( !m_pProperty->getAttributes().isReplacedForUser() );
- m_pProperty->modifyState( node::isMerged );
- m_aContext.markCurrentMerged();
-
- applyPropertyValue(aValue);
-}
-// -----------------------------------------------------------------------------
-
-void SAL_CALL LayerMergeHandler::setPropertyValueForLocale( const uno::Any& aValue, rtl::OUString const & aLocale )
- throw (backenduno::MalformedDataException, lang::WrappedTargetException, uno::RuntimeException)
-{
- if (this->isSkipping())
- return;
-
- if (!m_pProperty)
- m_aContext.raiseMalformedDataException("Layer merging: Invalid data: Overriding a (localized) value without a property.");
-
- OSL_ASSERT( !m_pProperty->getAttributes().isReplacedForUser() );
- m_pProperty->modifyState( node::isMerged );
- m_aContext.markCurrentMerged();
-
- applyPropertyValue(aValue,aLocale);
-}
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-
-uno::Reference< com::sun::star::script::XTypeConverter >
- LayerMergeHandler::Converter::createTCV(uno::Reference< uno::XComponentContext > const & xContext)
-{
- OSL_ENSURE(xContext.is(),"Cannot create TypeConverter for LayerMergeHandler without a Context");
-
- uno::Reference< lang::XMultiComponentFactory > xFactory = xContext->getServiceManager();
- OSL_ENSURE(xFactory.is(),"Cannot create TypeConverter for LayerMergeHandler without a ServiceManager");
-
- uno::Reference< com::sun::star::script::XTypeConverter > xTCV;
- if (xFactory.is())
- {
- static const rtl::OUString k_sTCVService(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.script.Converter"));
-
- xTCV = uno::Reference< com::sun::star::script::XTypeConverter >::query(xFactory->createInstanceWithContext(k_sTCVService,xContext));
- }
- return xTCV;
-}
-// -----------------------------------------------------------------------------
-
-LayerMergeHandler::Converter::Converter(uno::Reference< uno::XComponentContext > const & xContext)
-: m_aConverter( createTCV(xContext) )
-, m_bConvertData(false)
-{
-}
-// -----------------------------------------------------------------------------
-static
-inline
-uno::Type getBinaryDataType()
-{
- uno::Sequence< sal_Int8 > const * const forBinary = 0;
- return ::getCppuType(forBinary);
-}
-// -----------------------------------------------------------------------------
-
-uno::Any LayerMergeHandler::Converter::convertValue(uno::Type const & _aTargetType, uno::Any const & _aValue)
-{
- OSL_ENSURE( m_bConvertData, "Unexpected: Calling convert data, when data conversion is not active");
- OSL_ENSURE( _aValue.hasValue(), "Unexpected: Calling convert data, when data to convert is VOID");
-
- if (_aTargetType == _aValue.getValueType()) return _aValue;
-
- m_aConverter.reset(_aTargetType);
-
- if (m_aConverter.isList())
- {
- uno::Sequence< rtl::OUString > aStringList;
- if (_aValue >>= aStringList)
- return m_aConverter.convertListToAny(aStringList);
- }
-
- rtl::OUString aContent;
- if (_aValue >>= aContent)
- return m_aConverter.convertToAny(aContent);
-
-
- OSL_ENSURE(false, "Cannot convert typed value (not a string)");
-
- return uno::Any();
-}
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
-namespace
-{
-// -----------------------------------------------------------------------------
- static inline bool isFinal(node::Attributes const& _aAttributes)
- {
- return _aAttributes.isFinalized() || _aAttributes.isReadonly();
- }
- // --------------------------------- AttributeSetter ---------------------------------
-
- class DefaultPromoter : NodeModification
- {
- public:
- explicit
- DefaultPromoter()
- {}
-
- void adjustAccess(INode& _rNode);
-
- using NodeModification::applyToNode;
- private:
- void handle(ValueNode& _rValueNode);
- void handle(ISubtree& _rSubtree);
- };
-// -----------------------------------------------------------------------------
-
- void DefaultPromoter::adjustAccess(INode& _rNode)
- {
- _rNode.promoteAccessToDefault();
- }
-// -----------------------------------------------------------------------------
-
- void DefaultPromoter::handle(ValueNode& _rValueNode)
- {
- _rValueNode.promoteToDefault();
- adjustAccess(_rValueNode);
- }
-// -----------------------------------------------------------------------------
-
- void DefaultPromoter::handle(ISubtree& _rSubtree)
- {
- _rSubtree.markAsDefault();
- this->applyToChildren(_rSubtree);
- adjustAccess(_rSubtree);
- }
-//--------------------------------------------------------------------------
-
-}
-// -----------------------------------------------------------------------------
-void promoteToDefault(MergedComponentData & _rTree)
-{
- if (ISubtree * pTreeData = _rTree.getSchemaTree())
- DefaultPromoter().applyToNode(*pTreeData);
-
- else
- OSL_ENSURE(false,"No Data to promote to default");
-
-}
-
-// -----------------------------------------------------------------------------
-// -----------------------------------------------------------------------------
- } // namespace backend
-
-// -------------------------------------------------------------------------
-} // namespace configmgr