blob: 8d915ce24bfcbdeac1d411eb1bf67bf73f0c60b4 [file] [log] [blame]
/**************************************************************
*
* 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