1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_xmlsecurity.hxx"
30 
31 #include "elementmark.hxx"
32 #include "elementcollector.hxx"
33 #include "buffernode.hxx"
34 #include <com/sun/star/xml/crypto/sax/ConstOfSecurityId.hpp>
35 
36 namespace cssu = com::sun::star::uno;
37 namespace cssxc = com::sun::star::xml::crypto;
38 
39 ElementCollector::ElementCollector(
40 	sal_Int32 nSecurityId,
41 	sal_Int32 nBufferId,
42 	cssxc::sax::ElementMarkPriority nPriority,
43 	bool bToModify,
44 	const com::sun::star::uno::Reference<
45 		com::sun::star::xml::crypto::sax::XReferenceResolvedListener >&
46 		xReferenceResolvedListener)
47 	:ElementMark(nSecurityId, nBufferId),
48 	 m_nPriority(nPriority),
49 	 m_bToModify(bToModify),
50  	 m_bAbleToNotify(false),
51  	 m_bNotified(false),
52 	 m_xReferenceResolvedListener(xReferenceResolvedListener)
53 /****** ElementCollector/ElementCollector *************************************
54  *
55  *   NAME
56  *	ElementCollector -- constructor method
57  *
58  *   SYNOPSIS
59  *	ElementCollector(nSecurityId, nBufferId, nPriority, bToModify
60  *	                 xReferenceResolvedListener);
61  *
62  *   FUNCTION
63  *	construct an ElementCollector object.
64  *
65  *   INPUTS
66  *	nSecurityId - 	represents which security entity the buffer node is
67  *			related with. Either a signature or an encryption is
68  *			a security entity.
69  *	nBufferId -	the id of the element bufferred in the document
70  *			wrapper component. The document wrapper component
71  *			uses this id to search the particular bufferred
72  *			element.
73  *	nPriority -	the priority value. ElementCollector with lower
74  *			priority value can't notify until all ElementCollectors
75  *			with higher priority value have notified.
76  *	bToModify -	A flag representing whether this ElementCollector
77  *			notification will cause the modification of its working
78  *	                element.
79  *	xReferenceResolvedListener
80  *	          -	the listener that this ElementCollector notifies to.
81  *
82  *   RESULT
83  *	empty
84  *
85  *   HISTORY
86  *	05.01.2004 -	implemented
87  *
88  *   AUTHOR
89  *	Michael Mi
90  *	Email: michael.mi@sun.com
91  ******************************************************************************/
92 {
93 	m_type = cssxc::sax::ElementMarkType_ELEMENTCOLLECTOR;
94 }
95 
96 /*
97 bool ElementCollector::isInternalNotificationSuppressed() const
98 {
99 	return m_bInternalNotificationSuppressed;
100 }
101 */
102 
103 cssxc::sax::ElementMarkPriority ElementCollector::getPriority() const
104 {
105 	return m_nPriority;
106 }
107 
108 bool ElementCollector::getModify() const
109 {
110 	return m_bToModify;
111 }
112 
113 void ElementCollector::notifyListener()
114 /****** ElementCollector/notifyListener ***************************************
115  *
116  *   NAME
117  *	notifyListener -- enable the ability to notify the listener
118  *
119  *   SYNOPSIS
120  *	notifyListener();
121  *
122  *   FUNCTION
123  *	enable the ability to notify the listener and try to notify then.
124  *
125  *   INPUTS
126  *	empty
127  *
128  *   RESULT
129  *	empty
130  *
131  *   HISTORY
132  *	05.01.2004 -	implemented
133  *
134  *   AUTHOR
135  *	Michael Mi
136  *	Email: michael.mi@sun.com
137  ******************************************************************************/
138 {
139 	m_bAbleToNotify = true;
140 	doNotify();
141 }
142 
143 bool ElementCollector::isAbleToNotify() const
144 {
145 	return m_bAbleToNotify;
146 }
147 
148 void ElementCollector::setReferenceResolvedListener(
149 	const cssu::Reference< cssxc::sax::XReferenceResolvedListener >& xReferenceResolvedListener)
150 /****** ElementCollector/setReferenceResolvedListener *************************
151  *
152  *   NAME
153  *	setReferenceResolvedListener -- configures a listener for the buffer
154  *	node in this object
155  *
156  *   SYNOPSIS
157  *	setReferenceResolvedListener(xReferenceResolvedListener);
158  *
159  *   FUNCTION
160  *	configures a new listener and try to notify then.
161  *
162  *   INPUTS
163  *	xReferenceResolvedListener - the new listener
164  *
165  *   RESULT
166  *	empty
167  *
168  *   HISTORY
169  *	05.01.2004 -	implemented
170  *
171  *   AUTHOR
172  *	Michael Mi
173  *	Email: michael.mi@sun.com
174  ******************************************************************************/
175 {
176 	m_xReferenceResolvedListener = xReferenceResolvedListener;
177 	doNotify();
178 }
179 
180 void ElementCollector::setSecurityId(sal_Int32 nSecurityId)
181 /****** ElementCollector/setSecurityId ****************************************
182  *
183  *   NAME
184  *	setSecurityId -- configures the security Id of the buffer node
185  *
186  *   SYNOPSIS
187  *	setSecurityId(nSecurityId);
188  *
189  *   FUNCTION
190  *	configures the security Id and try to notify then
191  *
192  *   INPUTS
193  *	nSecurityId - the security Id
194  *
195  *   RESULT
196  *	empty
197  *
198  *   HISTORY
199  *	05.01.2004 -	implemented
200  *
201  *   AUTHOR
202  *	Michael Mi
203  *	Email: michael.mi@sun.com
204  ******************************************************************************/
205 {
206 	m_nSecurityId = nSecurityId;
207 	doNotify();
208 }
209 
210 void ElementCollector::doNotify()
211 /****** ElementCollector/doNotify *********************************************
212  *
213  *   NAME
214  *	doNotify -- tries to notify the listener
215  *
216  *   SYNOPSIS
217  *	doNotify();
218  *
219  *   FUNCTION
220  *	notifies the listener when all below conditions are satisfied:
221  *	the listener has not been notified;
222  *	the notify right is granted;
223  *	the listener has already been configured;
224  *	the security id has already been configure
225  *
226  *   INPUTS
227  *	empty
228  *
229  *   RESULT
230  *	empty
231  *
232  *   HISTORY
233  *	05.01.2004 -	implemented
234  *
235  *   AUTHOR
236  *	Michael Mi
237  *	Email: michael.mi@sun.com
238  ******************************************************************************/
239 {
240 	if (!m_bNotified &&
241 	    m_bAbleToNotify &&
242 	    m_xReferenceResolvedListener.is() &&
243 	    m_nSecurityId != cssxc::sax::ConstOfSecurityId::UNDEFINEDSECURITYID)
244 	{
245 		m_bNotified = true;
246 		m_xReferenceResolvedListener->referenceResolved(m_nBufferId);
247 	}
248 }
249 
250 ElementCollector* ElementCollector::clone(
251 	sal_Int32 nBufferId,
252 	cssxc::sax::ElementMarkPriority nPriority ) const
253 /****** ElementCollector/clone ************************************************
254  *
255  *   NAME
256  *	clone -- duplicates this ElementCollector object
257  *
258  *   SYNOPSIS
259  *	cloned = clone(nBufferId, nPriority);
260  *
261  *   FUNCTION
262  *	duplicates this ElementCollector object with new buffer Id, priority.
263  *
264  *   INPUTS
265  *	nBufferId -	the buffer node's Id
266  *	nPriority -	the priority
267  *
268  *   RESULT
269  *	clone - 	a new ElementCollector
270  *
271  *   HISTORY
272  *	05.01.2004 -	implemented
273  *
274  *   AUTHOR
275  *	Michael Mi
276  *	Email: michael.mi@sun.com
277  ******************************************************************************/
278 {
279 	ElementCollector* pClonedOne
280 		= new ElementCollector(m_nSecurityId,
281 				       nBufferId, nPriority, m_bToModify,
282 				       m_xReferenceResolvedListener);
283 
284 	if (m_bAbleToNotify)
285 	{
286 		pClonedOne->notifyListener();
287 	}
288 
289 	if (m_pBufferNode != NULL)
290 	{
291 		m_pBufferNode->addElementCollector(pClonedOne);
292 	}
293 
294 	return pClonedOne;
295 }
296 
297