xref: /AOO41X/main/embeddedobj/source/general/dummyobject.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 #include "precompiled_embeddedobj.hxx"
29 #include <com/sun/star/embed/EmbedStates.hpp>
30 #include <com/sun/star/embed/EmbedVerbs.hpp>
31 #include <com/sun/star/embed/EmbedUpdateModes.hpp>
32 #include <com/sun/star/embed/XEmbeddedClient.hpp>
33 #include <com/sun/star/embed/XInplaceClient.hpp>
34 #include <com/sun/star/embed/XWindowSupplier.hpp>
35 #include <com/sun/star/embed/StateChangeInProgressException.hpp>
36 #include <com/sun/star/embed/EmbedStates.hpp>
37 #include <com/sun/star/embed/Aspects.hpp>
38 #include <com/sun/star/embed/EmbedMapUnits.hpp>
39 #include <com/sun/star/embed/EntryInitModes.hpp>
40 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
41 #include <com/sun/star/lang/DisposedException.hpp>
42 
43 #include <cppuhelper/interfacecontainer.h>
44 
45 #include <dummyobject.hxx>
46 
47 
48 using namespace ::com::sun::star;
49 
50 //----------------------------------------------
51 void ODummyEmbeddedObject::CheckInit()
52 {
53 	if ( m_bDisposed )
54 		throw lang::DisposedException();
55 
56 	if ( m_nObjectState == -1 )
57 		throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object has no persistence!\n" ),
58 										uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
59 }
60 
61 //----------------------------------------------
62 void ODummyEmbeddedObject::PostEvent_Impl( const ::rtl::OUString& aEventName,
63 											const uno::Reference< uno::XInterface >& /*xSource*/ )
64 {
65 	if ( m_pInterfaceContainer )
66 	{
67 		::cppu::OInterfaceContainerHelper* pIC = m_pInterfaceContainer->getContainer(
68 											::getCppuType((const uno::Reference< document::XEventListener >*)0) );
69 		if( pIC )
70 		{
71 			document::EventObject aEvent;
72 			aEvent.EventName = aEventName;
73 			aEvent.Source = uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >( this ) );
74 			// For now all the events are sent as object events
75 			// aEvent.Source = ( xSource.is() ? xSource
76 			//					   : uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >( this ) ) );
77 			::cppu::OInterfaceIteratorHelper aIt( *pIC );
78 			while( aIt.hasMoreElements() )
79         	{
80             	try
81             	{
82                 	((document::XEventListener *)aIt.next())->notifyEvent( aEvent );
83             	}
84             	catch( uno::RuntimeException& )
85             	{
86                 	aIt.remove();
87             	}
88 
89 				// the listener could dispose the object.
90 				if ( m_bDisposed )
91 					return;
92         	}
93 		}
94 	}
95 }
96 
97 //----------------------------------------------
98 ODummyEmbeddedObject::~ODummyEmbeddedObject()
99 {
100 }
101 
102 //----------------------------------------------
103 void SAL_CALL ODummyEmbeddedObject::changeState( sal_Int32 nNewState )
104 		throw ( embed::UnreachableStateException,
105 				embed::WrongStateException,
106 				uno::Exception,
107 				uno::RuntimeException )
108 {
109 	::osl::MutexGuard aGuard( m_aMutex );
110 	CheckInit();
111 
112 	if ( nNewState == embed::EmbedStates::LOADED )
113 		return;
114 
115 	throw embed::UnreachableStateException();
116 }
117 
118 //----------------------------------------------
119 uno::Sequence< sal_Int32 > SAL_CALL ODummyEmbeddedObject::getReachableStates()
120 		throw ( embed::WrongStateException,
121 				uno::RuntimeException )
122 {
123 	::osl::MutexGuard aGuard( m_aMutex );
124 	CheckInit();
125 
126 	uno::Sequence< sal_Int32 > aResult( 1 );
127 	aResult[0] = embed::EmbedStates::LOADED;
128 
129 	return aResult;
130 }
131 
132 //----------------------------------------------
133 sal_Int32 SAL_CALL ODummyEmbeddedObject::getCurrentState()
134 		throw ( embed::WrongStateException,
135 				uno::RuntimeException )
136 {
137 	::osl::MutexGuard aGuard( m_aMutex );
138 	CheckInit();
139 
140 	return m_nObjectState;
141 }
142 
143 //----------------------------------------------
144 void SAL_CALL ODummyEmbeddedObject::doVerb( sal_Int32 )
145 		throw ( lang::IllegalArgumentException,
146 				embed::WrongStateException,
147 				embed::UnreachableStateException,
148 				uno::Exception,
149 				uno::RuntimeException )
150 {
151 	::osl::MutexGuard aGuard( m_aMutex );
152 	CheckInit();
153 
154 	// no supported verbs
155 }
156 
157 //----------------------------------------------
158 uno::Sequence< embed::VerbDescriptor > SAL_CALL ODummyEmbeddedObject::getSupportedVerbs()
159 		throw ( embed::WrongStateException,
160 				uno::RuntimeException )
161 {
162 	::osl::MutexGuard aGuard( m_aMutex );
163 	CheckInit();
164 
165 	return uno::Sequence< embed::VerbDescriptor >();
166 }
167 
168 //----------------------------------------------
169 void SAL_CALL ODummyEmbeddedObject::setClientSite(
170 				const uno::Reference< embed::XEmbeddedClient >& xClient )
171 		throw ( embed::WrongStateException,
172 				uno::RuntimeException )
173 {
174 	::osl::MutexGuard aGuard( m_aMutex );
175 	CheckInit();
176 
177 	m_xClientSite = xClient;
178 }
179 
180 //----------------------------------------------
181 uno::Reference< embed::XEmbeddedClient > SAL_CALL ODummyEmbeddedObject::getClientSite()
182 		throw ( embed::WrongStateException,
183 				uno::RuntimeException )
184 {
185 	::osl::MutexGuard aGuard( m_aMutex );
186 	CheckInit();
187 
188 	return m_xClientSite;
189 }
190 
191 //----------------------------------------------
192 void SAL_CALL ODummyEmbeddedObject::update()
193 		throw ( embed::WrongStateException,
194 				uno::Exception,
195 				uno::RuntimeException )
196 {
197 	::osl::MutexGuard aGuard( m_aMutex );
198 	CheckInit();
199 }
200 
201 //----------------------------------------------
202 void SAL_CALL ODummyEmbeddedObject::setUpdateMode( sal_Int32 )
203 		throw ( embed::WrongStateException,
204 				uno::RuntimeException )
205 {
206 	::osl::MutexGuard aGuard( m_aMutex );
207 	CheckInit();
208 }
209 
210 //----------------------------------------------
211 sal_Int64 SAL_CALL ODummyEmbeddedObject::getStatus( sal_Int64 )
212 		throw ( embed::WrongStateException,
213 				uno::RuntimeException )
214 {
215 	::osl::MutexGuard aGuard( m_aMutex );
216 	CheckInit();
217 
218 	return 0;
219 }
220 
221 //----------------------------------------------
222 void SAL_CALL ODummyEmbeddedObject::setContainerName( const ::rtl::OUString& )
223 		throw ( uno::RuntimeException )
224 {
225 	::osl::MutexGuard aGuard( m_aMutex );
226 	CheckInit();
227 }
228 
229 //----------------------------------------------
230 void SAL_CALL ODummyEmbeddedObject::setVisualAreaSize( sal_Int64 nAspect, const awt::Size& aSize )
231 		throw ( lang::IllegalArgumentException,
232 				embed::WrongStateException,
233 				uno::Exception,
234 				uno::RuntimeException )
235 {
236 	::osl::MutexGuard aGuard( m_aMutex );
237 	CheckInit();
238 
239 	OSL_ENSURE( nAspect != embed::Aspects::MSOLE_ICON, "For iconified objects no graphical replacement is required!\n" );
240 	if ( nAspect == embed::Aspects::MSOLE_ICON )
241 		// no representation can be retrieved
242 		throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "Illegal call!\n" ),
243 									uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
244 
245 	m_nCachedAspect = nAspect;
246 	m_aCachedSize = aSize;
247 	m_bHasCachedSize = sal_True;
248 }
249 
250 //----------------------------------------------
251 awt::Size SAL_CALL ODummyEmbeddedObject::getVisualAreaSize( sal_Int64 nAspect )
252 		throw ( lang::IllegalArgumentException,
253 				embed::WrongStateException,
254 				uno::Exception,
255 				uno::RuntimeException )
256 {
257 	::osl::MutexGuard aGuard( m_aMutex );
258 	CheckInit();
259 
260 	OSL_ENSURE( nAspect != embed::Aspects::MSOLE_ICON, "For iconified objects no graphical replacement is required!\n" );
261 	if ( nAspect == embed::Aspects::MSOLE_ICON )
262 		// no representation can be retrieved
263 		throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "Illegal call!\n" ),
264 									uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
265 
266 	if ( !m_bHasCachedSize || m_nCachedAspect != nAspect )
267 		throw embed::NoVisualAreaSizeException(
268 				::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "No size available!\n" ) ),
269 				uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
270 
271 	return m_aCachedSize;
272 }
273 
274 //----------------------------------------------
275 sal_Int32 SAL_CALL ODummyEmbeddedObject::getMapUnit( sal_Int64 nAspect )
276 		throw ( uno::Exception,
277 				uno::RuntimeException)
278 {
279 	::osl::MutexGuard aGuard( m_aMutex );
280 	CheckInit();
281 
282 	OSL_ENSURE( nAspect != embed::Aspects::MSOLE_ICON, "For iconified objects no graphical replacement is required!\n" );
283 	if ( nAspect == embed::Aspects::MSOLE_ICON )
284 		// no representation can be retrieved
285 		throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "Illegal call!\n" ),
286 									uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
287 
288 	return embed::EmbedMapUnits::ONE_100TH_MM;
289 }
290 
291 //----------------------------------------------
292 embed::VisualRepresentation SAL_CALL ODummyEmbeddedObject::getPreferredVisualRepresentation( sal_Int64 )
293 		throw ( lang::IllegalArgumentException,
294 				embed::WrongStateException,
295 				uno::Exception,
296 				uno::RuntimeException )
297 {
298 	::osl::MutexGuard aGuard( m_aMutex );
299 	CheckInit();
300 
301 	// no representation can be retrieved
302 	throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "Illegal call!\n" ),
303 								uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
304 }
305 
306 //----------------------------------------------
307 void SAL_CALL ODummyEmbeddedObject::setPersistentEntry(
308 					const uno::Reference< embed::XStorage >& xStorage,
309 					const ::rtl::OUString& sEntName,
310 					sal_Int32 nEntryConnectionMode,
311 					const uno::Sequence< beans::PropertyValue >& /* lArguments */,
312 					const uno::Sequence< beans::PropertyValue >& /* lObjArgs */ )
313 		throw ( lang::IllegalArgumentException,
314 				embed::WrongStateException,
315 				io::IOException,
316 				uno::Exception,
317 				uno::RuntimeException )
318 {
319 	::osl::MutexGuard aGuard( m_aMutex );
320 	if ( m_bDisposed )
321 		throw lang::DisposedException(); // TODO
322 
323 	if ( !xStorage.is() )
324 		throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "No parent storage is provided!\n" ),
325 											uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ),
326 											1 );
327 
328 	if ( !sEntName.getLength() )
329 		throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "Empty element name is provided!\n" ),
330 											uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ),
331 											2 );
332 
333 	if ( ( m_nObjectState != -1 || nEntryConnectionMode == embed::EntryInitModes::NO_INIT )
334 	  && ( m_nObjectState == -1 || nEntryConnectionMode != embed::EntryInitModes::NO_INIT ) )
335 	{
336 		throw embed::WrongStateException(
337 					::rtl::OUString::createFromAscii( "Can't change persistant representation of activated object!\n" ),
338 					uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
339 	}
340 
341     if ( m_bWaitSaveCompleted )
342 	{
343 		if ( nEntryConnectionMode == embed::EntryInitModes::NO_INIT )
344 			saveCompleted( ( m_xParentStorage != xStorage || !m_aEntryName.equals( sEntName ) ) );
345 		else
346 			throw embed::WrongStateException(
347 						::rtl::OUString::createFromAscii( "The object waits for saveCompleted() call!\n" ),
348 						uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
349 	}
350 
351 	if ( nEntryConnectionMode == embed::EntryInitModes::DEFAULT_INIT
352 	  || nEntryConnectionMode == embed::EntryInitModes::NO_INIT )
353 	{
354 		if ( xStorage->hasByName( sEntName ) )
355 
356 		{
357 			m_xParentStorage = xStorage;
358 			m_aEntryName = sEntName;
359 			m_nObjectState = embed::EmbedStates::LOADED;
360 		}
361 		else
362 			throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "Wrong entry is provided!\n" ),
363 								uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ),
364 								2 );
365 
366 	}
367 	else
368 		throw lang::IllegalArgumentException( ::rtl::OUString::createFromAscii( "Wrong connection mode is provided!\n" ),
369 								uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ),
370 								3 );
371 }
372 
373 //------------------------------------------------------
374 void SAL_CALL ODummyEmbeddedObject::storeToEntry( const uno::Reference< embed::XStorage >& xStorage,
375 							const ::rtl::OUString& sEntName,
376 							const uno::Sequence< beans::PropertyValue >& /* lArguments */,
377 							const uno::Sequence< beans::PropertyValue >& /* lObjArgs */ )
378 		throw ( lang::IllegalArgumentException,
379 				embed::WrongStateException,
380 				io::IOException,
381 				uno::Exception,
382 				uno::RuntimeException )
383 {
384 	::osl::MutexGuard aGuard( m_aMutex );
385 	CheckInit();
386 
387 	if ( m_bWaitSaveCompleted )
388 		throw embed::WrongStateException(
389 					::rtl::OUString::createFromAscii( "The object waits for saveCompleted() call!\n" ),
390 					uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
391 
392 	m_xParentStorage->copyElementTo( m_aEntryName, xStorage, sEntName );
393 }
394 
395 //------------------------------------------------------
396 void SAL_CALL ODummyEmbeddedObject::storeAsEntry( const uno::Reference< embed::XStorage >& xStorage,
397 							const ::rtl::OUString& sEntName,
398 							const uno::Sequence< beans::PropertyValue >& /* lArguments */,
399 							const uno::Sequence< beans::PropertyValue >& /* lObjArgs */ )
400 		throw ( lang::IllegalArgumentException,
401 				embed::WrongStateException,
402 				io::IOException,
403 				uno::Exception,
404 				uno::RuntimeException )
405 {
406 	::osl::MutexGuard aGuard( m_aMutex );
407 	CheckInit();
408 
409 	if ( m_bWaitSaveCompleted )
410 		throw embed::WrongStateException(
411 					::rtl::OUString::createFromAscii( "The object waits for saveCompleted() call!\n" ),
412 					uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
413 
414 	PostEvent_Impl( ::rtl::OUString::createFromAscii( "OnSaveAs" ),
415 					uno::Reference< uno::XInterface >( static_cast< cppu::OWeakObject* >( this ) ) );
416 
417 	m_xParentStorage->copyElementTo( m_aEntryName, xStorage, sEntName );
418 
419 	m_bWaitSaveCompleted = sal_True;
420 	m_xNewParentStorage = xStorage;
421     m_aNewEntryName = sEntName;
422 }
423 
424 //------------------------------------------------------
425 void SAL_CALL ODummyEmbeddedObject::saveCompleted( sal_Bool bUseNew )
426 		throw ( embed::WrongStateException,
427 				uno::Exception,
428 				uno::RuntimeException )
429 {
430 	::osl::MutexGuard aGuard( m_aMutex );
431 	CheckInit();
432 
433 	// it is allowed to call saveCompleted( false ) for nonstored objects
434 	if ( !m_bWaitSaveCompleted && !bUseNew )
435 		return;
436 
437 	OSL_ENSURE( m_bWaitSaveCompleted, "Unexpected saveCompleted() call!\n" );
438 	if ( !m_bWaitSaveCompleted )
439 		throw io::IOException(); // TODO: illegal call
440 
441 	OSL_ENSURE( m_xNewParentStorage.is() , "Internal object information is broken!\n" );
442 	if ( !m_xNewParentStorage.is() )
443 		throw uno::RuntimeException(); // TODO: broken internal information
444 
445 	if ( bUseNew )
446 	{
447 		m_xParentStorage = m_xNewParentStorage;
448 		m_aEntryName = m_aNewEntryName;
449 
450 		PostEvent_Impl( ::rtl::OUString::createFromAscii( "OnSaveAsDone" ),
451 						uno::Reference< uno::XInterface >( static_cast< cppu::OWeakObject* >( this ) ) );
452 	}
453 
454 	m_xNewParentStorage = uno::Reference< embed::XStorage >();
455 	m_aNewEntryName = ::rtl::OUString();
456 	m_bWaitSaveCompleted = sal_False;
457 }
458 
459 //------------------------------------------------------
460 sal_Bool SAL_CALL ODummyEmbeddedObject::hasEntry()
461 		throw ( embed::WrongStateException,
462 				uno::RuntimeException )
463 {
464 	::osl::MutexGuard aGuard( m_aMutex );
465 	CheckInit();
466 
467 	if ( m_bWaitSaveCompleted )
468 		throw embed::WrongStateException(
469 					::rtl::OUString::createFromAscii( "The object waits for saveCompleted() call!\n" ),
470 					uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
471 
472 	if ( m_aEntryName.getLength() )
473 		return sal_True;
474 
475 	return sal_False;
476 }
477 
478 //------------------------------------------------------
479 ::rtl::OUString SAL_CALL ODummyEmbeddedObject::getEntryName()
480 		throw ( embed::WrongStateException,
481 				uno::RuntimeException )
482 {
483 	::osl::MutexGuard aGuard( m_aMutex );
484 	CheckInit();
485 
486 	if ( m_bWaitSaveCompleted )
487 		throw embed::WrongStateException(
488 					::rtl::OUString::createFromAscii( "The object waits for saveCompleted() call!\n" ),
489 					uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
490 
491 	return m_aEntryName;
492 }
493 
494 //------------------------------------------------------
495 void SAL_CALL ODummyEmbeddedObject::storeOwn()
496 		throw ( embed::WrongStateException,
497 				io::IOException,
498 				uno::Exception,
499 				uno::RuntimeException )
500 {
501 	::osl::MutexGuard aGuard( m_aMutex );
502 	CheckInit();
503 
504 	if ( m_bWaitSaveCompleted )
505 		throw embed::WrongStateException(
506 					::rtl::OUString::createFromAscii( "The object waits for saveCompleted() call!\n" ),
507 					uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
508 
509 	// the object can not be activated or changed
510 	return;
511 }
512 
513 //------------------------------------------------------
514 sal_Bool SAL_CALL ODummyEmbeddedObject::isReadonly()
515 		throw ( embed::WrongStateException,
516 				uno::RuntimeException )
517 {
518 	::osl::MutexGuard aGuard( m_aMutex );
519 	CheckInit();
520 
521 	if ( m_bWaitSaveCompleted )
522 		throw embed::WrongStateException(
523 					::rtl::OUString::createFromAscii( "The object waits for saveCompleted() call!\n" ),
524 					uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
525 
526 	// this object can not be changed
527 	return sal_True;
528 }
529 
530 //------------------------------------------------------
531 void SAL_CALL ODummyEmbeddedObject::reload(
532 				const uno::Sequence< beans::PropertyValue >& /* lArguments */,
533 				const uno::Sequence< beans::PropertyValue >& /* lObjArgs */ )
534 		throw ( lang::IllegalArgumentException,
535 				embed::WrongStateException,
536 				io::IOException,
537 				uno::Exception,
538 				uno::RuntimeException )
539 {
540 	::osl::MutexGuard aGuard( m_aMutex );
541 	CheckInit();
542 
543 	if ( m_bWaitSaveCompleted )
544 		throw embed::WrongStateException(
545 					::rtl::OUString::createFromAscii( "The object waits for saveCompleted() call!\n" ),
546 					uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
547 
548 	// nothing to reload
549 }
550 
551 //------------------------------------------------------
552 uno::Sequence< sal_Int8 > SAL_CALL ODummyEmbeddedObject::getClassID()
553 		throw ( uno::RuntimeException )
554 {
555 	::osl::MutexGuard aGuard( m_aMutex );
556 	CheckInit();
557 
558 	// currently the class ID is empty
559 	// TODO/LATER: should a special class ID be used in this case?
560 	return uno::Sequence< sal_Int8 >();
561 }
562 
563 //------------------------------------------------------
564 ::rtl::OUString SAL_CALL ODummyEmbeddedObject::getClassName()
565 		throw ( uno::RuntimeException )
566 {
567 	::osl::MutexGuard aGuard( m_aMutex );
568 	if ( m_bDisposed )
569 		throw lang::DisposedException(); // TODO
570 
571 	return ::rtl::OUString();
572 }
573 
574 //------------------------------------------------------
575 void SAL_CALL ODummyEmbeddedObject::setClassInfo(
576 				const uno::Sequence< sal_Int8 >& /*aClassID*/, const ::rtl::OUString& /*aClassName*/ )
577 		throw ( lang::NoSupportException,
578 				uno::RuntimeException )
579 {
580 	throw lang::NoSupportException();
581 }
582 
583 //------------------------------------------------------
584 uno::Reference< util::XCloseable > SAL_CALL ODummyEmbeddedObject::getComponent()
585 		throw ( uno::RuntimeException )
586 {
587 	::osl::MutexGuard aGuard( m_aMutex );
588 	CheckInit();
589 
590     return uno::Reference< util::XCloseable >();
591 }
592 
593 //----------------------------------------------
594 void SAL_CALL ODummyEmbeddedObject::addStateChangeListener( const uno::Reference< embed::XStateChangeListener >& xListener )
595 	throw ( uno::RuntimeException )
596 {
597 	::osl::MutexGuard aGuard( m_aMutex );
598 	if ( m_bDisposed )
599 		return;
600 
601 	if ( !m_pInterfaceContainer )
602 		m_pInterfaceContainer = new ::cppu::OMultiTypeInterfaceContainerHelper( m_aMutex );
603 
604 	m_pInterfaceContainer->addInterface( ::getCppuType( (const uno::Reference< embed::XStateChangeListener >*)0 ),
605 														xListener );
606 }
607 
608 //----------------------------------------------
609 void SAL_CALL ODummyEmbeddedObject::removeStateChangeListener(
610 					const uno::Reference< embed::XStateChangeListener >& xListener )
611 	throw (uno::RuntimeException)
612 {
613 	::osl::MutexGuard aGuard( m_aMutex );
614 	if ( m_pInterfaceContainer )
615 		m_pInterfaceContainer->removeInterface( ::getCppuType( (const uno::Reference< embed::XStateChangeListener >*)0 ),
616 												xListener );
617 }
618 
619 //----------------------------------------------
620 void SAL_CALL ODummyEmbeddedObject::close( sal_Bool bDeliverOwnership )
621 	throw ( util::CloseVetoException,
622 			uno::RuntimeException )
623 {
624 	::osl::MutexGuard aGuard( m_aMutex );
625 	if ( m_bDisposed )
626 		throw lang::DisposedException(); // TODO
627 
628     uno::Reference< uno::XInterface > xSelfHold( static_cast< ::cppu::OWeakObject* >( this ) );
629     lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >( this ) );
630 
631 	if ( m_pInterfaceContainer )
632 	{
633     	::cppu::OInterfaceContainerHelper* pContainer =
634 			m_pInterfaceContainer->getContainer( ::getCppuType( ( const uno::Reference< util::XCloseListener >*) NULL ) );
635     	if ( pContainer != NULL )
636 		{
637         	::cppu::OInterfaceIteratorHelper pIterator(*pContainer);
638         	while (pIterator.hasMoreElements())
639         	{
640             	try
641             	{
642                 	((util::XCloseListener*)pIterator.next())->queryClosing( aSource, bDeliverOwnership );
643             	}
644             	catch( uno::RuntimeException& )
645             	{
646                 	pIterator.remove();
647             	}
648         	}
649 		}
650 
651     	pContainer = m_pInterfaceContainer->getContainer(
652 									::getCppuType( ( const uno::Reference< util::XCloseListener >*) NULL ) );
653     	if ( pContainer != NULL )
654 		{
655         	::cppu::OInterfaceIteratorHelper pCloseIterator(*pContainer);
656         	while (pCloseIterator.hasMoreElements())
657         	{
658             	try
659             	{
660                 	((util::XCloseListener*)pCloseIterator.next())->notifyClosing( aSource );
661             	}
662             	catch( uno::RuntimeException& )
663             	{
664                 	pCloseIterator.remove();
665             	}
666         	}
667 		}
668 
669 		m_pInterfaceContainer->disposeAndClear( aSource );
670 	}
671 
672 	m_bDisposed = sal_True; // the object is disposed now for outside
673 }
674 
675 //----------------------------------------------
676 void SAL_CALL ODummyEmbeddedObject::addCloseListener( const uno::Reference< util::XCloseListener >& xListener )
677 	throw ( uno::RuntimeException )
678 {
679 	::osl::MutexGuard aGuard( m_aMutex );
680 	if ( m_bDisposed )
681 		return;
682 
683 	if ( !m_pInterfaceContainer )
684 		m_pInterfaceContainer = new ::cppu::OMultiTypeInterfaceContainerHelper( m_aMutex );
685 
686 	m_pInterfaceContainer->addInterface( ::getCppuType( (const uno::Reference< util::XCloseListener >*)0 ), xListener );
687 }
688 
689 //----------------------------------------------
690 void SAL_CALL ODummyEmbeddedObject::removeCloseListener( const uno::Reference< util::XCloseListener >& xListener )
691 	throw (uno::RuntimeException)
692 {
693 	::osl::MutexGuard aGuard( m_aMutex );
694 	if ( m_pInterfaceContainer )
695 		m_pInterfaceContainer->removeInterface( ::getCppuType( (const uno::Reference< util::XCloseListener >*)0 ),
696 												xListener );
697 }
698 
699 //------------------------------------------------------
700 void SAL_CALL ODummyEmbeddedObject::addEventListener( const uno::Reference< document::XEventListener >& xListener )
701 		throw ( uno::RuntimeException )
702 {
703 	::osl::MutexGuard aGuard( m_aMutex );
704 	if ( m_bDisposed )
705 		return;
706 
707 	if ( !m_pInterfaceContainer )
708 		m_pInterfaceContainer = new ::cppu::OMultiTypeInterfaceContainerHelper( m_aMutex );
709 
710 	m_pInterfaceContainer->addInterface( ::getCppuType( (const uno::Reference< document::XEventListener >*)0 ), xListener );
711 }
712 
713 //------------------------------------------------------
714 void SAL_CALL ODummyEmbeddedObject::removeEventListener( const uno::Reference< document::XEventListener >& xListener )
715 		throw ( uno::RuntimeException )
716 {
717 	::osl::MutexGuard aGuard( m_aMutex );
718 	if ( m_pInterfaceContainer )
719 		m_pInterfaceContainer->removeInterface( ::getCppuType( (const uno::Reference< document::XEventListener >*)0 ),
720 												xListener );
721 }
722 
723