diff options
Diffstat (limited to 'sd/source/filter/eppt/eppt.cxx')
-rw-r--r-- | sd/source/filter/eppt/eppt.cxx | 1534 |
1 files changed, 0 insertions, 1534 deletions
diff --git a/sd/source/filter/eppt/eppt.cxx b/sd/source/filter/eppt/eppt.cxx deleted file mode 100644 index b996d205c..000000000 --- a/sd/source/filter/eppt/eppt.cxx +++ /dev/null @@ -1,1534 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * 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_sd.hxx" -#include <eppt.hxx> -#include "epptdef.hxx" -#include <tools/globname.hxx> -#include <tools/datetime.hxx> -#include <tools/poly.hxx> -#include <vcl/graph.hxx> -#include <vcl/bmpacc.hxx> -#include <vcl/gradient.hxx> -#include <rtl/ustring.hxx> -#include <tools/stream.hxx> -#include <svtools/fltcall.hxx> -#include <sfx2/docfile.hxx> -#include <svx/unoapi.hxx> -#include <svx/svdobj.hxx> -#include <svx/svdoole2.hxx> -#include <svx/svdmodel.hxx> -#include <svx/svdpage.hxx> -#include <com/sun/star/view/PaperOrientation.hpp> -#include <com/sun/star/view/PaperFormat.hpp> -#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> -#include <com/sun/star/office/XAnnotation.hpp> -#include <com/sun/star/office/XAnnotationAccess.hpp> -#include <com/sun/star/office/XAnnotationEnumeration.hpp> -#include <com/sun/star/geometry/RealPoint2D.hpp> -#include <com/sun/star/util/DateTime.hpp> -#include <tools/zcodec.hxx> -#include <editeng/svxenum.hxx> -#include <sot/storinfo.hxx> -#include <filter/msfilter/msoleexp.hxx> -#include <vcl/virdev.hxx> -#include <svtools/wmf.hxx> -#include <filter/msfilter/msdffimp.hxx> -#include <filter/msfilter/svxmsbas.hxx> -#include <editeng/flditem.hxx> -#include <sfx2/docinf.hxx> -#include <oox/export/utils.hxx> - -using namespace com::sun::star; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::presentation; - -using ::com::sun::star::beans::XPropertySet; - -//============================ PPTWriter ================================== - -PPTWriter::PPTWriter( SvStorageRef& rSvStorage, - ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > & rXModel, - ::com::sun::star::uno::Reference< ::com::sun::star::task::XStatusIndicator > & rXStatInd, - SvMemoryStream* pVBA, sal_uInt32 nCnvrtFlags ) : - PPTWriterBase ( rXModel, rXStatInd ), - mnCnvrtFlags ( nCnvrtFlags ), - mbStatus ( sal_False ), - mbUseNewAnimations ( sal_True ), - mnLatestStatValue ( 0 ), - mrStg ( rSvStorage ), - mpCurUserStrm ( NULL ), - mpStrm ( NULL ), - mpPicStrm ( NULL ), - mpPptEscherEx ( NULL ), - mnVBAOleOfs ( 0 ), - mpVBA ( pVBA ), - mnExEmbed ( 0 ), - mpExEmbed ( new SvMemoryStream ), - mnPagesWritten ( 0 ), - mnTxId ( 0x7a2f64 ) -{ -} - -void PPTWriter::exportPPTPre() -{ - if ( !mrStg.Is() ) - return; - - // MasterPages + Slides und Notizen + NotesMasterPage - mnDrawings = mnMasterPages + ( mnPages << 1 ) + 1; - - if ( mXStatusIndicator.is() ) - { - mbStatusIndicator = sal_True; - mnStatMaxValue = ( mnPages + mnMasterPages ) * 5; - mXStatusIndicator->start( String( RTL_CONSTASCII_USTRINGPARAM( "PowerPoint Export" ) ), - mnStatMaxValue + ( mnStatMaxValue >> 3 ) ); - } - - SvGlobalName aGName( 0x64818d10L, 0x4f9b, 0x11cf, 0x86, 0xea, 0x00, 0xaa, 0x00, 0xb9, 0x29, 0xe8 ); - mrStg->SetClass( aGName, 0, String( RTL_CONSTASCII_USTRINGPARAM( "MS PowerPoint 97" ) ) ); - - if ( !ImplCreateCurrentUserStream() ) - return; - - mpStrm = mrStg->OpenSotStream( String( RTL_CONSTASCII_USTRINGPARAM( "PowerPoint Document" ) ) ); - if ( !mpStrm ) - return; - - if ( !mpPicStrm ) - mpPicStrm = mrStg->OpenSotStream( String( RTL_CONSTASCII_USTRINGPARAM( "Pictures" ) ) ); - - mpPptEscherEx = new PptEscherEx( *mpStrm ); -} - -void PPTWriter::exportPPTPost( ) -{ - if ( !ImplCloseDocument() ) - return; - - if ( mbStatusIndicator ) - { - mXStatusIndicator->setText( String( RTL_CONSTASCII_USTRINGPARAM( "PowerPoint Export" ) ) ); - sal_uInt32 nValue = mnStatMaxValue + ( mnStatMaxValue >> 3 ); - if ( nValue > mnLatestStatValue ) - { - mXStatusIndicator->setValue( nValue ); - mnLatestStatValue = nValue; - } - } - - ImplWriteOLE(); - - ImplWriteVBA(); - - if ( !ImplWriteAtomEnding() ) - return; - - if ( !ImplCreateDocumentSummaryInformation() ) - return; - - mbStatus = sal_True; -}; - -// --------------------------------------------------------------------------------------------- - -void ImplExportComments( uno::Reference< drawing::XDrawPage > xPage, SvMemoryStream& rBinaryTagData10Atom ); - -void PPTWriter::ImplWriteSlide( sal_uInt32 nPageNum, sal_uInt32 nMasterNum, sal_uInt16 nMode, - sal_Bool bHasBackground, Reference< XPropertySet > aXBackgroundPropSet ) -{ - Any aAny; - - const PHLayout& rLayout = GetLayout( mXPagePropSet ); - mpPptEscherEx->PtReplaceOrInsert( EPP_Persist_Slide | nPageNum, mpStrm->Tell() ); - mpPptEscherEx->OpenContainer( EPP_Slide ); - mpPptEscherEx->AddAtom( 24, EPP_SlideAtom, 2 ); - *mpStrm << rLayout.nLayout; - mpStrm->Write( rLayout.nPlaceHolder, 8 ); // placeholderIDs ( 8Stueck ) - *mpStrm << (sal_uInt32)(nMasterNum | 0x80000000)// master ID ( ist gleich 0x80000000 bei einer masterpage ) - << (sal_uInt32)nPageNum + 0x100 // notes ID ( ist gleich null wenn keine notizen vorhanden ) - << nMode - << (sal_uInt16)0; // padword - - mnDiaMode = 0; - sal_Bool bVisible = sal_True; - ::com::sun::star::presentation::FadeEffect eFe = ::com::sun::star::presentation::FadeEffect_NONE; - - if ( GetPropertyValue( aAny, mXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Visible" ) ) ) ) - aAny >>= bVisible; - if ( GetPropertyValue( aAny, mXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Change" ) ) ) ) - { - switch ( *(sal_Int32*)aAny.getValue() ) - { - case 1 : // automatisch - mnDiaMode++; - case 2 : // halbautomatisch - mnDiaMode++; - default : - case 0 : // manuell - break; - } - } - if ( GetPropertyValue( aAny, mXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Effect" ) ) ) ) - aAny >>= eFe; - - sal_uInt32 nSoundRef = 0; - sal_Bool bIsSound = sal_False; - sal_Bool bStopSound = sal_False; - sal_Bool bLoopSound = sal_False; - - if ( GetPropertyValue( aAny, mXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Sound" ) ) ) ) - { - rtl::OUString aSoundURL; - if ( aAny >>= aSoundURL ) - { - nSoundRef = maSoundCollection.GetId( aSoundURL ); - bIsSound = sal_True; - } - else - aAny >>= bStopSound; - } - if ( GetPropertyValue( aAny, mXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "LoopSound" ) ) ) ) - aAny >>= bLoopSound; - - sal_Bool bNeedsSSSlideInfoAtom = ( bVisible == sal_False ) - || ( mnDiaMode == 2 ) - || ( bIsSound ) - || ( bStopSound ) - || ( eFe != ::com::sun::star::presentation::FadeEffect_NONE ); - if ( bNeedsSSSlideInfoAtom ) - { - sal_uInt8 nDirection = 0; - sal_uInt8 nTransitionType = 0; - sal_uInt16 nBuildFlags = 1; // advange by mouseclick - sal_Int32 nSlideTime = 0; // muss noch !!! - sal_uInt8 nSpeed = 1; - - if ( GetPropertyValue( aAny, mXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Speed" ) ) ) ) - { - ::com::sun::star::presentation::AnimationSpeed aAs; - aAny >>= aAs; - nSpeed = (sal_uInt8)aAs; - } - sal_Int16 nTT = 0; - if ( GetPropertyValue( aAny, mXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TransitionType" ) ) ) - && ( aAny >>= nTT ) ) - { - sal_Int16 nTST = 0; - if ( GetPropertyValue( aAny, mXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TransitionSubtype" ) ) ) - && ( aAny >>= nTST ) ) - nTransitionType = GetTransition( nTT, nTST, eFe, nDirection ); - - } - if ( !nTransitionType ) - nTransitionType = GetTransition( eFe, nDirection ); - if ( mnDiaMode == 2 ) // automatic ? - nBuildFlags |= 0x400; - if ( bVisible == sal_False ) - nBuildFlags |= 4; - if ( bIsSound ) - nBuildFlags |= 16; - if ( bLoopSound ) - nBuildFlags |= 64; - if ( bStopSound ) - nBuildFlags |= 256; - - if ( GetPropertyValue( aAny, mXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Duration" ) ) ) )// duration of this slide - nSlideTime = *(sal_Int32*)aAny.getValue() << 10; // in ticks - - mpPptEscherEx->AddAtom( 16, EPP_SSSlideInfoAtom ); - *mpStrm << nSlideTime // standtime in ticks - << nSoundRef - << nDirection - << nTransitionType - << nBuildFlags - << nSpeed - << (sal_uInt8)0 << (sal_uInt8)0 << (sal_uInt8)0; - } - - ImplCreateHeaderFooters( mXPagePropSet ); - - EscherSolverContainer aSolverContainer; - mpPptEscherEx->OpenContainer( EPP_PPDrawing ); - mpPptEscherEx->OpenContainer( ESCHER_DgContainer ); - mpPptEscherEx->EnterGroup(0,0); - ImplWritePage( rLayout, aSolverContainer, NORMAL, sal_False, nPageNum ); // Die Shapes der Seite werden im PPT Dok. erzeugt - mpPptEscherEx->LeaveGroup(); - - if ( bHasBackground ) - ImplWriteBackground( aXBackgroundPropSet ); - else - { - mpPptEscherEx->OpenContainer( ESCHER_SpContainer ); - mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, 0xc00 ); // Flags: Connector | Background | HasSpt - EscherPropertyContainer aPropOpt; - aPropOpt.AddOpt( ESCHER_Prop_fillRectRight, PPTtoEMU( maDestPageSize.Width ) ); - aPropOpt.AddOpt( ESCHER_Prop_fillRectBottom, PPTtoEMU( maDestPageSize.Width ) ); - aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x120012 ); - aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 ); - aPropOpt.AddOpt( ESCHER_Prop_bWMode, ESCHER_wDontShow ); - aPropOpt.AddOpt( ESCHER_Prop_fBackground, 0x10001 ); // if true, this is the background shape - aPropOpt.Commit( *mpStrm ); - mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer - } - - aSolverContainer.WriteSolver( *mpStrm ); - - mpPptEscherEx->CloseContainer(); // ESCHER_DgContainer - mpPptEscherEx->CloseContainer(); // EPP_Drawing - mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 1 ); - *mpStrm << (sal_uInt32)0xffffff << (sal_uInt32)0x000000 << (sal_uInt32)0x808080 << (sal_uInt32)0x000000 << (sal_uInt32)0x99cc00 << (sal_uInt32)0xcc3333 << (sal_uInt32)0xffcccc << (sal_uInt32)0xb2b2b2; - - SvMemoryStream aBinaryTagData10Atom; - ImplExportComments( mXDrawPage, aBinaryTagData10Atom ); - if ( mbUseNewAnimations ) - { - SvMemoryStream amsofbtAnimGroup; - ppt::AnimationExporter aExporter( aSolverContainer, maSoundCollection ); - aExporter.doexport( mXDrawPage, amsofbtAnimGroup ); - sal_uInt32 nmsofbtAnimGroupSize = amsofbtAnimGroup.Tell(); - if ( nmsofbtAnimGroupSize ) - { - { - EscherExAtom aMagic2( aBinaryTagData10Atom, 0x2eeb ); - aBinaryTagData10Atom << (sal_uInt32)0x01c45df9 - << (sal_uInt32)0xe1471b30; - } - { - EscherExAtom aMagic( aBinaryTagData10Atom, 0x2b00 ); - aBinaryTagData10Atom << (sal_uInt32)0; - } - aBinaryTagData10Atom.Write( amsofbtAnimGroup.GetData(), amsofbtAnimGroup.Tell() ); - { - EscherExContainer aMagic2( aBinaryTagData10Atom, 0x2b02 ); - } - } - } - if ( aBinaryTagData10Atom.Tell() ) - { - EscherExContainer aProgTags ( *mpStrm, EPP_ProgTags ); - EscherExContainer aProgBinaryTag( *mpStrm, EPP_ProgBinaryTag ); - { - EscherExAtom aCString( *mpStrm, EPP_CString ); - *mpStrm << (sal_uInt32)0x5f005f - << (sal_uInt32)0x50005f - << (sal_uInt32)0x540050 - << (sal_uInt16)0x31 - << (sal_uInt16)0x30; - } - { - EscherExAtom aBinaryTagData( *mpStrm, EPP_BinaryTagData ); - mpStrm->Write( aBinaryTagData10Atom.GetData(), aBinaryTagData10Atom.Tell() ); - } - } - mpPptEscherEx->CloseContainer(); // EPP_Slide -} - -// --------------------------------------------------------------------------------------------- - -void PPTWriter::ImplWriteSlideMaster( sal_uInt32 nPageNum, Reference< XPropertySet > aXBackgroundPropSet ) -{ - mpPptEscherEx->PtReplaceOrInsert( EPP_Persist_MainMaster | nPageNum, mpStrm->Tell() ); - mpPptEscherEx->OpenContainer( EPP_MainMaster ); - mpPptEscherEx->AddAtom( 24, EPP_SlideAtom, 2 ); - *mpStrm << (sal_Int32)EPP_LAYOUT_TITLEANDBODYSLIDE // slide layout -> title and body slide - << (sal_uInt8)1 << (sal_uInt8)2 << (sal_uInt8)0 << (sal_uInt8)0 << (sal_uInt8)0 << (sal_uInt8)0 << (sal_uInt8)0 << (sal_uInt8)0 // placeholderID - << (sal_uInt32)0 // master ID ( ist gleich null bei einer masterpage ) - << (sal_uInt32)0 // notes ID ( ist gleich null wenn keine notizen vorhanden ) - << (sal_uInt16)0 // Bit 1: Follow master objects, Bit 2: Follow master scheme, Bit 3: Follow master background - << (sal_uInt16)0; // padword - - mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 ); - *mpStrm << (sal_uInt32)0xffffff << (sal_uInt32)0x000000 << (sal_uInt32)0x808080 << (sal_uInt32)0x000000 << (sal_uInt32)0x99cc00 << (sal_uInt32)0xcc3333 << (sal_uInt32)0xffcccc << (sal_uInt32)0xb2b2b2; - mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 ); - *mpStrm << (sal_uInt32)0xff0000 << (sal_uInt32)0xffffff << (sal_uInt32)0x000000 << (sal_uInt32)0x00ffff << (sal_uInt32)0x0099ff << (sal_uInt32)0xffff00 << (sal_uInt32)0x0000ff << (sal_uInt32)0x969696; - mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 ); - *mpStrm << (sal_uInt32)0xccffff << (sal_uInt32)0x000000 << (sal_uInt32)0x336666 << (sal_uInt32)0x008080 << (sal_uInt32)0x339933 << (sal_uInt32)0x000080 << (sal_uInt32)0xcc3300 << (sal_uInt32)0x66ccff; - mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 ); - *mpStrm << (sal_uInt32)0xffffff << (sal_uInt32)0x000000 << (sal_uInt32)0x333333 << (sal_uInt32)0x000000 << (sal_uInt32)0xdddddd << (sal_uInt32)0x808080 << (sal_uInt32)0x4d4d4d << (sal_uInt32)0xeaeaea; - mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 ); - *mpStrm << (sal_uInt32)0xffffff << (sal_uInt32)0x000000 << (sal_uInt32)0x808080 << (sal_uInt32)0x000000 << (sal_uInt32)0x66ccff << (sal_uInt32)0xff0000 << (sal_uInt32)0xcc00cc << (sal_uInt32)0xc0c0c0; - mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 ); - *mpStrm << (sal_uInt32)0xffffff << (sal_uInt32)0x000000 << (sal_uInt32)0x808080 << (sal_uInt32)0x000000 << (sal_uInt32)0xc0c0c0 << (sal_uInt32)0xff6600 << (sal_uInt32)0x0000ff << (sal_uInt32)0x009900; - mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 6 ); - *mpStrm << (sal_uInt32)0xffffff << (sal_uInt32)0x000000 << (sal_uInt32)0x808080 << (sal_uInt32)0x000000 << (sal_uInt32)0xff9933 << (sal_uInt32)0xccff99 << (sal_uInt32)0xcc00cc << (sal_uInt32)0xb2b2b2; - - for ( int nInstance = EPP_TEXTTYPE_Title; nInstance <= EPP_TEXTTYPE_QuarterBody; nInstance++ ) - { - if ( nInstance == EPP_TEXTTYPE_notUsed ) - continue; - - // the auto color is dependent to the page background,so we have to set a page that is in the right context - if ( nInstance == EPP_TEXTTYPE_Notes ) - GetPageByIndex( 0, NOTICE ); - else - GetPageByIndex( 0, MASTER ); - - mpPptEscherEx->BeginAtom(); - - sal_Bool bFirst = sal_True; - sal_Bool bSimpleText = sal_False; - - *mpStrm << (sal_uInt16)5; // paragraph count - - for ( sal_uInt16 nLev = 0; nLev < 5; nLev++ ) - { - if ( nInstance >= EPP_TEXTTYPE_CenterBody ) - { - bFirst = sal_False; - bSimpleText = sal_True; - *mpStrm << nLev; - } - mpStyleSheet->mpParaSheet[ nInstance ]->Write( *mpStrm, mpPptEscherEx, nLev, bFirst, bSimpleText, mXPagePropSet ); - mpStyleSheet->mpCharSheet[ nInstance ]->Write( *mpStrm, mpPptEscherEx, nLev, bFirst, bSimpleText, mXPagePropSet ); - bFirst = sal_False; - } - mpPptEscherEx->EndAtom( EPP_TxMasterStyleAtom, 0, nInstance ); - } - GetPageByIndex( nPageNum, MASTER ); - - EscherSolverContainer aSolverContainer; - - mpPptEscherEx->OpenContainer( EPP_PPDrawing ); - mpPptEscherEx->OpenContainer( ESCHER_DgContainer ); - - mpPptEscherEx->EnterGroup(0,0); - ImplWritePage( GetLayout( 0 ), aSolverContainer, MASTER, sal_True ); // Die Shapes der Seite werden im PPT Dok. erzeugt - mpPptEscherEx->LeaveGroup(); - - ImplWriteBackground( aXBackgroundPropSet ); - - aSolverContainer.WriteSolver( *mpStrm ); - - mpPptEscherEx->CloseContainer(); // ESCHER_DgContainer - mpPptEscherEx->CloseContainer(); // EPP_Drawing - mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 1 ); - *mpStrm << (sal_uInt32)0xffffff << (sal_uInt32)0x000000 << (sal_uInt32)0x808080 << (sal_uInt32)0x000000 << (sal_uInt32)0x99cc00 << (sal_uInt32)0xcc3333 << (sal_uInt32)0xffcccc << (sal_uInt32)0xb2b2b2; - - if ( aBuExMasterStream.Tell() ) - { - ImplProgTagContainer( mpStrm, &aBuExMasterStream ); - } - mpPptEscherEx->CloseContainer(); // EPP_MainMaster -}; - -// --------------------------------------------------------------------------------------------- - -PPTWriter::~PPTWriter() -{ - void* pPtr; - delete mpExEmbed; - delete mpPptEscherEx; - delete mpCurUserStrm; - delete mpPicStrm; - delete mpStrm; - - - - std::vector< PPTExStyleSheet* >::iterator aStyleSheetIter( maStyleSheetList.begin() ); - while( aStyleSheetIter < maStyleSheetList.end() ) - delete *aStyleSheetIter++; - - for ( pPtr = maHyperlink.First(); pPtr; pPtr = maHyperlink.Next() ) - delete (EPPTHyperlink*)pPtr; - for ( pPtr = maExOleObj.First(); pPtr; pPtr = maExOleObj.Next() ) - delete (PPTExOleObjEntry*)pPtr; - - if ( mbStatusIndicator ) - mXStatusIndicator->end(); -} - -// --------------------------------------------------------------------------------------------- - -sal_Bool PPTWriter::ImplCreateCurrentUserStream() -{ - mpCurUserStrm = mrStg->OpenSotStream( String( RTL_CONSTASCII_USTRINGPARAM( "Current User" ) ) ); - if ( !mpCurUserStrm ) - return sal_False; - char pUserName[] = "Current User"; - sal_uInt32 nLenOfUserName = strlen( pUserName ); - sal_uInt32 nSizeOfRecord = 0x14 + ( ( nLenOfUserName + 4 ) & ~ 3 ); - - *mpCurUserStrm << (sal_uInt16)0 << (sal_uInt16)EPP_CurrentUserAtom << nSizeOfRecord; - *mpCurUserStrm << (sal_uInt32)0x14 // Len - << (sal_uInt32)0xe391c05f; // Magic - - sal_uInt32 nEditPos = mpCurUserStrm->Tell(); - *mpCurUserStrm << (sal_uInt32)0x0 // OffsetToCurrentEdit; - << (sal_uInt16)nLenOfUserName // - << (sal_uInt16)0x3f4 // DocFileVersion - << (sal_uInt8)3 // MajorVersion - << (sal_uInt8)0 // MinorVersion - << (sal_uInt16)0; // Pad Word - pUserName[ nLenOfUserName ] = 8; - mpCurUserStrm->Write( pUserName, nLenOfUserName + 1 ); - for ( sal_uInt32 i = 0x15 + nLenOfUserName; i < nSizeOfRecord; i++ ) - { - *mpCurUserStrm << (sal_uInt8)0; // pad bytes - }; - mpCurUserStrm->Seek( nEditPos ); - return sal_True; -}; - -// --------------------------------------------------------------------------------------------- - -sal_Bool PPTWriter::ImplCreateDocumentSummaryInformation() -{ - uno::Reference<document::XDocumentPropertiesSupplier> xDPS( - mXModel, uno::UNO_QUERY_THROW); - uno::Reference<document::XDocumentProperties> xDocProps( - xDPS->getDocumentProperties()); - - if (xDocProps.is()) { - - // no idea what this is... - static sal_uInt8 aGuid[ 0x52 ] = - { - 0x4e, 0x00, 0x00, 0x00, - '{',0,'D',0,'B',0,'1',0,'A',0,'C',0,'9',0,'6',0,'4',0,'-',0, - 'E',0,'3',0,'9',0,'C',0,'-',0,'1',0,'1',0,'D',0,'2',0,'-',0, - 'A',0,'1',0,'E',0,'F',0,'-',0,'0',0,'0',0,'6',0,'0',0,'9',0, - '7',0,'D',0,'A',0,'5',0,'6',0,'8',0,'9',0,'}',0 - }; - uno::Sequence<sal_uInt8> aGuidSeq(aGuid, 0x52); - - SvMemoryStream aHyperBlob; - ImplCreateHyperBlob( aHyperBlob ); - - uno::Sequence<sal_uInt8> aHyperSeq(aHyperBlob.Tell()); - const sal_uInt8* pBlob( - static_cast<const sal_uInt8*>(aHyperBlob.GetData())); - for (sal_Int32 j = 0; j < aHyperSeq.getLength(); ++j) { - aHyperSeq[j] = pBlob[j]; - } - - if ( mnCnvrtFlags & 0x8000 ) - { - uno::Sequence<sal_uInt8> aThumbSeq; - if ( GetPageByIndex( 0, NORMAL ) && - ImplGetPropertyValue( mXPagePropSet, - String( RTL_CONSTASCII_USTRINGPARAM( "PreviewBitmap" ) ) ) ) - { - aThumbSeq = - *static_cast<const uno::Sequence<sal_uInt8>*>(mAny.getValue()); - } - sfx2::SaveOlePropertySet( xDocProps, mrStg, - &aThumbSeq, &aGuidSeq, &aHyperSeq); - } - else - { - sfx2::SaveOlePropertySet( xDocProps, mrStg, - NULL, &aGuidSeq, &aHyperSeq ); - } - } - - return sal_True; -} - -// --------------------------------------------------------------------------------------------- - -void PPTWriter::ImplWriteExtParaHeader( SvMemoryStream& rSt, sal_uInt32 nRef, sal_uInt32 nInstance, sal_uInt32 nSlideId ) -{ - if ( rSt.Tell() ) - { - aBuExOutlineStream << (sal_uInt32)( ( EPP_PST_ExtendedParagraphHeaderAtom << 16 ) - | ( nRef << 4 ) ) - << (sal_uInt32)8 - << (sal_uInt32)nSlideId - << (sal_uInt32)nInstance; - aBuExOutlineStream.Write( rSt.GetData(), rSt.Tell() ); - } -} - -// --------------------------------------------------------------------------------------------- - -void PPTWriter::ImplCreateHeaderFooterStrings( SvStream& rStrm, ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& rXPagePropSet ) -{ - if ( rXPagePropSet.is() ) - { - rtl::OUString aString; - ::com::sun::star::uno::Any aAny; - if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "HeaderText" ) ), sal_True ) ) - { - if ( aAny >>= aString ) - PPTWriter::WriteCString( rStrm, aString, 1 ); - } - if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FooterText" ) ), sal_True ) ) - { - if ( aAny >>= aString ) - PPTWriter::WriteCString( rStrm, aString, 2 ); - } - if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "DateTimeText" ) ), sal_True ) ) - { - if ( aAny >>= aString ) - PPTWriter::WriteCString( rStrm, aString, 0 ); - } - } -} - -// --------------------------------------------------------------------------------------------- - -void PPTWriter::ImplCreateHeaderFooters( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& rXPagePropSet ) -{ - if ( rXPagePropSet.is() ) - { - sal_Bool bVal = sal_False; - sal_uInt32 nVal = 0; - ::com::sun::star::uno::Any aAny; - if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsHeaderVisible" ) ), sal_True ) ) - { - if ( ( aAny >>= bVal ) && bVal ) - nVal |= 0x100000; - } - if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsFooterVisible" ) ), sal_True ) ) - { - if ( ( aAny >>= bVal ) && bVal ) - nVal |= 0x200000; - } - if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsDateTimeVisible" ) ), sal_True ) ) - { - if ( ( aAny >>= bVal ) && bVal ) - nVal |= 0x010000; - } - if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsPageNumberVisible" ) ), sal_True ) ) - { - if ( ( aAny >>= bVal ) && bVal ) - nVal |= 0x080000; - } - if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsDateTimeFixed" ) ), sal_True ) ) - { - if ( ( aAny >>= bVal ) && !bVal ) - nVal |= 0x20000; - else - nVal |= 0x40000; - } - if ( PropValue::GetPropertyValue( aAny, rXPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "DateTimeFormat" ) ), sal_True ) ) - { - sal_Int32 nFormat = *(sal_Int32*)aAny.getValue(); - SvxDateFormat eDateFormat = (SvxDateFormat)( nFormat & 0xf ); - SvxTimeFormat eTimeFormat = (SvxTimeFormat)( ( nFormat >> 4 ) & 0xf ); - switch( eDateFormat ) - { - case SVXDATEFORMAT_F : - nFormat = 1; - break; - case SVXDATEFORMAT_D : - nFormat = 2; - break; - case SVXDATEFORMAT_C : - nFormat = 4; - break; - default: - case SVXDATEFORMAT_A : - nFormat = 0; - } - switch( eTimeFormat ) - { - case SVXTIMEFORMAT_24_HM : - nFormat = 9; - break; - case SVXTIMEFORMAT_12_HM : - nFormat = 11; - break; - case SVXTIMEFORMAT_24_HMS : - nFormat = 10; - break; - case SVXTIMEFORMAT_12_HMS : - nFormat = 12; - break; - default: - break; - } - nVal |= nFormat; - } - - mpPptEscherEx->OpenContainer( EPP_HeadersFooters, 0 ); - mpPptEscherEx->AddAtom( 4, EPP_HeadersFootersAtom ); - *mpStrm << nVal; - ImplCreateHeaderFooterStrings( *mpStrm, rXPagePropSet ); - mpPptEscherEx->CloseContainer(); - } -} - -// --------------------------------------------------------------------------------------------- - -sal_Bool PPTWriter::ImplCreateDocument() -{ - sal_uInt32 i; - sal_uInt16 nSlideType = EPP_SLIDESIZE_TYPECUSTOM; - - sal_uInt32 nWidth = maDestPageSize.Width; - sal_uInt32 nHeight = maDestPageSize.Height; - - if ( ( nWidth == 0x1680 ) && ( nHeight == 0x10e0 ) ) - nSlideType = EPP_SLIDESIZE_TYPEONSCREEN; - else if ( ( nWidth == 0x1200 ) && ( nHeight == 0x240 ) ) - nSlideType = EPP_SLIDESIZE_TYPEBANNER; - else if ( ( nWidth == 0x1950 ) && ( nHeight == 0x10e0 ) ) - nSlideType = EPP_SLIDESIZE_TYPE35MM; - else if ( ( nWidth == 0x1860 ) && ( nHeight == 0x10e0 ) ) - nSlideType = EPP_SLIDESIZE_TYPEA4PAPER; - - mpPptEscherEx->OpenContainer( EPP_Document ); - // CREATE DOCUMENT ATOM - mpPptEscherEx->AddAtom( 40, EPP_DocumentAtom, 1 ); - *mpStrm << nWidth // Slide Size in Master coordinates X - << nHeight // " " " " " Y - << (sal_Int32)maNotesPageSize.Width // Notes Page Size X - << (sal_Int32)maNotesPageSize.Height // " " " Y - << (sal_Int32)1 << (sal_Int32)2; // the scale used when the Powerpoint document is embedded. the default is 1:2 - mpPptEscherEx->InsertPersistOffset( EPP_MAINNOTESMASTER_PERSIST_KEY, mpStrm->Tell() ); - *mpStrm << (sal_uInt32)0 // Reference to NotesMaster ( 0 if none ); - << (sal_uInt32)0 // Reference to HandoutMaster ( 0 if none ); - << (sal_Int16)1 // Number of the first slide; - << nSlideType // Size of the document slides ( default: EPP_SLIDESIZETYPEONSCREEN ) - << (sal_uInt8)0 // bool1 indicates if document was saved with embedded true type fonts - << (sal_uInt8)0 // bool1 indicates if the placeholders on the title slide are omitted - << (sal_uInt8)0 // bool1 right to left ( flag for Bidi version ) - << (sal_uInt8)1; // bool1 visibility of comments shapes - - mpPptEscherEx->PtInsert( EPP_Persist_Document, mpStrm->Tell() ); - - mpPptEscherEx->OpenContainer( EPP_HeadersFooters, 3 ); //Master footer (default) - mpPptEscherEx->AddAtom( 4, EPP_HeadersFootersAtom ); - *mpStrm << (sal_uInt32)0x25000d; - if ( GetPageByIndex( 0, MASTER ) ) - ImplCreateHeaderFooterStrings( *mpStrm, mXPagePropSet ); - mpPptEscherEx->CloseContainer(); - mpPptEscherEx->OpenContainer( EPP_HeadersFooters, 4 ); //NotesMaster footer (default) - mpPptEscherEx->AddAtom( 4, EPP_HeadersFootersAtom ); - *mpStrm << (sal_uInt32)0x3d000d; - if ( GetPageByIndex( 0, NOTICE ) ) - ImplCreateHeaderFooterStrings( *mpStrm, mXPagePropSet ); - mpPptEscherEx->CloseContainer(); - - mpPptEscherEx->OpenContainer( EPP_SlideListWithText ); // Animation info fuer die Slides - - for ( i = 0; i < mnPages; i++ ) - { - mpPptEscherEx->AddAtom( 20, EPP_SlidePersistAtom ); - mpPptEscherEx->InsertPersistOffset( EPP_MAINSLIDE_PERSIST_KEY | i, mpStrm->Tell() ); - *mpStrm << (sal_uInt32)0 // psrReference - logical reference to the slide persist object ( EPP_MAINSLIDE_PERSIST_KEY ) - << (sal_uInt32)4 // flags - only bit 3 used, if set then slide contains shapes other than placeholders - << (sal_Int32)0 // numberTexts - number of placeholder texts stored with the persist object. Allows to display outline view without loading the slide persist objects - << (sal_Int32)i + 0x100 // slideId - Unique slide identifier, used for OLE link monikers for example - << (sal_uInt32)0; // reserved, usualy 0 - - if ( !GetPageByIndex( i, NORMAL ) ) // sehr aufregend: noch einmal ueber alle seiten - return sal_False; - SetCurrentStyleSheet( GetMasterIndex( NORMAL ) ); - - ::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed > - aXName( mXDrawPage, ::com::sun::star::uno::UNO_QUERY ); - - if ( aXName.is() ) - maSlideNameList.push_back( aXName->getName() ); - else - maSlideNameList.push_back( ::rtl::OUString() ); - } - mpPptEscherEx->CloseContainer(); // EPP_SlideListWithText - - mpPptEscherEx->OpenContainer( EPP_SlideListWithText, 2 ); // Animation info fuer die notes - for( i = 0; i < mnPages; i++ ) - { - mpPptEscherEx->AddAtom( 20, EPP_SlidePersistAtom ); - mpPptEscherEx->InsertPersistOffset( EPP_MAINNOTES_PERSIST_KEY | i, mpStrm->Tell() ); - *mpStrm << (sal_uInt32)0 - << (sal_uInt32)4 - << (sal_Int32)0 - << (sal_Int32)i + 0x100 - << (sal_uInt32)0; - } - mpPptEscherEx->CloseContainer(); // EPP_SlideListWithText - - ::com::sun::star::uno::Reference< ::com::sun::star::presentation::XPresentationSupplier > - aXPresSupplier( mXModel, ::com::sun::star::uno::UNO_QUERY ); ; - if ( aXPresSupplier.is() ) - { - ::com::sun::star::uno::Reference< ::com::sun::star::presentation::XPresentation > - aXPresentation( aXPresSupplier->getPresentation() ); - if ( aXPresentation.is() ) - { - mXPropSet = ::com::sun::star::uno::Reference< - ::com::sun::star::beans::XPropertySet > - ( aXPresentation, ::com::sun::star::uno::UNO_QUERY ); - if ( mXPropSet.is() ) - { - ::rtl::OUString aCustomShow; - sal_uInt32 nPenColor = 0x1000000; - sal_Int32 nRestartTime = 0x7fffffff; - sal_Int16 nStartSlide = 0; - sal_Int16 nEndSlide = 0; - sal_uInt32 nFlags = 0; // Bit 0: Auto advance - // Bit 1 Skip builds ( do not allow slide effects ) - // Bit 2 Use slide range - // Bit 3 Use named show - // Bit 4 Browse mode on - // Bit 5 Kiosk mode on - // Bit 7 loop continously - // Bit ? show scrollbar - - if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CustomShow" ) ) ) ) - { - aCustomShow = ( *(::rtl::OUString*)mAny.getValue() ); - if ( aCustomShow.getLength() ) - { - nFlags |= 8; - } - } - if ( ( nFlags & 8 ) == 0 ) - { - if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "FirstPage" ) ) ) ) - { - ::rtl::OUString aSlideName( *(::rtl::OUString*)mAny.getValue() ); - - std::vector<rtl::OUString>::const_iterator pIter = std::find( - maSlideNameList.begin(),maSlideNameList.end(),aSlideName); - - if (pIter != maSlideNameList.end()) - { - nStartSlide = pIter - maSlideNameList.begin() + 1; - nFlags |= 4; - nEndSlide = (sal_uInt16)mnPages; - } - } - } - - if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "IsAutomatic" ) ) ) ) - { - sal_Bool bBool = sal_False; - mAny >>= bBool; - if ( !bBool ) - nFlags |= 1; - } - - if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "IsEndless" ) ) ) ) // muesste eigendlich heissen IsNotEndless !=)"�()& - { - sal_Bool bBool = sal_False; - mAny >>= bBool; - if ( bBool ) - nFlags |= 0x80; - } - if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "IsFullScreen" ) ) ) ) - { - sal_Bool bBool = sal_False; - mAny >>= bBool; - if ( !bBool ) - nFlags |= 0x11; - } - - mpPptEscherEx->AddAtom( 80, EPP_SSDocInfoAtom, 1 ); - *mpStrm << nPenColor << nRestartTime << nStartSlide << nEndSlide; - - sal_uInt32 nCustomShowNameLen = aCustomShow.getLength(); - if ( nCustomShowNameLen > 31 ) - nCustomShowNameLen = 31; - if ( nCustomShowNameLen ) // named show identifier - { - const sal_Unicode* pCustomShow = aCustomShow.getStr(); - for ( i = 0; i < nCustomShowNameLen; i++ ) - { - *mpStrm << (sal_uInt16)( pCustomShow[ i ] ); - } - } - for ( i = nCustomShowNameLen; i < 32; i++, *mpStrm << (sal_uInt16)0 ) ; - - *mpStrm << nFlags; - ::com::sun::star::uno::Reference< ::com::sun::star::presentation::XCustomPresentationSupplier > - aXCPSup( mXModel, ::com::sun::star::uno::UNO_QUERY ); - if ( aXCPSup.is() ) - { - ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer > - aXCont( aXCPSup->getCustomPresentations() ); - if ( aXCont.is() ) - { - ::com::sun::star::uno::Sequence< ::rtl::OUString> aNameSeq( aXCont->getElementNames() ); - const ::rtl::OUString* pUString = aNameSeq.getArray(); - sal_uInt32 nCount = aNameSeq.getLength(); - if ( nCount ) - { - mpPptEscherEx->OpenContainer( EPP_NamedShows ); - sal_uInt32 nCustomShowIndex = 0; - for( i = 0; i < nCount; i++ ) // Anzahl der Custom Shows - { - if ( pUString[ i ].getLength() ) - { - mpPptEscherEx->OpenContainer( EPP_NamedShow, nCustomShowIndex++ ); - - sal_uInt32 nNamedShowLen = pUString[ i ].getLength(); - if ( nNamedShowLen > 31 ) - nNamedShowLen = 31; - mpPptEscherEx->AddAtom( nNamedShowLen << 1, EPP_CString ); - const sal_Unicode* pCustomShowName = pUString[ i ].getStr(); - for ( sal_uInt32 k = 0; k < nNamedShowLen; *mpStrm << (sal_uInt16)( pCustomShowName[ k++ ] ) ) ; - mAny = aXCont->getByName( pUString[ i ] ); - if ( mAny.getValue() ) - { - - ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexContainer > aXIC; - if ( mAny >>= aXIC ) - { - mpPptEscherEx->BeginAtom(); - - sal_Int32 nSlideCount = aXIC->getCount(); - for ( sal_Int32 j = 0; j < nSlideCount; j++ ) // Anzahl der Slides - { - mAny = aXIC->getByIndex( j ); - if ( mAny.getValue() ) - { - ::com::sun::star::uno::Reference< - ::com::sun::star::drawing::XDrawPage > aXDrawPage; - if ( mAny >>= aXDrawPage ) - { - ::com::sun::star::uno::Reference< - ::com::sun::star::container::XNamed > - aXName( aXDrawPage, ::com::sun::star::uno::UNO_QUERY ); - if ( aXName.is() ) - { - ::rtl::OUString aSlideName( aXName->getName() ); - std::vector<rtl::OUString>::const_iterator pIter = std::find( - maSlideNameList.begin(),maSlideNameList.end(),aSlideName); - - if (pIter != maSlideNameList.end()) - { - sal_uInt32 nPageNumber = pIter - maSlideNameList.begin(); - *mpStrm << (sal_uInt32)( nPageNumber + 0x100 ); // unique slide id - } - } - } - } - } - mpPptEscherEx->EndAtom( EPP_NamedShowSlides ); - } - } - mpPptEscherEx->CloseContainer(); // EPP_NamedShow - } - } - mpPptEscherEx->CloseContainer(); // EPP_NamedShows - } - } - } - } - } - } - mpPptEscherEx->AddAtom( 0, EPP_EndDocument ); - mpPptEscherEx->CloseContainer(); // EPP_Document - return sal_True; -}; - -// --------------------------------------------------------------------------------------------- - -sal_Bool PPTWriter::ImplCreateHyperBlob( SvMemoryStream& rStrm ) -{ - sal_uInt32 nCurrentOfs, nParaOfs, nParaCount = 0; - - nParaOfs = rStrm.Tell(); - rStrm << (sal_uInt32)0; // property size - rStrm << (sal_uInt32)0; // property count - - for ( EPPTHyperlink* pLink = (EPPTHyperlink*)maHyperlink.First(); pLink; pLink = (EPPTHyperlink*)maHyperlink.Next() ) - { - nParaCount += 6; - rStrm << (sal_uInt32)3 // Type VT_I4 - << (sal_uInt32)7 // (VTI4 - Private1) - << (sal_uInt32)3 // Type VT_I4 - << (sal_uInt32)6 // (VTI4 - Private2) - << (sal_uInt32)3 // Type VT_I4 - << (sal_uInt32)0; // (VTI4 - Private3) - - // INFO - // HIWORD: = 0 : do not change anything - // = 1 : replace the hyperlink with the target and subadress in the following two VTLPWSTR - // = 2 : delete the hyperlink - // LOWORD: = 0 : graphic shown as background (link) - // = 1 : graphic shown as shape (link) - // = 2 : graphic is used to fill a shape - // = 3 : graphic used to fill a shape outline (future use) - // = 4 : hyperlink attached to a shape - // = 5 : " " " " (Word) field - // = 6 : " " " " (Excel) range - // = 7 : " " " " (PPT) text range - // = 8 : " " " " (Project) task - - sal_uInt32 nUrlLen = pLink->aURL.Len(); - const sal_Unicode* pUrl = pLink->aURL.GetBuffer(); - - sal_uInt32 nInfo = 7; - - rStrm << (sal_uInt32)3 // Type VT_I4 - << nInfo; // Info - - switch( pLink->nType & 0xff ) - { - case 1 : // click action to slidenumber - { - rStrm << (sal_uInt32)0x1f << (sal_uInt32)1 << (sal_uInt32)0; // path - rStrm << (sal_uInt32)0x1f << (sal_uInt32)( nUrlLen + 1 ); - for ( sal_uInt32 i = 0; i < nUrlLen; i++ ) - { - rStrm << pUrl[ i ]; - } - rStrm << (sal_uInt16)0; - } - break; - case 2 : - { - sal_uInt32 i; - - rStrm << (sal_uInt32)0x1f - << (sal_uInt32)( nUrlLen + 1 ); - for ( i = 0; i < nUrlLen; i++ ) - { - rStrm << pUrl[ i ]; - } - if ( ! ( i & 1 ) ) - rStrm << (sal_uInt16)0; - rStrm << (sal_uInt16)0 - << (sal_uInt32)0x1f - << (sal_uInt32)1 - << (sal_uInt32)0; - } - break; - } - } - nCurrentOfs = rStrm.Tell(); - rStrm.Seek( nParaOfs ); - rStrm << (sal_uInt32)( nCurrentOfs - ( nParaOfs + 4 ) ); - rStrm << nParaCount; - rStrm.Seek( nCurrentOfs ); - return sal_True; -} - -// --------------------------------------------------------------------------------------------- - -sal_Bool PPTWriter::ImplCreateMainNotes() -{ - EscherSolverContainer aSolverContainer; - - mpPptEscherEx->PtReplaceOrInsert( EPP_Persist_MainNotes, mpStrm->Tell() ); - mpPptEscherEx->OpenContainer( EPP_Notes ); - mpPptEscherEx->AddAtom( 8, EPP_NotesAtom, 1 ); - *mpStrm << (sal_uInt32)0x80000001 // Number that identifies this slide - << (sal_uInt32)0; // follow nothing - mpPptEscherEx->OpenContainer( EPP_PPDrawing ); - mpPptEscherEx->OpenContainer( ESCHER_DgContainer ); - mpPptEscherEx->EnterGroup(0,0); - - ImplWritePage( GetLayout( 20 ), aSolverContainer, NOTICE, sal_True ); - - mpPptEscherEx->LeaveGroup(); - mpPptEscherEx->OpenContainer( ESCHER_SpContainer ); - mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, 0xc00 ); - EscherPropertyContainer aPropOpt; - aPropOpt.AddOpt( ESCHER_Prop_fillColor, 0xffffff ); // stock valued fill color - aPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0 ); - aPropOpt.AddOpt( ESCHER_Prop_fillRectRight, 0x68bdde ); - aPropOpt.AddOpt( ESCHER_Prop_fillRectBottom, 0x8b9f8e ); - aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x120012 ); - aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0 ); - aPropOpt.AddOpt( ESCHER_Prop_bWMode, ESCHER_wDontShow ); - aPropOpt.AddOpt( ESCHER_Prop_fBackground, 0x10001 ); // if true, this is the background shape - aPropOpt.Commit( *mpStrm ); - mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer - - aSolverContainer.WriteSolver( *mpStrm ); - - mpPptEscherEx->CloseContainer(); // ESCHER_DgContainer - mpPptEscherEx->CloseContainer(); // EPP_Drawing - mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 1 ); - *mpStrm << (sal_uInt32)0xffffff << (sal_uInt32)0x000000 << (sal_uInt32)0x808080 << (sal_uInt32)0x000000 << (sal_uInt32)0x99cc00 << (sal_uInt32)0xcc3333 << (sal_uInt32)0xffcccc << (sal_uInt32)0xb2b2b2; - mpPptEscherEx->CloseContainer(); // EPP_Notes - return sal_True; -} - -// --------------------------------------------------------------------------------------------- - -static rtl::OUString getInitials( const rtl::OUString& rName ) -{ - rtl::OUString sInitials; - - const sal_Unicode * pStr = rName.getStr(); - sal_Int32 nLength = rName.getLength(); - - while( nLength ) - { - // skip whitespace - while( nLength && (*pStr <= ' ') ) - { - nLength--; pStr++; - } - - // take letter - if( nLength ) - { - sInitials += rtl::OUString( *pStr ); - nLength--; pStr++; - } - - // skip letters until whitespace - while( nLength && (*pStr > ' ') ) - { - nLength--; pStr++; - } - } - - return sInitials; -} - -void ImplExportComments( uno::Reference< drawing::XDrawPage > xPage, SvMemoryStream& rBinaryTagData10Atom ) -{ - try - { - uno::Reference< office::XAnnotationAccess > xAnnotationAccess( xPage, uno::UNO_QUERY_THROW ); - uno::Reference< office::XAnnotationEnumeration > xAnnotationEnumeration( xAnnotationAccess->createAnnotationEnumeration() ); - - sal_Int32 nIndex = 1; - - while( xAnnotationEnumeration->hasMoreElements() ) - { - EscherExContainer aComment10( rBinaryTagData10Atom, EPP_Comment10 ); - { - uno::Reference< office::XAnnotation > xAnnotation( xAnnotationEnumeration->nextElement() ); - - geometry::RealPoint2D aRealPoint2D( xAnnotation->getPosition() ); - MapMode aMapDest( MAP_INCH, Point(), Fraction( 1, 576 ), Fraction( 1, 576 ) ); - Point aPoint( OutputDevice::LogicToLogic( Point( static_cast< sal_Int32 >( aRealPoint2D.X * 100.0 ), - static_cast< sal_Int32 >( aRealPoint2D.Y * 100.0 ) ), MAP_100TH_MM, aMapDest ) ); - - rtl::OUString sAuthor( xAnnotation->getAuthor() ); - uno::Reference< text::XText > xText( xAnnotation->getTextRange() ); - rtl::OUString sText( xText->getString() ); - rtl::OUString sInitials( getInitials( sAuthor ) ); - util::DateTime aDateTime( xAnnotation->getDateTime() ); - if ( sAuthor.getLength() ) - PPTWriter::WriteCString( rBinaryTagData10Atom, sAuthor, 0 ); - if ( sText.getLength() ) - PPTWriter::WriteCString( rBinaryTagData10Atom, sText, 1 ); - if ( sInitials.getLength() ) - PPTWriter::WriteCString( rBinaryTagData10Atom, sInitials, 2 ); - - sal_Int16 nMilliSeconds = aDateTime.HundredthSeconds * 10; - EscherExAtom aCommentAtom10( rBinaryTagData10Atom, EPP_CommentAtom10 ); - rBinaryTagData10Atom << nIndex++ - << aDateTime.Year - << aDateTime.Month - << aDateTime.Day // todo: day of week - << aDateTime.Day - << aDateTime.Hours - << aDateTime.Minutes - << aDateTime.Seconds - << nMilliSeconds - << static_cast< sal_Int32 >( aPoint.X() ) - << static_cast< sal_Int32 >( aPoint.Y() ); - } - } - } - catch ( uno::Exception& ) - { - } -} - -// --------------------------------------------------------------------------------------------- - -void PPTWriter::ImplWriteNotes( sal_uInt32 nPageNum ) -{ - mpPptEscherEx->PtReplaceOrInsert( EPP_Persist_Notes | nPageNum, mpStrm->Tell() ); - mpPptEscherEx->OpenContainer( EPP_Notes ); - mpPptEscherEx->AddAtom( 8, EPP_NotesAtom, 1 ); - *mpStrm << (sal_uInt32)nPageNum + 0x100 - << (sal_uInt16)3 // follow master .... - << (sal_uInt16)0; - - ImplCreateHeaderFooters( mXPagePropSet ); - - EscherSolverContainer aSolverContainer; - - mpPptEscherEx->OpenContainer( EPP_PPDrawing ); - mpPptEscherEx->OpenContainer( ESCHER_DgContainer ); - mpPptEscherEx->EnterGroup(0,0); - - ImplWritePage( GetLayout( 20 ), aSolverContainer, NOTICE, sal_False ); // Die Shapes der Seite werden im PPT Dok. erzeugt - - mpPptEscherEx->LeaveGroup(); - mpPptEscherEx->OpenContainer( ESCHER_SpContainer ); - mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, 0xc00 ); // Flags: Connector | Background | HasSpt - EscherPropertyContainer aPropOpt; - aPropOpt.AddOpt( ESCHER_Prop_fillColor, 0xffffff ); // stock valued fill color - aPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0 ); - aPropOpt.AddOpt( ESCHER_Prop_fillRectRight, 0x8b9f8e ); - aPropOpt.AddOpt( ESCHER_Prop_fillRectBottom, 0x68bdde ); - aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x120012 ); - aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 ); - aPropOpt.AddOpt( ESCHER_Prop_bWMode, ESCHER_wDontShow ); - aPropOpt.AddOpt( ESCHER_Prop_fBackground, 0x10001 ); - aPropOpt.Commit( *mpStrm ); - mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer - - aSolverContainer.WriteSolver( *mpStrm ); - - mpPptEscherEx->CloseContainer(); // ESCHER_DgContainer - mpPptEscherEx->CloseContainer(); // EPP_Drawing - mpPptEscherEx->AddAtom( 32, EPP_ColorSchemeAtom, 0, 1 ); - *mpStrm << (sal_uInt32)0xffffff << (sal_uInt32)0x000000 << (sal_uInt32)0x808080 << (sal_uInt32)0x000000 << (sal_uInt32)0x99cc00 << (sal_uInt32)0xcc3333 << (sal_uInt32)0xffcccc << (sal_uInt32)0xb2b2b2; - mpPptEscherEx->CloseContainer(); // EPP_Notes -}; - -void PPTWriter::ImplWriteBackground( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet ) -{ - //************************ ****** - //** DEFAULT BACKGROUND SHAPE ** - //****************************** - - sal_uInt32 nFillColor = 0xffffff; - sal_uInt32 nFillBackColor = 0; - - mpPptEscherEx->OpenContainer( ESCHER_SpContainer ); - mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, 0xc00 ); // Flags: Connector | Background | HasSpt - Point aEmptyPoint = Point(); - Rectangle aRect( aEmptyPoint, Size( 28000, 21000 ) ); - EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm, aRect ); - aPropOpt.AddOpt( ESCHER_Prop_fillType, ESCHER_FillSolid ); - ::com::sun::star::drawing::FillStyle aFS( ::com::sun::star::drawing::FillStyle_NONE ); - if ( ImplGetPropertyValue( rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" ) ) ) ) - mAny >>= aFS; - - switch( aFS ) - { - case ::com::sun::star::drawing::FillStyle_GRADIENT : - { - aPropOpt.CreateGradientProperties( rXPropSet ); - aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x1f001e ); - aPropOpt.GetOpt( ESCHER_Prop_fillColor, nFillColor ); - aPropOpt.GetOpt( ESCHER_Prop_fillBackColor, nFillBackColor ); - } - break; - - case ::com::sun::star::drawing::FillStyle_BITMAP : - aPropOpt.CreateGraphicProperties( rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillBitmapURL" ) ), sal_True ); - break; - - case ::com::sun::star::drawing::FillStyle_HATCH : - aPropOpt.CreateGraphicProperties( rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillHatch" ) ), sal_True ); - break; - - case ::com::sun::star::drawing::FillStyle_SOLID : - { - if ( ImplGetPropertyValue( rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillColor" ) ) ) ) - { - nFillColor = mpPptEscherEx->GetColor( *((sal_uInt32*)mAny.getValue()) ); - nFillBackColor = nFillColor ^ 0xffffff; - } - } // PASSTHROUGH INTENDED - case ::com::sun::star::drawing::FillStyle_NONE : - default: - aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x120012 ); - break; - } - aPropOpt.AddOpt( ESCHER_Prop_fillColor, nFillColor ); - aPropOpt.AddOpt( ESCHER_Prop_fillBackColor, nFillBackColor ); - aPropOpt.AddOpt( ESCHER_Prop_fillRectRight, PPTtoEMU( maDestPageSize.Width ) ); - aPropOpt.AddOpt( ESCHER_Prop_fillRectBottom, PPTtoEMU( maDestPageSize.Height ) ); - aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 ); - aPropOpt.AddOpt( ESCHER_Prop_bWMode, ESCHER_bwWhite ); - aPropOpt.AddOpt( ESCHER_Prop_fBackground, 0x10001 ); - aPropOpt.Commit( *mpStrm ); - mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer -} - -void PPTWriter::ImplWriteVBA() -{ - if ( mpVBA ) - { - mpVBA->Seek( STREAM_SEEK_TO_END ); - sal_uInt32 nLen = mpVBA->Tell(); - if ( nLen > 8 ) - { - nLen -= 8; - mnVBAOleOfs = mpStrm->Tell(); - mpPptEscherEx->BeginAtom(); - mpStrm->Write( (sal_Int8*)mpVBA->GetData() + 8, nLen ); - mpPptEscherEx->EndAtom( EPP_ExOleObjStg, 0, 1 ); - } - } -} - -// --------------------------------------------------------------------------------------------- - -void PPTWriter::ImplWriteOLE( ) -{ - PPTExOleObjEntry* pPtr; - - SvxMSExportOLEObjects aOleExport( mnCnvrtFlags ); - - for ( pPtr = (PPTExOleObjEntry*)maExOleObj.First(); pPtr; - pPtr = (PPTExOleObjEntry*)maExOleObj.Next() ) - { - SvMemoryStream* pStrm = NULL; - pPtr->nOfsB = mpStrm->Tell(); - switch ( pPtr->eType ) - { - case NORMAL_OLE_OBJECT : - { - SdrObject* pSdrObj = GetSdrObjectFromXShape( pPtr->xShape ); - if ( pSdrObj && pSdrObj->ISA( SdrOle2Obj ) ) - { - ::uno::Reference < embed::XEmbeddedObject > xObj( ( (SdrOle2Obj*) pSdrObj )->GetObjRef() ); - if( xObj.is() ) - { - SvStorageRef xTempStorage( new SvStorage( new SvMemoryStream(), sal_True ) ); - aOleExport.ExportOLEObject( xObj, *xTempStorage ); - - //TODO/MBA: testing - String aPersistStream( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( SVEXT_PERSIST_STREAM ) ) ); - SvMemoryStream aStream; - SvStorageRef xCleanStorage( new SvStorage( sal_False, aStream ) ); - xTempStorage->CopyTo( xCleanStorage ); - // create a dummy content stream, the dummy content is necessary for ppt, but not for - // doc files, so we can't share code. - SotStorageStreamRef xStm = xCleanStorage->OpenSotStream( aPersistStream, STREAM_STD_READWRITE ); - *xStm << (sal_uInt32)0 // no ClipboardId - << (sal_uInt32)4 // no target device - << (sal_uInt32)1 // aspect ratio - << (sal_Int32)-1 // L-Index - << (sal_uInt32)0 // Advanced Flags - << (sal_uInt32)0 // compression - << (sal_uInt32)0 // Size - << (sal_uInt32)0 // " - << (sal_uInt32)0; - pStrm = xCleanStorage->CreateMemoryStream(); - } - } - } - break; - - case OCX_CONTROL : - { - if ( pPtr->xControlModel.is() ) - { - String aName; - ::com::sun::star::awt::Size aSize; - SvStorageRef xDest( new SvStorage( new SvMemoryStream(), sal_True ) ); - sal_Bool bOk = SvxMSConvertOCXControls::WriteOCXStream( xDest, pPtr->xControlModel, aSize, aName ); - if ( bOk ) - pStrm = xDest->CreateMemoryStream(); - } - } - } - if ( pStrm ) - { - mpPptEscherEx->BeginAtom(); - pStrm->Seek( STREAM_SEEK_TO_END ); - sal_uInt32 npStrmSize = pStrm->Tell(); - *mpStrm << npStrmSize; // uncompressed size - - pStrm->Seek( 0 ); - ZCodec aZCodec( 0x8000, 0x8000 ); - aZCodec.BeginCompression(); - aZCodec.Compress( *pStrm, *mpStrm ); - aZCodec.EndCompression(); - delete pStrm; - mpPptEscherEx->EndAtom( EPP_ExOleObjStg, 0, 1 ); - } - } -} - -// --------------------------------------------------------------------------------------------- -// PersistantTable und UserEditAtom schreiben - -sal_Bool PPTWriter::ImplWriteAtomEnding() -{ - -#define EPP_LastViewTypeNone 0 -#define EPP_LastViewTypeSlideView 1 -#define EPP_LastViewTypeOutlineView 2 -#define EPP_LastViewTypeNotes 3 - - sal_uInt32 i, nPos, nOfs, nPersistOfs = mpStrm->Tell(); - sal_uInt32 nPersistEntrys = 0; - *mpStrm << (sal_uInt32)0 << (sal_uInt32)0 << (sal_uInt32)0; // Record Header und ersten Eintrag ueberspringen - - // Document pesist schreiben - nPersistEntrys++; - *mpStrm << (sal_uInt32)0; - // MasterPages persists schreiben - for ( i = 0; i < mnMasterPages; i++ ) - { - nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_MainMaster | i ); - if ( nOfs ) - { - *mpStrm << nOfs; - mpPptEscherEx->InsertAtPersistOffset( EPP_MAINMASTER_PERSIST_KEY | i, ++nPersistEntrys ); - } - } - // MainNotesMaster persist schreiben - nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_MainNotes ); - if ( nOfs ) - { - *mpStrm << nOfs; - mpPptEscherEx->InsertAtPersistOffset( EPP_MAINNOTESMASTER_PERSIST_KEY, ++nPersistEntrys ); - } - // Slide persists schreiben -> es gilt hier auch den EPP_SlidePersistAtome mit einem gueltigen wert zu beschreiben - for ( i = 0; i < mnPages; i++ ) - { - nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_Slide | i ); - if ( nOfs ) - { - *mpStrm << nOfs; - mpPptEscherEx->InsertAtPersistOffset( EPP_MAINSLIDE_PERSIST_KEY | i, ++nPersistEntrys ); - } - } - // Notes persists schreiben - for ( i = 0; i < mnPages; i++ ) - { - nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_Notes | i ); - if ( nOfs ) - { - *mpStrm << nOfs; - mpPptEscherEx->InsertAtPersistOffset( EPP_MAINNOTES_PERSIST_KEY | i, ++nPersistEntrys ); - } - } - // Ole persists - PPTExOleObjEntry* pPtr; - for ( pPtr = (PPTExOleObjEntry*)maExOleObj.First(); pPtr; pPtr = (PPTExOleObjEntry*)maExOleObj.Next() ) - { - nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_ExObj ); - if ( nOfs ) - { - nPersistEntrys++; - *mpStrm << pPtr->nOfsB; - sal_uInt32 nOldPos, nPersOfs = nOfs + pPtr->nOfsA + 16 + 8; // 8 bytes atom header, +16 to the persist entry - nOldPos = mpStrm->Tell(); - mpStrm->Seek( nPersOfs ); - *mpStrm << nPersistEntrys; - mpStrm->Seek( nOldPos ); - } - } - // VB persist - if ( mnVBAOleOfs && mpVBA ) - { - nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_VBAInfoAtom ); - if ( nOfs ) - { - nPersistEntrys++; - sal_uInt32 n1, n2; - - mpVBA->Seek( 0 ); - *mpVBA >> n1 - >> n2; - - *mpStrm << mnVBAOleOfs; - sal_uInt32 nOldPos = mpStrm->Tell(); - mpStrm->Seek( nOfs ); // Fill the VBAInfoAtom with the correct index to the persisttable - *mpStrm << nPersistEntrys - << n1 - << 2; - mpStrm->Seek( nOldPos ); - - } - } - nPos = mpStrm->Tell(); - mpStrm->Seek( nPersistOfs ); - mpPptEscherEx->AddAtom( ( nPersistEntrys + 1 ) << 2, EPP_PersistPtrIncrementalBlock ); // Record Header eintragen - *mpStrm << (sal_uInt32)( ( nPersistEntrys << 20 ) | 1 ); - mpStrm->Seek( nPos ); - - *mpCurUserStrm << (sal_uInt32)nPos; // offset to current edit setzen - mpPptEscherEx->AddAtom( 28, EPP_UserEditAtom ); - *mpStrm << (sal_Int32)0x100 // last slide ID - << (sal_uInt32)0x03000dbc // minor and major app version that did the save - << (sal_uInt32)0 // offset last save, 0 after a full save - << nPersistOfs // File offset to persist pointers for this save operation - << (sal_uInt32)1 // Persist reference to the document persist object - << (sal_uInt32)nPersistEntrys // max persists written, Seed value for persist object id management - << (sal_Int16)EPP_LastViewTypeSlideView // last view type - << (sal_Int16)0x12; // padword - - return sal_True; -} - -// --------------------- -// - exported function - -// --------------------- - -extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool __LOADONCALLAPI ExportPPT( SvStorageRef& rSvStorage, - ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > & rXModel, - ::com::sun::star::uno::Reference< ::com::sun::star::task::XStatusIndicator > & rXStatInd, - SvMemoryStream* pVBA, sal_uInt32 nCnvrtFlags ) -{ - PPTWriter* pPPTWriter; - sal_Bool bStatus = sal_False; - - pPPTWriter = new PPTWriter( rSvStorage, rXModel, rXStatInd, pVBA, nCnvrtFlags ); - if ( pPPTWriter ) - { - pPPTWriter->exportPPT(); - bStatus = ( pPPTWriter->IsValid() == sal_True ); - delete pPPTWriter; - } - - return bStatus; -} - -extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool __LOADONCALLAPI SaveVBA( SfxObjectShell& rDocShell, SvMemoryStream*& pBas ) -{ - SvStorageRef xDest( new SvStorage( new SvMemoryStream(), sal_True ) ); - SvxImportMSVBasic aMSVBas( rDocShell, *xDest, sal_False, sal_False ); - aMSVBas.SaveOrDelMSVBAStorage( sal_True, String( RTL_CONSTASCII_USTRINGPARAM("_MS_VBA_Overhead") ) ); - - SvStorageRef xOverhead = xDest->OpenSotStorage( String( RTL_CONSTASCII_USTRINGPARAM("_MS_VBA_Overhead") ) ); - if ( xOverhead.Is() && ( xOverhead->GetError() == SVSTREAM_OK ) ) - { - SvStorageRef xOverhead2 = xOverhead->OpenSotStorage( String( RTL_CONSTASCII_USTRINGPARAM("_MS_VBA_Overhead") ) ); - if ( xOverhead2.Is() && ( xOverhead2->GetError() == SVSTREAM_OK ) ) - { - SvStorageStreamRef xTemp = xOverhead2->OpenSotStream( String( RTL_CONSTASCII_USTRINGPARAM("_MS_VBA_Overhead2") ) ); - if ( xTemp.Is() && ( xTemp->GetError() == SVSTREAM_OK ) ) - { - sal_uInt32 nLen = xTemp->GetSize(); - if ( nLen ) - { - char* pTemp = new char[ nLen ]; - if ( pTemp ) - { - xTemp->Seek( STREAM_SEEK_TO_BEGIN ); - xTemp->Read( pTemp, nLen ); - pBas = new SvMemoryStream( pTemp, nLen, STREAM_READ ); - pBas->ObjectOwnsMemory( sal_True ); - return sal_True; - } - } - } - } - } - - return sal_False; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |