diff options
author | Michael Stahl <mstahl@redhat.com> | 2011-12-02 23:43:23 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2011-12-03 00:48:15 +0100 |
commit | fd95f1ab6220c6a530fd2e4e727417f504a5db51 (patch) | |
tree | b378d6e72698a8329f41d7919016574a301016e2 | |
parent | aa59ee85a8e902aa4dc956822e9169093de6c454 (diff) |
refactor SdrModel::GetDocumentStream
Remove 3 ~identical implementations of GetDocumentStream and the associated
struct SdrDocumentStreamInfo.
-rw-r--r-- | sc/inc/drwlayer.hxx | 1 | ||||
-rw-r--r-- | sc/source/core/data/drwlayer.cxx | 53 | ||||
-rw-r--r-- | sd/inc/drawdoc.hxx | 1 | ||||
-rw-r--r-- | sd/source/core/drawdoc3.cxx | 82 | ||||
-rw-r--r-- | sd/source/ui/inc/DrawDocShell.hxx | 1 | ||||
-rw-r--r-- | svx/inc/svx/svdmodel.hxx | 21 | ||||
-rw-r--r-- | svx/source/svdraw/svdmodel.cxx | 48 | ||||
-rw-r--r-- | svx/source/svdraw/svdograf.cxx | 38 | ||||
-rw-r--r-- | sw/inc/drawdoc.hxx | 5 | ||||
-rw-r--r-- | sw/source/core/draw/drawdoc.cxx | 40 |
10 files changed, 71 insertions, 219 deletions
diff --git a/sc/inc/drwlayer.hxx b/sc/inc/drwlayer.hxx index 35e1843719a2..6f4f71dd6902 100644 --- a/sc/inc/drwlayer.hxx +++ b/sc/inc/drwlayer.hxx @@ -115,7 +115,6 @@ public: virtual void SetChanged( sal_Bool bFlg = sal_True ); virtual Window* GetCurDocViewWin(); - virtual SvStream* GetDocumentStream(SdrDocumentStreamInfo& rStreamInfo) const; virtual SdrLayerID GetControlExportLayerId( const SdrObject & ) const; diff --git a/sc/source/core/data/drwlayer.cxx b/sc/source/core/data/drwlayer.cxx index 58b591cec3e1..327f65a15e17 100644 --- a/sc/source/core/data/drwlayer.cxx +++ b/sc/source/core/data/drwlayer.cxx @@ -1904,59 +1904,6 @@ void ScDrawLayer::SetChanged( sal_Bool bFlg /* = sal_True */ ) FmFormModel::SetChanged( bFlg ); } -SvStream* ScDrawLayer::GetDocumentStream(SdrDocumentStreamInfo& rStreamInfo) const -{ - OSL_ENSURE( pDoc, "ScDrawLayer::GetDocumentStream without document" ); - if ( !pDoc ) - return NULL; - - uno::Reference< embed::XStorage > xStorage = pDoc->GetDocumentShell() ? - pDoc->GetDocumentShell()->GetStorage() : - NULL; - SvStream* pRet = NULL; - - if( xStorage.is() ) - { - if( rStreamInfo.maUserData.Len() && - ( rStreamInfo.maUserData.GetToken( 0, ':' ) == - String( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package" ) ) ) ) - { - const String aPicturePath( rStreamInfo.maUserData.GetToken( 1, ':' ) ); - - // graphic from picture stream in picture storage in XML package - if( aPicturePath.GetTokenCount( '/' ) == 2 ) - { - const String aPictureStreamName( aPicturePath.GetToken( 1, '/' ) ); - const String aPictureStorageName( aPicturePath.GetToken( 0, '/' ) ); - - try { - if ( xStorage->isStorageElement( aPictureStorageName ) ) - { - uno::Reference< embed::XStorage > xPictureStorage = - xStorage->openStorageElement( aPictureStorageName, embed::ElementModes::READ ); - - if( xPictureStorage.is() && - xPictureStorage->isStreamElement( aPictureStreamName ) ) - { - uno::Reference< io::XStream > xStream = - xPictureStorage->openStreamElement( aPictureStreamName, embed::ElementModes::READ ); - if ( xStream.is() ) - pRet = ::utl::UcbStreamHelper::CreateStream( xStream ); - } - } - } - catch( uno::Exception& ) - { - // TODO: error handling - } - } - } - rStreamInfo.mbDeleteAfterUse = ( pRet != NULL ); - } - - return pRet; -} - SdrLayerID ScDrawLayer::GetControlExportLayerId( const SdrObject & ) const { // Layer fuer Export von Form-Controls in Versionen vor 5.0 - immer SC_LAYER_FRONT diff --git a/sd/inc/drawdoc.hxx b/sd/inc/drawdoc.hxx index 86b2ef85fdfe..7e087f581681 100644 --- a/sd/inc/drawdoc.hxx +++ b/sd/inc/drawdoc.hxx @@ -229,7 +229,6 @@ public: virtual void DisposeLoadedModels(); virtual bool IsReadOnly() const; virtual void SetChanged(sal_Bool bFlag = sal_True); - virtual SvStream* GetDocumentStream(SdrDocumentStreamInfo& rStreamInfo) const; SfxItemPool& GetPool() { return( *pItemPool ); } diff --git a/sd/source/core/drawdoc3.cxx b/sd/source/core/drawdoc3.cxx index b4000157dfac..c05af4811b20 100644 --- a/sd/source/core/drawdoc3.cxx +++ b/sd/source/core/drawdoc3.cxx @@ -1242,88 +1242,6 @@ List* SdDrawDocument::GetCustomShowList(sal_Bool bCreate) /************************************************************************* |* -|* Document-Stream herausgeben (fuer load-on-demand Graphiken) -|* -\************************************************************************/ - -SvStream* SdDrawDocument::GetDocumentStream(SdrDocumentStreamInfo& rStreamInfo) const -{ - uno::Reference < embed::XStorage > xStor; - if (mpDocSh) - xStor = mpDocSh->GetStorage(); - SvStream* pRet = NULL; - - if( xStor.is() ) - { - //TODO/MBA: binary format removed, needs testing - if( rStreamInfo.maUserData.Len() && - ( rStreamInfo.maUserData.GetToken( 0, ':' ) == - String( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package" ) ) ) ) - { - const String aPicturePath( rStreamInfo.maUserData.GetToken( 1, ':' ) ); - - // graphic from picture stream in picture storage in XML package - if( aPicturePath.GetTokenCount( '/' ) == 2 ) try - { - const String aPictureStreamName( aPicturePath.GetToken( 1, '/' ) ); - const String aPictureStorageName( aPicturePath.GetToken( 0, '/' ) ); - if( xStor->isStorageElement( aPictureStorageName ) ) - { - uno::Reference < embed::XStorage > xPictureStorage = - xStor->openStorageElement( aPictureStorageName, embed::ElementModes::READ ); - try - { - if( xPictureStorage.is() && xPictureStorage->isStreamElement( aPictureStreamName ) ) - { - uno::Reference < io::XStream > xStream = xPictureStorage->openStreamElement( aPictureStreamName, embed::ElementModes::READ ); - if( xStream.is() ) - pRet = ::utl::UcbStreamHelper::CreateStream( xStream ); - } - } - catch( container::NoSuchElementException& ) - { - } - } - } - catch( uno::Exception& e ) - { - (void)e; - OSL_FAIL( - (rtl::OString("sd::SdDrawDocument::GetDocumentStream(), " - "exception caught: ") + - rtl::OUStringToOString( - comphelper::anyToString( cppu::getCaughtException() ), - RTL_TEXTENCODING_UTF8 ) + - rtl::OString("\r\nATTENTION: Graphics may get lost now, please inform CL or KA!") ).getStr() ); - } - - rStreamInfo.mbDeleteAfterUse = ( pRet != NULL ); - } - } - -#if OSL_DEBUG_LEVEL > 1 - if( pRet ) - { - // try to get some information from stream - const sal_uLong nStartPos = pRet->Tell(); - const sal_uLong nEndPos = pRet->Seek( STREAM_SEEK_TO_END ); - const sal_uLong nStmLen = nEndPos - nStartPos; - sal_uChar aTestByte; - - // try to read one byte - if( nStmLen ) - *pRet >> aTestByte; - - pRet->Seek( nStartPos ); - } -#endif - - return pRet; -} - - -/************************************************************************* -|* |* Nicht benutzte MasterPages und Layouts entfernen |* \************************************************************************/ diff --git a/sd/source/ui/inc/DrawDocShell.hxx b/sd/source/ui/inc/DrawDocShell.hxx index 02f225d20cb9..0083f53ec9bc 100644 --- a/sd/source/ui/inc/DrawDocShell.hxx +++ b/sd/source/ui/inc/DrawDocShell.hxx @@ -47,7 +47,6 @@ class SdDrawDocument; class SvxItemFactory; class SdPage; class SfxPrinter; -struct SdrDocumentStreamInfo; struct SpellCallbackInfo; class AbstractSvxNameDialog; class SfxUndoManager; diff --git a/svx/inc/svx/svdmodel.hxx b/svx/inc/svx/svdmodel.hxx index 3cf998fec409..567c821e5f4e 100644 --- a/svx/inc/svx/svdmodel.hxx +++ b/svx/inc/svx/svdmodel.hxx @@ -91,10 +91,13 @@ class SotStorage; class SdrOutlinerCache; class SotStorageRef; class SdrUndoFactory; -namespace comphelper{ +namespace comphelper +{ class IEmbeddedHelper; + class LifecycleProxy; } -namespace sfx2{ +namespace sfx2 +{ class LinkManager; } //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -156,13 +159,6 @@ public: // neu zu bestimmen und unbenutztes wegzuwerfen). sal_False == aktiv #define LOADREFCOUNTS (false) -struct SdrDocumentStreamInfo -{ - bool mbDeleteAfterUse; - String maUserData; - com::sun::star::uno::Reference < com::sun::star::embed::XStorage > mxStorageRef; -}; - struct SdrModelImpl; class SVX_DLLPUBLIC SdrModel : public SfxBroadcaster, public tools::WeakBase< SdrModel > @@ -330,7 +326,12 @@ public: // Datei angelegt. // Geliefert werden muss der Stream, aus dem das Model geladen wurde // bzw. in den es zuletzt gespeichert wurde. - virtual SvStream* GetDocumentStream( SdrDocumentStreamInfo& rStreamInfo ) const; + virtual ::com::sun::star::uno::Reference< + ::com::sun::star::embed::XStorage> GetDocumentStorage() const; + ::com::sun::star::uno::Reference< + ::com::sun::star::io::XInputStream > + GetDocumentStream(::rtl::OUString const& rURL, + ::comphelper::LifecycleProxy & rProxy) const; // Die Vorlagenattribute der Zeichenobjekte in harte Attribute verwandeln. void BurnInStyleSheetAttributes(); // Wer sich von SdrPage ableitet muss sich auch von SdrModel ableiten diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx index cb24ca2c3768..df94366e8b31 100644 --- a/svx/source/svdraw/svdmodel.cxx +++ b/svx/source/svdraw/svdmodel.cxx @@ -29,11 +29,16 @@ #include <svx/svdmodel.hxx> -#include <com/sun/star/lang/XComponent.hpp> +#include <math.h> + #include <osl/endian.h> #include <rtl/logfile.hxx> #include <rtl/strbuf.hxx> -#include <math.h> + +#include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/document/XStorageBasedDocument.hpp> +#include <com/sun/star/embed/ElementModes.hpp> + #include <tools/urlobj.hxx> #include <unotools/ucbstreamhelper.hxx> @@ -82,6 +87,7 @@ #include <svl/zforlist.hxx> #include <comphelper/processfactory.hxx> #include <comphelper/servicehelper.hxx> +#include <comphelper/storagehelper.hxx> #include <tools/tenccvt.hxx> #include <unotools/syslocale.hxx> @@ -886,9 +892,43 @@ void SdrModel::ImpReformatAllEdgeObjects() } } -SvStream* SdrModel::GetDocumentStream(SdrDocumentStreamInfo& /*rStreamInfo*/) const +uno::Reference<embed::XStorage> SdrModel::GetDocumentStorage() const { - return NULL; + uno::Reference<document::XStorageBasedDocument> const xSBD( + const_cast<SdrModel*>(this)->getUnoModel(), uno::UNO_QUERY); + if (!xSBD.is()) + { + SAL_WARN("svx", "no UNO model"); + return 0; + } + return xSBD->getDocumentStorage(); +} + +uno::Reference<io::XInputStream> +SdrModel::GetDocumentStream( ::rtl::OUString const& rURL, + ::comphelper::LifecycleProxy & rProxy) const +{ + uno::Reference<embed::XStorage> const xStorage(GetDocumentStorage()); + if (!xStorage.is()) + { + SAL_WARN("svx", "no storage?"); + return 0; + } + try { + uno::Reference<io::XStream> const xStream( + ::comphelper::OStorageHelper::GetStreamAtPackageURL( + xStorage, rURL, embed::ElementModes::READ, rProxy)); + return (xStream.is()) ? xStream->getInputStream() : 0; + } + catch (container::NoSuchElementException const&) + { + SAL_INFO("svx", "not found"); + } + catch (uno::Exception const&) + { + SAL_WARN("svx", "exception"); + } + return 0; } // convert template attributes from the string into "hard" attributes diff --git a/svx/source/svdraw/svdograf.cxx b/svx/source/svdraw/svdograf.cxx index a587ab0b512a..151878a1bb27 100644 --- a/svx/source/svdraw/svdograf.cxx +++ b/svx/source/svdraw/svdograf.cxx @@ -35,6 +35,7 @@ #include <vcl/salbtype.hxx> #include <sot/formats.hxx> #include <sot/storage.hxx> +#include <comphelper/storagehelper.hxx> #include <unotools/ucbstreamhelper.hxx> #include <unotools/localfilehelper.hxx> #include <svl/style.hxx> @@ -71,6 +72,7 @@ #include <basegfx/polygon/b2dpolygontools.hxx> #include <osl/thread.hxx> +using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::io; @@ -1220,12 +1222,13 @@ IMPL_LINK( SdrGrafObj, ImpSwapHdl, GraphicObject*, pO ) { if( pGraphic->HasUserData() ) { - SdrDocumentStreamInfo aStreamInfo; + ::comphelper::LifecycleProxy proxy; + uno::Reference<io::XInputStream> const xStream( + pModel->GetDocumentStream(pGraphic->GetUserData(), proxy)); - aStreamInfo.mbDeleteAfterUse = sal_False; - aStreamInfo.maUserData = pGraphic->GetUserData(); - - SvStream* pStream = pModel->GetDocumentStream( aStreamInfo ); + ::boost::scoped_ptr<SvStream> const pStream( (xStream.is()) + ? ::utl::UcbStreamHelper::CreateStream(xStream) + : 0 ); if( pStream != NULL ) { @@ -1251,7 +1254,7 @@ IMPL_LINK( SdrGrafObj, ImpSwapHdl, GraphicObject*, pO ) } if( !GraphicFilter::GetGraphicFilter().ImportGraphic( aGraphic, - aStreamInfo.maUserData, + pGraphic->GetUserData(), *pStream, GRFILTER_FORMAT_DONTKNOW, NULL, 0, pFilterData ) ) @@ -1267,17 +1270,6 @@ IMPL_LINK( SdrGrafObj, ImpSwapHdl, GraphicObject*, pO ) delete pFilterData; pStream->ResetError(); - - if( aStreamInfo.mbDeleteAfterUse || aStreamInfo.mxStorageRef.is() ) - { - if ( aStreamInfo.mxStorageRef.is() ) - { - aStreamInfo.mxStorageRef->dispose(); - aStreamInfo.mxStorageRef = 0; - } - - delete pStream; - } } } else if( !ImpUpdateGraphicLink( sal_False ) ) @@ -1316,15 +1308,9 @@ Reference< XInputStream > SdrGrafObj::getInputStream() // kann aus dem original Doc-Stream nachgeladen werden... if( pGraphic->HasUserData() ) { - SdrDocumentStreamInfo aStreamInfo; - - aStreamInfo.mbDeleteAfterUse = sal_False; - aStreamInfo.maUserData = pGraphic->GetUserData(); - - SvStream* pStream = pModel->GetDocumentStream( aStreamInfo ); - - if( pStream ) - xStream.set( new utl::OInputStreamWrapper( pStream, sal_True ) ); + ::comphelper::LifecycleProxy proxy; + xStream.set( + pModel->GetDocumentStream(pGraphic->GetUserData(), proxy)); } else if( pGraphic && GetGraphic().IsLink() ) { diff --git a/sw/inc/drawdoc.hxx b/sw/inc/drawdoc.hxx index 4c699c3b2591..cdc2c3ba538e 100644 --- a/sw/inc/drawdoc.hxx +++ b/sw/inc/drawdoc.hxx @@ -47,9 +47,8 @@ public: virtual SdrPage* AllocPage(bool bMasterPage); - - // For "load on demand" of graphics in DrawingLayer. - virtual SvStream* GetDocumentStream( SdrDocumentStreamInfo& rInfo ) const; + virtual ::com::sun::star::uno::Reference< + ::com::sun::star::embed::XStorage> GetDocumentStorage() const; // For saving of rectangles as control-replacement for versions < 5.0. virtual SdrLayerID GetControlExportLayerId( const SdrObject & ) const; diff --git a/sw/source/core/draw/drawdoc.cxx b/sw/source/core/draw/drawdoc.cxx index 92684dc79d1c..00ea9c7e276a 100644 --- a/sw/source/core/draw/drawdoc.cxx +++ b/sw/source/core/draw/drawdoc.cxx @@ -161,45 +161,9 @@ SdrPage* SwDrawDocument::AllocPage(bool bMasterPage) return pPage; } - -SvStream* SwDrawDocument::GetDocumentStream( SdrDocumentStreamInfo& rInfo ) const +uno::Reference<embed::XStorage> SwDrawDocument::GetDocumentStorage() const { - SvStream* pRet = NULL; - uno::Reference < embed::XStorage > xRoot( pDoc->GetDocStorage() ); - if( xRoot.is() ) - { - if( rInfo.maUserData.Len() && - ( rInfo.maUserData.GetToken( 0, ':' ) == - String( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package" ) ) ) ) - { - const String aPicturePath( rInfo.maUserData.GetToken( 1, ':' ) ); - - // graphic from picture stream in picture storage in XML package - if( aPicturePath.GetTokenCount( '/' ) == 2 ) - { - const String aPictureStorageName( aPicturePath.GetToken( 0, '/' ) ); - const String aPictureStreamName( aPicturePath.GetToken( 1, '/' ) ); - - try - { - uno::Reference < embed::XStorage > xPictureStorage = xRoot->openStorageElement( - aPictureStorageName, embed::ElementModes::READ ); - uno::Reference < io::XStream > xStream = xPictureStorage->openStreamElement( - aPictureStreamName, embed::ElementModes::READ ); - pRet = utl::UcbStreamHelper::CreateStream( xStream ); - if( pRet ) - { - rInfo.mbDeleteAfterUse = sal_True; - rInfo.mxStorageRef = xPictureStorage; - } - } - catch ( uno::Exception& ) - { - } - } - } - } - return pRet; + return pDoc->GetDocStorage(); } SdrLayerID SwDrawDocument::GetControlExportLayerId( const SdrObject & ) const |