summaryrefslogtreecommitdiff
path: root/svx/source/msfilter/msoleexp.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/msfilter/msoleexp.cxx')
-rw-r--r--svx/source/msfilter/msoleexp.cxx376
1 files changed, 0 insertions, 376 deletions
diff --git a/svx/source/msfilter/msoleexp.cxx b/svx/source/msfilter/msoleexp.cxx
deleted file mode 100644
index b01fe6b0f7..0000000000
--- a/svx/source/msfilter/msoleexp.cxx
+++ /dev/null
@@ -1,376 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: msoleexp.cxx,v $
- * $Revision: 1.22 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_svx.hxx"
-#include <com/sun/star/uno/Reference.hxx>
-#include <com/sun/star/uno/Sequence.hxx>
-#include <com/sun/star/uno/Any.hxx>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/container/XNameAccess.hpp>
-#ifndef _COM_SUN_STAR_EMBED_XEmbedPersist_HPP_
-#include <com/sun/star/embed/XEmbedPersist.hpp>
-#endif
-#include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
-#include <com/sun/star/embed/EmbedStates.hpp>
-#include <com/sun/star/frame/XStorable.hpp>
-#include <com/sun/star/awt/Size.hpp>
-#include <com/sun/star/embed/Aspects.hpp>
-
-#ifndef _SO_CLSIDS_HXX
-#include <sot/clsids.hxx>
-#endif
-#include <sfx2/objsh.hxx>
-//#ifndef _SFX_INTERNO_HXX
-//#include <sfx2/interno.hxx>
-//#endif
-#include <sfx2/docfac.hxx>
-#include <sfx2/docfilt.hxx>
-#include <sfx2/docfile.hxx>
-#include <sfx2/fcontnr.hxx>
-#include <sot/formats.hxx>
-#include <comphelper/processfactory.hxx>
-
-#include <unotools/streamwrap.hxx>
-#include <comphelper/storagehelper.hxx>
-#include <svtools/embedhlp.hxx>
-#include <svx/msdffimp.hxx> // extern sichtbare Header-Datei
-
-#include "msoleexp.hxx"
-
-#define CREATE_CONST_ASC(s) String::CreateFromAscii( \
- RTL_CONSTASCII_STRINGPARAM(s))
-
-using namespace ::com::sun::star;
-
-SvGlobalName GetEmbeddedVersion( const SvGlobalName& aAppName )
-{
- if ( aAppName == SvGlobalName( SO3_SM_CLASSID_60 ) )
- return SvGlobalName( SO3_SM_OLE_EMBED_CLASSID_8 );
- else if ( aAppName == SvGlobalName( SO3_SW_CLASSID_60 ) )
- return SvGlobalName( SO3_SW_OLE_EMBED_CLASSID_8 );
- else if ( aAppName == SvGlobalName( SO3_SC_CLASSID_60 ) )
- return SvGlobalName( SO3_SC_OLE_EMBED_CLASSID_8 );
- else if ( aAppName == SvGlobalName( SO3_SDRAW_CLASSID_60 ) )
- return SvGlobalName( SO3_SDRAW_OLE_EMBED_CLASSID_8 );
- else if ( aAppName == SvGlobalName( SO3_SIMPRESS_CLASSID_60 ) )
- return SvGlobalName( SO3_SIMPRESS_OLE_EMBED_CLASSID_8 );
- else if ( aAppName == SvGlobalName( SO3_SCH_CLASSID_60 ) )
- return SvGlobalName( SO3_SCH_OLE_EMBED_CLASSID_8 );
-
- return SvGlobalName();
-}
-
-String GetStorageType( const SvGlobalName& aEmbName )
-{
- if ( aEmbName == SvGlobalName( SO3_SM_OLE_EMBED_CLASSID_8 ) )
- return String::CreateFromAscii( "opendocument.MathDocument.1" );
- else if ( aEmbName == SvGlobalName( SO3_SW_OLE_EMBED_CLASSID_8 ) )
- return String::CreateFromAscii( "opendocument.WriterDocument.1" );
- else if ( aEmbName == SvGlobalName( SO3_SC_OLE_EMBED_CLASSID_8 ) )
- return String::CreateFromAscii( "opendocument.CalcDocument.1" );
- else if ( aEmbName == SvGlobalName( SO3_SDRAW_OLE_EMBED_CLASSID_8 ) )
- return String::CreateFromAscii( "opendocument.DrawDocument.1" );
- else if ( aEmbName == SvGlobalName( SO3_SIMPRESS_OLE_EMBED_CLASSID_8 ) )
- return String::CreateFromAscii( "opendocument.ImpressDocument.1" );
- else if ( aEmbName == SvGlobalName( SO3_SCH_OLE_EMBED_CLASSID_8 ) )
- return String::CreateFromAscii( "opendocument.ChartDocument.1" );
-
- return String();
-}
-
-sal_Bool UseOldMSExport()
-{
- uno::Reference< lang::XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
-
- if ( xFactory.is() )
- {
- uno::Reference< lang::XMultiServiceFactory > xProvider( xFactory->createInstance(
- rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationProvider"))),
- uno::UNO_QUERY);
- if ( xProvider.is() )
- {
- try {
- uno::Sequence< uno::Any > aArg( 1 );
- aArg[0] <<= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.Common/InternalMSExport") );
- uno::Reference< container::XNameAccess > xNameAccess(
- xProvider->createInstanceWithArguments(
- rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.configuration.ConfigurationUpdateAccess" ) ),
- aArg ),
- uno::UNO_QUERY );
- if ( xNameAccess.is() )
- {
- uno::Any aResult = xNameAccess->getByName(
- rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UseOldExport" ) ) );
-
- sal_Bool bResult = sal_Bool();
- if ( aResult >>= bResult )
- return bResult;
- }
- }
- catch( uno::Exception& )
- {
- }
- }
- }
-
- OSL_ENSURE( sal_False, "Could not get access to configuration entry!\n" );
- return sal_False;
-}
-
-void SvxMSExportOLEObjects::ExportOLEObject( const com::sun::star::uno::Reference < com::sun::star::embed::XEmbeddedObject>& rObj, SotStorage& rDestStg )
-{
- svt::EmbeddedObjectRef aObj( rObj, embed::Aspects::MSOLE_CONTENT );
- ExportOLEObject( aObj, rDestStg );
-}
-
-void SvxMSExportOLEObjects::ExportOLEObject( svt::EmbeddedObjectRef& rObj, SvStorage& rDestStg )
-{
- SvGlobalName aOwnGlobalName;
- SvGlobalName aObjName( rObj->getClassID() );
- const SfxFilter* pExpFilter = NULL;
- {
- static struct _ObjExpType {
- UINT32 nFlag;
- const char* pFilterNm;
- // GlobalNameId
- struct _GlobalNameIds {
- UINT32 n1;
- USHORT n2, n3;
- BYTE b8, b9, b10, b11, b12, b13, b14, b15;
- }
- aGlNmIds[4];
- } aArr[] = {
- { OLE_STARMATH_2_MATHTYPE, "MathType 3.x",
- {{SO3_SM_CLASSID_60}, {SO3_SM_CLASSID_50},
- {SO3_SM_CLASSID_40}, {SO3_SM_CLASSID_30 }}},
- { OLE_STARWRITER_2_WINWORD, "MS Word 97",
- {{SO3_SW_CLASSID_60}, {SO3_SW_CLASSID_50},
- {SO3_SW_CLASSID_40}, {SO3_SW_CLASSID_30 }}},
- { OLE_STARCALC_2_EXCEL, "MS Excel 97",
- {{SO3_SC_CLASSID_60}, {SO3_SC_CLASSID_50},
- {SO3_SC_CLASSID_40}, {SO3_SC_CLASSID_30 }}},
- { OLE_STARIMPRESS_2_POWERPOINT, "MS PowerPoint 97",
- {{SO3_SIMPRESS_CLASSID_60}, {SO3_SIMPRESS_CLASSID_50},
- {SO3_SIMPRESS_CLASSID_40}, {SO3_SIMPRESS_CLASSID_30 }}},
- { 0, "",
- {{SO3_SCH_CLASSID_60}, {SO3_SCH_CLASSID_50},
- {SO3_SCH_CLASSID_40}, {SO3_SCH_CLASSID_30 }}},
- { 0, "",
- {{SO3_SDRAW_CLASSID_60}, {SO3_SDRAW_CLASSID_50}, // SJ: !!!! SO3_SDRAW_CLASSID is only available up from
- {SO3_SDRAW_CLASSID_60}, {SO3_SDRAW_CLASSID_50 }}}, // ver 5.0, it is purpose to have double entrys here.
-
- { 0xffff,0,
- {{SO3_SDRAW_CLASSID_60}, {SO3_SDRAW_CLASSID_50},
- {SO3_SDRAW_CLASSID_60}, {SO3_SDRAW_CLASSID_50}}}
- };
-
- for( const _ObjExpType* pArr = aArr; !pExpFilter && ( pArr->nFlag != 0xffff ); ++pArr )
- {
- for ( int n = 0; n < 4; ++n )
- {
- const _ObjExpType::_GlobalNameIds& rId = pArr->aGlNmIds[ n ];
- SvGlobalName aGlbNm( rId.n1, rId.n2, rId.n3,
- rId.b8, rId.b9, rId.b10, rId.b11,
- rId.b12, rId.b13, rId.b14, rId.b15 );
- if( aObjName == aGlbNm )
- {
- aOwnGlobalName = aGlbNm;
-
- // flags for checking if conversion is wanted at all (SaveOptions?!)
- if( GetFlags() & pArr->nFlag )
- {
- pExpFilter = SfxFilterMatcher().GetFilter4FilterName(String::CreateFromAscii(pArr->pFilterNm));
- break;
- }
- }
- }
- }
- }
-
- if( pExpFilter ) // use this filter for the export
- {
- try
- {
- if ( rObj->getCurrentState() == embed::EmbedStates::LOADED )
- rObj->changeState( embed::EmbedStates::RUNNING );
- //TODO/LATER: is stream instead of outputstream a better choice?!
- //TODO/LATER: a "StoreTo" method at embedded object would be nice
- uno::Sequence < beans::PropertyValue > aSeq(2);
- SvStream* pStream = new SvMemoryStream;
- aSeq[0].Name = ::rtl::OUString::createFromAscii( "OutputStream" );
- ::uno::Reference < io::XOutputStream > xOut = new ::utl::OOutputStreamWrapper( *pStream );
- aSeq[0].Value <<= xOut;
- aSeq[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FilterName" ) );
- aSeq[1].Value <<= ::rtl::OUString( pExpFilter->GetName() );
- uno::Reference < frame::XStorable > xStor( rObj->getComponent(), uno::UNO_QUERY );
- xStor->storeToURL( ::rtl::OUString::createFromAscii( "private:stream" ), aSeq );
- SotStorageRef xOLEStor = new SotStorage( pStream, TRUE );
- xOLEStor->CopyTo( &rDestStg );
- rDestStg.Commit();
- }
- catch( uno::Exception& )
- {
- // TODO/LATER: Error handling
- DBG_ERROR( "The object could not be exported!" );
- }
- }
- else if( aOwnGlobalName != SvGlobalName() )
- {
- // own format, maybe SO6 format or lower
- SvGlobalName aEmbName = GetEmbeddedVersion( aOwnGlobalName );
- if ( aEmbName != SvGlobalName() && !UseOldMSExport() )
- {
- // this is a SO6 embedded object, save in old binary format
- rDestStg.SetVersion( SOFFICE_FILEFORMAT_31 );
- rDestStg.SetClass( aEmbName,
- SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE,
- GetStorageType( aEmbName ) );
- SotStorageStreamRef xExtStm = rDestStg.OpenSotStream(
- String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "properties_stream" ) ),
- STREAM_STD_READWRITE );
-
- sal_Bool bExtentSuccess = sal_False;
- if( !xExtStm->GetError() )
- {
- // write extent
- //TODO/MBA: check if writing a size is enough
- if( rObj.GetObject().is() )
- {
- // MSOLE objects don't need to be in running state for VisualArea access
- awt::Size aSize;
- try
- {
- // this is an own object, the content size must be stored in the
- // extension stream
- aSize = rObj->getVisualAreaSize( embed::Aspects::MSOLE_CONTENT );
- }
- catch( embed::NoVisualAreaSizeException& )
- {
- OSL_ENSURE( sal_False, "Could not get visual area size!\n" );
- aSize.Width = 5000;
- aSize.Height = 5000;
- }
- catch( uno::Exception& )
- {
- OSL_ENSURE( sal_False, "Unexpected exception while getting visual area size!\n" );
- aSize.Width = 5000;
- aSize.Height = 5000;
- }
-
- //Rectangle aVisArea = xSfxIPObj->GetVisArea( ASPECT_CONTENT );
- sal_Int32 pRect[4];
- //pRect[0] = aVisArea.Left();
- //pRect[1] = aVisArea.Right();
- //pRect[2] = aVisArea.Top();
- //pRect[3] = aVisArea.Bottom();
- pRect[0] = 0;
- pRect[1] = aSize.Width;
- pRect[2] = 0;
- pRect[3] = aSize.Height;
-
- sal_Int8 aWriteSet[16];
- for ( int ind = 0; ind < 4; ind++ )
- {
- sal_Int32 nVal = pRect[ind];
- for ( int nByte = 0; nByte < 4; nByte++ )
- {
- aWriteSet[ind*4+nByte] = (sal_Int8) nVal % 0x100;
- nVal /= 0x100;
- }
- }
-
- bExtentSuccess = ( xExtStm->Write( aWriteSet, 16 ) == 16 );
- }
- }
-
- if ( bExtentSuccess )
- {
- SotStorageStreamRef xEmbStm = rDestStg.OpenSotStream(
- String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "package_stream" ) ),
- STREAM_STD_READWRITE );
- if( !xEmbStm->GetError() )
- {
- try
- {
- if ( rObj->getCurrentState() == embed::EmbedStates::LOADED )
- rObj->changeState( embed::EmbedStates::RUNNING );
- //TODO/LATER: is stream instead of outputstream a better choice?!
- //TODO/LATER: a "StoreTo" method at embedded object would be nice
- uno::Sequence < beans::PropertyValue > aSeq(1);
- aSeq[0].Name = ::rtl::OUString::createFromAscii( "OutputStream" );
- ::uno::Reference < io::XOutputStream > xOut = new ::utl::OOutputStreamWrapper( *xEmbStm );
- aSeq[0].Value <<= xOut;
- uno::Reference < frame::XStorable > xStor( rObj->getComponent(), uno::UNO_QUERY );
- xStor->storeToURL( ::rtl::OUString::createFromAscii( "private:stream" ), aSeq );
- }
- catch( uno::Exception& )
- {
- // TODO/LATER: Error handling
- DBG_ERROR( "The object could not be exported!" );
- }
- }
- }
- }
- else
- {
- DBG_ERROR("Own binary format inside own container document!");
- }
- }
- else
- {
- // alien objects
- //TODO/LATER: a "StoreTo" method at embedded object would be nice
- rDestStg.SetVersion( SOFFICE_FILEFORMAT_31 );
- uno::Reference < embed::XStorage > xStor = ::comphelper::OStorageHelper::GetTemporaryStorage();
- uno::Reference < embed::XEmbedPersist > xPers( rObj.GetObject(), uno::UNO_QUERY );
- if ( xPers.is() )
- {
- uno::Sequence < beans::PropertyValue > aEmptySeq;
- ::rtl::OUString aTempName(::rtl::OUString::createFromAscii("bla"));
- try
- {
- xPers->storeToEntry( xStor, aTempName, aEmptySeq, aEmptySeq );
- }
- catch ( uno::Exception& )
- {}
-
- SotStorageRef xOLEStor = SotStorage::OpenOLEStorage( xStor, aTempName, STREAM_STD_READ );
- xOLEStor->CopyTo( &rDestStg );
- rDestStg.Commit();
- }
- }
-
- //We never need this stream: See #99809# and #i2179#
- rDestStg.Remove(CREATE_CONST_ASC(SVEXT_PERSIST_STREAM));
-}
-
-
-