/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef OOX_DUMP_BIFFDUMPER_HXX #define OOX_DUMP_BIFFDUMPER_HXX #include "oox/dump/dumperbase.hxx" #include "oox/dump/dffdumper.hxx" #include "oox/dump/oledumper.hxx" #include "oox/xls/richstring.hxx" #include "oox/xls/biffinputstream.hxx" #if OOX_INCLUDE_DUMPER namespace oox { namespace xls { class BiffInputStream; class FontPortionModelList; struct FunctionInfo; class FunctionProvider; } } namespace oox { namespace dump { namespace biff { typedef ::boost::shared_ptr< ::oox::xls::BiffInputStream > BiffInputStreamRef; // ============================================================================ // ============================================================================ class BiffDffStreamObject : public DffStreamObject { public: explicit BiffDffStreamObject( const OutputObjectBase& rParent, const BinaryInputStreamRef& rxStrm ); protected: virtual void implDumpClientAnchor(); }; // ============================================================================ class BiffCtlsStreamObject : public InputObjectBase { public: explicit BiffCtlsStreamObject( const OutputObjectBase& rParent, const BinaryInputStreamRef& rxStrm ); void dumpControl( sal_uInt32 nStartPos, sal_uInt32 nLength ); protected: virtual void implDump(); private: sal_uInt32 mnStartPos; sal_uInt32 mnLength; }; // ============================================================================ // ============================================================================ class BiffConfig : public Config { public: explicit BiffConfig( const Config& rParent, ::oox::xls::BiffType eBiff ); protected: virtual bool implIsValid() const; virtual NameListRef implGetNameList( const ::rtl::OUString& rKey ) const; private: ::oox::xls::BiffType meBiff; }; // ============================================================================ class BiffSharedData : public Base { public: explicit BiffSharedData( ::oox::xls::BiffType eBiff ); void initializePerSheet(); inline ::oox::xls::BiffType getBiff() const { return meBiff; } inline rtl_TextEncoding getTextEncoding() const { return meTextEnc; } void setTextEncoding( rtl_TextEncoding eTextEnc ); sal_uInt16 getFontCount() const; rtl_TextEncoding getFontEncoding( sal_uInt16 nFontId ) const; void appendFontEncoding( rtl_TextEncoding eFontEnc ); sal_uInt16 getXfCount() const; rtl_TextEncoding getXfEncoding( sal_uInt16 nXfId ) const; void appendXfFontId( sal_uInt16 nFontId ); protected: virtual bool implIsValid() const; private: typedef ::std::vector< rtl_TextEncoding > TextEncVec; typedef ::std::vector< sal_uInt16 > FontIdVec; TextEncVec maFontEncs; FontIdVec maXfFontIds; ::oox::xls::BiffType meBiff; rtl_TextEncoding meTextEnc; }; // ============================================================================ class BiffObjectBase : public RecordObjectBase { public: inline BiffSharedData& getBiffData() const { return *mxBiffData; } inline ::oox::xls::BiffInputStream& getBiffStream() const { return *mxBiffStrm; } inline ::oox::xls::BiffType getBiff() const { return mxBiffData->getBiff(); } protected: inline explicit BiffObjectBase() {} virtual ~BiffObjectBase(); using InputObjectBase::construct; void construct( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, ::oox::xls::BiffType eBiff, const ::rtl::OUString& rSysFileName ); void construct( const BiffObjectBase& rParent ); virtual bool implIsValid() const; virtual bool implStartRecord( BinaryInputStream& rBaseStrm, sal_Int64& ornRecPos, sal_Int64& ornRecId, sal_Int64& ornRecSize ); inline sal_uInt16 getLastRecId() const { return mnLastRecId; } ::rtl::OUString getErrorName( sal_uInt8 nErrCode ) const; // ------------------------------------------------------------------------ sal_Int32 readCol( bool bCol16Bit ); sal_Int32 readRow( bool bRow32Bit ); void readAddress( Address& orAddress, bool bCol16Bit = true, bool bRow32Bit = false ); void readRange( Range& orRange, bool bCol16Bit = true, bool bRow32Bit = false ); void readRangeList( RangeList& orRanges, bool bCol16Bit = true, bool bRow32Bit = false ); // ------------------------------------------------------------------------ void writeBooleanItem( const String& rName, sal_uInt8 nBool ); void writeErrorCodeItem( const String& rName, sal_uInt8 nErrCode ); void writeFontPortions( const ::oox::xls::FontPortionModelList& rPortions ); template< typename Type > void writeRectItem( const String& rName, Type nLeft, Type nTop, Type nWidth, Type nHeight, const NameListWrapper& rListWrp = NO_LIST, FormatType eFmtType = FORMATTYPE_DEC ); // ------------------------------------------------------------------------ ::rtl::OUString dumpByteString( const String& rName, ::oox::xls::BiffStringFlags nFlags = ::oox::xls::BIFF_STR_DEFAULT, rtl_TextEncoding eDefaultTextEnc = RTL_TEXTENCODING_DONTKNOW ); ::rtl::OUString dumpUniString( const String& rName, ::oox::xls::BiffStringFlags nFlags = ::oox::xls::BIFF_STR_DEFAULT ); ::rtl::OUString dumpString( const String& rName, ::oox::xls::BiffStringFlags nByteFlags = ::oox::xls::BIFF_STR_DEFAULT, ::oox::xls::BiffStringFlags nUniFlags = ::oox::xls::BIFF_STR_DEFAULT, rtl_TextEncoding eDefaultTextEnc = RTL_TEXTENCODING_DONTKNOW ); ::rtl::OUString dumpSegmentedUniString( const String& rName ); void dumpSegmentedUniStringArray( const String& rName ); sal_uInt8 dumpBoolean( const String& rName = EMPTY_STRING ); sal_uInt8 dumpErrorCode( const String& rName = EMPTY_STRING ); rtl_TextEncoding dumpCodePage( const String& rName = EMPTY_STRING ); void dumpFormulaResult( const String& rName = EMPTY_STRING ); sal_Int32 dumpColIndex( const String& rName = EMPTY_STRING, bool bCol16Bit = true ); sal_Int32 dumpRowIndex( const String& rName = EMPTY_STRING, bool bRow32Bit = false ); sal_Int32 dumpColRange( const String& rName = EMPTY_STRING, bool bCol16Bit = true ); sal_Int32 dumpRowRange( const String& rName = EMPTY_STRING, bool bRow32Bit = false ); Address dumpAddress( const String& rName = EMPTY_STRING, bool bCol16Bit = true, bool bRow32Bit = false ); Range dumpRange( const String& rName = EMPTY_STRING, bool bCol16Bit = true, bool bRow32Bit = false ); void dumpRangeList( const String& rName = EMPTY_STRING, bool bCol16Bit = true, bool bRow32Bit = false ); void dumpConstArrayHeader( sal_uInt32& rnCols, sal_uInt32& rnRows ); ::rtl::OUString dumpConstValue( sal_Unicode cStrQuote = OOX_DUMP_STRQUOTE ); template< typename Type > void dumpRect( const String& rName, const NameListWrapper& rListWrp = NO_LIST, FormatType eFmtType = FORMATTYPE_DEC ); template< typename Type > void dumpRectWithGaps( const String& rName, sal_Int32 nGap, const NameListWrapper& rListWrp = NO_LIST, FormatType eFmtType = FORMATTYPE_DEC ); sal_uInt16 dumpRepeatedRecId(); void dumpFrHeader( bool bWithFlags, bool bWithRange ); void dumpDffClientRect(); void dumpEmbeddedDff(); void dumpControl(); private: typedef ::boost::shared_ptr< BiffSharedData > BiffSharedDataRef; typedef ::boost::shared_ptr< BiffDffStreamObject > BiffDffStreamObjRef; typedef ::boost::shared_ptr< BiffCtlsStreamObject > BiffCtlsStrmObjRef; BiffSharedDataRef mxBiffData; BiffInputStreamRef mxBiffStrm; BiffDffStreamObjRef mxDffObj; BiffCtlsStrmObjRef mxCtlsObj; NameListRef mxErrCodes; NameListRef mxConstType; NameListRef mxResultType; sal_uInt16 mnLastRecId; bool mbMergeContRec; }; // ---------------------------------------------------------------------------- template< typename Type > void BiffObjectBase::writeRectItem( const String& rName, Type nLeft, Type nTop, Type nWidth, Type nHeight, const NameListWrapper& rListWrp, FormatType eFmtType ) { MultiItemsGuard aMultiGuard( mxOut ); writeEmptyItem( rName ); writeValueItem( "x-pos", nLeft, eFmtType, rListWrp ); writeValueItem( "y-pos", nTop, eFmtType, rListWrp ); writeValueItem( "x-size", nWidth, eFmtType, rListWrp ); writeValueItem( "y-size", nHeight, eFmtType, rListWrp ); } template< typename Type > void BiffObjectBase::dumpRect( const String& rName, const NameListWrapper& rListWrp, FormatType eFmtType ) { Type nLeft, nTop, nWidth, nHeight; *mxBiffStrm >> nLeft >> nTop >> nWidth >> nHeight; writeRectItem( rName, nLeft, nTop, nWidth, nHeight, rListWrp, eFmtType ); } template< typename Type > void BiffObjectBase::dumpRectWithGaps( const String& rName, sal_Int32 nGap, const NameListWrapper& rListWrp, FormatType eFmtType ) { Type nLeft, nTop, nWidth, nHeight; *mxBiffStrm >> nLeft; mxBiffStrm->skip( nGap ); *mxBiffStrm >> nTop; mxBiffStrm->skip( nGap ); *mxBiffStrm >> nWidth; mxBiffStrm->skip( nGap ); *mxBiffStrm >> nHeight; mxBiffStrm->skip( nGap ); writeRectItem( rName, nLeft, nTop, nWidth, nHeight, rListWrp, eFmtType ); } // ============================================================================ // ============================================================================ class FormulaObject : public BiffObjectBase { public: explicit FormulaObject( const BiffObjectBase& rParent ); virtual ~FormulaObject(); sal_uInt16 readFormulaSize(); sal_uInt16 dumpFormulaSize( const String& rName = EMPTY_STRING ); void dumpCellFormula( const String& rName, sal_uInt16 nSize ); void dumpCellFormula( const String& rName = EMPTY_STRING ); void dumpNameFormula( const String& rName, sal_uInt16 nSize ); void dumpNameFormula( const String& rName = EMPTY_STRING ); protected: virtual void implDump(); private: void constructFmlaObj(); void dumpFormula( const String& rName, sal_uInt16 nSize, bool bNameMode ); void dumpFormula( const String& rName, bool bNameMode ); TokenAddress createTokenAddress( sal_uInt16 nCol, sal_uInt16 nRow, bool bRelC, bool bRelR, bool bNameMode ) const; ::rtl::OUString createRef( const ::rtl::OUString& rData ) const; ::rtl::OUString createName( sal_uInt16 nNameIdx ) const; ::rtl::OUString createPlaceHolder( size_t nIdx ) const; ::rtl::OUString createPlaceHolder() const; sal_uInt16 readFuncId(); ::rtl::OUString writeFuncIdItem( sal_uInt16 nFuncId, const ::oox::xls::FunctionInfo** oppFuncInfo = 0 ); sal_uInt16 dumpTokenCol( const String& rName, bool& rbRelC, bool& rbRelR ); sal_uInt16 dumpTokenRow( const String& rName, bool& rbRelC, bool& rbRelR ); TokenAddress dumpTokenAddress( bool bNameMode ); TokenRange dumpTokenRange( bool bNameMode ); sal_Int16 readTokenRefIdx(); ::rtl::OUString dumpTokenRefIdx(); ::rtl::OUString dumpTokenRefTabIdxs(); void dumpIntToken(); void dumpDoubleToken(); void dumpStringToken(); void dumpBoolToken(); void dumpErrorToken(); void dumpMissArgToken(); void dumpArrayToken( const ::rtl::OUString& rTokClass ); void dumpNameToken( const ::rtl::OUString& rTokClass ); void dumpNameXToken( const ::rtl::OUString& rTokClass ); void dumpRefToken( const ::rtl::OUString& rTokClass, bool bNameMode ); void dumpAreaToken( const ::rtl::OUString& rTokClass, bool bNameMode ); void dumpRefErrToken( const ::rtl::OUString& rTokClass, bool bArea ); void dumpRef3dToken( const ::rtl::OUString& rTokClass, bool bNameMode ); void dumpArea3dToken( const ::rtl::OUString& rTokClass, bool bNameMode ); void dumpRefErr3dToken( const ::rtl::OUString& rTokClass, bool bArea ); void dumpMemFuncToken( const ::rtl::OUString& rTokClass ); void dumpMemAreaToken( const ::rtl::OUString& rTokClass, bool bAddData ); void dumpExpToken( const String& rName ); void dumpUnaryOpToken( const String& rLOp, const String& rROp ); void dumpBinaryOpToken( const String& rOp ); void dumpFuncToken( const ::rtl::OUString& rTokClass ); void dumpFuncVarToken( const ::rtl::OUString& rTokClass ); void dumpCmdToken( const ::rtl::OUString& rTokClass ); void dumpSheetToken(); void dumpEndSheetToken(); bool dumpAttrToken(); bool dumpNlrToken(); void dumpNlrErrToken(); void dumpNlrColRowToken( const ::rtl::OUString& rTokClass, bool bAddData ); void dumpNlrRangeToken( const ::rtl::OUString& rTokClass, bool bAddData ); void dumpNlrRangeErrToken(); void dumpAddTokenData(); void dumpAddDataNlr( size_t nIdx ); void dumpAddDataArray( size_t nIdx ); void dumpAddDataMemArea( size_t nIdx ); private: enum AddDataType { ADDDATA_NLR, ADDDATA_ARRAY, ADDDATA_MEMAREA }; typedef ::boost::shared_ptr< FormulaStack > FormulaStackRef; typedef ::boost::shared_ptr< ::oox::xls::FunctionProvider > FuncProvRef; typedef ::std::vector< AddDataType > AddDataTypeVec; NameListRef mxTokens; NameListRef mxClasses; NameListRef mxRelFlags; NameListRef mxNlrTypes; NameListRef mxAttrTypes; NameListRef mxSpTypes; sal_Int32 mnColCount; sal_Int32 mnRowCount; FormulaStackRef mxStack; FuncProvRef mxFuncProv; AddDataTypeVec maAddData; ::rtl::OUString maRefPrefix; ::rtl::OUString maName; sal_uInt16 mnSize; bool mbNameMode; }; // ============================================================================ // ============================================================================ class RecordStreamObject : public BiffObjectBase { protected: inline explicit RecordStreamObject() {} virtual ~RecordStreamObject(); using BiffObjectBase::construct; void construct( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, ::oox::xls::BiffType eBiff, const ::rtl::OUString& rSysFileName ); virtual bool implIsValid() const; inline FormulaObject& getFormulaDumper() const { return *mxFmlaObj; } private: typedef ::boost::shared_ptr< FormulaObject > FormulaObjectRef; FormulaObjectRef mxFmlaObj; }; // ============================================================================ class WorkbookStreamObject : public RecordStreamObject { public: explicit WorkbookStreamObject( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, const ::rtl::OUString& rSysFileName ); virtual ~WorkbookStreamObject(); protected: virtual void implDumpRecordBody(); private: void initializePerSheet(); ::rtl::OUString createFontName( const ::rtl::OUString& rName, sal_uInt16 nHeight, bool bBold, bool bItalic ) const; sal_uInt16 dumpPatternIdx( const String& rName = EMPTY_STRING, bool b16Bit = true ); sal_uInt16 dumpColorIdx( const String& rName = EMPTY_STRING, bool b16Bit = true ); sal_uInt16 dumpFontIdx( const String& rName = EMPTY_STRING, bool b16Bit = true ); sal_uInt16 dumpFormatIdx( const String& rName = EMPTY_STRING ); sal_uInt16 dumpXfIdx( const String& rName = EMPTY_STRING, bool bBiff2Style = false ); template< typename Type > inline Type dumpExtColorType() { return dumpDec< Type >( "color-type", "EXTCOLOR-TYPE" ); } void dumpExtColorValue( sal_uInt32 nColorType ); void dumpExtColor( const String& rName = EMPTY_STRING ); void dumpExtCfColor( const String& rName = EMPTY_STRING ); void dumpExtGradientHead(); sal_uInt8 dumpFilterColumnOperator( const String& rName ); ::rtl::OUString dumpPivotString( const String& rName, sal_uInt16 nStrLen ); ::rtl::OUString dumpPivotString( const String& rName ); sal_uInt16 dumpCellHeader( bool bBiff2Style = false ); void dumpBoolErr(); void dumpCfRuleProp(); void dumpXfExtProp(); void dumpDxfProp(); void dumpDxf12Prop(); void dumpCfRule12Param( sal_uInt16 nSubType ); void dumpFontRec(); void dumpFormatRec(); void dumpXfRec(); void dumpObjRec(); void dumpObjRecBiff3(); void dumpObjRecBiff4(); void dumpObjRecBiff5(); void dumpObjRecBiff8(); void dumpObjRecLineData(); void dumpObjRecFillData(); void dumpObjRecRectData(); void dumpObjRecTextDataBiff3( sal_uInt16& ornTextLen, sal_uInt16& ornFormatSize ); void dumpObjRecTextDataBiff5( sal_uInt16& ornTextLen, sal_uInt16& ornFormatSize, sal_uInt16& ornLinkSize ); void dumpObjRecSbsData(); void dumpObjRecGboData(); void dumpObjRecEdoData(); void dumpObjRecRboData(); void dumpObjRecCblsData(); void dumpObjRecLbsData(); void dumpObjRecPadding(); void dumpObjRecString( const String& rName, sal_uInt16 nTextLen, bool bRepeatLen ); void dumpObjRecTextFmt( sal_uInt16 nFormatSize ); void dumpObjRecFmlaRaw(); void dumpObjRecFmla( const String& rName, sal_uInt16 nFmlaSize ); void dumpObjRecPictFmla( sal_uInt16 nFmlaSize ); typedef ::std::pair< sal_uInt8, ::rtl::OUString > ChFrExtPropInfo; void dumpChFrExtProps(); ChFrExtPropInfo dumpChFrExtPropHeader(); private: NameListRef mxColors; NameListRef mxBorderStyles; NameListRef mxFillPatterns; NameListRef mxFontNames; NameListRef mxFormats; sal_uInt16 mnFormatIdx; sal_uInt16 mnPTRowFields; sal_uInt16 mnPTColFields; sal_uInt16 mnPTRowColItemsIdx; bool mbHasCodePage; bool mbHasDff; }; // ============================================================================ class PivotCacheStreamObject : public RecordStreamObject { public: explicit PivotCacheStreamObject( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, ::oox::xls::BiffType eBiff, const ::rtl::OUString& rSysFileName ); protected: virtual void implDumpRecordBody(); }; // ============================================================================ // ============================================================================ class RootStorageObject : public OleStorageObject { public: explicit RootStorageObject( const DumperBase& rParent ); protected: virtual void implDumpStream( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxStrm, const ::rtl::OUString& rStrgPath, const ::rtl::OUString& rStrmName, const ::rtl::OUString& rSysFileName ); virtual void implDumpStorage( const StorageRef& rxStrg, const ::rtl::OUString& rStrgPath, const ::rtl::OUString& rSysPath ); virtual void implDumpBaseStream( const BinaryInputStreamRef& rxStrm, const ::rtl::OUString& rSysFileName ); }; // ============================================================================ // ============================================================================ class Dumper : public DumperBase { public: explicit Dumper( const ::oox::core::FilterBase& rFilter ); explicit Dumper( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStrm, const ::rtl::OUString& rSysFileName ); protected: virtual void implDump(); }; // ============================================================================ // ============================================================================ } // namespace biff } // namespace dump } // namespace oox #endif #endif