1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _BUFFERNODE_HXX
25 #define _BUFFERNODE_HXX
26 
27 #include <com/sun/star/lang/XServiceInfo.hpp>
28 #include <com/sun/star/xml/wrapper/XXMLElementWrapper.hpp>
29 
30 #ifndef INCLUDED_VECTOR
31 #include <vector>
32 #define INCLUDED_VECTOR
33 #endif
34 
35 class ElementMark;
36 class ElementCollector;
37 
38 class BufferNode
39 /****** buffernode.hxx/CLASS BufferNode ***************************************
40  *
41  *   NAME
42  *	BufferNode -- Class to maintain the tree of bufferred elements
43  *
44  *   FUNCTION
45  *	One BufferNode object represents a bufferred element in the document
46  *	wrapper component.
47  *	All BufferNode objects construct a tree which has the same structure
48  *	of all bufferred elements. That is to say, if one bufferred element is
49  *	an ancestor of another bufferred element, then the corresponding
50  *	BufferNode objects are also in ancestor/descendant relationship.
51  *	This class is used to manipulate the tree of bufferred elements.
52  *
53  *   HISTORY
54  *	05.01.2004 -	implemented
55  *
56  *   AUTHOR
57  *	Michael Mi
58  *	Email: michael.mi@sun.com
59  ******************************************************************************/
60 {
61 private:
62 	/* the parent BufferNode */
63 	BufferNode* m_pParent;
64 
65 	/* all child BufferNodes */
66 	std::vector< const BufferNode* > m_vChildren;
67 
68 	/* all ElementCollector holding this BufferNode */
69 	std::vector< const ElementCollector* > m_vElementCollectors;
70 
71 	/*
72 	 * the blocker holding this BufferNode, one BufferNode can have one
73 	 * blocker at most
74 	 */
75 	ElementMark* m_pBlocker;
76 
77 	/*
78 	 * whether the element has completely bufferred by the document wrapper
79 	 * component
80 	 */
81 	bool m_bAllReceived;
82 
83 	/* the XMLElementWrapper of the bufferred element */
84 	com::sun::star::uno::Reference<
85 		com::sun::star::xml::wrapper::XXMLElementWrapper > m_xXMLElement;
86 
87 private:
88 	bool isECInSubTreeIncluded(sal_Int32 nIgnoredSecurityId) const;
89 	bool isECOfBeforeModifyInAncestorIncluded(sal_Int32 nIgnoredSecurityId) const;
90 	bool isBlockerInSubTreeIncluded(sal_Int32 nIgnoredSecurityId) const;
91 	const BufferNode* getNextChild(const BufferNode* pChild) const;
92 
93 public:
94 	explicit BufferNode(
95 		const com::sun::star::uno::Reference<
96 			com::sun::star::xml::wrapper::XXMLElementWrapper >& xXMLElement);
~BufferNode()97 	virtual ~BufferNode() {};
98 
99 	bool isECOfBeforeModifyIncluded(sal_Int32 nIgnoredSecurityId) const;
100         void setReceivedAll();
101         bool isAllReceived() const;
102 	void addElementCollector(const ElementCollector* pElementCollector);
103 	void removeElementCollector(const ElementCollector* pElementCollector);
104 	ElementMark* getBlocker() const;
105 	void setBlocker(const ElementMark* pBlocker);
106 	rtl::OUString printChildren() const;
107 	bool hasAnything() const;
108 	bool hasChildren() const;
109 	std::vector< const BufferNode* >* getChildren() const;
110 	const BufferNode* getFirstChild() const;
111 	void addChild(const BufferNode* pChild, sal_Int32 nPosition);
112 	void addChild(const BufferNode* pChild);
113 	void removeChild(const BufferNode* pChild);
114 	sal_Int32 indexOfChild(const BufferNode* pChild) const;
115 	const BufferNode* childAt(sal_Int32 nIndex) const;
116 	const BufferNode* getParent() const;
117 	void setParent(const BufferNode* pParent);
118 	const BufferNode* getNextSibling() const;
119 	const BufferNode* isAncestor(const BufferNode* pDescendant) const;
120 	bool isPrevious(const BufferNode* pFollowing) const;
121 	const BufferNode* getNextNodeByTreeOrder() const;
122 	com::sun::star::uno::Reference<
123 		com::sun::star::xml::wrapper::XXMLElementWrapper > getXMLElement() const;
124 	void setXMLElement(const com::sun::star::uno::Reference<
125 		com::sun::star::xml::wrapper::XXMLElementWrapper >& xXMLElement);
126 	void notifyBranch();
127 	void notifyAncestor();
128 	void elementCollectorNotify();
129 	void freeAllChildren();
130 };
131 
132 #endif
133 
134