diff options
Diffstat (limited to 'filter/inc/filter/msfilter/msdffimp.hxx')
-rw-r--r-- | filter/inc/filter/msfilter/msdffimp.hxx | 861 |
1 files changed, 861 insertions, 0 deletions
diff --git a/filter/inc/filter/msfilter/msdffimp.hxx b/filter/inc/filter/msfilter/msdffimp.hxx new file mode 100644 index 000000000000..4f11a4c2fab9 --- /dev/null +++ b/filter/inc/filter/msfilter/msdffimp.hxx @@ -0,0 +1,861 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef _MSDFFIMP_HXX +#define _MSDFFIMP_HXX + +#include <com/sun/star/uno/Reference.h> +#include <com/sun/star/embed/XEmbeddedObject.hpp> +#include <tools/solar.h> // UINTXX +#include <svl/svarray.hxx> +#include <tools/color.hxx> +#include <tools/gen.hxx> +#include <tools/table.hxx> +#include <svx/msdffdef.hxx> +#include <filter/msfilter/msfiltertracer.hxx> +#include <vcl/graph.hxx> +#include <string.h> +#include <map> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <filter/msfilter/msfilterdllapi.h> +#include <sot/storage.hxx> + +class Graphic; +class SvStream; +class SdrObject; +class SdrOle2Obj; +class SotStorageRef; +class Polygon; +class PolyPolygon; +class FmFormModel; +class SdrModel; +class DffRecordHeader; + +class SwFlyFrmFmt; + +struct SvxMSDffBLIPInfo; +struct SvxMSDffShapeInfo; +struct SvxMSDffShapeOrder; + +class MSFILTER_DLLPUBLIC DffRecordHeader +{ + +public: + BYTE nRecVer; // may be DFF_PSFLAG_CONTAINER + UINT16 nRecInstance; + UINT16 nImpVerInst; + UINT16 nRecType; + UINT32 nRecLen; + ULONG nFilePos; +public: + DffRecordHeader() : nRecVer(0), nRecInstance(0), nImpVerInst(0), nRecType(0), nRecLen(0), nFilePos(0) {} + FASTBOOL IsContainer() const { return nRecVer == DFF_PSFLAG_CONTAINER; } + ULONG GetRecBegFilePos() const { return nFilePos; } + ULONG GetRecEndFilePos() const { return nFilePos + DFF_COMMON_RECORD_HEADER_SIZE + nRecLen; } + void SeekToEndOfRecord(SvStream& rIn) const { rIn.Seek(nFilePos + DFF_COMMON_RECORD_HEADER_SIZE + nRecLen ); } + void SeekToContent( SvStream& rIn) const { rIn.Seek(nFilePos + DFF_COMMON_RECORD_HEADER_SIZE ); } + void SeekToBegOfRecord(SvStream& rIn) const { rIn.Seek( nFilePos ); } + + MSFILTER_DLLPUBLIC friend SvStream& operator>>(SvStream& rIn, DffRecordHeader& rRec); + +}; + +struct DffPropFlags +{ + BYTE bSet : 1; + BYTE bComplex : 1; + BYTE bBlip : 1; + BYTE bSoftAttr : 1; +}; + +class SvxMSDffManager; + +class MSFILTER_DLLPUBLIC DffPropSet : public Table +{ + protected : + + UINT32 mpContents[ 1024 ]; + DffPropFlags mpFlags[ 1024 ]; + + public : + + DffPropSet( BOOL bInitialize = FALSE ){ if ( bInitialize ) + memset( mpFlags, 0, 0x400 * sizeof( DffPropFlags ) ); }; + + inline BOOL IsProperty( UINT32 nRecType ) const { return ( mpFlags[ nRecType & 0x3ff ].bSet ); }; + BOOL IsHardAttribute( UINT32 nId ) const; + UINT32 GetPropertyValue( UINT32 nId, UINT32 nDefault = 0 ) const; + /** Returns a boolean property by its real identifier. */ + bool GetPropertyBool( UINT32 nId, bool bDefault = false ) const; + /** Returns a string property. */ + ::rtl::OUString GetPropertyString( UINT32 nId, SvStream& rStrm ) const; + void SetPropertyValue( UINT32 nId, UINT32 nValue ) const; + BOOL SeekToContent( UINT32 nRecType, SvStream& rSt ) const; + void Merge( DffPropSet& rMasterPropSet ) const; + void InitializePropSet() const; + friend SvStream& operator>>( SvStream& rIn, DffPropSet& rPropSet ); +}; + +class SfxItemSet; +class SdrObject; +struct DffObjData; + +class MSFILTER_DLLPUBLIC DffPropertyReader : public DffPropSet +{ + const SvxMSDffManager& rManager; + DffPropSet* pDefaultPropSet; + + void ApplyCustomShapeTextAttributes( SfxItemSet& rSet ) const; + void ApplyCustomShapeAdjustmentAttributes( SfxItemSet& rSet ) const; + void ApplyCustomShapeGeometryAttributes( SvStream& rIn, SfxItemSet& rSet, const DffObjData& rObjData ) const; + void ApplyLineAttributes( SfxItemSet& rSet, const MSO_SPT eShapeType ) const; // #i28269# + void ApplyFillAttributes( SvStream& rIn, SfxItemSet& rSet, const DffObjData& rObjData ) const; + +public: + + INT32 mnFix16Angle; + + DffPropertyReader( const SvxMSDffManager& rManager ); + ~DffPropertyReader(); + INT32 Fix16ToAngle( INT32 nAngle ) const; + +#ifdef DBG_CUSTOMSHAPE + void ReadPropSet( SvStream& rIn, void* pClientData, UINT32 nShapeType = 0 ) const; +#else + void ReadPropSet( SvStream& rIn, void* pClientData ) const; +#endif + + void SetDefaultPropSet( SvStream& rIn, UINT32 nOffDgg ) const; + void ApplyAttributes( SvStream& rIn, SfxItemSet& rSet ) const; + void ApplyAttributes( SvStream& rIn, SfxItemSet& rSet, const DffObjData& rObjData ) const; +}; + + +#define COL_DEFAULT RGB_COLORDATA( 0xFA, 0xFB, 0xFC ) + +typedef SvxMSDffBLIPInfo* SvxMSDffBLIPInfo_Ptr; + +typedef SvxMSDffShapeInfo* SvxMSDffShapeInfo_Ptr; + +typedef SvxMSDffShapeOrder* SvxMSDffShapeOrder_Ptr; + +typedef ::std::map< sal_Int32, SdrObject* > SvxMSDffShapeIdContainer; + +#define SVEXT_PERSIST_STREAM "\002OlePres000" + +// nach der Reihenfolge des Auftretens sortiert werden: +// +SV_DECL_PTRARR_DEL(SvxMSDffBLIPInfos, SvxMSDffBLIPInfo_Ptr, 16,16) + +SV_DECL_PTRARR_DEL(SvxMSDffShapeOrders, SvxMSDffShapeOrder_Ptr, 16,16) + +// explizit sortiert werden: +// +SV_DECL_PTRARR_SORT_DEL_VISIBILITY(SvxMSDffShapeInfos, SvxMSDffShapeInfo_Ptr, 16,16, MSFILTER_DLLPUBLIC) + +SV_DECL_PTRARR_SORT_VISIBILITY(SvxMSDffShapeTxBxSort, SvxMSDffShapeOrder_Ptr, 16,16, MSFILTER_DLLPUBLIC) + +#define SVXMSDFF_SETTINGS_CROP_BITMAPS 1 +#define SVXMSDFF_SETTINGS_IMPORT_PPT 2 +#define SVXMSDFF_SETTINGS_IMPORT_EXCEL 4 + +#define SP_FGROUP 0x001 // This shape is a group shape +#define SP_FCHILD 0x002 // Not a top-level shape +#define SP_FPATRIARCH 0x004 // This is the topmost group shape. + // Exactly one of these per drawing. +#define SP_FDELETED 0x008 // The shape has been deleted +#define SP_FOLESHAPE 0x010 // The shape is an OLE object +#define SP_FHAVEMASTER 0x020 // Shape has a hspMaster property +#define SP_FFLIPH 0x040 // Shape is flipped horizontally +#define SP_FFLIPV 0x080 // Shape is flipped vertically +#define SP_FCONNECTOR 0x100 // Connector type of shape +#define SP_FHAVEANCHOR 0x200 // Shape has an anchor of some kind +#define SP_FBACKGROUND 0x400 // Background shape +#define SP_FHAVESPT 0x800 // Shape has a shape type property + +// for the CreateSdrOLEFromStorage we need the information, how we handle +// convert able OLE-Objects - this ist stored in +#define OLE_MATHTYPE_2_STARMATH 0x0001 +#define OLE_WINWORD_2_STARWRITER 0x0002 +#define OLE_EXCEL_2_STARCALC 0x0004 +#define OLE_POWERPOINT_2_STARIMPRESS 0x0008 + +struct SvxMSDffConnectorRule +{ + sal_uInt32 nRuleId; + sal_uInt32 nShapeA; // SPID of shape A + + sal_uInt32 nShapeB; // SPID of shape B + sal_uInt32 nShapeC; // SPID of connector shape + sal_uInt32 ncptiA; // Connection site Index of shape A + sal_uInt32 ncptiB; // Connection site Index of shape B + sal_uInt32 nSpFlagsA; // SpFlags of shape A ( the original mirror flags must be known when solving the Solver Container ) + sal_uInt32 nSpFlagsB; // SpFlags of shape A + + SdrObject* pAObj; // pPtr of object ( corresponding to shape A ) + SdrObject* pBObj; // " + SdrObject* pCObj; // " of connector object + + SvxMSDffConnectorRule() : nSpFlagsA( 0 ), nSpFlagsB( 0 ), pAObj( NULL ), pBObj( NULL ), pCObj( NULL ) {}; + + friend SvStream& operator>>( SvStream& rIn, SvxMSDffConnectorRule& rAtom ); +}; +struct MSFILTER_DLLPUBLIC SvxMSDffSolverContainer +{ + List aCList; + + SvxMSDffSolverContainer(); + ~SvxMSDffSolverContainer(); + + MSFILTER_DLLPUBLIC friend SvStream& operator>>( SvStream& rIn, SvxMSDffSolverContainer& rAtom ); +}; + +struct FIDCL +{ + UINT32 dgid; // DG owning the SPIDs in this cluster + UINT32 cspidCur; // number of SPIDs used so far +}; + +//--------------------------------------------------------------------------- +// von SvxMSDffManager fuer jedes in der Gruppe enthaltene Shape geliefert +//--------------------------------------------------------------------------- +struct MSDffTxId +{ + USHORT nTxBxS; + USHORT nSequence; + MSDffTxId(USHORT nTxBxS_, USHORT nSequence_ ) + : nTxBxS( nTxBxS_ ), + nSequence( nSequence_ ){} + MSDffTxId(const MSDffTxId& rCopy) + : nTxBxS( rCopy.nTxBxS ), + nSequence( rCopy.nSequence ){} +}; + +struct MSFILTER_DLLPUBLIC SvxMSDffImportRec +{ + SdrObject* pObj; + Polygon* pWrapPolygon; + char* pClientAnchorBuffer; + UINT32 nClientAnchorLen; + char* pClientDataBuffer; + UINT32 nClientDataLen; + UINT32 nXAlign; + UINT32 nXRelTo; + UINT32 nYAlign; + UINT32 nYRelTo; + UINT32 nLayoutInTableCell; + UINT32 nFlags; + long nTextRotationAngle; + long nDxTextLeft; // Abstand der Textbox vom umgebenden Shape + long nDyTextTop; + long nDxTextRight; + long nDyTextBottom; + long nDxWrapDistLeft; + long nDyWrapDistTop; + long nDxWrapDistRight; + long nDyWrapDistBottom; + long nCropFromTop; + long nCropFromBottom; + long nCropFromLeft; + long nCropFromRight; + MSDffTxId aTextId; // Kennungen fuer Textboxen + ULONG nNextShapeId; // fuer verlinkte Textboxen + ULONG nShapeId; + MSO_SPT eShapeType; + MSO_LineStyle eLineStyle; // Umrandungs-Arten + BOOL bDrawHell :1; + BOOL bHidden :1; + BOOL bReplaceByFly :1; + BOOL bLastBoxInChain :1; + BOOL bHasUDefProp :1; + BOOL bVFlip :1; + BOOL bHFlip :1; + BOOL bAutoWidth :1; + + SvxMSDffImportRec(); + SvxMSDffImportRec(const SvxMSDffImportRec& rCopy); + ~SvxMSDffImportRec(); + BOOL operator==( const SvxMSDffImportRec& rEntry ) const + { return nShapeId == rEntry.nShapeId; } + BOOL operator<( const SvxMSDffImportRec& rEntry ) const + { return nShapeId < rEntry.nShapeId; } +}; +typedef SvxMSDffImportRec* MSDffImportRec_Ptr; + +// Liste aller SvxMSDffImportRec fuer eine Gruppe +SV_DECL_PTRARR_SORT_DEL_VISIBILITY(MSDffImportRecords, MSDffImportRec_Ptr, 16,16, MSFILTER_DLLPUBLIC) + +//--------------------------------------------------------------------------- +// Import-/Export-Parameterblock fuer 1 x ImportObjAtCurrentStreamPos() +//--------------------------------------------------------------------------- +struct SvxMSDffImportData +{ + MSDffImportRecords aRecords; // Shape-Pointer, -Ids und private Daten + Rectangle aParentRect;// Rectangle der umgebenden Gruppe + // bzw. von aussen reingegebenes Rect + Rectangle aNewRect; // mit diesem Shape definiertes Rectangle + + SvxMSDffImportData() + {} + SvxMSDffImportData(const Rectangle& rParentRect) + :aParentRect( rParentRect ) + {} + void SetNewRect(INT32 l, INT32 o, + INT32 r, INT32 u ){ aNewRect = Rectangle(l,o, r,u); } + BOOL HasParRect() const { return aParentRect.IsEmpty(); } + BOOL HasNewRect() const { return aNewRect.IsEmpty() ; } + BOOL HasRecords() const { return 0 != aRecords.Count(); } + USHORT GetRecCount() const { return aRecords.Count(); } + SvxMSDffImportRec* GetRecord(USHORT iRecord) const + { return aRecords.GetObject( iRecord ); } +}; + +struct DffObjData +{ + const DffRecordHeader& rSpHd; + + Rectangle aBoundRect; + Rectangle aChildAnchor; + + UINT32 nShapeId; + UINT32 nSpFlags; + MSO_SPT eShapeType; + + BOOL bShapeType : 1; + BOOL bClientAnchor : 1; + BOOL bClientData : 1; + BOOL bChildAnchor : 1; + BOOL bOpt : 1; + BOOL bIsAutoText : 1; + + int nCalledByGroup; + + DffObjData( const DffRecordHeader& rObjHd, + const Rectangle& rBoundRect, + int nClByGroup ) : + rSpHd( rObjHd ), + aBoundRect( rBoundRect ), + nShapeId( 0 ), + nSpFlags( 0 ), + eShapeType( mso_sptNil ), + bShapeType( FALSE ), + bClientAnchor( FALSE ), + bClientData( FALSE ), + bChildAnchor( FALSE ), + bOpt( FALSE ), + bIsAutoText( FALSE ), + nCalledByGroup( nClByGroup ){} +}; + +#define DFF_RECORD_MANAGER_BUF_SIZE 64 + +struct DffRecordList +{ + UINT32 nCount; + UINT32 nCurrent; + DffRecordList* pPrev; + DffRecordList* pNext; + + DffRecordHeader mHd[ DFF_RECORD_MANAGER_BUF_SIZE ]; + + DffRecordList( DffRecordList* pList ); + ~DffRecordList(); +}; + +enum DffSeekToContentMode +{ + SEEK_FROM_BEGINNING, + SEEK_FROM_CURRENT, + SEEK_FROM_CURRENT_AND_RESTART +}; + +class MSFILTER_DLLPUBLIC DffRecordManager : public DffRecordList +{ + public : + + DffRecordList* pCList; + + void Clear(); + void Consume( SvStream& rIn, BOOL bAppend = FALSE, UINT32 nStOfs = 0 ); + + BOOL SeekToContent( SvStream& rIn, UINT16 nRecType, DffSeekToContentMode eMode = SEEK_FROM_BEGINNING ); + DffRecordHeader* GetRecordHeader( UINT16 nRecType, DffSeekToContentMode eMode = SEEK_FROM_BEGINNING ); + + DffRecordManager(); + DffRecordManager( SvStream& rIn ); + ~DffRecordManager(); + + DffRecordHeader* Current(); + DffRecordHeader* First(); + DffRecordHeader* Next(); + DffRecordHeader* Prev(); + DffRecordHeader* Last(); +}; + +/* + SvxMSDffManager - abstrakte Basis-Klasse fuer Escher-Import + =============== + Zweck: Zugriff auf Objekte im Drawing File Format + Stand: Zugriff nur auf BLIPs (wird spaeter erweitert) + + Beachte: in der zwecks PowerPoint-, ODER Word- ODER Excel-Import + ======== abgeleiteten Klasse + MUSS jeweils die Methode ProcessUserDefinedRecord() + implementiert werden! +*/ +class MSFILTER_DLLPUBLIC SvxMSDffManager : public DffPropertyReader +{ + FmFormModel* pFormModel; + SvxMSDffBLIPInfos* pBLIPInfos; + SvxMSDffShapeInfos* pShapeInfos; + SvxMSDffShapeOrders* pShapeOrders; + ULONG nDefaultFontHeight; + long nOffsDgg; + USHORT nBLIPCount; + USHORT nShapeCount; + sal_uInt32 nGroupShapeFlags; + + void CheckTxBxStoryChain(); + void GetFidclData( long nOffsDgg ); + +protected : + + String maBaseURL; + UINT32 mnCurMaxShapeId; // we need this information to + UINT32 mnDrawingsSaved; // access the right drawing + UINT32 mnIdClusters; // while only knowing the shapeid + FIDCL* mpFidcls; + Table maDgOffsetTable; // array of fileoffsets + + friend class DffPropertyReader; + + SvStream& rStCtrl; + SvStream* pStData; + SvStream* pStData2; + SdrModel* pSdrModel; + + long nMapMul; + long nMapDiv; + long nMapXOfs; + long nMapYOfs; + long nEmuMul; + long nEmuDiv; + long nPntMul; + long nPntDiv; + FASTBOOL bNeedMap; + UINT32 nSvxMSDffSettings; + UINT32 nSvxMSDffOLEConvFlags; + + /** stores a reference to an imported SdrObject with its shape id if + it has one + */ + SvxMSDffShapeIdContainer maShapeIdContainer; + + void GetCtrlData( long nOffsDgg ); + void GetDrawingGroupContainerData( SvStream& rSt, + ULONG nLenDgg ); + // --> OD 2008-08-01 #156763# + // Add internal drawing container id as parameter to the sub methods of + // reading the control information about the drawing objects. + // The drawing container id is used to distinguish the text ids of drawing + // objects in different drawing containers. + void GetDrawingContainerData( SvStream& rSt, + ULONG nLenDg, + const unsigned long nDrawingContainerId ); + BOOL GetShapeGroupContainerData( SvStream& rSt, + ULONG nLenShapeGroupCont, + BOOL bPatriarch, + const unsigned long nDrawingContainerId ); + BOOL GetShapeContainerData( SvStream& rSt, + ULONG nLenShapeCont, + ULONG nPosGroup, + const unsigned long nDrawingContainerId ); + // <-- + + FASTBOOL ReadGraphic( SvStream& rSt, ULONG nIndex, Graphic& rGraphic ) const; + SdrObject* ImportFontWork( SvStream&, SfxItemSet&, Rectangle& rBoundRect ) const; + SdrObject* ImportGraphic( SvStream&, SfxItemSet&, const DffObjData& ) const; + // --> OD 2004-12-14 #i32596# - pass <nCalledByGroup> to method + // Needed in the Writer Microsoft Word import to avoid import of OLE objects + // inside groups. Instead a graphic object is created. + virtual SdrObject* ImportOLE( long nOLEId, + const Graphic& rGraf, + const Rectangle& rBoundRect, + const Rectangle& rVisArea, + const int _nCalledByGroup, + sal_Int64 nAspect ) const; + // <-- + SdrObject* GetAutoForm( MSO_SPT eTyp ) const; + static const GDIMetaFile* lcl_GetMetaFileFromGrf_Impl( const Graphic& rGrf, GDIMetaFile& rMtf ); +#ifndef SVX_LIGHT + static com::sun::star::uno::Reference < com::sun::star::embed::XEmbeddedObject > CheckForConvertToSOObj( + UINT32 nConvertFlags, SotStorage& rSrcStg, + const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xDestStg, + const Graphic& rGrf, + const Rectangle& rVisArea ); +#endif + +/* + folgende Methoden sind zum Excel-Import zu ueberschreiben: +*/ + virtual BOOL ProcessClientAnchor(SvStream& rStData, ULONG nDatLen, char*& rpBuff, UINT32& rBuffLen ) const; + virtual void ProcessClientAnchor2( SvStream& rStData, DffRecordHeader& rHd, void* pData, DffObjData& ); + virtual BOOL ProcessClientData( SvStream& rStData, ULONG nDatLen, char*& rpBuff, UINT32& rBuffLen ) const; + virtual SdrObject* ProcessObj( SvStream& rSt, DffObjData& rData, void* pData, Rectangle& rTextRect, SdrObject* pObj = NULL); + virtual ULONG Calc_nBLIPPos( ULONG nOrgVal, ULONG nStreamPos ) const; + virtual FASTBOOL GetColorFromPalette(USHORT nNum, Color& rColor) const; + + // ----------------------------------------------------------------------- + + FASTBOOL ReadDffString(SvStream& rSt, String& rTxt) const; + FASTBOOL ReadObjText(SvStream& rSt, SdrObject* pObj) const; + + // SJ: New implementation of ReadObjText is used by Fontwork objects, because + // the old one does not properly import multiple paragraphs + void ReadObjText( const String& rText, SdrObject* pObj ) const; + // ----------------------------------------------------------------------- + + /* + folgende Methode ist von allen zu ueberschreiben, die OLE-Objecte + importieren moechten: + */ + virtual BOOL GetOLEStorageName( long nOLEId, String& rStorageName, + SotStorageRef& rSrcStorage, + com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xDestStg + ) const; + + /* + folgende Methode ist von allen zu ueberschreiben, die verhindern + moechten, dass (abgerundete) Rechtecke mit umgebrochenem Text + immer in SdrRectObj( OBJ_TEXT ) umgewandelt werden: + TRUE bedeutet umwandeln. + */ + virtual BOOL ShapeHasText(ULONG nShapeId, ULONG nFilePos) const; + +public: + + void* pSvxMSDffDummy1; + void* pSvxMSDffDummy2; + void* pSvxMSDffDummy3; + List* pEscherBlipCache; + + DffRecordManager maShapeRecords; + ColorData mnDefaultColor; + + MSFilterTracer* mpTracer; + sal_Bool mbTracing; + + Color MSO_TEXT_CLR_ToColor( sal_uInt32 nColorCode ) const; + Color MSO_CLR_ToColor( sal_uInt32 nColorCode, sal_uInt16 nContextProperty = DFF_Prop_lineColor ) const; + virtual BOOL SeekToShape( SvStream& rSt, void* pClientData, UINT32 nId ) const; + FASTBOOL SeekToRec( SvStream& rSt, USHORT nRecId, ULONG nMaxFilePos, DffRecordHeader* pRecHd = NULL, ULONG nSkipCount = 0 ) const; + FASTBOOL SeekToRec2( USHORT nRecId1, USHORT nRecId2, ULONG nMaxFilePos, DffRecordHeader* pRecHd = NULL, ULONG nSkipCount = 0 ) const; + + // ----------------------------------------------------------------------- + static void MSDFFReadZString( SvStream& rIn, String& rStr, ULONG nMaxLen, FASTBOOL bUniCode = FALSE ); + + static BOOL ReadCommonRecordHeader( DffRecordHeader& rRec, SvStream& rIn ); + static BOOL ReadCommonRecordHeader( SvStream& rSt, + BYTE& rVer, + USHORT& rInst, + USHORT& rFbt, + UINT32& rLength ); +/* + Konstruktor + =========== + Input: rStCtrl - Verwaltungsstream mit Containern, + FBSE Objekten und Shapes + ( muss immer uebergeben werden; + Stream muss bereits offen sein ) + + nOffsDgg - Offset im rStCtrl: Beginn des Drawing Group Containers + + pStData - Datenstream, in dem die BLIPs gespeichert sind + ( falls Null, wird angenommen, dass die + BLIPs ebenfalls im rStCtrl gespeichert sind; + dieser Stream muss ebenfalls bereits offen sein ) + pSdrModel_ kann beim Ctor-Aufruf leer bleiben, muss dann aber + spaeter ueber SetModel() gesetzt werden! + + setzt nBLIPCount +*/ + SvxMSDffManager( SvStream& rStCtrl, + const String& rBaseURL, + long nOffsDgg, + SvStream* pStData, + SdrModel* pSdrModel_ = 0, + long nApplicationScale = 0, + ColorData mnDefaultColor_ = COL_DEFAULT, + ULONG nDefaultFontHeight_ = 24, + SvStream* pStData2_ = 0, + MSFilterTracer* pTracer = NULL ); + + // in PPT werden die Parameter DGGContainerOffset und PicStream + // mit Hilfe einer Init Routine Uebergeben. + SvxMSDffManager( SvStream& rStCtrl, const String& rBaseURL, MSFilterTracer* pTracer ); + void InitSvxMSDffManager( long nOffsDgg_, SvStream* pStData_, sal_uInt32 nSvxMSDffOLEConvFlags ); + void SetDgContainer( SvStream& rSt ); + + virtual ~SvxMSDffManager(); + + UINT32 GetSvxMSDffSettings() const { return nSvxMSDffSettings; }; + void SetSvxMSDffSettings( UINT32 nSettings ) { nSvxMSDffSettings = nSettings; }; + + static BOOL MakeContentStream( SotStorage * pStor, const GDIMetaFile & ); + static BOOL ConvertToOle2( SvStream& rStm, UINT32 nLen, const GDIMetaFile*, + const SotStorageRef & rDest ); + + void SetModel(SdrModel* pModel, long nApplicationScale); + SdrModel* GetModel() const { return pSdrModel; } + void Scale(sal_Int32& rVal) const; + void Scale(Point& rPos) const; + void Scale(Size& rSiz) const; + void Scale(Rectangle& rRect) const; + void Scale(Polygon& rPoly) const; + void Scale(PolyPolygon& rPoly) const; + void ScaleEmu(sal_Int32& rVal) const; + UINT32 ScalePt( UINT32 nPt ) const; + INT32 ScalePoint( INT32 nVal ) const; + +/* + GetBLIP() - Anforderung eines bestimmten BLIP + ========= + Input: nIdx - Nummer des angeforderten BLIP + ( muss immer uebergeben werden ) + + Output: rData - bereits fertig konvertierte Daten + ( direkt als Grafik in unsere Dokumente einzusetzen ) + + Rueckgabewert: TRUE, im Erfolgsfalls, FALSE bei Fehler +*/ + BOOL GetBLIP( ULONG nIdx, Graphic& rData, Rectangle* pVisArea = NULL ) const; + +/* + GetBLIPDirect() -Einlesen eines BLIP aus schon positioniertem Stream + =============== + Input: rBLIPStream -bereits korrekt positionierter Stream + ( muss immer uebergeben werden ) + + Output: rData -bereits fertig konvertierte Daten + ( direkt als Grafik in unsere Dokumente einzusetzen ) + + Rueckgabewert: TRUE, im Erfolgsfalls, FALSE bei Fehler +*/ + BOOL GetBLIPDirect(SvStream& rBLIPStream, Graphic& rData, Rectangle* pVisArea = NULL ) const; + + BOOL GetShape(ULONG nId, + SdrObject*& rpData, SvxMSDffImportData& rData); + +/* + GetBLIPCount() - Abfrage der verwalteten BLIP Anzahl + ============== + Input: ./. + Output: ./. + Rueckgabewert: nBLIPCount - Anzahl der im pStData (bzw. rStCtrl) enthaltenen BLIPs + ( sprich: Anzahl der FBSEs im Drawing Group Container ) + + Werte: 0 - Struktur Ok, jedoch keine BLIPs vorhanden + 1.. - Anzahl der BLIPs + USHRT_MAX - Fehler: kein korrektes Drawing File Format +*/ + USHORT GetBLIPCount() const{ return nBLIPCount; } + +/* + ZCodecDecompressed() - Dekomprimierung eines komp. WMF oder Enhanced WMF + ==================== + Input: rIn -bereits korrekt positionierter Stream, + der das komprimierte Bild enthaelt + rOut -bereits korrekt positionierter Ausgabe-Stream, + + bLookForEnd -Flag, ob das komp. Bild bis zum Stream-Ende reicht. + Falls TRUE, wird jeweils geprueft, ob das gelesene noch + zum Bild gehoert. + Falls FALSE, wird bis zum Stream-Ende gelesen. + + Output: rIn -Der Stream steht hinter dem Ende des komp. Bildes. + (es kann aber noch eine Ende-Kennung und CRC-Sum folgen) + rOut -Der Stream enthaelt das dekomprimierte Bild. + Der Stream wird auf den Anfang des Bildes positioniert. + (also dorthin, wo der Stream vor der Verarbeitung stand) + + Rueckgabewert: TRUE, im Erfolgsfall + FALSE bei Fehler oder Null Bytes geschrieben +*/ +// static BOOL ZCodecDecompressed( SvStream& rIn, +// SvStream& rOut, +// BOOL bLookForEnd ); +// + SdrObject* ImportObj(SvStream& rSt, void* pData, + Rectangle& rClientRect, const Rectangle& rGlobalChildRect, int nCalledByGroup = 0, sal_Int32* pShapeId = NULL); + + SdrObject* ImportGroup( const DffRecordHeader& rHd, SvStream& rSt, void* pData, + Rectangle& rClientRect, const Rectangle& rGlobalChildRect, int nCalledByGroup = 0, sal_Int32* pShapeId = NULL ); + + SdrObject* ImportShape( const DffRecordHeader& rHd, SvStream& rSt, void* pData, + Rectangle& rClientRect, const Rectangle& rGlobalChildRect, int nCalledByGroup = 0, sal_Int32* pShapeId = NULL); + + Rectangle GetGlobalChildAnchor( const DffRecordHeader& rHd, SvStream& rSt, Rectangle& aClientRect ); + void GetGroupAnchors( const DffRecordHeader& rHd, SvStream& rSt, + Rectangle& rGroupClientAnchor, Rectangle& rGroupChildAnchor, + const Rectangle& rClientRect, const Rectangle& rGlobalChildRect ); + + inline const SvxMSDffShapeInfos* GetShapeInfos( void ) const + { + return pShapeInfos; + } + + inline const SvxMSDffShapeOrders* GetShapeOrders( void ) const + { + return pShapeOrders; + } + + void StoreShapeOrder(ULONG nId, + ULONG nTxBx, + SdrObject* pObject, + SwFlyFrmFmt* pFly = 0, + short nHdFtSection = 0) const; + + void ExchangeInShapeOrder(SdrObject* pOldObject, + ULONG nTxBx, + SwFlyFrmFmt* pFly, + SdrObject* pObject) const; + + void RemoveFromShapeOrder( SdrObject* pObject ) const; + + UINT32 GetConvertFlags() const { return nSvxMSDffOLEConvFlags; } + + static SdrOle2Obj* CreateSdrOLEFromStorage( const String& rStorageName, + SotStorageRef& rSrcStorage, + const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xDestStg, + const Graphic& rGraf, + const Rectangle& rBoundRect, + const Rectangle& rVisArea, + SvStream* pDataStrrm, + ErrCode& rError, + UINT32 nConvertFlags, + sal_Int64 nAspect ); + + /* the method SolveSolver will create connections between shapes, it should be called after a page is imported. + The SvxMSDffSolverContainer is containing necessary data data that is collected during the import of each shape + */ + void SolveSolver( const SvxMSDffSolverContainer& rSolver ); + + static sal_Bool SetPropValue( + const ::com::sun::star::uno::Any& rAny, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet, + const String& rPropertyName, + sal_Bool bTestPropertyAvailability = sal_False ); + + void insertShapeId( sal_Int32 nShapeId, SdrObject* pShape ); + void removeShapeId( SdrObject* pShape ); + SdrObject* getShapeForId( sal_Int32 nShapeId ); +}; + +struct SvxMSDffBLIPInfo +{ + USHORT nBLIPType; // Art des BLIP: z.B. 6 fuer PNG + ULONG nFilePos; // Offset des BLIP im Daten-Stream + ULONG nBLIPSize; // Anzahl Bytes, die der BLIP im Stream einnimmt + SvxMSDffBLIPInfo(USHORT nBType, ULONG nFPos, ULONG nBSize): + nBLIPType( nBType ), nFilePos( nFPos ), nBLIPSize( nBSize ){} +}; + +struct SvxMSDffShapeInfo +{ + sal_uInt32 nShapeId; // Shape Id, verwendet im PLCF SPA und im mso_fbtSp (FSP) + ULONG nFilePos; // Offset des Shape im Kontroll-Stream fuer eventuelle + // erneute Zugriffe auf dieses Shape + sal_uInt32 nTxBxComp; + + BOOL bReplaceByFly :1; // Shape darf im Writer durch Rahmen ersetzt werden. + BOOL bSortByShapeId :1; + BOOL bLastBoxInChain:1; + + SvxMSDffShapeInfo(ULONG nFPos, sal_uInt32 nId=0, // ULONG nBIdx=0, + USHORT nSeqId=0, USHORT nBoxId=0): + nShapeId( nId ), + nFilePos( nFPos ), + nTxBxComp( (nSeqId << 16) + nBoxId ) + { + bReplaceByFly = FALSE; + bSortByShapeId = FALSE; + bLastBoxInChain = TRUE; + } + SvxMSDffShapeInfo(SvxMSDffShapeInfo& rInfo): + nShapeId( rInfo.nShapeId ), + nFilePos( rInfo.nFilePos ), + nTxBxComp( rInfo.nTxBxComp ) + { + bReplaceByFly = rInfo.bReplaceByFly; + bSortByShapeId = rInfo.bSortByShapeId; + bLastBoxInChain = rInfo.bLastBoxInChain; + } + BOOL operator==( const SvxMSDffShapeInfo& rEntry ) const + { + return bSortByShapeId ? (nShapeId == rEntry.nShapeId) + : (nTxBxComp == rEntry.nTxBxComp && this == &rEntry); + } + BOOL operator<( const SvxMSDffShapeInfo& rEntry ) const + { + return bSortByShapeId ? (nShapeId < rEntry.nShapeId) + : (nTxBxComp < rEntry.nTxBxComp); + } +}; + +struct SvxMSDffShapeOrder +{ + ULONG nShapeId; // Shape Id, verwendet im PLCF SPA und im mso_fbtSp (FSP) + + ULONG nTxBxComp; // Ketten- und Boxnummer in der Text-Box-Story (bzw. Null) + + SwFlyFrmFmt* pFly; // Frame-Format eines statt des Sdr-Text-Objektes im + // Writer eingefuegten Rahmens: zur Verkettung benoetigt! + + short nHdFtSection; // used by Writer to find out if linked frames are in the + // same header or footer of the same section + + SdrObject* pObj; // Zeiger auf das Draw-Objekt (bzw. Null, falls nicht verwendet) + + // Vorgehensweise: im Ctor des SvxMSDffManager werden im der Shape-Order-Array + // nur die Shape-Ids vermerkt, + // Text-Box-Nummer und der Objekt-Pointer werden nur dann + // gespeichert, wenn das Shape tatsaechlich importiert wird! + SvxMSDffShapeOrder( ULONG nId ): + nShapeId( nId ), nTxBxComp( 0 ), pFly( 0 ), nHdFtSection( 0 ), pObj( 0 ){} + + BOOL operator==( const SvxMSDffShapeOrder& rEntry ) const + { + return (nTxBxComp == rEntry.nTxBxComp); + } + BOOL operator<( const SvxMSDffShapeOrder& rEntry ) const + { + return (nTxBxComp < rEntry.nTxBxComp); + } +}; + +#endif + |