summaryrefslogtreecommitdiff
path: root/oox/source/ole/olestorage.cxx
diff options
context:
space:
mode:
authorDaniel Rentz [dr] <daniel.rentz@oracle.com>2011-02-07 17:18:11 +0100
committerDaniel Rentz [dr] <daniel.rentz@oracle.com>2011-02-07 17:18:11 +0100
commit7a5084f1acacb0858588d4d0c82651e47ca9914f (patch)
treea92a5c9040270413f47cbf9eacc2605896c7ebb9 /oox/source/ole/olestorage.cxx
parent09f7fc99c442d71852396d97ee1079f0d03901a0 (diff)
dr78: rework of stream handling, improve handling of very large streams (prevent loading entire stream into array or string, esp. dumper and VML import), full support of XComponentContext
Diffstat (limited to 'oox/source/ole/olestorage.cxx')
-rw-r--r--oox/source/ole/olestorage.cxx59
1 files changed, 28 insertions, 31 deletions
diff --git a/oox/source/ole/olestorage.cxx b/oox/source/ole/olestorage.cxx
index cf55d6463778..2db4aed76834 100644
--- a/oox/source/ole/olestorage.cxx
+++ b/oox/source/ole/olestorage.cxx
@@ -35,6 +35,7 @@
#include <com/sun/star/io/XSeekable.hpp>
#include <com/sun/star/io/XStream.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
#include <cppuhelper/implbase2.hxx>
#include "oox/helper/binaryinputstream.hxx"
#include "oox/helper/binaryoutputstream.hxx"
@@ -68,7 +69,7 @@ class OleOutputStream : public OleOutputStreamBase
{
public:
explicit OleOutputStream(
- const Reference< XMultiServiceFactory >& rxFactory,
+ const Reference< XComponentContext >& rxContext,
const Reference< XNameContainer >& rxStorage,
const OUString& rElementName );
virtual ~OleOutputStream();
@@ -95,14 +96,15 @@ private:
// ----------------------------------------------------------------------------
-OleOutputStream::OleOutputStream( const Reference< XMultiServiceFactory >& rxFactory,
+OleOutputStream::OleOutputStream( const Reference< XComponentContext >& rxContext,
const Reference< XNameContainer >& rxStorage, const OUString& rElementName ) :
mxStorage( rxStorage ),
maElementName( rElementName )
{
try
{
- mxTempFile.set( rxFactory->createInstance( CREATE_OUSTRING( "com.sun.star.io.TempFile" ) ), UNO_QUERY_THROW );
+ Reference< XMultiServiceFactory > xFactory( rxContext->getServiceManager(), UNO_QUERY_THROW );
+ mxTempFile.set( xFactory->createInstance( CREATE_OUSTRING( "com.sun.star.io.TempFile" ) ), UNO_QUERY_THROW );
mxOutStrm = mxTempFile->getOutputStream();
mxSeekable.set( mxOutStrm, UNO_QUERY );
}
@@ -179,49 +181,40 @@ void OleOutputStream::ensureConnected() const throw( NotConnectedException )
// ============================================================================
-OleStorage::OleStorage(
- const Reference< XMultiServiceFactory >& rxFactory,
- const Reference< XInputStream >& rxInStream,
- bool bBaseStreamAccess ) :
+OleStorage::OleStorage( const Reference< XComponentContext >& rxContext,
+ const Reference< XInputStream >& rxInStream, bool bBaseStreamAccess ) :
StorageBase( rxInStream, bBaseStreamAccess ),
- mxFactory( rxFactory ),
+ mxContext( rxContext ),
mpParentStorage( 0 )
{
- OSL_ENSURE( mxFactory.is(), "OleStorage::OleStorage - missing service factory" );
+ OSL_ENSURE( mxContext.is(), "OleStorage::OleStorage - missing component context" );
initStorage( rxInStream );
}
-OleStorage::OleStorage(
- const Reference< XMultiServiceFactory >& rxFactory,
- const Reference< XStream >& rxOutStream,
- bool bBaseStreamAccess ) :
+OleStorage::OleStorage( const Reference< XComponentContext >& rxContext,
+ const Reference< XStream >& rxOutStream, bool bBaseStreamAccess ) :
StorageBase( rxOutStream, bBaseStreamAccess ),
- mxFactory( rxFactory ),
+ mxContext( rxContext ),
mpParentStorage( 0 )
{
- OSL_ENSURE( mxFactory.is(), "OleStorage::OleStorage - missing service factory" );
+ OSL_ENSURE( mxContext.is(), "OleStorage::OleStorage - missing component context" );
initStorage( rxOutStream );
}
-OleStorage::OleStorage(
- const OleStorage& rParentStorage,
- const Reference< XNameContainer >& rxStorage,
- const OUString& rElementName,
- bool bReadOnly ) :
+OleStorage::OleStorage( const OleStorage& rParentStorage,
+ const Reference< XNameContainer >& rxStorage, const OUString& rElementName, bool bReadOnly ) :
StorageBase( rParentStorage, rElementName, bReadOnly ),
- mxFactory( rParentStorage.mxFactory ),
+ mxContext( rParentStorage.mxContext ),
mxStorage( rxStorage ),
mpParentStorage( &rParentStorage )
{
OSL_ENSURE( mxStorage.is(), "OleStorage::OleStorage - missing substorage elements" );
}
-OleStorage::OleStorage(
- const OleStorage& rParentStorage,
- const Reference< XStream >& rxOutStream,
- const OUString& rElementName ) :
+OleStorage::OleStorage( const OleStorage& rParentStorage,
+ const Reference< XStream >& rxOutStream, const OUString& rElementName ) :
StorageBase( rParentStorage, rElementName, false ),
- mxFactory( rParentStorage.mxFactory ),
+ mxContext( rParentStorage.mxContext ),
mpParentStorage( &rParentStorage )
{
initStorage( rxOutStream );
@@ -239,7 +232,8 @@ void OleStorage::initStorage( const Reference< XInputStream >& rxInStream )
Reference< XInputStream > xInStrm = rxInStream;
if( !Reference< XSeekable >( xInStrm, UNO_QUERY ).is() ) try
{
- Reference< XStream > xTempFile( mxFactory->createInstance( CREATE_OUSTRING( "com.sun.star.io.TempFile" ) ), UNO_QUERY_THROW );
+ Reference< XMultiServiceFactory > xFactory( mxContext->getServiceManager(), UNO_QUERY_THROW );
+ Reference< XStream > xTempFile( xFactory->createInstance( CREATE_OUSTRING( "com.sun.star.io.TempFile" ) ), UNO_QUERY_THROW );
{
Reference< XOutputStream > xOutStrm( xTempFile->getOutputStream(), UNO_SET_THROW );
/* Pass false to both binary stream objects to keep the UNO
@@ -259,10 +253,11 @@ void OleStorage::initStorage( const Reference< XInputStream >& rxInStream )
// create base storage object
if( xInStrm.is() ) try
{
+ Reference< XMultiServiceFactory > xFactory( mxContext->getServiceManager(), UNO_QUERY_THROW );
Sequence< Any > aArgs( 2 );
aArgs[ 0 ] <<= xInStrm;
aArgs[ 1 ] <<= true; // true = do not create a copy of the input stream
- mxStorage.set( mxFactory->createInstanceWithArguments(
+ mxStorage.set( xFactory->createInstanceWithArguments(
CREATE_OUSTRING( "com.sun.star.embed.OLESimpleStorage" ), aArgs ), UNO_QUERY_THROW );
}
catch( Exception& )
@@ -275,10 +270,11 @@ void OleStorage::initStorage( const Reference< XStream >& rxOutStream )
// create base storage object
if( rxOutStream.is() ) try
{
+ Reference< XMultiServiceFactory > xFactory( mxContext->getServiceManager(), UNO_QUERY_THROW );
Sequence< Any > aArgs( 2 );
aArgs[ 0 ] <<= rxOutStream;
aArgs[ 1 ] <<= true; // true = do not create a copy of the stream
- mxStorage.set( mxFactory->createInstanceWithArguments(
+ mxStorage.set( xFactory->createInstanceWithArguments(
CREATE_OUSTRING( "com.sun.star.embed.OLESimpleStorage" ), aArgs ), UNO_QUERY_THROW );
}
catch( Exception& )
@@ -347,7 +343,8 @@ StorageRef OleStorage::implOpenSubStorage( const OUString& rElementName, bool bC
if( !isReadOnly() && (bCreateMissing || xSubStorage.get()) ) try
{
// create new storage based on a temp file
- Reference< XStream > xTempFile( mxFactory->createInstance( CREATE_OUSTRING( "com.sun.star.io.TempFile" ) ), UNO_QUERY_THROW );
+ Reference< XMultiServiceFactory > xFactory( mxContext->getServiceManager(), UNO_QUERY_THROW );
+ Reference< XStream > xTempFile( xFactory->createInstance( CREATE_OUSTRING( "com.sun.star.io.TempFile" ) ), UNO_QUERY_THROW );
StorageRef xTempStorage( new OleStorage( *this, xTempFile, rElementName ) );
// copy existing substorage into temp storage
if( xSubStorage.get() )
@@ -379,7 +376,7 @@ Reference< XOutputStream > OleStorage::implOpenOutputStream( const OUString& rEl
{
Reference< XOutputStream > xOutStream;
if( mxStorage.is() && (rElementName.getLength() > 0) )
- xOutStream.set( new OleOutputStream( mxFactory, mxStorage, rElementName ) );
+ xOutStream.set( new OleOutputStream( mxContext, mxStorage, rElementName ) );
return xOutStream;
}