18cc7695e0
2008/04/01 12:27:21 thb 1.6.130.2: #i85898# Stripping all external header guards 2008/03/31 12:22:42 rt 1.6.130.1: #i87441# Change license header to LPGL v3.
186 lines
7.2 KiB
C++
186 lines
7.2 KiB
C++
/*************************************************************************
|
|
*
|
|
* 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.7 $
|
|
*
|
|
* 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.
|
|
*
|
|
************************************************************************/
|
|
|
|
#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);
|
|
|
|
bool checkValidState() const;
|
|
private:
|
|
Name m_sNodeName;
|
|
NodeOffset m_nUsedPos;
|
|
TreeDepth m_nDepth;
|
|
};
|
|
//-------------------------------------------------------------------------
|
|
|
|
/** checks whether there are any immediate children of <var>aNode</var> (which is in <var>aTree</var>)
|
|
|
|
@return
|
|
<TRUE/> if a child node exists
|
|
<FALSE/> otherwise
|
|
*/
|
|
inline
|
|
bool hasChildOrElement(Tree const& aTree, AnyNodeRef const& aNode)
|
|
{ return aNode.isNode() && hasChildOrElement(aTree,aNode.toNode()); }
|
|
|
|
/** checks whether there is an immediate child of <var>aNode</var> (which is in <var>aTree</var>)
|
|
specified by <var>aName</var>
|
|
|
|
@return
|
|
<TRUE/> if the child node exists
|
|
<FALSE/> 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 <var>aNode</var> (which is in <var>aTree</var>)
|
|
specified by <var>aName</var>
|
|
<p> On return <var>aNode</var> is modified to refer to the node found and
|
|
<var>aTree</var> will then refer to the tree that node is in.
|
|
<p/>
|
|
|
|
@return The requested child node, if it exists
|
|
(then <var>aTree</var> refers to the tree containing the desired node),
|
|
*/
|
|
AnyNodeRef getChildOrElement(Tree& aTree, NodeRef const& aParentNode, Name const& aName);
|
|
|
|
/** tries to find the descendant of <var>aNode</var> specified by <var>aPath</var> within <var>aTree</var>
|
|
<p> This function follows the given path stepwise, until a requested node is missing in the tree.</p>
|
|
<p> On return <var>aNode</var> is modified to refer to the last inner node found
|
|
and <var>aTree</var> will be unchanged (except for deprecated usage).
|
|
<p/>
|
|
<p> Also, <var>aPath</var> is modified to contain the unresolved part of the original path.
|
|
</p>
|
|
|
|
@return the requested node, if the path could be resolved completely
|
|
(so <var>aNode</var> refers to the desired node or its parent,
|
|
and <var>aPath</var> is empty)<BR/>
|
|
an invalid node otherwise
|
|
*/
|
|
AnyNodeRef getLocalDescendant(Tree const& aTree, NodeRef const& aNode, RelativePath const& aPath);
|
|
|
|
/** tries to find the descendant of <var>aNode</var> (which is in <var>aTree</var>) specified by <var>aPath</var>
|
|
<p> This function follows the given path stepwise, until a requested node is missing in the tree.</p>
|
|
<p> On return <var>aNode</var> is modified to refer to the last inner node found and
|
|
<var>aTree</var> will then refer to the tree that node is in.
|
|
<p/>
|
|
<p> Also, <var>aPath</var> is modified to contain the unresolved part of the original path.
|
|
</p>
|
|
|
|
@return the requested node, if the path could be resolved completely
|
|
(so <var>aNode</var> and <var>aTree</var> refer to the desired node or its parent,
|
|
and <var>aPath</var> is empty)<BR/>
|
|
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_
|