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