/************************************************************************* * * 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: anynoderef.hxx,v $ * $Revision: 1.8 $ * * 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ #ifndef CONFIGMGR_CONFIGANYNODE_HXX_ #define CONFIGMGR_CONFIGANYNODE_HXX_ #include "noderef.hxx" namespace configmgr { namespace configapi { class Factory; } namespace node { struct Attributes; } namespace configuration { //------------------------------------------------------------------------- class Name; //------------------------------------------------------------------------- namespace argument { struct NoValidate; } typedef com::sun::star::uno::Type UnoType; typedef com::sun::star::uno::Any UnoAny; //------------------------------------------------------------------------- class NodeRef; class ValueRef; class AnyNodeRef; class NodeID; class Tree; class TreeImpl; typedef unsigned int NodeOffset; typedef unsigned int TreeDepth; //------------------------------------------------------------------------- /// represents any node in some tree class AnyNodeRef { public: /// constructs an empty (invalid) node AnyNodeRef(); /// converts an inner node explicit AnyNodeRef(NodeRef const& aInnerNode); /// converts a value node explicit AnyNodeRef(ValueRef const& aValueNode); /// copy a node (with reference semantics) AnyNodeRef(AnyNodeRef const& rOther); /// copy a node (with reference semantics) AnyNodeRef& operator=(AnyNodeRef const& rOther); void swap(AnyNodeRef& rOther); ~AnyNodeRef(); /// checks, if this represents an existing node inline bool isValid() const; /// checks if this a node (rather than a value only) bool isNode() const; /// converts this, if it is a value ValueRef toValue() const; /// converts this, if it is a inner node NodeRef toNode() const; private: friend class Tree; friend class TreeImplHelper; AnyNodeRef(NodeOffset nParentPos, TreeDepth m_nDepth); AnyNodeRef(Name const& aName, NodeOffset nParentPos); #if OSL_DEBUG_LEVEL > 0 bool checkValidState() const; #endif private: Name m_sNodeName; NodeOffset m_nUsedPos; TreeDepth m_nDepth; }; //------------------------------------------------------------------------- /** checks whether there is an immediate child of aNode (which is in aTree) specified by aName @return if the child node exists otherwise */ inline bool hasChildOrElement(Tree const& aTree, AnyNodeRef const& aNode, Name const& aName) { return aNode.isNode() && hasChildOrElement(aTree,aNode.toNode(),aName); } /** tries to find the immediate child of aNode (which is in aTree) specified by aName

On return aNode is modified to refer to the node found and aTree will then refer to the tree that node is in.

@return The requested child node, if it exists (then aTree refers to the tree containing the desired node), */ AnyNodeRef getChildOrElement(Tree& aTree, NodeRef const& aParentNode, Name const& aName); /** tries to find the descendant of aNode specified by aPath within aTree

This function follows the given path stepwise, until a requested node is missing in the tree.

On return aNode is modified to refer to the last inner node found and aTree will be unchanged (except for deprecated usage).

Also, aPath is modified to contain the unresolved part of the original path.

@return the requested node, if the path could be resolved completely (so aNode refers to the desired node or its parent, and aPath is empty)
an invalid node otherwise */ AnyNodeRef getLocalDescendant(Tree const& aTree, NodeRef const& aNode, RelativePath const& aPath); /** tries to find the descendant of aNode (which is in aTree) specified by aPath

This function follows the given path stepwise, until a requested node is missing in the tree.

On return aNode is modified to refer to the last inner node found and aTree will then refer to the tree that node is in.

Also, aPath is modified to contain the unresolved part of the original path.

@return the requested node, if the path could be resolved completely (so aNode and aTree refer to the desired node or its parent, and aPath is empty)
an invalid node otherwise */ AnyNodeRef getDeepDescendant(Tree& aTree, NodeRef& aNode, RelativePath& aPath); //------------------------------------------------------------------------- inline bool AnyNodeRef::isValid() const { OSL_ASSERT( m_nUsedPos == 0 || checkValidState() ); return m_nUsedPos != 0; } //------------------------------------------------------------------------- } } #endif // CONFIGMGR_CONFIGANYNODE_HXX_