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_framework.hxx"
30 
31 //_________________________________________________________________________________________________________________
32 //	my own includes
33 //_________________________________________________________________________________________________________________
34 #include <helper/ocomponentenumeration.hxx>
35 
36 #ifndef _FRAMEWORK_THREADHELP_RESETABLEGUARD_HXX_
37 #include <threadhelp/resetableguard.hxx>
38 #endif
39 
40 //_________________________________________________________________________________________________________________
41 //	interface includes
42 //_________________________________________________________________________________________________________________
43 
44 //_________________________________________________________________________________________________________________
45 //	includes of other projects
46 //_________________________________________________________________________________________________________________
47 #include <vcl/svapp.hxx>
48 
49 //_________________________________________________________________________________________________________________
50 //	namespace
51 //_________________________________________________________________________________________________________________
52 
53 namespace framework{
54 
55 using namespace ::com::sun::star::container		;
56 using namespace ::com::sun::star::lang			;
57 using namespace ::com::sun::star::uno			;
58 using namespace ::cppu							;
59 using namespace ::osl							;
60 using namespace ::rtl							;
61 
62 //_________________________________________________________________________________________________________________
63 //	non exported const
64 //_________________________________________________________________________________________________________________
65 
66 //_________________________________________________________________________________________________________________
67 //	non exported definitions
68 //_________________________________________________________________________________________________________________
69 
70 //_________________________________________________________________________________________________________________
71 //	declarations
72 //_________________________________________________________________________________________________________________
73 
74 //*****************************************************************************************************************
75 //	constructor
76 //*****************************************************************************************************************
77 OComponentEnumeration::OComponentEnumeration( const Sequence< css::uno::Reference< XComponent > >& seqComponents )
78 		//	Init baseclasses first
79 		//	Attention:
80 		//		Don't change order of initialization!
81 		//      ThreadHelpBase is a struct with a mutex as member. We can't use a mutex as member, while
82 		//		we must garant right initialization and a valid value of this! First initialize
83 		//		baseclasses and then members. And we need the mutex for other baseclasses !!!
84         :   ThreadHelpBase  ( &Application::GetSolarMutex() )
85 		// Init member
86         ,   m_nPosition     ( 0                             )   // 0 is the first position for a valid list and the right value for an invalid list to!
87         ,   m_seqComponents ( seqComponents                 )
88 {
89 	// Safe impossible states
90 	// "Method" not defined for ALL parameters!
91 	LOG_ASSERT( impldbg_checkParameter_OComponentEnumerationCtor( seqComponents ), "OComponentEnumeration::OComponentEnumeration()\nInvalid parameter detected!\n" )
92 }
93 
94 //*****************************************************************************************************************
95 //	destructor
96 //*****************************************************************************************************************
97 OComponentEnumeration::~OComponentEnumeration()
98 {
99 	// Reset instance, free memory ....
100 	impl_resetObject();
101 }
102 
103 //*****************************************************************************************************************
104 //	XEventListener
105 //*****************************************************************************************************************
106 void SAL_CALL OComponentEnumeration::disposing( const EventObject&
107 #if OSL_DEBUG_LEVEL > 0
108 aEvent
109 #endif
110 ) throw( RuntimeException )
111 {
112 	// Ready for multithreading
113 	ResetableGuard aGuard( m_aLock );
114 
115 	// Safe impossible cases
116 	// This method is not specified for all incoming parameters.
117 	LOG_ASSERT( impldbg_checkParameter_disposing( aEvent ), "OComponentEnumeration::disposing()\nInvalid parameter detected!\n" )
118 
119 	// Reset instance to defaults, release references and free memory.
120 	impl_resetObject();
121 }
122 
123 //*****************************************************************************************************************
124 //	XEnumeration
125 //*****************************************************************************************************************
126 sal_Bool SAL_CALL OComponentEnumeration::hasMoreElements() throw( RuntimeException )
127 {
128 	// Ready for multithreading
129 	ResetableGuard aGuard( m_aLock );
130 
131 	// First position in a valid list is 0.
132 	// => The last one is getLength() - 1!
133 	// m_nPosition's current value is the position for the next element, which will be return, if user call "nextElement()"
134 	// => We have more elements if current position less then the length of the list!
135 	return ( m_nPosition < (sal_uInt32)(m_seqComponents.getLength()) );
136 }
137 
138 //*****************************************************************************************************************
139 //	XEnumeration
140 //*****************************************************************************************************************
141 Any SAL_CALL OComponentEnumeration::nextElement() throw(	NoSuchElementException	,
142 										 					WrappedTargetException	,
143 															RuntimeException		)
144 {
145 	// Ready for multithreading
146 	ResetableGuard aGuard( m_aLock );
147 
148 	// If we have no elements or end of enumeration is arrived ...
149 	if ( hasMoreElements() == sal_False )
150 	{
151 		// .. throw an exception!
152 		throw NoSuchElementException();
153 	}
154 
155 	// Else; Get next element from list ...
156 	Any aComponent;
157 	aComponent <<= m_seqComponents[m_nPosition];
158 	// ... and step to next element!
159 	++m_nPosition;
160 
161 	// Return listitem.
162 	return aComponent;
163 }
164 
165 //*****************************************************************************************************************
166 //	proteced method
167 //*****************************************************************************************************************
168 void OComponentEnumeration::impl_resetObject()
169 {
170 	// Attention:
171 	// Write this for multiple calls - NOT AT THE SAME TIME - but for more then one call again)!
172 	// It exist two ways to call this method. From destructor and from disposing().
173 	// I can't say, which one is the first. Normaly the disposing-call - but other way ....
174 
175 	// Delete list of components.
176 	m_seqComponents.realloc( 0 );
177 	// Reset position in list.
178 	// The list has no elements anymore. m_nPosition is normaly the current position in list for nextElement!
179 	// But a position of 0 in a list of 0 items is an invalid state. This constellation can't work in future.
180 	// End of enumeration is arrived!
181 	// (see hasMoreElements() for more details...)
182 	m_nPosition = 0 ;
183 }
184 
185 //_________________________________________________________________________________________________________________
186 //	debug methods
187 //_________________________________________________________________________________________________________________
188 
189 /*-----------------------------------------------------------------------------------------------------------------
190 	The follow methods checks the parameter for other functions. If a parameter or his value is non valid,
191 	we return "sal_False". (else sal_True) This mechanism is used to throw an ASSERT!
192 
193 	ATTENTION
194 
195 		If you miss a test for one of this parameters, contact the autor or add it himself !(?)
196 		But ... look for right testing! See using of this methods!
197 -----------------------------------------------------------------------------------------------------------------*/
198 
199 #ifdef ENABLE_ASSERTIONS
200 
201 //*****************************************************************************************************************
202 // An empty list is allowed ... hasMoreElements() will return false then!
203 sal_Bool OComponentEnumeration::impldbg_checkParameter_OComponentEnumerationCtor( const Sequence< css::uno::Reference< XComponent > >& seqComponents )
204 {
205 	// Set default return value.
206 	sal_Bool bOK = sal_True;
207 	// Check parameter.
208 	if	(
209 			( &seqComponents == NULL )
210 		)
211 	{
212 		bOK = sal_False ;
213 	}
214 	// Return result of check.
215 	return bOK ;
216 }
217 
218 //*****************************************************************************************************************
219 sal_Bool OComponentEnumeration::impldbg_checkParameter_disposing( const EventObject& aEvent )
220 {
221 	// Set default return value.
222 	sal_Bool bOK = sal_True;
223 	// Check parameter.
224 	if	(
225 			( &aEvent				==	NULL		)	||
226 			( aEvent.Source.is()	==	sal_False	)
227 		)
228 	{
229 		bOK = sal_False ;
230 	}
231 	// Return result of check.
232 	return bOK ;
233 }
234 
235 #endif	//	#ifdef ENABLE_ASSERTIONS
236 
237 }		//	namespace framework
238