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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_embeddedobj.hxx"
26 #include <com/sun/star/embed/EmbedUpdateModes.hpp>
27 #include <com/sun/star/embed/EmbedStates.hpp>
28 #include <com/sun/star/lang/XComponent.hpp>
29 #include <com/sun/star/lang/DisposedException.hpp>
30 
31 #include <cppuhelper/interfacecontainer.h>
32 
33 #include <oleembobj.hxx>
34 #include <olecomponent.hxx>
35 
36 #include "ownview.hxx"
37 
38 using namespace ::com::sun::star;
39 
40 sal_Bool KillFile_Impl( const ::rtl::OUString& aURL, const uno::Reference< lang::XMultiServiceFactory >& xFactory );
41 
42 
43 //------------------------------------------------------
OleEmbeddedObject(const uno::Reference<lang::XMultiServiceFactory> & xFactory,const uno::Sequence<sal_Int8> & aClassID,const::rtl::OUString & aClassName)44 OleEmbeddedObject::OleEmbeddedObject( const uno::Reference< lang::XMultiServiceFactory >& xFactory,
45 									  const uno::Sequence< sal_Int8 >& aClassID,
46 									  const ::rtl::OUString& aClassName )
47 : m_pOleComponent( NULL )
48 , m_pInterfaceContainer( NULL )
49 , m_bReadOnly( sal_False )
50 , m_bDisposed( sal_False )
51 , m_nObjectState( -1 )
52 , m_nTargetState( -1 )
53 , m_nUpdateMode ( embed::EmbedUpdateModes::ALWAYS_UPDATE )
54 , m_xFactory( xFactory )
55 , m_aClassID( aClassID )
56 , m_aClassName( aClassName )
57 , m_bWaitSaveCompleted( sal_False )
58 , m_bNewVisReplInStream( sal_True )
59 , m_bStoreLoaded( sal_False )
60 , m_bVisReplInitialized( sal_False )
61 , m_bVisReplInStream( sal_False )
62 , m_bStoreVisRepl( sal_False )
63 , m_bIsLink( sal_False )
64 , m_bHasCachedSize( sal_False )
65 , m_nCachedAspect( 0 )
66 , m_bHasSizeToSet( sal_False )
67 , m_nAspectToSet( 0 )
68 , m_bGotStatus( sal_False )
69 , m_nStatus( 0 )
70 , m_nStatusAspect( 0 )
71 , m_pOwnView( NULL )
72 , m_bFromClipboard( sal_False )
73 , m_bTriedConversion( sal_False )
74 {
75 }
76 
77 //------------------------------------------------------
78 // In case of loading from persistent entry the classID of the object
79 // will be retrieved from the entry, during construction it is unknown
OleEmbeddedObject(const uno::Reference<lang::XMultiServiceFactory> & xFactory,sal_Bool bLink)80 OleEmbeddedObject::OleEmbeddedObject( const uno::Reference< lang::XMultiServiceFactory >& xFactory, sal_Bool bLink )
81 : m_pOleComponent( NULL )
82 , m_pInterfaceContainer( NULL )
83 , m_bReadOnly( sal_False )
84 , m_bDisposed( sal_False )
85 , m_nObjectState( -1 )
86 , m_nTargetState( -1 )
87 , m_nUpdateMode( embed::EmbedUpdateModes::ALWAYS_UPDATE )
88 , m_xFactory( xFactory )
89 , m_bWaitSaveCompleted( sal_False )
90 , m_bNewVisReplInStream( sal_True )
91 , m_bStoreLoaded( sal_False )
92 , m_bVisReplInitialized( sal_False )
93 , m_bVisReplInStream( sal_False )
94 , m_bStoreVisRepl( sal_False )
95 , m_bIsLink( bLink )
96 , m_bHasCachedSize( sal_False )
97 , m_nCachedAspect( 0 )
98 , m_bHasSizeToSet( sal_False )
99 , m_nAspectToSet( 0 )
100 , m_bGotStatus( sal_False )
101 , m_nStatus( 0 )
102 , m_nStatusAspect( 0 )
103 , m_pOwnView( NULL )
104 , m_bFromClipboard( sal_False )
105 , m_bTriedConversion( sal_False )
106 {
107 }
108 #ifdef WNT
109 //------------------------------------------------------
110 // this constructor let object be initialized from clipboard
OleEmbeddedObject(const uno::Reference<lang::XMultiServiceFactory> & xFactory)111 OleEmbeddedObject::OleEmbeddedObject( const uno::Reference< lang::XMultiServiceFactory >& xFactory )
112 : m_pOleComponent( NULL )
113 , m_pInterfaceContainer( NULL )
114 , m_bReadOnly( sal_False )
115 , m_bDisposed( sal_False )
116 , m_nObjectState( -1 )
117 , m_nTargetState( -1 )
118 , m_nUpdateMode( embed::EmbedUpdateModes::ALWAYS_UPDATE )
119 , m_xFactory( xFactory )
120 , m_bWaitSaveCompleted( sal_False )
121 , m_bNewVisReplInStream( sal_True )
122 , m_bStoreLoaded( sal_False )
123 , m_bVisReplInitialized( sal_False )
124 , m_bVisReplInStream( sal_False )
125 , m_bStoreVisRepl( sal_False )
126 , m_bIsLink( sal_False )
127 , m_bHasCachedSize( sal_False )
128 , m_nCachedAspect( 0 )
129 , m_bHasSizeToSet( sal_False )
130 , m_nAspectToSet( 0 )
131 , m_bGotStatus( sal_False )
132 , m_nStatus( 0 )
133 , m_nStatusAspect( 0 )
134 , m_pOwnView( NULL )
135 , m_bFromClipboard( sal_True )
136 , m_bTriedConversion( sal_False )
137 {
138 }
139 #endif
140 //------------------------------------------------------
~OleEmbeddedObject()141 OleEmbeddedObject::~OleEmbeddedObject()
142 {
143 	OSL_ENSURE( !m_pInterfaceContainer && !m_pOleComponent && !m_xObjectStream.is(),
144 					"The object is not closed! DISASTER is possible!" );
145 
146 	if ( m_pOleComponent || m_pInterfaceContainer || m_xObjectStream.is() )
147 	{
148 		// the component must be cleaned during closing
149 		m_refCount++; // to avoid crash
150 		try {
151 			Dispose();
152 		} catch( uno::Exception& ) {}
153 	}
154 
155 	if ( m_aTempURL.getLength() )
156        	KillFile_Impl( m_aTempURL, m_xFactory );
157 
158 	if ( m_aTempDumpURL.getLength() )
159        	KillFile_Impl( m_aTempDumpURL, m_xFactory );
160 }
161 
162 //------------------------------------------------------
MakeEventListenerNotification_Impl(const::rtl::OUString & aEventName)163 void OleEmbeddedObject::MakeEventListenerNotification_Impl( const ::rtl::OUString& aEventName )
164 {
165 	if ( m_pInterfaceContainer )
166 	{
167 	   	::cppu::OInterfaceContainerHelper* pContainer =
168 			m_pInterfaceContainer->getContainer(
169 									::getCppuType( ( const uno::Reference< document::XEventListener >*) NULL ) );
170     	if ( pContainer != NULL )
171 		{
172     		document::EventObject aEvent( static_cast< ::cppu::OWeakObject* >( this ), aEventName );
173         	::cppu::OInterfaceIteratorHelper pIterator(*pContainer);
174         	while (pIterator.hasMoreElements())
175         	{
176             	try
177             	{
178                 	((document::XEventListener*)pIterator.next())->notifyEvent( aEvent );
179             	}
180             	catch( uno::RuntimeException& )
181             	{
182             	}
183         	}
184 		}
185 	}
186 }
187 #ifdef WNT
188 //----------------------------------------------
StateChangeNotification_Impl(sal_Bool bBeforeChange,sal_Int32 nOldState,sal_Int32 nNewState)189 void OleEmbeddedObject::StateChangeNotification_Impl( sal_Bool bBeforeChange, sal_Int32 nOldState, sal_Int32 nNewState )
190 {
191 	if ( m_pInterfaceContainer )
192 	{
193     	::cppu::OInterfaceContainerHelper* pContainer = m_pInterfaceContainer->getContainer(
194 							::getCppuType( ( const uno::Reference< embed::XStateChangeListener >*) NULL ) );
195     	if ( pContainer != NULL )
196 		{
197     		lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >( this ) );
198         	::cppu::OInterfaceIteratorHelper pIterator(*pContainer);
199 
200         	while (pIterator.hasMoreElements())
201         	{
202 				if ( bBeforeChange )
203 				{
204             		try
205             		{
206                 		((embed::XStateChangeListener*)pIterator.next())->changingState( aSource, nOldState, nNewState );
207             		}
208             		catch( uno::Exception& )
209             		{
210 						// even if the listener complains ignore it for now
211             		}
212 				}
213 				else
214 				{
215 			   		try
216             		{
217                 		((embed::XStateChangeListener*)pIterator.next())->stateChanged( aSource, nOldState, nNewState );
218             		}
219             		catch( uno::Exception& )
220             		{
221 						// if anything happened it is problem of listener, ignore it
222             		}
223 				}
224         	}
225 		}
226 	}
227 }
228 #endif
229 //------------------------------------------------------
GetRidOfComponent()230 void OleEmbeddedObject::GetRidOfComponent()
231 {
232 #ifdef WNT
233 	if ( m_pOleComponent )
234 	{
235 		if ( m_nObjectState != -1 && m_nObjectState != embed::EmbedStates::LOADED )
236 			SaveObject_Impl();
237 
238 		m_pOleComponent->removeCloseListener( m_xClosePreventer );
239 		try
240 		{
241 			m_pOleComponent->close( sal_False );
242 		}
243 		catch( uno::Exception& )
244 		{
245 			// TODO: there should be a special listener to wait for component closing
246 			// 		 and to notify object, may be object itself can be such a listener
247 			m_pOleComponent->addCloseListener( m_xClosePreventer );
248 			throw;
249 		}
250 
251 		m_pOleComponent->disconnectEmbeddedObject();
252 		m_pOleComponent->release();
253 		m_pOleComponent = NULL;
254 	}
255 #endif
256 }
257 
258 //------------------------------------------------------
Dispose()259 void OleEmbeddedObject::Dispose()
260 {
261 	if ( m_pInterfaceContainer )
262 	{
263     	lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >( this ) );
264 		m_pInterfaceContainer->disposeAndClear( aSource );
265 		delete m_pInterfaceContainer;
266 		m_pInterfaceContainer = NULL;
267 	}
268 
269 	if ( m_pOwnView )
270 	{
271 		m_pOwnView->Close();
272 		m_pOwnView->release();
273 		m_pOwnView = NULL;
274 	}
275 
276 	if ( m_pOleComponent )
277 		try {
278 			GetRidOfComponent();
279 		} catch( uno::Exception& )
280 		{
281 			m_bDisposed = true;
282 			throw; // TODO: there should be a special listener that will close object when
283 					// component is finally closed
284 		}
285 
286 	if ( m_xObjectStream.is() )
287 	{
288 		uno::Reference< lang::XComponent > xComp( m_xObjectStream, uno::UNO_QUERY );
289 		OSL_ENSURE( xComp.is(), "Storage stream doesn't support XComponent!\n" );
290 
291 		if ( xComp.is() )
292 		{
293 			try {
294 				xComp->dispose();
295 			} catch( uno::Exception& ) {}
296 		}
297 		m_xObjectStream = uno::Reference< io::XStream >();
298 	}
299 
300 	m_xParentStorage = uno::Reference< embed::XStorage >();
301 
302 	m_bDisposed = true;
303 }
304 
305 //------------------------------------------------------
getClassID()306 uno::Sequence< sal_Int8 > SAL_CALL OleEmbeddedObject::getClassID()
307 		throw ( uno::RuntimeException )
308 {
309     // begin wrapping related part ====================
310     uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject;
311     if ( xWrappedObject.is() )
312     {
313         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
314         return xWrappedObject->getClassID();
315     }
316     // end wrapping related part ====================
317 
318 	::osl::MutexGuard aGuard( m_aMutex );
319 	if ( m_bDisposed )
320 		throw lang::DisposedException(); // TODO
321 
322 	return m_aClassID;
323 }
324 
325 //------------------------------------------------------
getClassName()326 ::rtl::OUString SAL_CALL OleEmbeddedObject::getClassName()
327 		throw ( uno::RuntimeException )
328 {
329     // begin wrapping related part ====================
330     uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject;
331     if ( xWrappedObject.is() )
332     {
333         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
334         return xWrappedObject->getClassName();
335     }
336     // end wrapping related part ====================
337 
338 	::osl::MutexGuard aGuard( m_aMutex );
339 	if ( m_bDisposed )
340 		throw lang::DisposedException(); // TODO
341 
342 	return m_aClassName;
343 }
344 
345 //------------------------------------------------------
setClassInfo(const uno::Sequence<sal_Int8> & aClassID,const::rtl::OUString & aClassName)346 void SAL_CALL OleEmbeddedObject::setClassInfo(
347 				const uno::Sequence< sal_Int8 >& aClassID, const ::rtl::OUString& aClassName )
348 		throw ( lang::NoSupportException,
349 				uno::RuntimeException )
350 {
351     // begin wrapping related part ====================
352     uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject;
353     if ( xWrappedObject.is() )
354     {
355         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
356         xWrappedObject->setClassInfo( aClassID, aClassName );
357         return;
358     }
359     // end wrapping related part ====================
360 
361 	// the object class info can not be changed explicitly
362 	throw lang::NoSupportException(); //TODO:
363 }
364 
365 //------------------------------------------------------
getComponent()366 uno::Reference< util::XCloseable > SAL_CALL OleEmbeddedObject::getComponent()
367 		throw ( uno::RuntimeException )
368 {
369     // begin wrapping related part ====================
370     uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject;
371     if ( xWrappedObject.is() )
372     {
373         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
374         return xWrappedObject->getComponent();
375     }
376     // end wrapping related part ====================
377 
378 	::osl::MutexGuard aGuard( m_aMutex );
379 	if ( m_bDisposed )
380 		throw lang::DisposedException(); // TODO
381 
382 	if ( m_nObjectState == -1 ) // || m_nObjectState == embed::EmbedStates::LOADED )
383 	{
384 		// the object is still not running
385 		throw embed::WrongStateException( ::rtl::OUString::createFromAscii( "The object is not loaded!\n" ),
386 										uno::Reference< uno::XInterface >( static_cast< ::cppu::OWeakObject* >(this) ) );
387 	}
388 
389 	// if ( m_bWaitSaveCompleted )
390 	// 	throw embed::WrongStateException(
391 	// 				::rtl::OUString::createFromAscii( "The object waits for saveCompleted() call!\n" ),
392 	// 				uno::Reference< uno::XInterface >( reinterpret_cast< ::cppu::OWeakObject* >(this) ) );
393 
394 	if ( !m_pOleComponent )
395 	{
396 		// TODO/LATER: Is it correct???
397 		return uno::Reference< util::XCloseable >();
398 		// throw uno::RuntimeException(); // TODO
399 	}
400 
401 	return uno::Reference< util::XCloseable >( static_cast< ::cppu::OWeakObject* >( m_pOleComponent ), uno::UNO_QUERY );
402 }
403 
404 //----------------------------------------------
addStateChangeListener(const uno::Reference<embed::XStateChangeListener> & xListener)405 void SAL_CALL OleEmbeddedObject::addStateChangeListener( const uno::Reference< embed::XStateChangeListener >& xListener )
406 	throw ( uno::RuntimeException )
407 {
408     // begin wrapping related part ====================
409     uno::Reference< embed::XStateChangeBroadcaster > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY );
410     if ( xWrappedObject.is() )
411     {
412         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
413         xWrappedObject->addStateChangeListener( xListener );
414         return;
415     }
416     // end wrapping related part ====================
417 
418 	::osl::MutexGuard aGuard( m_aMutex );
419 	if ( m_bDisposed )
420 		throw lang::DisposedException(); // TODO
421 
422 	if ( !m_pInterfaceContainer )
423 		m_pInterfaceContainer = new ::cppu::OMultiTypeInterfaceContainerHelper( m_aMutex );
424 
425 	m_pInterfaceContainer->addInterface( ::getCppuType( (const uno::Reference< embed::XStateChangeListener >*)0 ),
426 														xListener );
427 }
428 
429 //----------------------------------------------
removeStateChangeListener(const uno::Reference<embed::XStateChangeListener> & xListener)430 void SAL_CALL OleEmbeddedObject::removeStateChangeListener(
431 					const uno::Reference< embed::XStateChangeListener >& xListener )
432 	throw (uno::RuntimeException)
433 {
434     // begin wrapping related part ====================
435     uno::Reference< embed::XStateChangeBroadcaster > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY );
436     if ( xWrappedObject.is() )
437     {
438         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
439         xWrappedObject->removeStateChangeListener( xListener );
440         return;
441     }
442     // end wrapping related part ====================
443 
444 	::osl::MutexGuard aGuard( m_aMutex );
445 	if ( m_pInterfaceContainer )
446 		m_pInterfaceContainer->removeInterface( ::getCppuType( (const uno::Reference< embed::XStateChangeListener >*)0 ),
447 												xListener );
448 }
449 
450 
451 //----------------------------------------------
close(sal_Bool bDeliverOwnership)452 void SAL_CALL OleEmbeddedObject::close( sal_Bool bDeliverOwnership )
453 	throw ( util::CloseVetoException,
454 			uno::RuntimeException )
455 {
456     // begin wrapping related part ====================
457     uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject;
458     if ( xWrappedObject.is() )
459     {
460         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
461         xWrappedObject->close( bDeliverOwnership );
462         return;
463     }
464     // end wrapping related part ====================
465 
466 	::osl::MutexGuard aGuard( m_aMutex );
467 	if ( m_bDisposed )
468 		throw lang::DisposedException(); // TODO
469 
470     uno::Reference< uno::XInterface > xSelfHold( static_cast< ::cppu::OWeakObject* >( this ) );
471     lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >( this ) );
472 
473 	if ( m_pInterfaceContainer )
474 	{
475     	::cppu::OInterfaceContainerHelper* pContainer =
476 			m_pInterfaceContainer->getContainer( ::getCppuType( ( const uno::Reference< util::XCloseListener >*) NULL ) );
477     	if ( pContainer != NULL )
478 		{
479         	::cppu::OInterfaceIteratorHelper pIterator(*pContainer);
480         	while (pIterator.hasMoreElements())
481         	{
482             	try
483             	{
484                 	((util::XCloseListener*)pIterator.next())->queryClosing( aSource, bDeliverOwnership );
485             	}
486             	catch( uno::RuntimeException& )
487             	{
488                 	pIterator.remove();
489             	}
490         	}
491 		}
492 
493     	pContainer = m_pInterfaceContainer->getContainer(
494 									::getCppuType( ( const uno::Reference< util::XCloseListener >*) NULL ) );
495     	if ( pContainer != NULL )
496 		{
497         	::cppu::OInterfaceIteratorHelper pCloseIterator(*pContainer);
498         	while (pCloseIterator.hasMoreElements())
499         	{
500             	try
501             	{
502                 	((util::XCloseListener*)pCloseIterator.next())->notifyClosing( aSource );
503             	}
504             	catch( uno::RuntimeException& )
505             	{
506                 	pCloseIterator.remove();
507             	}
508         	}
509 		}
510 	}
511 
512 	Dispose();
513 }
514 
515 //----------------------------------------------
addCloseListener(const uno::Reference<util::XCloseListener> & xListener)516 void SAL_CALL OleEmbeddedObject::addCloseListener( const uno::Reference< util::XCloseListener >& xListener )
517 	throw ( uno::RuntimeException )
518 {
519     // begin wrapping related part ====================
520     uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject;
521     if ( xWrappedObject.is() )
522     {
523         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
524         xWrappedObject->addCloseListener( xListener );
525         return;
526     }
527     // end wrapping related part ====================
528 
529 	::osl::MutexGuard aGuard( m_aMutex );
530 	if ( m_bDisposed )
531 		throw lang::DisposedException(); // TODO
532 
533 	if ( !m_pInterfaceContainer )
534 		m_pInterfaceContainer = new ::cppu::OMultiTypeInterfaceContainerHelper( m_aMutex );
535 
536 	m_pInterfaceContainer->addInterface( ::getCppuType( (const uno::Reference< util::XCloseListener >*)0 ), xListener );
537 }
538 
539 //----------------------------------------------
removeCloseListener(const uno::Reference<util::XCloseListener> & xListener)540 void SAL_CALL OleEmbeddedObject::removeCloseListener( const uno::Reference< util::XCloseListener >& xListener )
541 	throw (uno::RuntimeException)
542 {
543     // begin wrapping related part ====================
544     uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject;
545     if ( xWrappedObject.is() )
546     {
547         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
548         xWrappedObject->removeCloseListener( xListener );
549         return;
550     }
551     // end wrapping related part ====================
552 
553 	::osl::MutexGuard aGuard( m_aMutex );
554 	if ( m_bDisposed )
555 		throw lang::DisposedException(); // TODO
556 
557 	if ( m_pInterfaceContainer )
558 		m_pInterfaceContainer->removeInterface( ::getCppuType( (const uno::Reference< util::XCloseListener >*)0 ),
559 												xListener );
560 }
561 
562 //------------------------------------------------------
addEventListener(const uno::Reference<document::XEventListener> & xListener)563 void SAL_CALL OleEmbeddedObject::addEventListener( const uno::Reference< document::XEventListener >& xListener )
564 		throw ( uno::RuntimeException )
565 {
566     // begin wrapping related part ====================
567     uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject;
568     if ( xWrappedObject.is() )
569     {
570         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
571         xWrappedObject->addEventListener( xListener );
572         return;
573     }
574     // end wrapping related part ====================
575 
576 	::osl::MutexGuard aGuard( m_aMutex );
577 	if ( m_bDisposed )
578 		throw lang::DisposedException(); // TODO
579 
580 	if ( !m_pInterfaceContainer )
581 		m_pInterfaceContainer = new ::cppu::OMultiTypeInterfaceContainerHelper( m_aMutex );
582 
583 	m_pInterfaceContainer->addInterface( ::getCppuType( (const uno::Reference< document::XEventListener >*)0 ), xListener );
584 }
585 
586 //------------------------------------------------------
removeEventListener(const uno::Reference<document::XEventListener> & xListener)587 void SAL_CALL OleEmbeddedObject::removeEventListener(
588 				const uno::Reference< document::XEventListener >& xListener )
589 		throw ( uno::RuntimeException )
590 {
591     // begin wrapping related part ====================
592     uno::Reference< embed::XEmbeddedObject > xWrappedObject = m_xWrappedObject;
593     if ( xWrappedObject.is() )
594     {
595         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
596         xWrappedObject->removeEventListener( xListener );
597         return;
598     }
599     // end wrapping related part ====================
600 
601 	::osl::MutexGuard aGuard( m_aMutex );
602 	if ( m_bDisposed )
603 		throw lang::DisposedException(); // TODO
604 
605 	if ( m_pInterfaceContainer )
606 		m_pInterfaceContainer->removeInterface( ::getCppuType( (const uno::Reference< document::XEventListener >*)0 ),
607 												xListener );
608 }
609 
610 // XInplaceObject ( wrapper related implementation )
611 //------------------------------------------------------
setObjectRectangles(const awt::Rectangle & aPosRect,const awt::Rectangle & aClipRect)612 void SAL_CALL OleEmbeddedObject::setObjectRectangles( const awt::Rectangle& aPosRect,
613 										  			 	const awt::Rectangle& aClipRect )
614 		throw ( embed::WrongStateException,
615 				uno::Exception,
616 				uno::RuntimeException )
617 {
618     // begin wrapping related part ====================
619     uno::Reference< embed::XInplaceObject > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY );
620     if ( xWrappedObject.is() )
621     {
622         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
623         xWrappedObject->setObjectRectangles( aPosRect, aClipRect );
624         return;
625     }
626     // end wrapping related part ====================
627 
628     throw embed::WrongStateException();
629 }
630 
631 //------------------------------------------------------
enableModeless(sal_Bool bEnable)632 void SAL_CALL OleEmbeddedObject::enableModeless( sal_Bool bEnable )
633 		throw ( embed::WrongStateException,
634 				uno::Exception,
635 				uno::RuntimeException )
636 {
637     // begin wrapping related part ====================
638     uno::Reference< embed::XInplaceObject > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY );
639     if ( xWrappedObject.is() )
640     {
641         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
642         xWrappedObject->enableModeless( bEnable );
643         return;
644     }
645     // end wrapping related part ====================
646 
647     throw embed::WrongStateException();
648 }
649 
650 //------------------------------------------------------
translateAccelerators(const uno::Sequence<awt::KeyEvent> & aKeys)651 void SAL_CALL OleEmbeddedObject::translateAccelerators(
652 					const uno::Sequence< awt::KeyEvent >& aKeys )
653 		throw ( embed::WrongStateException,
654 				uno::RuntimeException )
655 {
656     // begin wrapping related part ====================
657     uno::Reference< embed::XInplaceObject > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY );
658     if ( xWrappedObject.is() )
659     {
660         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
661         xWrappedObject->translateAccelerators( aKeys );
662         return;
663     }
664     // end wrapping related part ====================
665 
666     // throw embed::WrongStateException();
667 }
668 
669 // XChild
670 //------------------------------------------------------
getParent()671 com::sun::star::uno::Reference< com::sun::star::uno::XInterface > SAL_CALL OleEmbeddedObject::getParent() throw (::com::sun::star::uno::RuntimeException)
672 {
673     // begin wrapping related part ====================
674     uno::Reference< container::XChild > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY );
675     if ( xWrappedObject.is() )
676     {
677         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
678         return xWrappedObject->getParent();
679     }
680     // end wrapping related part ====================
681 
682     return m_xParent;
683 }
684 
685 //------------------------------------------------------
setParent(const com::sun::star::uno::Reference<com::sun::star::uno::XInterface> & xParent)686 void SAL_CALL OleEmbeddedObject::setParent( const com::sun::star::uno::Reference< com::sun::star::uno::XInterface >& xParent ) throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException)
687 {
688     // begin wrapping related part ====================
689     uno::Reference< container::XChild > xWrappedObject( m_xWrappedObject, uno::UNO_QUERY );
690     if ( xWrappedObject.is() )
691     {
692         // the object was converted to OOo embedded object, the current implementation is now only a wrapper
693         xWrappedObject->setParent( xParent );
694         return;
695     }
696     // end wrapping related part ====================
697 
698     m_xParent = xParent;
699 }
700 
701