#112923# do not close stream untill it is needed

This commit is contained in:
Mikhail Voitenko
2003-11-20 16:02:23 +00:00
parent cf8a36c99b
commit 93f166da84
4 changed files with 75 additions and 21 deletions

View File

@@ -2,9 +2,9 @@
* *
* $RCSfile: miscobj.cxx,v $ * $RCSfile: miscobj.cxx,v $
* *
* $Revision: 1.5 $ * $Revision: 1.6 $
* *
* last change: $Author: mav $ $Date: 2003-11-18 12:47:06 $ * last change: $Author: mav $ $Date: 2003-11-20 17:02:21 $
* *
* The Contents of this file are made available subject to the terms of * The Contents of this file are made available subject to the terms of
* either of the following licenses * either of the following licenses
@@ -467,6 +467,23 @@ void SAL_CALL OCommonEmbeddedObject::close( sal_Bool bDeliverOwnership )
m_pDocHolder = NULL; m_pDocHolder = NULL;
} }
// TODO: for now the storage will be disposed by the object, but after the document
// will use the storage, the storage will be disposed by the document and recreated by the object
if ( m_xObjectStorage.is() )
{
uno::Reference< lang::XComponent > xComp( m_xObjectStorage, uno::UNO_QUERY );
OSL_ENSURE( xComp.is(), "Storage does not support XComponent!\n" );
if ( xComp.is() )
{
try {
xComp->dispose();
} catch ( uno::Exception& ) {}
}
m_xObjectStorage = uno::Reference< embed::XStorage >();
}
m_bClosed = sal_True; // the closing succeeded m_bClosed = sal_True; // the closing succeeded
} }

View File

@@ -2,9 +2,9 @@
* *
* $RCSfile: oleembobj.hxx,v $ * $RCSfile: oleembobj.hxx,v $
* *
* $Revision: 1.3 $ * $Revision: 1.4 $
* *
* last change: $Author: mav $ $Date: 2003-11-18 09:03:54 $ * last change: $Author: mav $ $Date: 2003-11-20 17:02:21 $
* *
* The Contents of this file are made available subject to the terms of * The Contents of this file are made available subject to the terms of
* either of the following licenses * either of the following licenses
@@ -165,6 +165,9 @@ class OleEmbeddedObject : public ::cppu::WeakImplHelper8
::rtl::OUString m_aLinkURL; // ??? ::rtl::OUString m_aLinkURL; // ???
protected: protected:
::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > GetStreamForSaving();
::com::sun::star::uno::Sequence< sal_Int32 > GetIntermediateVerbsSequence_Impl( sal_Int32 nNewState ); ::com::sun::star::uno::Sequence< sal_Int32 > GetIntermediateVerbsSequence_Impl( sal_Int32 nNewState );
::com::sun::star::uno::Sequence< sal_Int32 > GetReachableStatesList_Impl( ::com::sun::star::uno::Sequence< sal_Int32 > GetReachableStatesList_Impl(

View File

@@ -2,9 +2,9 @@
* *
* $RCSfile: olemisc.cxx,v $ * $RCSfile: olemisc.cxx,v $
* *
* $Revision: 1.3 $ * $Revision: 1.4 $
* *
* last change: $Author: mav $ $Date: 2003-11-18 09:03:55 $ * last change: $Author: mav $ $Date: 2003-11-20 17:02:23 $
* *
* The Contents of this file are made available subject to the terms of * The Contents of this file are made available subject to the terms of
* either of the following licenses * either of the following licenses
@@ -66,7 +66,9 @@
#include <com/sun/star/embed/EmbedStates.hpp> #include <com/sun/star/embed/EmbedStates.hpp>
#endif #endif
#ifndef _COM_SUN_STAR_LANG_XCOMPONENT_HPP_
#include <com/sun/star/lang/XComponent.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_ #ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_
#include <com/sun/star/lang/DisposedException.hpp> #include <com/sun/star/lang/DisposedException.hpp>
#endif #endif
@@ -118,9 +120,10 @@ OleEmbeddedObject::OleEmbeddedObject( const uno::Reference< lang::XMultiServiceF
//------------------------------------------------------ //------------------------------------------------------
OleEmbeddedObject::~OleEmbeddedObject() OleEmbeddedObject::~OleEmbeddedObject()
{ {
OSL_ENSURE( !m_pInterfaceContainer && !m_pOleComponent, "The object is not closed! DISASTER is possible!" ); OSL_ENSURE( !m_pInterfaceContainer && !m_pOleComponent && !m_xObjectStream.is(),
"The object is not closed! DISASTER is possible!" );
if ( m_pOleComponent || m_pInterfaceContainer ) if ( m_pOleComponent || m_pInterfaceContainer || m_xObjectStream.is() )
{ {
// the component must be cleaned during closing // the component must be cleaned during closing
m_refCount++; // to avoid crash m_refCount++; // to avoid crash
@@ -155,6 +158,22 @@ void OleEmbeddedObject::Dispose()
m_pOleComponent = NULL; m_pOleComponent = NULL;
} }
if ( m_xObjectStream.is() )
{
uno::Reference< lang::XComponent > xComp( m_xObjectStream, uno::UNO_QUERY );
OSL_ENSURE( xComp.is(), "Storage stream doesn't support XComponent!\n" );
if ( xComp.is() )
{
try {
xComp->dispose();
} catch( uno::Exception& ) {}
}
m_xObjectStream = uno::Reference< io::XStream >();
}
m_xParentStorage = uno::Reference< embed::XStorage >();
m_bDisposed = true; m_bDisposed = true;
} }

View File

@@ -2,9 +2,9 @@
* *
* $RCSfile: olepersist.cxx,v $ * $RCSfile: olepersist.cxx,v $
* *
* $Revision: 1.3 $ * $Revision: 1.4 $
* *
* last change: $Author: mav $ $Date: 2003-11-18 09:03:56 $ * last change: $Author: mav $ $Date: 2003-11-20 17:02:23 $
* *
* The Contents of this file are made available subject to the terms of * The Contents of this file are made available subject to the terms of
* either of the following licenses * either of the following licenses
@@ -94,6 +94,10 @@
#include <com/sun/star/container/XNameAccess.hpp> #include <com/sun/star/container/XNameAccess.hpp>
#endif #endif
#ifndef _COM_SUN_STAR_IO_XTRUNCATE_HPP_
#include <com/sun/star/io/XTruncate.hpp>
#endif
#include <olecomponent.hxx> #include <olecomponent.hxx>
#include <closepreventer.hxx> #include <closepreventer.hxx>
@@ -167,6 +171,25 @@ void OleEmbeddedObject::CreateOleComponent_Impl()
OSL_ENSURE( sal_False, "Trying to recreate OLE component!\n" ); OSL_ENSURE( sal_False, "Trying to recreate OLE component!\n" );
} }
//------------------------------------------------------
uno::Reference< io::XOutputStream > OleEmbeddedObject::GetStreamForSaving()
{
if ( !m_xObjectStream.is() )
throw uno::RuntimeException(); //TODO:
uno::Reference< io::XOutputStream > xOutStream = m_xObjectStream->getOutputStream();
if ( !xOutStream.is() )
throw io::IOException(); //TODO: access denied
uno::Reference< io::XTruncate > xTruncate( xOutStream, uno::UNO_QUERY );
if ( !xTruncate.is() )
throw uno::RuntimeException(); //TODO:
xTruncate->truncate();
return xOutStream;
}
//------------------------------------------------------ //------------------------------------------------------
void SAL_CALL OleEmbeddedObject::setPersistentEntry( void SAL_CALL OleEmbeddedObject::setPersistentEntry(
const uno::Reference< embed::XStorage >& xStorage, const uno::Reference< embed::XStorage >& xStorage,
@@ -367,21 +390,15 @@ void SAL_CALL OleEmbeddedObject::storeOwn()
// in case visual repersentation must be stored also // in case visual repersentation must be stored also
// the procedure should be the same as for embedded objects // the procedure should be the same as for embedded objects
uno::Reference< io::XOutputStream > xOutStream = m_xObjectStream->getOutputStream(); uno::Reference< io::XOutputStream > xOutStream = GetStreamForSaving();
if ( !xOutStream.is() )
throw io::IOException(); //TODO: access denied
// should the component detect that it is a link??? // should the component detect that it is a link???
m_pOleComponent->StoreObjectToStream( xOutStream, m_bStoreVisRepl ); m_pOleComponent->StoreObjectToStream( xOutStream, m_bStoreVisRepl );
xOutStream->closeOutput(); //TODO: allow to reopen the stream object ???
} }
else else
{ {
uno::Reference< io::XOutputStream > xOutStream = m_xObjectStream->getOutputStream(); uno::Reference< io::XOutputStream > xOutStream = GetStreamForSaving();
if ( !xOutStream.is() )
throw io::IOException(); //TODO: access denied
m_pOleComponent->StoreObjectToStream( xOutStream, m_bStoreVisRepl ); m_pOleComponent->StoreObjectToStream( xOutStream, m_bStoreVisRepl );
xOutStream->closeOutput(); //TODO: allow to reopen the stream object ???
} }
// TODO: // TODO:
@@ -431,7 +448,6 @@ void SAL_CALL OleEmbeddedObject::storeToEntry( const uno::Reference< embed::XSto
throw io::IOException(); //TODO: access denied throw io::IOException(); //TODO: access denied
m_pOleComponent->StoreObjectToStream( xOutStream, m_bStoreVisRepl ); m_pOleComponent->StoreObjectToStream( xOutStream, m_bStoreVisRepl );
xOutStream->closeOutput();
uno::Reference< lang::XComponent > xComp( xTargetStream, uno::UNO_QUERY ); uno::Reference< lang::XComponent > xComp( xTargetStream, uno::UNO_QUERY );
if ( xComp.is() ) if ( xComp.is() )
@@ -485,7 +501,6 @@ void SAL_CALL OleEmbeddedObject::storeAsEntry( const uno::Reference< embed::XSto
throw io::IOException(); //TODO: access denied throw io::IOException(); //TODO: access denied
m_pOleComponent->StoreObjectToStream( xOutStream, m_bStoreVisRepl ); m_pOleComponent->StoreObjectToStream( xOutStream, m_bStoreVisRepl );
xOutStream->closeOutput(); // TODO: allow to reuse the stream
try { try {
uno::Reference< lang::XComponent > xComp( xTargetStream, uno::UNO_QUERY ); uno::Reference< lang::XComponent > xComp( xTargetStream, uno::UNO_QUERY );