#112923# breaking of ole link and assertion fixes

This commit is contained in:
Mikhail Voitenko 2003-11-26 15:44:04 +00:00
parent 5d64757c7a
commit 586d6b72db
3 changed files with 83 additions and 22 deletions

View File

@ -2,9 +2,9 @@
*
* $RCSfile: persistence.cxx,v $
*
* $Revision: 1.4 $
* $Revision: 1.5 $
*
* last change: $Author: mav $ $Date: 2003-11-25 13:21:47 $
* last change: $Author: mav $ $Date: 2003-11-26 16:44:03 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -220,7 +220,7 @@ void OCommonEmbeddedObject::SwitchOwnPersistence( const uno::Reference< embed::X
{
try {
uno::Reference< lang::XComponent > xComponent( m_xObjectStorage, uno::UNO_QUERY );
OSL_ENSURE( xComponent.is(), "Wrong storage implementation!" );
OSL_ENSURE( !m_xObjectStorage.is() || xComponent.is(), "Wrong storage implementation!" );
if ( xComponent.is() )
xComponent->dispose();
}

View File

@ -2,9 +2,9 @@
*
* $RCSfile: olecomponent.cxx,v $
*
* $Revision: 1.6 $
* $Revision: 1.7 $
*
* last change: $Author: mav $ $Date: 2003-11-26 10:27:47 $
* last change: $Author: mav $ $Date: 2003-11-26 16:44:04 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -727,22 +727,83 @@ void OleComponent::InitEmbeddedCopyOfLink( OleComponent* pOleLinkComponent )
CComPtr< IDataObject > pDataObject;
HRESULT hr = pOleLinkComponent->m_pObj->QueryInterface( IID_IDataObject, (void**)&pDataObject );
if ( FAILED( hr ) || !pDataObject || OleQueryCreateFromData( pDataObject ) )
throw io::IOException(); // TODO: the object doesn't allow initialization based on data
if ( SUCCEEDED( hr ) && pDataObject && SUCCEEDED( OleQueryCreateFromData( pDataObject ) ) )
{
m_pIStorage = CreateNewIStorage_Impl();
if ( !m_pIStorage )
throw uno::RuntimeException(); // TODO:
m_pIStorage = CreateNewIStorage_Impl();
if ( !m_pIStorage )
throw uno::RuntimeException(); // TODO:
hr = OleCreateFromData( pDataObject,
IID_IUnknown,
OLERENDER_DRAW,
NULL,
NULL,
m_pIStorage,
(void**)&m_pObj );
hr = OleCreateFromData( pDataObject,
IID_IUnknown,
OLERENDER_DRAW,
NULL,
NULL,
m_pIStorage,
(void**)&m_pObj );
}
if ( FAILED( hr ) || !m_pObj)
if ( !m_pObj )
{
CComPtr< IOleLink > pOleLink;
hr = pOleLinkComponent->m_pObj->QueryInterface( IID_IOleLink, (void**)&pOleLink );
if ( FAILED( hr ) || !pOleLink )
throw io::IOException(); // TODO: the object doesn't support IOleLink
CComPtr< IMoniker > pMoniker;
hr = pOleLink->GetSourceMoniker( &pMoniker );
if ( FAILED( hr ) || !pMoniker )
throw io::IOException(); // TODO: can not retrieve moniker
// In case of file moniker life is easy :)
DWORD aMonType = 0;
hr = pMoniker->IsSystemMoniker( &aMonType );
if ( SUCCEEDED( hr ) && aMonType == MKSYS_FILEMONIKER )
{
CComPtr< IMalloc > pMalloc;
CoGetMalloc( 1, &pMalloc ); // if fails there will be a memory leak
OSL_ENSURE( pMalloc, "CoGetMalloc() failed!" );
LPOLESTR pOleStr = NULL;
hr = pOleLink->GetSourceDisplayName( &pOleStr );
if ( SUCCEEDED( hr ) && pOleStr )
{
::rtl::OUString aFilePath( (sal_Unicode*)pOleStr );
if ( pMalloc )
pMalloc->Free( (void*)pOleStr );
hr = OleCreateFromFile( CLSID_NULL,
aFilePath.getStr(),
IID_IUnknown,
OLERENDER_DRAW, // OLERENDER_FORMAT
NULL,
NULL,
m_pIStorage,
(void**)&m_pObj );
}
}
// in case of other moniker types the only way is to get storage
if ( !m_pObj )
{
CComPtr< IBindCtx > pBindCtx;
hr = CreateBindCtx( 0, (LPBC FAR*)&pBindCtx );
if ( SUCCEEDED( hr ) && pBindCtx )
{
CComPtr< IStorage > pObjectStorage;
hr = pMoniker->BindToStorage( pBindCtx, NULL, IID_IStorage, (void**)&pObjectStorage );
if ( SUCCEEDED( hr ) && pObjectStorage )
{
hr = pObjectStorage->CopyTo( 0, NULL, NULL, m_pIStorage );
if ( SUCCEEDED( hr ) )
hr = OleLoad( m_pIStorage, IID_IUnknown, NULL, (void**)&m_pObj );
}
}
}
}
// If object could not be created the only way is to use graphical representation
if ( FAILED( hr ) || !m_pObj )
throw uno::RuntimeException(); // TODO
// TODO: May be the Icon should be also copied?

View File

@ -2,9 +2,9 @@
*
* $RCSfile: olepersist.cxx,v $
*
* $Revision: 1.7 $
* $Revision: 1.8 $
*
* last change: $Author: mav $ $Date: 2003-11-26 10:27:48 $
* last change: $Author: mav $ $Date: 2003-11-26 16:44:04 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@ -111,7 +111,7 @@ void OleEmbeddedObject::SwitchOwnPersistence( const uno::Reference< embed::XStor
{
try {
uno::Reference< lang::XComponent > xComponent( m_xObjectStream, uno::UNO_QUERY );
OSL_ENSURE( xComponent.is(), "Wrong stream implementation!" );
OSL_ENSURE( !m_xObjectStream.is() || xComponent.is(), "Wrong stream implementation!" );
if ( xComponent.is() )
xComponent->dispose();
}
@ -766,7 +766,7 @@ void SAL_CALL OleEmbeddedObject::breakLink( const uno::Reference< embed::XStorag
GetRidOfComponent();
CreateOleComponent_Impl( pNewOleComponent );
if ( m_xParentStorage != xStorage || !m_aNewEntryName.equals( sEntName ) )
if ( m_xParentStorage != xStorage || !m_aEntryName.equals( sEntName ) )
SwitchOwnPersistence( xStorage, sEntName );
if ( m_nObjectState != embed::EmbedStates::EMBED_LOADED )