summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2011-12-02 23:43:23 +0100
committerMichael Stahl <mstahl@redhat.com>2011-12-03 00:48:15 +0100
commitfd95f1ab6220c6a530fd2e4e727417f504a5db51 (patch)
treeb378d6e72698a8329f41d7919016574a301016e2
parentaa59ee85a8e902aa4dc956822e9169093de6c454 (diff)
refactor SdrModel::GetDocumentStream
Remove 3 ~identical implementations of GetDocumentStream and the associated struct SdrDocumentStreamInfo.
-rw-r--r--sc/inc/drwlayer.hxx1
-rw-r--r--sc/source/core/data/drwlayer.cxx53
-rw-r--r--sd/inc/drawdoc.hxx1
-rw-r--r--sd/source/core/drawdoc3.cxx82
-rw-r--r--sd/source/ui/inc/DrawDocShell.hxx1
-rw-r--r--svx/inc/svx/svdmodel.hxx21
-rw-r--r--svx/source/svdraw/svdmodel.cxx48
-rw-r--r--svx/source/svdraw/svdograf.cxx38
-rw-r--r--sw/inc/drawdoc.hxx5
-rw-r--r--sw/source/core/draw/drawdoc.cxx40
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