summaryrefslogtreecommitdiff
path: root/configmgr/source/tree/builddata.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/source/tree/builddata.cxx')
-rw-r--r--configmgr/source/tree/builddata.cxx1137
1 files changed, 0 insertions, 1137 deletions
diff --git a/configmgr/source/tree/builddata.cxx b/configmgr/source/tree/builddata.cxx
deleted file mode 100644
index 9fc78aa7fc97..000000000000
--- a/configmgr/source/tree/builddata.cxx
+++ /dev/null
@@ -1,1137 +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: builddata.cxx,v $
- * $Revision: 1.14 $
- *
- * 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 "sal/types.h"
-
-#include "builddata.hxx"
-#include "nodevisitor.hxx"
-#include "node.hxx"
-#include "treefragment.hxx"
-#include "valuenode.hxx"
-#include "treenodefactory.hxx"
-#include "utility.hxx"
-
-#ifndef INCLUDED_CSTDDEF
-#include <cstddef>
-#define INCLUDED_CSTDDEF
-#endif
-#ifndef INCLUDED_ALGORITHM
-#include <algorithm>
-#define INCLUDED_ALGORITHM
-#endif
-#include <vector>
-
-namespace configmgr
-{
-//-----------------------------------------------------------------------------
- namespace data
- {
-//-----------------------------------------------------------------------------
-
- static
- inline
- sharable::Node * offsetNodeBy(sharable::Node * _aNode, sal_uInt16 _nOffset)
- {
- sharable::Node *pNode = _aNode;
- pNode += _nOffset;
- return (sharable::Node *)(pNode);
- }
-
- static
- inline
- sharable::Node * addressOfNodeAt(sharable::TreeFragment * _aTree, sal_uInt16 _nOffset)
- {
- sharable::TreeFragment *pRaw = _aTree;
- return &pRaw->nodes[_nOffset];
- }
-
-//-----------------------------------------------------------------------------
-
- class TreeNodeBuilder
- {
- sharable::TreeFragmentHeader m_header;
- std::vector< sharable::Node > m_nodes;
- sal_uInt16 m_parent;
- public:
- TreeNodeBuilder() : m_header(), m_nodes(), m_parent() {}
-
- sharable::TreeFragmentHeader & header() { return m_header; }
-
- sharable::Node & nodeAt(sal_uInt16 _pos) { checkOffset(_pos); return m_nodes[_pos]; }
- sharable::NodeInfo & nodeInfoAt(sal_uInt16 _pos) { checkOffset(_pos); return m_nodes[_pos].info; }
-
- sharable::Node & lastNode() { checkOffset(0); return m_nodes.back(); }
- sharable::NodeInfo & lastNodeInfo() { checkOffset(0); return m_nodes.back().info; }
-
- void resetTreeFragment(rtl_uString * _treeName, sal_uInt8 _state);
-
- sharable::TreeFragment * createTreeFragment();
-
- sal_uInt16 startGroup( rtl_uString * _aName, sal_uInt8 _aFlags );
- void endGroup( sal_uInt16 _nPos );
-
- void addSet( rtl_uString * _aName, sal_uInt8 _aFlags, sal_uInt8 * _aElementType );
-
- void addValue( rtl_uString * _aName, sal_uInt8 _aFlags,
- sal_uInt8 _aValueType,
- sharable::AnyData _aUserValue,
- sharable::AnyData _aDefaultName );
- public:
- class CollectSetElements;
- class LinkSetNodes;
-
- private:
- sharable::TreeFragment * allocTreeFragment();
- void linkTreeFragment(sharable::TreeFragment * _aTreeAddr);
-
- sal_uInt16 addNode(rtl_uString * _aName, sal_uInt8 _aFlags, sal_uInt8 _aType);
- void checkOffset(sal_uInt16 _pos);
- };
-//-----------------------------------------------------------------------------
-
- class TreeNodeBuilder::CollectSetElements
- {
- sharable::TreeFragment * m_head;
- public:
- explicit
- CollectSetElements() : m_head(NULL) {}
-
- void resetElementList();
- void addElement(sharable::TreeFragment * _aNewElement);
- sharable::TreeFragment * getElementListAndClear();
- };
-//-----------------------------------------------------------------------------
-
- class TreeNodeBuilder::LinkSetNodes: private SetVisitor {
- sharable::Node * m_parent;
- public:
- LinkSetNodes(): m_parent(0) {}
-
- void linkTree(sharable::TreeFragment * tree);
-
- private:
- using SetVisitor::handle;
-
- virtual bool handle(sharable::SetNode * node);
-
- virtual bool handle(sharable::TreeFragment * tree);
- };
-//-----------------------------------------------------------------------------
-
- class BasicDataTreeBuilder
- {
- public:
- explicit
- BasicDataTreeBuilder() {}
-
- sharable::TreeFragment * createTree() { return m_builder.createTreeFragment(); }
-
- protected:
- TreeNodeBuilder& builder() { return m_builder; }
- private:
- TreeNodeBuilder m_builder;
- };
-//-----------------------------------------------------------------------------
-
- class ConvertingDataTreeBuilder : private NodeAction, public BasicDataTreeBuilder
- {
- rtl::OUString m_sRootName;
- bool m_bWithDefaults;
- public:
- explicit
- ConvertingDataTreeBuilder() : BasicDataTreeBuilder() {}
-
- sharable::TreeFragment * buildTree(rtl::OUString const & _aTreeName, INode const& _aNode, bool _bWithDefault);
- sharable::TreeFragment * buildElement(INode const& _aNode, rtl::OUString const & _aTypeName, bool _bWithDefault);
- private:
- class ElementListBuilder;
-
- virtual void handle(ISubtree const & _aNode);
- virtual void handle(ValueNode const & _aNode);
-
- sal_uInt8 * makeTemplateData(rtl::OUString const & _aTemplateName, rtl::OUString const & _aTemplateModule);
-
- rtl_uString * allocName(INode const & _aNode);
- sal_uInt8 makeState(node::Attributes const & _aAttributes);
- sal_uInt8 makeFlags(node::Attributes const & _aAttributes);
- };
-//-----------------------------------------------------------------------------
-
- class ConvertingDataTreeBuilder::ElementListBuilder : private NodeAction
- {
- TreeNodeBuilder::CollectSetElements m_aCollector;
-
- rtl::OUString m_sTypeName;
- bool m_bWithDefaults;
- public:
- explicit
- ElementListBuilder()
- : m_aCollector()
- , m_sTypeName()
- , m_bWithDefaults()
- {}
-
- sharable::TreeFragment *buildElementList(ISubtree const & _aSet, bool _bWithDefaults);
- private:
- void handleNode(INode const & _aSourceNode);
-
- void handle(ValueNode const & _aSourceNode);
- void handle(ISubtree const & _aSourceNode);
- };
-//-----------------------------------------------------------------------------
-
- class CopyingDataTreeBuilder : private NodeVisitor, public BasicDataTreeBuilder
- {
- public:
- explicit
- CopyingDataTreeBuilder() : BasicDataTreeBuilder() {}
-
- sharable::TreeFragment * buildTree(sharable::TreeFragment * sourceTree);
-
- private:
- class ElementListBuilder;
-
- using NodeVisitor::handle;
- virtual bool handle(sharable::ValueNode * node);
- virtual bool handle(sharable::GroupNode * node);
- virtual bool handle(sharable::SetNode * node);
-
- sal_uInt8 * makeTemplateData(sal_uInt8 * _aSourceTemplate);
- };
-//-----------------------------------------------------------------------------
-
- class CopyingDataTreeBuilder::ElementListBuilder : private SetVisitor
- {
- TreeNodeBuilder::CollectSetElements m_aCollector;
- public:
- explicit
- ElementListBuilder() : m_aCollector() {}
-
- sharable::TreeFragment * buildElementList(sharable::SetNode * set);
-
- private:
- using SetVisitor::handle;
- virtual bool handle(sharable::TreeFragment * tree);
- };
-//-----------------------------------------------------------------------------
-
- class ConvertingNodeBuilder : private NodeVisitor
- {
- OTreeNodeFactory & m_rNodeFactory;
-
- std::auto_ptr<INode> m_pNode;
- public:
- ConvertingNodeBuilder(OTreeNodeFactory & _rNodeFactory)
- : m_rNodeFactory(_rNodeFactory)
- , m_pNode()
- {
- }
-
- std::auto_ptr<INode> buildNode(sharable::TreeFragment * tree, bool _bUseTreeName);
- std::auto_ptr<INode> buildNode(sharable::Node * tree);
-
- std::auto_ptr<ISubtree> buildNodeTree(sharable::GroupNode * groupNode) const;
- std::auto_ptr<ISubtree> buildNodeTree(sharable::SetNode * setNode) const;
- std::auto_ptr<ValueNode> buildNodeTree(sharable::ValueNode * valueNode) const
- { return convertNode(valueNode); }
-
- static node::Attributes convertAttributes(sharable::Node * node)
- { return node->getAttributes(); }
-
- private:
- std::auto_ptr<ISubtree> convertNode(sharable::GroupNode * groupNode) const;
- std::auto_ptr<ISubtree> convertNode(sharable::SetNode * setNode) const;
- std::auto_ptr<ValueNode> convertNode(sharable::ValueNode * valueNode) const;
-
- using NodeVisitor::handle;
- virtual bool handle(sharable::ValueNode * node);
- virtual bool handle(sharable::GroupNode * node);
- virtual bool handle(sharable::SetNode * node);
- };
-//-----------------------------------------------------------------------------
-
- class ConvertingSubnodeBuilder : private SetVisitor
- {
- ConvertingNodeBuilder m_aSubnodeBuilder;
- ISubtree & m_rParentNode;
- public:
- ConvertingSubnodeBuilder(OTreeNodeFactory & _rNodeFactory, ISubtree & _rParentNode)
- : m_aSubnodeBuilder(_rNodeFactory)
- , m_rParentNode(_rParentNode)
- {
- }
-
- void addElements(sharable::SetNode * set) { visitElements(set); }
- void addChildren(sharable::GroupNode * group) { visitChildren(group); }
-
- private:
- using SetVisitor::handle;
- virtual bool handle(sharable::Node * node);
- virtual bool handle(sharable::TreeFragment * tree);
- };
-//-----------------------------------------------------------------------------
-
- class DataTreeDefaultMerger : private NodeAction
- {
- public:
- explicit
- DataTreeDefaultMerger() {}
-
- void mergeDefaults(sharable::TreeFragment * _aBaseAddress, INode const& _aDefaultNode);
- private:
- void handle(ValueNode const & _aNode);
- void handle(ISubtree const & _aNode);
- };
-
-//-----------------------------------------------------------------------------
-
- class DataTreeCleanup
- {
- public:
- explicit
- DataTreeCleanup() {}
-
- sharable::TreeFragment * destroyTree(sharable::TreeFragment * _aBaseAddress);
- private:
- void destroyNode(sharable::Node * _aNodeAddress);
-
- void destroyData(sharable::TreeFragmentHeader * _pHeader);
- void destroyData(sharable::NodeInfo * _pNodeInfo);
-
- void destroyData(sharable::GroupNode * _pNode);
- void destroyData(sharable::ValueNode * _pNode);
- void destroyData(sharable::SetNode * _pNode);
- };
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-sharable::TreeFragment * buildTree(sharable::TreeFragment * tree)
-{
- return CopyingDataTreeBuilder().buildTree(tree);
-}
-//-----------------------------------------------------------------------------
-
-sharable::TreeFragment * buildTree(rtl::OUString const & _aTreeName, INode const& _aNode, bool _bWithDefaults)
-{
- ConvertingDataTreeBuilder aBuilder;
-
- sharable::TreeFragment * aResult = aBuilder.buildTree(_aTreeName, _aNode,_bWithDefaults);
-
- return aResult;
-}
-//-----------------------------------------------------------------------------
-
-sharable::TreeFragment * buildElementTree(INode const& _aNode, rtl::OUString const & _aTypeName, bool _bWithDefaults)
-{
- ConvertingDataTreeBuilder aBuilder;
-
- sharable::TreeFragment * aResult = aBuilder.buildElement(_aNode, _aTypeName, _bWithDefaults);
-
- return aResult;
-}
-//-----------------------------------------------------------------------------
-
-void mergeDefaults(sharable::TreeFragment * _aBaseAddress, INode const& _aDefaultNode)
-{
- DataTreeDefaultMerger aMergeHelper;
-
- aMergeHelper.mergeDefaults(_aBaseAddress, _aDefaultNode);
-}
-//-----------------------------------------------------------------------------
-
-void destroyTree(sharable::TreeFragment * _aBaseAddress)
-{
- DataTreeCleanup aCleaner;
-
- aCleaner.destroyTree(_aBaseAddress);
-}
-//-----------------------------------------------------------------------------
-
-std::auto_ptr<INode> convertTree(sharable::TreeFragment * tree, bool _bUseTreeName)
-{
- ConvertingNodeBuilder aBuilder( configmgr::getDefaultTreeNodeFactory() );
-
- return aBuilder.buildNode(tree, _bUseTreeName);
-}
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-inline
-void TreeNodeBuilder::CollectSetElements::resetElementList()
-{
- OSL_ENSURE(m_head == NULL, "Joining to a element list that was forgotten");
-}
-//-----------------------------------------------------------------------------
-
-inline
-sharable::TreeFragment * TreeNodeBuilder::CollectSetElements::getElementListAndClear()
-{
- sharable::TreeFragment * aResult = m_head;
- m_head = NULL;
- return aResult;
-}
-//-----------------------------------------------------------------------------
-
-void TreeNodeBuilder::CollectSetElements::addElement(sharable::TreeFragment * _aNewElement)
-{
- if (sharable::TreeFragment * pNewFragment = _aNewElement)
- {
- pNewFragment->header.parent = 0; // data not available here
- pNewFragment->header.next = m_head;
-
- m_head = _aNewElement;
- }
- else
- OSL_ENSURE(false, "Cannot add NULL element");
-}
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-void TreeNodeBuilder::LinkSetNodes::linkTree(sharable::TreeFragment * tree) {
- sharable::Node * old = m_parent;
- m_parent = 0;
- sal_uInt16 n = tree->header.count;
- for (sal_uInt16 i = 0; i < n; ++i) {
- if (visitNode(tree->nodes + i)) {
- break;
- }
- }
- m_parent = old;
-}
-
-bool TreeNodeBuilder::LinkSetNodes::handle(sharable::SetNode * node)
-{
- OSL_ASSERT(m_parent == 0);
- m_parent = sharable::node(node);
- bool done = visitElements(node);
- m_parent = 0;
- return done;
-}
-
-bool TreeNodeBuilder::LinkSetNodes::handle(sharable::TreeFragment * tree)
-{
- OSL_ASSERT(m_parent != 0);
- tree->header.parent = m_parent;
- return false;
-}
-
-//-----------------------------------------------------------------------------
-
-inline void TreeNodeBuilder::checkOffset(sal_uInt16 _pos)
-{
- { (void)_pos; }
- OSL_ENSURE(_pos < m_nodes.size(), "TreeNodeBuilder: Node access past end.");
-}
-//-----------------------------------------------------------------------------
-
-sal_uInt16 TreeNodeBuilder::addNode(rtl_uString * _aName, sal_uInt8 _aFlags, sal_uInt8 _aType)
-{
- OSL_PRECOND(_aName, "TreeNodeBuilder: Unexpected NULL name");
-
- // TODO: consistencı checks for flags
- OSL_ENSURE(m_nodes.size() == m_header.count, "TreeNodeBuilder: node count mismatch");
-
- sal_uInt16 nNewOffset = m_header.count++;
-
- m_nodes.push_back( sharable::Node() );
-
- OSL_ASSERT( &lastNode() == &nodeAt(nNewOffset) );
-
- sharable::NodeInfo & rInfo = lastNode().info;
-
- rInfo.name = _aName;
- rInfo.flags = _aFlags;
- rInfo.type = _aType;
-
- OSL_ENSURE( m_parent <= nNewOffset, "ERROR - TreeNodeBuilder: invalid parent");
- OSL_ENSURE( (nNewOffset == 0) == (nNewOffset == m_parent), "ERROR - TreeNodeBuilder: node is own parent");
-
- rInfo.parent = nNewOffset - m_parent;
-
- return nNewOffset;
-}
-//-----------------------------------------------------------------------------
-
-void TreeNodeBuilder::resetTreeFragment(rtl_uString * _name, sal_uInt8 _state)
-{
- m_header.next = 0;
- m_header.name = _name;
-
- m_header.parent = 0;
-
- m_header.count = 0;
- m_header.state = _state;
-
- m_nodes.clear();
- m_parent = 0;
-}
-//-----------------------------------------------------------------------------
-
-sharable::TreeFragment * TreeNodeBuilder::allocTreeFragment()
-{
- OSL_ENSURE(m_nodes.size() == m_header.count, "TreeNodeBuilder: node count mismatch");
-
- sharable::TreeFragment *pFragment = sharable::TreeFragment::allocate(m_header.count);
- pFragment->header = m_header;
- std::copy(m_nodes.begin(),m_nodes.end(),pFragment->nodes);
-
- return (sharable::TreeFragment *)( pFragment );
-}
-//-----------------------------------------------------------------------------
-
-void TreeNodeBuilder::linkTreeFragment(sharable::TreeFragment * _aTreeFragment)
-{
- LinkSetNodes().linkTree(_aTreeFragment);
-}
-//-----------------------------------------------------------------------------
-
-sharable::TreeFragment * TreeNodeBuilder::createTreeFragment()
-{
- sharable::TreeFragment * aResult = allocTreeFragment();
-
- if (aResult != NULL)
- {
- linkTreeFragment(aResult);
-
- m_nodes.clear(); // ownership of indirect data has gone ...
- }
- return aResult;
-}
-//-----------------------------------------------------------------------------
-
-sal_uInt16 TreeNodeBuilder::startGroup( rtl_uString * _aName, sal_uInt8 _aFlags )
-{
- sal_uInt16 nNewIndex = addNode(_aName,_aFlags,Type::nodetype_group);
-
- lastNode().group.numDescendants = 0;
-
- m_parent = nNewIndex;
-
- return nNewIndex;
-}
-//-----------------------------------------------------------------------------
-
-void TreeNodeBuilder::endGroup( sal_uInt16 _nPos )
-{
- // while (_nPos < m_parent) endGroup(m_parent);
- OSL_PRECOND(_nPos == m_parent, "TreeNodeBuilder: Group being closed is not the current parent");
-
- OSL_ENSURE(nodeAt(_nPos).isGroup(), "TreeNodeBuilder: Group being closed is not a group");
-
- OSL_ENSURE(m_nodes.size() == m_header.count, "TreeNodeBuilder: node count mismatch");
-
- sharable::GroupNode & rGroup = nodeAt(_nPos).group;
-
- rGroup.numDescendants = sal_uInt16( m_nodes.size() - static_cast< ::std::size_t >(_nPos) - 1 );
- m_parent = m_parent - rGroup.info.parent;
-}
-//-----------------------------------------------------------------------------
-
-void TreeNodeBuilder::addSet( rtl_uString * _aName, sal_uInt8 _aFlags, sal_uInt8 * _aElementType )
-{
- addNode(_aName,_aFlags,Type::nodetype_set);
-
- lastNode().set.elementType = _aElementType;
- lastNode().set.elements = 0;
-}
-
-//-----------------------------------------------------------------------------
-
-void TreeNodeBuilder::addValue( rtl_uString * _aName, sal_uInt8 _aFlags,
- sal_uInt8 _aValueType,
- sharable::AnyData _aUserValue,
- sharable::AnyData _aDefaultValue )
-{
- OSL_PRECOND(_aValueType == (_aValueType & Type::mask_valuetype), "TreeNodeBuilder: invalid value type");
-
- addNode(_aName,_aFlags,sal_uInt8(Type::nodetype_value | _aValueType));
-
- lastNode().value.value = _aUserValue;
- lastNode().value.defaultValue = _aDefaultValue;
-}
-//-----------------------------------------------------------------------------
-
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-sharable::TreeFragment * CopyingDataTreeBuilder::buildTree(sharable::TreeFragment * sourceTree)
-{
- OSL_ENSURE(sourceTree != 0, "Trying to build a tree from NULL data");
-
- rtl_uString * aTreeName = acquireString( sourceTree->getName());
- this->builder().resetTreeFragment(aTreeName, sourceTree->header.state);
-
- this->visitNode(sourceTree->getRootNode());
-
- return this->createTree();
-}
-//-----------------------------------------------------------------------------
-
-bool CopyingDataTreeBuilder::handle(sharable::ValueNode * node)
-{
- rtl_uString * aNodeName = acquireString( node->info.getName());
- sal_uInt8 aFlags = node->info.flags;
-
- sal_uInt8 aType = sal_uInt8( node->info.type & Type::mask_valuetype );
-
- sharable::AnyData aNewValue, aNewDefault;
- if (aFlags & Flags::valueAvailable)
- aNewValue = sharable::allocData(aType, node->getUserValue());
- else
- aNewValue.data = 0;
-
- if (aFlags & Flags::defaultAvailable)
- aNewDefault = sharable::allocData(aType, node->getDefaultValue());
- else
- aNewDefault.data = 0;
-
- this->builder().addValue(aNodeName,aFlags,aType,aNewValue,aNewDefault);
-
- return false;
-}
-//-----------------------------------------------------------------------------
-
-bool CopyingDataTreeBuilder::handle(sharable::GroupNode * node)
-{
- rtl_uString * aNodeName = acquireString( node->info.getName());
- sal_uInt8 aFlags = node->info.flags;
-
- sal_uInt16 nGroupOffset = this->builder().startGroup(aNodeName,aFlags);
- this->visitChildren(node);
- this->builder().endGroup(nGroupOffset);
-
- return false;
-}
-//-----------------------------------------------------------------------------
-
-bool CopyingDataTreeBuilder::handle(sharable::SetNode * node)
-{
- rtl_uString * aNodeName = acquireString( node->info.getName());
- sal_uInt8 aFlags = node->info.flags;
- sal_uInt8 * aTemplate = this->makeTemplateData(node->elementType);
-
- this->builder().addSet(aNodeName,aFlags,aTemplate);
-
- OSL_ASSERT( this->builder().lastNode().isSet() );
- sharable::SetNode& _aNewSet = this->builder().lastNode().set;
-
- _aNewSet.elements = ElementListBuilder().buildElementList(node);
-
- return false;
-}
-//-----------------------------------------------------------------------------
-
-sal_uInt8 * CopyingDataTreeBuilder::makeTemplateData(sal_uInt8 * _aSourceTemplate)
-{
- return sharable::SetNode::copyTemplateData(_aSourceTemplate);
-}
-//-----------------------------------------------------------------------------
-
-sharable::TreeFragment * CopyingDataTreeBuilder::ElementListBuilder::buildElementList(sharable::SetNode * set)
-{
- OSL_ASSERT(set != 0);
-
- m_aCollector.resetElementList();
-
- this->visitElements(set);
-
- return m_aCollector.getElementListAndClear();
-}
-//-----------------------------------------------------------------------------
-
-bool CopyingDataTreeBuilder::ElementListBuilder::handle(sharable::TreeFragment * tree)
-{
- sharable::TreeFragment * aNewElement = CopyingDataTreeBuilder().buildTree(tree);
-
- m_aCollector.addElement(aNewElement);
-
- return false;
-}
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-rtl_uString * ConvertingDataTreeBuilder::allocName(INode const & _aNode)
-{
- rtl::OUString sNextName = _aNode.getName();
-
- if (m_sRootName.getLength())
- {
- sNextName = m_sRootName;
- m_sRootName = rtl::OUString();
- }
-
- return acquireString( sNextName);
-}
-//-----------------------------------------------------------------------------
-
-sharable::TreeFragment * ConvertingDataTreeBuilder::buildElement(INode const& _aNode, rtl::OUString const & _aTypeName, bool _bWithDefaults)
-{
- m_sRootName = _aTypeName;
- m_bWithDefaults = _bWithDefaults;
-
- rtl_uString * aTreeName = acquireString( _aNode.getName());
- this->builder().resetTreeFragment(aTreeName, makeState(_aNode.getAttributes()));
-
-
- this->applyToNode(_aNode);
-
- return this->createTree();
-}
-//-----------------------------------------------------------------------------
-
-sharable::TreeFragment * ConvertingDataTreeBuilder::buildTree(rtl::OUString const & _aTreeName, INode const& _aNode, bool _bWithDefaults)
-{
- m_sRootName = rtl::OUString();
- m_bWithDefaults = _bWithDefaults;
-
- rtl_uString * aTreeName = acquireString( _aTreeName );
- this->builder().resetTreeFragment(aTreeName, makeState(_aNode.getAttributes()));
-
-
- this->applyToNode(_aNode);
-
- return this->createTree();
-}
-//-----------------------------------------------------------------------------
-
-void ConvertingDataTreeBuilder::handle(ISubtree const & _aNode)
-{
- rtl_uString * aNodeName = allocName( _aNode );
- sal_uInt8 aFlags = makeFlags(_aNode.getAttributes());
-
- if (_aNode.isSetNode())
- {
- sal_uInt8 * aTemplate = this->makeTemplateData(_aNode.getElementTemplateName(),
- _aNode.getElementTemplateModule());
-
- this->builder().addSet(aNodeName,aFlags,aTemplate);
-
- OSL_ASSERT( this->builder().lastNode().isSet() );
- sharable::SetNode& _aNewSet = this->builder().lastNode().set;
-
- _aNewSet.elements = ElementListBuilder().buildElementList(_aNode, m_bWithDefaults);
- }
- else
- {
- sal_uInt16 nGroupOffset = this->builder().startGroup(aNodeName,aFlags);
- this->applyToChildren(_aNode);
- this->builder().endGroup(nGroupOffset);
- }
-}
-//-----------------------------------------------------------------------------
-
-void ConvertingDataTreeBuilder::handle(ValueNode const & _aNode)
-{
- rtl_uString * aNodeName = allocName( _aNode );
- sal_uInt8 aFlags = makeFlags(_aNode.getAttributes());
-
- sal_uInt8 aType = sharable::getTypeCode(_aNode.getValueType());
-
- sharable::AnyData aNewValue; aNewValue.data = 0;
- sharable::AnyData aNewDefault; aNewDefault.data = 0;
-
- OSL_ASSERT( !(aFlags & (Flags::valueAvailable | Flags::defaultAvailable)) );
-
- if (!_aNode.isDefault())
- {
- uno::Any aValue = _aNode.getValue();
- if (aValue.hasValue())
- {
- aNewValue = sharable::allocData(aType, aValue);
- aFlags |= Flags::valueAvailable;
- }
- }
-
- if (_aNode.hasUsableDefault())
- {
- uno::Any aDefault = _aNode.getDefault();
- if (aDefault.hasValue())
- {
- aNewDefault = sharable::allocData(aType, aDefault);
- aFlags |= Flags::defaultAvailable;
- }
- }
-
- this->builder().addValue(aNodeName,aFlags,aType,aNewValue,aNewDefault);
-}
-//-----------------------------------------------------------------------------
-
-sal_uInt8 ConvertingDataTreeBuilder::makeState(node::Attributes const & _aAttributes)
-{
- sal_uInt8 state;
-
- switch (_aAttributes.state())
- {
- case node::isDefault: state = State::defaulted; m_bWithDefaults = true; break;
- case node::isMerged: state = State::merged; break;
- case node::isReplaced: state = State::replaced; m_bWithDefaults = false; break;
- case node::isAdded: state = State::added; m_bWithDefaults = false; break;
-
- default: OSL_ASSERT(false); state = 0; break;
- }
-
- if (_aAttributes.isReadonly())
- state |= State::flag_readonly;
- //Map mandatory and Removable
- if (_aAttributes.isMandatory())
- state |= State::flag_mandatory;
-
- if (_aAttributes.isRemovable())
- state |= State::flag_removable;
-
- if ( m_bWithDefaults )
- state |= State::flag_default_avail;
-
- return state;
-}
-//-----------------------------------------------------------------------------
-
-sal_uInt8 ConvertingDataTreeBuilder::makeFlags(node::Attributes const & _aAttributes)
-{
- sal_uInt8 flags = 0;
-
- if ( _aAttributes.isReadonly())
- flags |= Flags::readonly;
-
- if ( _aAttributes.isFinalized())
- flags |= Flags::finalized;
-
- if ( _aAttributes.isNullable())
- flags |= Flags::nullable;
-
- if ( _aAttributes.isLocalized())
- flags |= Flags::localized;
-
- if (_aAttributes.isDefault())
- flags |= Flags::defaulted; // somewhat redundant with State
-
- if (!_aAttributes.isReplacedForUser())
- flags |= Flags::defaultable; // redundant with State (merged || defaulted)
-
- return flags;
-}
-//-----------------------------------------------------------------------------
-
-sal_uInt8 * ConvertingDataTreeBuilder::makeTemplateData(rtl::OUString const & _aTemplateName, rtl::OUString const & _aTemplateModule)
-{
- return sharable::SetNode::allocTemplateData(_aTemplateName, _aTemplateModule );
-}
-//-----------------------------------------------------------------------------
-
-sharable::TreeFragment * ConvertingDataTreeBuilder::ElementListBuilder::buildElementList(ISubtree const & _aSet, bool _bWithDefaults)
-{
- OSL_PRECOND(_aSet.isSetNode(), "Node must be a set");
-
- m_aCollector.resetElementList();
-
- m_sTypeName = _aSet.getElementTemplateName();
- m_bWithDefaults = _bWithDefaults;
-
- this->applyToChildren(_aSet);
-
- return m_aCollector.getElementListAndClear();
-}
-//-----------------------------------------------------------------------------
-
-void ConvertingDataTreeBuilder::ElementListBuilder::handleNode(INode const & _aSourceNode)
-{
- sharable::TreeFragment * aNewElement = ConvertingDataTreeBuilder()
- .buildElement(_aSourceNode,m_sTypeName,m_bWithDefaults);
-
- m_aCollector.addElement(aNewElement);
-}
-//-----------------------------------------------------------------------------
-
-void ConvertingDataTreeBuilder::ElementListBuilder::handle(ValueNode const & _aSourceNode)
-{
- handleNode(_aSourceNode);
-}
-//-----------------------------------------------------------------------------
-
-void ConvertingDataTreeBuilder::ElementListBuilder::handle(ISubtree const & _aSourceNode)
-{
- handleNode(_aSourceNode);
-}
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-std::auto_ptr<INode> ConvertingNodeBuilder::buildNode(sharable::TreeFragment * sourceTree, bool _bUseTreeName)
-{
- std::auto_ptr<INode> pResult = this->buildNode(sourceTree == 0 ? 0 : sourceTree->getRootNode());
- if (pResult.get() != NULL)
- {
- // use the element name !
- if (_bUseTreeName) pResult->setName( sourceTree->getName() );
-
- // do something about attributes here ?
- }
- return pResult;
-}
-//-----------------------------------------------------------------------------
-
-std::auto_ptr<INode> ConvertingNodeBuilder::buildNode(sharable::Node * sourceNode)
-{
- OSL_ENSURE( !m_pNode.get(), "Old node tree will be dropped");
- visitNode(sourceNode);
- return m_pNode;
-}
-//-----------------------------------------------------------------------------
-
-std::auto_ptr<ISubtree> ConvertingNodeBuilder::buildNodeTree(sharable::GroupNode * groupNode) const
-{
- std::auto_ptr<ISubtree> pResult = convertNode(groupNode);
-
- if (pResult.get() != NULL)
- {
- ConvertingSubnodeBuilder aCollector(m_rNodeFactory, *pResult);
- aCollector.addChildren(groupNode);
- }
-
- return pResult;
-}
-//-----------------------------------------------------------------------------
-
-std::auto_ptr<ISubtree> ConvertingNodeBuilder::buildNodeTree(sharable::SetNode * setNode) const
-{
- std::auto_ptr<ISubtree> pResult = convertNode(setNode);
-
- if (pResult.get() != NULL)
- {
- ConvertingSubnodeBuilder aCollector(m_rNodeFactory, *pResult);
- aCollector.addElements(setNode);
- }
-
- return pResult;
-}
-//-----------------------------------------------------------------------------
-
-std::auto_ptr<ISubtree> ConvertingNodeBuilder::convertNode(sharable::GroupNode * groupNode) const
-{
- return m_rNodeFactory.createGroupNode( groupNode->info.getName(),
- convertAttributes(sharable::node(groupNode)));
-}
-//-----------------------------------------------------------------------------
-
-std::auto_ptr<ISubtree> ConvertingNodeBuilder::convertNode(sharable::SetNode * setNode) const
-{
- return m_rNodeFactory.createSetNode(setNode->info.getName(),
- setNode->getElementTemplateName(),
- setNode->getElementTemplateModule(),
- convertAttributes(sharable::node(setNode)));
-}
-//-----------------------------------------------------------------------------
-
-std::auto_ptr<ValueNode> ConvertingNodeBuilder::convertNode(sharable::ValueNode * valueNode) const
-{
- uno::Any aUserValue = valueNode->getUserValue();
- uno::Any aDefValue = valueNode->getDefaultValue();
-
- if (aUserValue.hasValue() || aDefValue.hasValue())
- {
- return m_rNodeFactory.createValueNode(valueNode->info.getName(),
- aUserValue, aDefValue,
- convertAttributes(sharable::node(valueNode)));
- }
- else
- {
- return m_rNodeFactory.createNullValueNode(valueNode->info.getName(),
- valueNode->getValueType(),
- convertAttributes(sharable::node(valueNode)));
- }
-}
-//-----------------------------------------------------------------------------
-
-bool ConvertingNodeBuilder::handle(sharable::ValueNode * node)
-{
- m_pNode = base_ptr(buildNodeTree(node));
- return true;
-}
-//-----------------------------------------------------------------------------
-
-bool ConvertingNodeBuilder::handle(sharable::GroupNode * node)
-{
- m_pNode = base_ptr(buildNodeTree(node));
- return true;
-}
-//-----------------------------------------------------------------------------
-
-bool ConvertingNodeBuilder::handle(sharable::SetNode * node)
-{
- m_pNode = base_ptr(buildNodeTree(node));
- return true;
-}
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-bool ConvertingSubnodeBuilder::handle(sharable::TreeFragment * tree)
-{
- OSL_ASSERT(m_rParentNode.isSetNode());
- m_rParentNode.addChild(m_aSubnodeBuilder.buildNode(tree, true));
- return false;
-}
-//-----------------------------------------------------------------------------
-
-bool ConvertingSubnodeBuilder::handle(sharable::Node * node)
-{
- OSL_ASSERT(!m_rParentNode.isSetNode());
- m_rParentNode.addChild(m_aSubnodeBuilder.buildNode(node));
- return false;
-}
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-void DataTreeDefaultMerger::mergeDefaults(sharable::TreeFragment * /*_aBaseAddress*/, INode const& /*_aDefaultNode*/)
-{
-}
-//-----------------------------------------------------------------------------
-
-void DataTreeDefaultMerger::handle(ISubtree const & /*_aNode*/)
-{
-}
-//-----------------------------------------------------------------------------
-
-void DataTreeDefaultMerger::handle(ValueNode const & /*_aNode*/)
-{
-}
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-sharable::TreeFragment * DataTreeCleanup::destroyTree(sharable::TreeFragment * _aBaseAddress)
-{
- sharable::TreeFragment *pData = _aBaseAddress;
-
- sharable::TreeFragment *pNext = pData->header.next;
-
- sal_uInt16 const nCount = pData->header.count;
-
- destroyData( & pData->header );
-
- for (sal_uInt16 i = 0; i< nCount; ++i)
- {
- destroyNode( addressOfNodeAt(_aBaseAddress,i) );
- }
-
- sharable::TreeFragment::free_shallow( pData );
-
- return (sharable::TreeFragment *)( pNext );
-}
-//-----------------------------------------------------------------------------
-
-void DataTreeCleanup::destroyNode(sharable::Node * _aNodeAddress)
-{
- sharable::Node * pNode = _aNodeAddress;
-
- sal_uInt8 aTypeTag = pNode->info.type;
- switch ( aTypeTag & Type::mask_nodetype )
- {
- case Type::nodetype_group:
- destroyData( &pNode->group );
- break;
- case Type::nodetype_value:
- destroyData( &pNode->value );
- break;
- case Type::nodetype_set:
- destroyData( &pNode->set );
- break;
- default:
- OSL_ENSURE(false, "Cannot destroy node: Invalid type tag in node");
- break;
- }
-}
-//-----------------------------------------------------------------------------
-
-void DataTreeCleanup::destroyData(sharable::TreeFragmentHeader * _pHeader)
-{
- // 'component' is owned elsewhere -> leave alone
-
- rtl_uString * aName = _pHeader->name;
-
- rtl_uString_release( aName );
-}
-//-----------------------------------------------------------------------------
-
-void DataTreeCleanup::destroyData(sharable::NodeInfo * _pNodeInfo)
-{
- rtl_uString * aName = _pNodeInfo->name;
-
- if (aName) rtl_uString_release( aName );
-}
-//-----------------------------------------------------------------------------
-
-void DataTreeCleanup::destroyData(sharable::SetNode * _pNode)
-{
- sharable::TreeFragment * aElement( _pNode->elements );
-
- sal_uInt8 * aTemplate = _pNode->elementType;;
-
- destroyData(&_pNode->info);
-
- while (aElement != NULL)
- aElement = destroyTree(aElement);
-
- sharable::SetNode::releaseTemplateData( aTemplate );
-}
-//-----------------------------------------------------------------------------
-
-void DataTreeCleanup::destroyData(sharable::GroupNode * _pNode)
-{
- destroyData(&_pNode->info);
- // nothing more to do
-}
-//-----------------------------------------------------------------------------
-
-void DataTreeCleanup::destroyData(sharable::ValueNode * _pNode)
-{
- sal_uInt8 aValueType = sal_uInt8( _pNode->info.type & Type::mask_valuetype );
- sal_uInt8 aFlags = _pNode->info.flags;
-
- destroyData(&_pNode->info);
-
- if (aFlags & Flags::valueAvailable)
- freeData( aValueType, _pNode->value );
-
- if (aFlags & Flags::defaultAvailable)
- freeData( aValueType, _pNode->defaultValue );
-
-}
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
- //-------------------------------------------------------------------------
- }
-//-----------------------------------------------------------------------------
-} // namespace configmgr
-
-