diff options
Diffstat (limited to 'sc')
27 files changed, 252 insertions, 12561 deletions
diff --git a/sc/source/core/data/bcaslot.cxx b/sc/source/core/data/bcaslot.cxx index ff82d1fd362f..85f8a4921242 100644 --- a/sc/source/core/data/bcaslot.cxx +++ b/sc/source/core/data/bcaslot.cxx @@ -294,13 +294,13 @@ void ScBroadcastAreaSlot::DelBroadcastAreasInRange( const ScRange& rRange ) if (rRange.In( rAreaRange)) { ScBroadcastArea* pArea = *aIter; + aBroadcastAreaTbl.erase( aIter++); // erase before modifying if (!pArea->DecRef()) { if (pBASM->IsInBulkBroadcast()) pBASM->RemoveBulkArea( pArea); delete pArea; } - aBroadcastAreaTbl.erase( aIter++); } else ++aIter; diff --git a/sc/source/filter/excel/biffdump.cxx b/sc/source/filter/excel/biffdump.cxx deleted file mode 100644 index c3478cf8cb50..000000000000 --- a/sc/source/filter/excel/biffdump.cxx +++ /dev/null @@ -1,9864 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: biffdump.cxx,v $ - * $Revision: 1.91 $ - * - * 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_sc.hxx" -#include "biffdump.hxx" - -#if EXC_INCL_DUMPER -#include <tools/stream.hxx> -#include <sfx2/docfile.hxx> -#include <sfx2/objsh.hxx> -#include <sot/storinfo.hxx> - -#include <string.h> -#include <stdlib.h> -#include <stdio.h> - -#include <rtl/math.hxx> -#include "document.hxx" -#include "global.hxx" -#include "fprogressbar.hxx" -#include "xlpivot.hxx" -#include "xicontent.hxx" -#include "imp_op.hxx" - -#define GETSTR(s) ByteString( s, RTL_TEXTENCODING_MS_1252 ) - -static const sal_Char* __pHexPrefix = "0x"; -static const sal_Char* __pBinPrefix = "0b"; -static const sal_Char* pU = "UNKNOWN "; - -const sal_Char* Biff8RecDumper::pLevelPreString = " "; -const sal_Char* Biff8RecDumper::pLevelPreStringNT = pLevelPreString + strlen( pLevelPreString ); -UINT32 Biff8RecDumper::nInstances = 0; -sal_Char* Biff8RecDumper::pBlankLine = NULL; -const UINT16 Biff8RecDumper::nLenBlankLine = 255; -const UINT16 Biff8RecDumper::nRecCnt = 0x2020; -UINT8* Biff8RecDumper::pCharType = NULL; -UINT8* Biff8RecDumper::pCharVal = NULL; - -static const UINT16 nLevelInc = 1; - -static UINT16 nXFCount = 0; - -static UINT16 nSXLISize[2] = {0, 0}; // array size for SXLI records [rows/cols] -static UINT16 nSXLIIndex = 0; // current index for SXLI records - -// ============================================================================ - -namespace { - -// decimal -------------------------------------------------------------------- - -inline void lclAppendDec( ByteString& rStr, sal_uInt8 nData ) -{ - rStr.Append( ByteString::CreateFromInt32( nData ) ); -} - -inline void lclAppendDec( ByteString& rStr, sal_Int8 nData ) -{ - rStr.Append( ByteString::CreateFromInt32( nData ) ); -} - -inline void lclAppendDec( ByteString& rStr, sal_uInt16 nData ) -{ - rStr.Append( ByteString::CreateFromInt32( nData ) ); -} - -inline void lclAppendDec( ByteString& rStr, sal_Int16 nData ) -{ - rStr.Append( ByteString::CreateFromInt32( nData ) ); -} - -inline void lclAppendDec( ByteString& rStr, sal_uInt32 nData ) -{ - rStr.Append( ByteString::CreateFromInt64( nData ) ); -} - -inline void lclAppendDec( ByteString& rStr, sal_Int32 nData ) -{ - rStr.Append( ByteString::CreateFromInt32( nData ) ); -} - -inline void lclAppendDec( ByteString& rStr, float fData ) -{ - rStr.Append( ByteString( ::rtl::math::doubleToString( fData, rtl_math_StringFormat_G, 15, '.', true ) ) ); -} - -inline void lclAppendDec( ByteString& rStr, double fData ) -{ - rStr.Append( ByteString( ::rtl::math::doubleToString( fData, rtl_math_StringFormat_G, 15, '.', true ) ) ); -} - -// hexadecimal ---------------------------------------------------------------- - -void lclAppendHex( ByteString& rStr, sal_uInt8 nData, bool bPrefix = true ) -{ - static const sal_Char spcHexDigits[] = "0123456789ABCDEF"; - static const ByteString saPrefix( "0x" ); - - if( bPrefix ) - rStr.Append( saPrefix ); - rStr.Append( spcHexDigits[ (nData >> 4) & 0x0F ] ).Append( spcHexDigits[ nData & 0x0F ] ); -} - -inline void lclAppendHex( ByteString& rStr, sal_Int8 nData, bool bPrefix = true ) -{ - lclAppendHex( rStr, static_cast< sal_uInt8 >( nData ), bPrefix ); -} - -void lclAppendHex( ByteString& rStr, sal_uInt16 nData, bool bPrefix = true ) -{ - lclAppendHex( rStr, static_cast< sal_uInt8 >( nData >> 8 ), bPrefix ); - lclAppendHex( rStr, static_cast< sal_uInt8 >( nData ), false ); -} - -inline void lclAppendHex( ByteString& rStr, sal_Int16 nData, bool bPrefix = true ) -{ - lclAppendHex( rStr, static_cast< sal_uInt16 >( nData ), bPrefix ); -} - -void lclAppendHex( ByteString& rStr, sal_uInt32 nData, bool bPrefix = true ) -{ - lclAppendHex( rStr, static_cast< sal_uInt16 >( nData >> 16 ), bPrefix ); - lclAppendHex( rStr, static_cast< sal_uInt16 >( nData ), false ); -} - -inline void lclAppendHex( ByteString& rStr, sal_Int32 nData, bool bPrefix = true ) -{ - lclAppendHex( rStr, static_cast< sal_uInt32 >( nData ), bPrefix ); -} - -inline void lclAppendHex( ByteString& rStr, double fData, bool bPrefix = true ) -{ - const sal_uInt32* pnData = reinterpret_cast< const sal_uInt32* >( &fData ); - lclAppendHex( rStr, pnData[ 0 ], bPrefix ); - lclAppendHex( rStr, pnData[ 1 ], false ); -} - -// others --------------------------------------------------------------------- - -void lclAppendGuid( ByteString& rStr, const XclGuid& rGuid ) -{ - lclAppendHex( rStr, SVBT32ToUInt32( rGuid.mpnData ), false ); - rStr.Append( '-' ); - lclAppendHex( rStr, SVBT16ToShort( rGuid.mpnData + 4 ), false ); - rStr.Append( '-' ); - lclAppendHex( rStr, SVBT16ToShort( rGuid.mpnData + 6 ), false ); - rStr.Append( '-' ); - lclAppendHex( rStr, rGuid.mpnData[ 8 ], false ); - lclAppendHex( rStr, rGuid.mpnData[ 9 ], false ); - rStr.Append( '-' ); - lclAppendHex( rStr, rGuid.mpnData[ 10 ], false ); - lclAppendHex( rStr, rGuid.mpnData[ 11 ], false ); - lclAppendHex( rStr, rGuid.mpnData[ 12 ], false ); - lclAppendHex( rStr, rGuid.mpnData[ 13 ], false ); - lclAppendHex( rStr, rGuid.mpnData[ 14 ], false ); - lclAppendHex( rStr, rGuid.mpnData[ 15 ], false ); -} - -} // namespace - -// ============================================================================ - -static void __AddHexNibble( ByteString& r, UINT8 nVal ) -{ - const sal_Char pH[] = "0123456789ABCDEF"; - - nVal &= 0x0F; - - r += pH[ nVal ]; -} - - -static void __AddPureHex( ByteString& r, UINT8 nVal ) -{ - __AddHexNibble( r, nVal >> 4 ); - __AddHexNibble( r, nVal ); -} - - -static void __AddHex( ByteString& r, UINT8 nVal ) -{ - r += __pHexPrefix; - __AddHexNibble( r, nVal >> 4 ); - __AddHexNibble( r, nVal ); -} - - -static void __AddPureHex( ByteString& r, UINT16 nVal ) -{ - __AddHexNibble( r, ( UINT8 ) ( nVal >> 12 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 8 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 4 ) ); - __AddHexNibble( r, ( UINT8 ) nVal ); -} - - -static void __AddHex( ByteString& r, UINT16 nVal ) -{ - r += __pHexPrefix; - __AddHexNibble( r, ( UINT8 ) ( nVal >> 12 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 8 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 4 ) ); - __AddHexNibble( r, ( UINT8 ) nVal ); -} - - -static void __AddPureHex( ByteString& r, UINT32 nVal ) -{ - __AddHexNibble( r, ( UINT8 ) ( nVal >> 28 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 24 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 20 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 16 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 12 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 8 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 4 ) ); - __AddHexNibble( r, ( UINT8 ) nVal ); -} - - -static void __AddHex( ByteString& r, UINT32 nVal ) -{ - r += __pHexPrefix; - __AddHexNibble( r, ( UINT8 ) ( nVal >> 28 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 24 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 20 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 16 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 12 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 8 ) ); - __AddHexNibble( r, ( UINT8 ) ( nVal >> 4 ) ); - __AddHexNibble( r, ( UINT8 ) nVal ); -} - - -static void __AddHex( ByteString& r, INT32 nVal ) -{ - __AddHex( r, (UINT32) nVal ); -} - - -static void __AddPureBinNibble( ByteString& r, UINT8 nVal ) -{ - nVal <<= 4; - for( int n = 4 ; n ; n-- ) - { - r += ( nVal & 0x80 )? "1" : "0"; - nVal <<= 1; - } -} - - -static void __AddPureBin( ByteString& r, UINT8 nVal ) -{ - __AddPureBinNibble( r, nVal >> 4 ); - r += " "; - __AddPureBinNibble( r, nVal ); -} - - -static void __AddPureBin( ByteString& r, UINT16 nVal ) -{ - const sal_Char* pIn = " "; - __AddPureBin( r, ( UINT8 ) ( nVal >> 8 ) ); - r += pIn; - __AddPureBin( r, ( UINT8 ) nVal ); -} - - -static void __AddPureBin( ByteString& r, UINT32 nVal ) -{ - const sal_Char* pIn = " "; - __AddPureBin( r, ( UINT8 ) ( nVal >> 24 ) ); - r += pIn; - __AddPureBin( r, ( UINT8 ) ( nVal >> 16 ) ); - r += pIn; - __AddPureBin( r, ( UINT8 ) ( nVal >> 8 ) ); - r += pIn; - __AddPureBin( r, ( UINT8 ) nVal ); -} - - -inline static void __AddDec( ByteString& r, UINT32 n ) -{ - sal_Char p[ 32 ]; - sprintf( p, "%u", n ); // #100211# - checked - r += p; -} - - -inline static void __AddDec( ByteString& r, UINT16 n ) -{ - __AddDec( r, ( UINT32 ) n ); -} - - -inline static void __AddDec( ByteString& r, UINT8 n ) -{ - __AddDec( r, ( UINT32 ) n ); -} - - -inline static void __AddDec( ByteString& r, INT32 n ) -{ - sal_Char p[ 32 ]; - sprintf( p, "%d", n ); // #100211# - checked - r += p; -} - - -inline static void __AddDec( ByteString& r, INT16 n ) -{ - __AddDec( r, ( INT32 ) n ); -} - -inline static void __AddDec( ByteString& r, sal_Int8 n ) -{ - __AddDec( r, ( INT32 ) n ); -} - - -static void __AddDec( ByteString& r, UINT32 nVal, UINT16 nNumOfDig, sal_Char c = ' ' ) -{ - ByteString t; - ByteString aVal; - __AddDec( aVal, nVal ); - if( nNumOfDig > (UINT16) aVal.Len() ) - t.Fill( nNumOfDig - (UINT16) aVal.Len(), c ); - r += t; - r += aVal; -} - - -inline static void __AddDec1616( ByteString& r, UINT32 n ) -{ - __AddDec( r, (UINT16)(n >> 16) ); - r += '.'; - __AddDec( r, (UINT16)(n & 0xFFFF) ); -} - - -static void __AddDouble( ByteString& r, const double f ) -{ - r += ByteString( ::rtl::math::doubleToString( f, rtl_math_StringFormat_G, 15, '.', TRUE ) ); -} - - -static inline void __AddRK( ByteString& rString, sal_Int32 nRKValue ) -{ - __AddDouble( rString, XclTools::GetDoubleFromRK( nRKValue ) ); -} - - -inline static void __Add16p16( ByteString& r, UINT32 n ) -{ - __AddDouble( r, double(n) / 65536.0 ); -} - - -static void lcl_AddRef( ByteString& rStr, sal_uInt16 nCol, sal_uInt16 nRow ) -{ - ScAddress aRef( static_cast< SCCOL >( nCol ), static_cast< SCROW >( nRow ), 0 ); - rStr.Append( GETSTR( aRef.GetColRowString() ) ); -} - - -static void lcl_AddRangeRef( ByteString& rStr, sal_uInt16 nCol1, sal_uInt16 nRow1, sal_uInt16 nCol2, sal_uInt16 nRow2 ) -{ - lcl_AddRef( rStr, nCol1, nRow1 ); - if( (nCol1 != nCol2) || (nRow1 != nRow2) ) - { - rStr.Append( ':' ); - lcl_AddRef( rStr, nCol2, nRow2 ); - } -} - - -static void __AddCellHead( ByteString& r, const UINT16 nC, const UINT16 nR, const UINT16 nXF ) -{ - lcl_AddRef( r, (UINT8) nC, nR ); - r += " (XF="; - __AddDec( r, nXF ); - r += ')'; -} - - -inline static void lcl_AddFlag( - ByteString& rString, bool bFlag, const sal_Char* pcTrue = "true", const sal_Char* pcFalse = "false" ) -{ - rString += (bFlag ? pcTrue : pcFalse); -} - -inline static void lcl_AddOnOff( ByteString& rString, bool bFlag ) -{ - lcl_AddFlag( rString, bFlag, "on", "off" ); -} - - -static void lcl_AddEnum( - ByteString& rString, long nValue, const sal_Char* const ppcEnums[], long nSize, - const sal_Char* pcDefault = 0, long nOffset = 0 ) -{ - nValue -= nOffset; - const sal_Char* pcText = "!unknown!"; - if( (0 <= nValue) && (nValue < nSize) && ppcEnums[ nValue ] ) - pcText = ppcEnums[ nValue ]; - else if( pcDefault ) - pcText = pcDefault; - if( *pcText ) // nonempty string - rString.Append( " (" ).Append( pcText ).Append( ')' ); -} - - -namespace { - -void lclDumpString( SvStream& rOutStrm, const ByteString& rData ) -{ - ByteString aOutStr; - xub_StrLen nIdx = 0; - for( ; (nIdx < rData.Len()) && (aOutStr.Len() < 80); ++nIdx ) - { - sal_Char cChar = rData.GetChar( nIdx ); - if( 32 <= cChar ) - aOutStr.Append( cChar ); - else - { - aOutStr.Append( '<' ); - __AddHex( aOutStr, static_cast< sal_uInt8 >( cChar ) ); - aOutStr.Append( '>' ); - } - } - rOutStrm << aOutStr.GetBuffer(); - if( nIdx < rData.Len() ) - rOutStrm << "<...>"; -} - -void lclDumpStringValue( SvStream& rOutStrm, const ByteString& rName, const ByteString& rData ) -{ - rOutStrm << rName.GetBuffer() << "='"; - lclDumpString( rOutStrm, rData ); - rOutStrm << '\''; -} - -void lclDumpString( SvStream& rOutStrm, const String& rData ) -{ - ByteString aOutStr; - xub_StrLen nIdx = 0; - for( ; (nIdx < rData.Len()) && (aOutStr.Len() < 80); ++nIdx ) - { - sal_Unicode cChar = rData.GetChar( nIdx ); - if( (32 <= cChar) && (cChar <= 255) ) - aOutStr.Append( static_cast< sal_Char >( cChar ) ); - else - { - aOutStr.Append( '<' ); - if( cChar < 256 ) - __AddHex( aOutStr, static_cast< sal_uInt8 >( cChar ) ); - else - __AddHex( aOutStr, static_cast< sal_uInt16 >( cChar ) ); - aOutStr.Append( '>' ); - } - } - rOutStrm << aOutStr.GetBuffer(); - if( nIdx < rData.Len() ) - rOutStrm << "<...>"; -} - -void lclDumpStringValue( SvStream& rOutStrm, const ByteString& rName, const String& rData ) -{ - rOutStrm << rName.GetBuffer() << "='"; - lclDumpString( rOutStrm, rData ); - rOutStrm << '\''; -} - -} // namespace - - -IdRangeList::~IdRangeList() -{ - Clear(); -} - - -void IdRangeList::Clear( void ) -{ - IdRange* p = ( IdRange* ) First(); - - while( p ) - { - delete p; - p = ( IdRange* ) Next(); - } - - List::Clear(); -} - -// ============================================================================ -// -// H E L P E R O B J E C T S -// -// ============================================================================ - -namespace { - -// ---------------------------------------------------------------------------- - -class XclDumpStreamHeader -{ -public: - explicit XclDumpStreamHeader( SvStream& rInStrm, SvStream& rOutStrm, const String& rStrmName, const String& rStrmPath ); - ~XclDumpStreamHeader(); - inline ULONG GetStreamLen() const { return mnStrmLen; } - -private: - SvStream& mrOutStrm; - String maStrmName; - String maStrmPath; - ByteString maSeparator; - ULONG mnStrmLen; -}; - -XclDumpStreamHeader::XclDumpStreamHeader( SvStream& rInStrm, SvStream& rOutStrm, const String& rStrmName, const String& rStrmPath ) : - mrOutStrm( rOutStrm ), - maStrmName( rStrmName ), - maStrmPath( rStrmPath ), - mnStrmLen( 0 ) -{ - maSeparator.Assign( '+' ).Expand( 78, '-' ); - - rInStrm.Seek( STREAM_SEEK_TO_END ); - mnStrmLen = rInStrm.Tell(); - rInStrm.Seek( STREAM_SEEK_TO_BEGIN ); - - ByteString aLine; - lclAppendDec( aLine, mnStrmLen ); - - mrOutStrm << maSeparator.GetBuffer() << "\n"; - mrOutStrm << "| STREAM-BEGIN\n"; - mrOutStrm << "| "; - lclDumpStringValue( mrOutStrm, "stream-name", maStrmName ); - mrOutStrm << "\n| "; - lclDumpStringValue( mrOutStrm, "stream-path", maStrmPath ); - mrOutStrm << "\n| stream-len=" << aLine.GetBuffer() << "\n"; - mrOutStrm << "|\n\n"; -} - -XclDumpStreamHeader::~XclDumpStreamHeader() -{ - mrOutStrm << "|\n"; - mrOutStrm << "| "; - lclDumpStringValue( mrOutStrm, "stream-name", maStrmName ); - mrOutStrm << "\n| "; - lclDumpStringValue( mrOutStrm, "stream-path", maStrmPath ); - mrOutStrm << "\n"; - mrOutStrm << "| STREAM-END\n"; - mrOutStrm << maSeparator.GetBuffer() << "\n\n"; -} - -// ---------------------------------------------------------------------------- - -class XclDumpStorageHeader -{ -public: - explicit XclDumpStorageHeader( SotStorage& rInStrg, SvStream& rOutStrm, const String& rStrgPath ); - ~XclDumpStorageHeader(); - -private: - SvStream& mrOutStrm; - String maStrgName; - String maStrgPath; - ByteString maSeparator; -}; - -XclDumpStorageHeader::XclDumpStorageHeader( SotStorage& rInStrg, SvStream& rOutStrm, const String& rStrgPath ) : - mrOutStrm( rOutStrm ), - maStrgName( rInStrg.GetName() ), - maStrgPath( rStrgPath ) -{ - maSeparator.Assign( "++" ).Expand( 78, '=' ); - - mrOutStrm << maSeparator.GetBuffer() << "\n"; - mrOutStrm << "|| STORAGE-BEGIN\n"; - mrOutStrm << "|| "; - lclDumpStringValue( mrOutStrm, "storage-name", maStrgName ); - mrOutStrm << "\n|| "; - lclDumpStringValue( mrOutStrm, "storage-path", maStrgPath ); - mrOutStrm << "\n"; - - SvStorageInfoList aInfoList; - rInStrg.FillInfoList( &aInfoList ); - ByteString aLine; - lclAppendDec( aLine, aInfoList.Count() ); - mrOutStrm << "|| directory-size=" << aLine.GetBuffer() << "\n"; - - for( ULONG nInfo = 0; nInfo < aInfoList.Count(); ++nInfo ) - { - SvStorageInfo& rInfo = aInfoList.GetObject( nInfo ); - mrOutStrm << "|| type="; - if( rInfo.IsStream() ) - mrOutStrm << "stream "; - else if( rInfo.IsStorage() ) - mrOutStrm << "storage "; - else - mrOutStrm << "unknown "; - lclDumpStringValue( mrOutStrm, "name", rInfo.GetName() ); - mrOutStrm << "\n"; - } - - mrOutStrm << "||\n\n"; -} - -XclDumpStorageHeader::~XclDumpStorageHeader() -{ - mrOutStrm << "||\n"; - mrOutStrm << "|| "; - lclDumpStringValue( mrOutStrm, "storage-name", maStrgName ); - mrOutStrm << "\n|| "; - lclDumpStringValue( mrOutStrm, "storage-path", maStrgPath ); - mrOutStrm << "\n"; - mrOutStrm << "|| STORAGE-END\n"; - mrOutStrm << maSeparator.GetBuffer() << "\n\n"; -} - -// ---------------------------------------------------------------------------- - -} - -// ============================================================================ -// -// ============================================================================ - -void Biff8RecDumper::Print( const ByteString& r ) -{ - DBG_ASSERT( pDumpStream, "-Biff8RecDumper::Print(): Stream is wech!" ); - *pDumpStream << '\n' << pLevelPre; - pDumpStream->Write( r.GetBuffer(), r.Len() ); -} - - -void Biff8RecDumper::Print( const sal_Char* p ) -{ - DBG_ASSERT( pDumpStream, "-Biff8RecDumper::Print(): Stream is wech!" ); - DBG_ASSERT( p, "-Biff8RecDumper::Print(): ByteString is wech!" ); - - *pDumpStream << '\n' << pLevelPre << p; -} - - -static const sal_Char* GetSeriesType( const UINT16 n ) -{ - const sal_Char* p; - - switch( n ) - { - case 0: p = "(date) "; break; - case 1: p = "(numeric) "; break; - case 2: p = "(sequence)"; break; - case 3: p = "(text) "; break; - default: p = "(unknown) "; - } - - return p; -} - - -static const sal_Char* GetLineType( const UINT16 n ) -{ - const sal_Char* p; - - switch( n ) - { - case 0: p = "solid"; break; - case 1: p = "dash"; break; - case 2: p = "dot"; break; - case 3: p = "dash-dot"; break; - case 4: p = "dash-dot-dot"; break; - case 5: p = "none"; break; - case 6: p = "dark gray pattern"; break; - case 7: p = "medium gray pattern"; break; - case 8: p = "light gray pattern"; break; - default: p = pU; - } - - return p; -} - - -static ByteString GetRGB( const UINT32 n ) -{ - ByteString s; - - s += "R"; - __AddDec( s, ( UINT8 ) n ); - s += " G"; - __AddDec( s, ( UINT8 ) ( n >> 8 ) ); - s += " B"; - __AddDec( s, ( UINT8 ) ( n >> 16 ) ); - - return s; -} - - -static void AddRef( ByteString& t, UINT16 nRow, UINT16 nC, BOOL bName, UINT16 nTab = 0xFFFF ) -{ - BOOL bColRel = ( nC & 0x4000 ) != 0; - BOOL bRowRel = ( nC & 0x8000 ) != 0; - UINT8 nCol = (UINT8) nC; - INT8 nRelCol = (INT8) nCol; - INT16 nRelRow = (INT16) nRow; - - if( nTab < 0xFFFF ) - { - t += "XTI("; - __AddDec( t, nTab ); - t += ")!"; - } - - if( bName ) - { - // dump relative: [Column|Row] - // [C-1,R-1] = one column left, one row up - // [C+1,R+1] = one column right, one row down - // [C,R] = same column/row - // [C=B,R=2] = absolute column B/row 2 - t += "[C"; - if( bColRel ) - { - if( nRelCol > 0 ) - t += '+'; - if( nRelCol != 0 ) - __AddDec( t, (INT16)nRelCol ); - } - else - { - t += '='; - t += GETSTR( ::ScScColToAlpha( nCol ) ); - } - - t += ",R"; - if( bRowRel ) - { - if( nRelRow > 0 ) - t += "+"; - if( nRelRow != 0 ) - __AddDec( t, nRelRow ); - } - else - { - t += '='; - __AddDec( t, (INT32)nRow + 1 ); - } - t += ']'; - } - else - { - if( !bColRel ) - t += '$'; - t += GETSTR( ::ScColToAlpha( nCol ) ); - if( !bRowRel ) - t += '$'; - __AddDec( t, (UINT16)(nRow + 1) ); - } -} - -static void AddRangeRef( ByteString& t, UINT16 nRow1, UINT16 nC1, UINT16 nRow2, UINT16 nC2, BOOL bName, UINT16 nTab = 0xFFFF ) -{ - AddRef( t, nRow1, nC1, bName, nTab ); - if( (nRow1 != nRow2) || (nC1 != nC2) ) - { - t += ':'; - AddRef( t, nRow2, nC2, bName ); - } -} - - - -static BOOL AddUNICODEString( ByteString& rStr, XclImpStream& rStrm, const BOOL b16BitLen = TRUE, UINT16 nLen = 0, ByteString* pRawName = 0 ) -{ - BOOL bRet = TRUE; - - if( !nLen ) - nLen = b16BitLen ? rStrm.ReaduInt16() : rStrm.ReaduInt8(); - UINT8 nGrbit = rStrm.ReaduInt8(); - - UINT32 nExtLen; - UINT16 nCrun; - bool b16Bit, bFarEast, bRichString; - rStrm.ReadUniStringExtHeader( b16Bit, bRichString, bFarEast, nCrun, nExtLen, nGrbit ); - - rStr += "(l="; - __AddDec( rStr, nLen ); - rStr += " f="; - __AddHex( rStr, nGrbit ); - rStr += " "; - rStr += b16Bit ? "16-Bit" : "8-Bit"; - - if( bRichString && bFarEast ) - rStr += " rich far-east"; - else if( bRichString && !bFarEast ) - rStr += " rich"; - else if ( !bRichString && bFarEast ) - rStr += " far-east"; - rStr += ") '"; - - ByteString aData( rStrm.ReadRawUniString( nLen, b16Bit ), RTL_TEXTENCODING_MS_1252 ); - if( pRawName ) *pRawName = aData; - - xub_StrLen nIndex = 0; - while( (nIndex < aData.Len()) && (nIndex < 255) ) - { - UINT8 nChar = (UINT8)aData.GetChar( nIndex ); - if( nChar < ' ' ) - { - ByteString aIns( '<' ); - __AddHex( aIns, nChar ); - aIns += '>'; - aData.Erase( nIndex, 1 ).Insert( aIns, nIndex ); - nIndex += 5; - } - nIndex++; - } - - rStr += aData.Copy( 0, 255 ); - rStr += '\''; - if( aData.Len() > 255 ) - rStr += "..."; - - if( nCrun ) - { - rStr += " + "; - __AddDec( rStr, nCrun ); - rStr += " format blocks ("; - nCrun *= 4; - __AddDec( rStr, nCrun ); - rStr += " bytes)"; - rStrm.Ignore( nCrun ); - } - if( nExtLen ) - { - rStr += " + "; - __AddDec( rStr, nExtLen ); - rStr += " byte extended:"; - for( sal_uInt32 nIdx = 0; rStrm.IsValid() && (nIdx < nExtLen); ++nIdx ) - { - rStr.Append( ' ' ); - __AddPureHex( rStr, rStrm.ReaduInt8() ); - } - } - - return bRet; -} - - -DUMP_ERR::~DUMP_ERR() -{ - if( pHint ) - delete pHint; -} - - - - -#define Read1(rIn) (rIn).ReaduInt8() -#define Read2(rIn) (rIn).ReaduInt16() -#define Read4(rIn) (rIn).ReaduInt32() -#define Read8(rIn) (rIn).ReadDouble() -#define LINESTART() {t.Erase();t+=pPre;} -#define IGNORE(n) rIn.Ignore(n) -#define ADDBIN(n) __AddBin( t, Read##n( rIn ) ) -#define ADDHEX(n) __AddHex( t, Read##n( rIn ) ) -#define ADDDEC(n) __AddDec( t, Read##n( rIn ) ) -#define ADDDOUBLE() __AddDouble( t, rIn.ReadDouble() ) -#define ADD16P16() __Add16p16( t, Read4( rIn ) ) -#define ADDTEXT(T) t += T -#define PRINT() Print( t ) -#define PreDump(LEN) {rIn.PushPosition();ContDump(LEN);rIn.PopPosition();} -#define ADDCELLHEAD() {UINT16 nR,nC,nX;rIn>>nR>>nC>>nX;__AddCellHead(t,nC,nR,nX);} -#define STARTFLAG() {ADDTEXT( "flags=" ); __AddHex( t, __nFlags ); ADDTEXT( " " );} -#define ADDFLAG(mask,text) {if( __nFlags & mask ) t.Append( ' ' ).Append( text );} -#define ADDRESERVED(mask) ADDFLAG(mask,"!RESERVED!") - - -UINT16 Biff8RecDumper::DumpXF( XclImpStream& rStrm, const sal_Char* pPre ) -{ - ByteString t; // "t" needed by macros - - sal_uInt32 nBorder1, nBorder2; - sal_uInt16 nFont, nNumFmt, nTypeProt, nAlign, nMiscAttrib, nArea, __nFlags, nTmp; - rStrm >> nFont >> nNumFmt >> nTypeProt >> nAlign >> nMiscAttrib >> nBorder1 >> nBorder2 >> nArea; - bool bCell = !::get_flag( nTypeProt, EXC_XF_STYLE ); - - // XF type/parent - LINESTART(); - ::extract_value( nTmp, nTypeProt, 4, 12 ); - ADDTEXT( "index=#" ); __AddDec( t, nXFCount++ ); - ADDTEXT( " type=" ); lcl_AddFlag( t, bCell, "cell", "style" ); - ADDTEXT( " parent-xf=#" ); __AddDec( t, nTmp ); - PRINT(); - - // attribute used flags - LINESTART(); - ::extract_value( __nFlags, nMiscAttrib, 10, 6 ); - if( !bCell ) __nFlags ^= 0x3F; // in style XFs a 0 means used - ADDTEXT( "used " ); STARTFLAG(); - ADDFLAG( EXC_XF_DIFF_VALFMT, "numfmt" ); - ADDFLAG( EXC_XF_DIFF_FONT, "font" ); - ADDFLAG( EXC_XF_DIFF_ALIGN, "align" ); - ADDFLAG( EXC_XF_DIFF_BORDER, "border" ); - ADDFLAG( EXC_XF_DIFF_AREA, "area" ); - ADDFLAG( EXC_XF_DIFF_PROT, "prot" ); - PRINT(); - - // cell protection/font/number format - LINESTART(); - ADDTEXT( "cell-lock=" ); lcl_AddOnOff( t, ::get_flag( nTypeProt, EXC_XF_LOCKED ) ); - ADDTEXT( " hidden=" ); lcl_AddOnOff( t, ::get_flag( nTypeProt, EXC_XF_HIDDEN ) ); - ADDTEXT( " font=" ); __AddDec( t, nFont ); - ADDTEXT( " num-fmt=" ); __AddDec( t, nNumFmt ); - PRINT(); - - // alignment - LINESTART(); - ::extract_value( nTmp, nAlign, 0, 3 ); - ADDTEXT( "hor-align=" ); __AddDec( t, nTmp ); - ADDTEXT( " (" ); - switch( nTmp ) - { - case EXC_XF_HOR_GENERAL: ADDTEXT( "general" ); break; - case EXC_XF_HOR_LEFT: ADDTEXT( "left" ); break; - case EXC_XF_HOR_CENTER: ADDTEXT( "center" ); break; - case EXC_XF_HOR_RIGHT: ADDTEXT( "right" ); break; - case EXC_XF_HOR_FILL: ADDTEXT( "fill" ); break; - case EXC_XF_HOR_JUSTIFY: ADDTEXT( "justify" ); break; - case EXC_XF_HOR_CENTER_AS: ADDTEXT( "center-as" ); break; - case EXC_XF_HOR_DISTRIB: ADDTEXT( "distrib" ); break; - default: ADDTEXT( "!unknown!" ); - }; - ::extract_value( nTmp, nAlign, 4, 3 ); - ADDTEXT( ") ver-align=" ); __AddDec( t, nTmp ); - ADDTEXT( " (" ); - switch( nTmp ) - { - case EXC_XF_VER_TOP: ADDTEXT( "top" ); break; - case EXC_XF_VER_CENTER: ADDTEXT( "center" ); break; - case EXC_XF_VER_BOTTOM: ADDTEXT( "bottom" ); break; - case EXC_XF_VER_JUSTIFY: ADDTEXT( "justify" ); break; - case EXC_XF_VER_DISTRIB: ADDTEXT( "distrib" ); break; - default: ADDTEXT( "!unknown!" ); - }; - ADDTEXT( ") text-wrap=" ); lcl_AddOnOff( t, ::get_flag( nAlign, EXC_XF_LINEBREAK ) ); - PRINT(); - - LINESTART(); - ::extract_value( nTmp, nAlign, 8, 8 ); - ADDTEXT( "rotation=" ); __AddDec( t, nTmp ); - ADDTEXT( " (" ); - if( nTmp < 91 ) - { __AddDec( t, nTmp ); ADDTEXT( "\xB0" ); } - else if( nTmp < 181 ) - { __AddDec( t, static_cast< sal_Int32 >( 90 - nTmp ) ); ADDTEXT( "\xB0" ); } - else if( nTmp == EXC_ROT_STACKED ) - { ADDTEXT( "stacked" ); } - else - { ADDTEXT( "!unknown!" ); } - ::extract_value( nTmp, nMiscAttrib, 0, 4 ); - ADDTEXT( ") indent=" ); __AddDec( t, nTmp ); - ADDTEXT( " shrink=" ); lcl_AddOnOff( t, ::get_flag( nMiscAttrib, EXC_XF8_SHRINK ) ); - ::extract_value( nTmp, nMiscAttrib, 6, 2 ); - ADDTEXT( " text-dir=" ); __AddDec( t, nTmp ); - ADDTEXT( " (" ); - switch( nTmp ) - { - case EXC_XF_TEXTDIR_CONTEXT: ADDTEXT( "context" ); break; - case EXC_XF_TEXTDIR_LTR: ADDTEXT( "ltr" ); break; - case EXC_XF_TEXTDIR_RTL: ADDTEXT( "rtl" ); break; - default: ADDTEXT( "!unknown!" ); - }; - ADDTEXT( ")" ); - PRINT(); - - // border/area - LINESTART(); - ::extract_value( nTmp, nBorder1, 0, 4 ); - ADDTEXT( "left-line=" ); __AddDec( t, nTmp ); - ::extract_value( nTmp, nBorder1, 16, 7 ); - ADDTEXT( " color=" ); __AddDec( t, nTmp ); - ::extract_value( nTmp, nBorder1, 4, 4 ); - ADDTEXT( " right-line =" ); __AddDec( t, nTmp ); - ::extract_value( nTmp, nBorder1, 23, 7 ); - ADDTEXT( " color=" ); __AddDec( t, nTmp ); - PRINT(); - LINESTART(); - ::extract_value( nTmp, nBorder1, 8, 4 ); - ADDTEXT( "top-line =" ); __AddDec( t, nTmp ); - ::extract_value( nTmp, nBorder2, 0, 7 ); - ADDTEXT( " color=" ); __AddDec( t, nTmp ); - ::extract_value( nTmp, nBorder1, 12, 4 ); - ADDTEXT( " bottom-line=" ); __AddDec( t, nTmp ); - ::extract_value( nTmp, nBorder2, 7, 7 ); - ADDTEXT( " color=" ); __AddDec( t, nTmp ); - PRINT(); - LINESTART(); - ::extract_value( nTmp, nBorder2, 21, 4 ); - ADDTEXT( "diag-line=" ); __AddDec( t, nTmp ); - ::extract_value( nTmp, nBorder2, 14, 7 ); - ADDTEXT( " color=" ); __AddDec( t, nTmp ); - ADDTEXT( " diag-tl-to-br=" ); lcl_AddOnOff( t, ::get_flag( nBorder1, 0x40000000UL ) ); - ADDTEXT( " diag-bl-to-tr=" ); lcl_AddOnOff( t, ::get_flag( nBorder1, 0x80000000UL ) ); - PRINT(); - LINESTART(); - ::extract_value( nTmp, nBorder2, 26, 6 ); - ADDTEXT( "area-pattern=" ); __AddDec( t, nTmp ); - ::extract_value( nTmp, nArea, 0, 7 ); - ADDTEXT( " fore-color=" ); __AddDec( t, nTmp ); - ::extract_value( nTmp, nArea, 7, 7 ); - ADDTEXT( " back-color=" ); __AddDec( t, nTmp ); - PRINT(); - - return 0; -} - -void Biff8RecDumper::DumpValidPassword( XclImpStream& rIn, const sal_Char* pPre ) -{ - ByteString t; - UINT16 nHash; - rIn >> nHash; - LINESTART(); - ADDTEXT( "hash=" ); - __AddHex( t, nHash ); - if( nHash ) - { - ByteString sPasswd; - ByteString sDummy; - UINT16 nLen = 9; - UINT16 nDummy; - UINT16 nNewChar; - - nHash ^= 0xCE4B; - nDummy = nHash; - ADDTEXT( " without-mask=" ); - __AddHex( t, nHash ); - while( !(nDummy & 0x8000) && nLen ) - { - nLen--; - nDummy <<= 1; - } - if( !nLen ) nLen = 2; - if( (nLen ^ nHash) & 0x0001 ) nLen++; - if( nLen == 9 ) - { - nLen = 10; - nHash ^= 0x8001; - } - nHash ^= nLen; - if( nLen < 9 ) nHash <<= (8 - nLen); - for( UINT16 iChar = nLen; iChar > 0; iChar-- ) - { - switch( iChar ) - { - case 10: - nNewChar = (nHash & 0xC000) | 0x0400; - nHash ^= nNewChar; - nNewChar >>= 2; - break; - case 9: - nNewChar = 0x4200; - nHash ^= nNewChar; - nNewChar >>= 1; - break; - case 1: - nNewChar = nHash & 0xFF00; - break; - default: - nNewChar = (nHash & 0xE000) ^ 0x2000; - if( !nNewChar ) nNewChar = (nHash & 0xF000) ^ 0x1800; - if( nNewChar == 0x6000 ) nNewChar = 0x6100; - nHash ^= nNewChar; - nHash <<= 1; - break; - } - nNewChar >>= 8; - nNewChar &= 0x00FF; - sDummy = sPasswd; - sPasswd = (sal_Char) nNewChar; - sPasswd += sDummy; - } - ADDTEXT( " valid-password='" ); - t += sPasswd; - ADDTEXT( "'" ); - } - PRINT(); -} - - -void __AddGUID( ByteString& rStr, XclImpStream& rIn ) -{ - UINT16 nIndex; - __AddPureHex( rStr, Read4( rIn ) ); - rStr += "-"; - __AddPureHex( rStr, Read2( rIn ) ); - rStr += "-"; - __AddPureHex( rStr, Read2( rIn ) ); - rStr += "-"; - // last 2 parts byte for byte - for( nIndex = 0; nIndex < 2; nIndex++ ) - __AddPureHex( rStr, Read1( rIn ) ); - rStr += "-"; - for( nIndex = 0; nIndex < 6; nIndex++ ) - __AddPureHex( rStr, Read1( rIn ) ); -} - - -void Biff8RecDumper::PreDumpDecrypted( ULONG nL ) -{ - if( !nL ) return; - - ByteString t; - const sal_Char* pPre = (pLevelPre > pLevelPreString) ? pLevelPre - 1 : pLevelPre; - - LINESTART(); - ADDTEXT( "*** encrypted ***" ); - PRINT(); - pIn->DisableDecryption(); - pIn->Seek( EXC_REC_SEEK_TO_BEGIN ); - ContDump( nL ); - - if( pIn->HasValidDecrypter() ) - { - LINESTART(); - ADDTEXT( "*** decrypted ***" ); - PRINT(); - pIn->EnableDecryption(); - pIn->Seek( EXC_REC_SEEK_TO_BEGIN ); - ContDump( nL ); - } -} - - -void Biff8RecDumper::RecDump( BOOL bSubStream ) -{ - const sal_Char* p; - BOOL bDec = FALSE; - ByteString aTmp; - UINT16 __nFlags; - const UINT16 nR = pIn->GetRecId(); - const ByteString* pName = GetName( nR ); - - // set CONTINUE handling mode - switch( nR ) - { - case 0x000A: // EOF - case 0x003C: // CONT - case 0x005D: // OBJ - case 0x00EC: // MSODRAWING - case 0x01B6: // TXO - pIn->ResetRecord( false ); - break; - case 0x1066: // CHGELFRAME - pIn->ResetRecord( bReadContRecs, 0x1066 ); - break; - default: - pIn->ResetRecord( bReadContRecs ); - } - const ULONG nL = pIn->GetRecSize(); - - switch( nR ) - { - case 0x0009: - case 0x0209: - case 0x0409: - case 0x0809: - nLevelCnt = 0; - break; - case 0x1033: - if( pName ) - aTmp = *pName; - else - aTmp = "BEGIN "; - bDec = ( pLevelPre + nLevelInc ) >= pLevelPreString; - nLevelCnt++; - aTmp.Append( ByteString::CreateFromInt32( nLevelCnt ) ); - pName = &aTmp; - break; - case 0x1034: - if( pName ) - aTmp = *pName; - else - aTmp = "END "; - if( ( pLevelPre + nLevelInc ) <= pLevelPreStringNT ) - pLevelPre += nLevelInc; - if( nLevelCnt ) - { - aTmp.Append( ByteString::CreateFromInt32( nLevelCnt ) ); - nLevelCnt--; - } - else - aTmp += "#LEVEL ERROR#"; - pName = &aTmp; - break; - } - - ByteString aT; - ByteString& t = aT; - const sal_Char* pPre = (pLevelPre > pLevelPreString) ? pLevelPre - 1 : pLevelPre; - - if( nR || nL ) // skip dummy-zero DIMENSIONS at eof - { - if( bBlankLine ) - *pDumpStream << '\n'; - - aT += pLevelPre; - __AddHex( aT, nR ); - - if( pName ) - { - aT += " ("; - aT += *pName; - aT += ") ["; - } - else - aT += " ["; - - if( bReadContRecs ) - __AddHex( aT, nL ); - else - __AddHex( aT, (UINT16)nL ); - aT += "]"; - if( !bSkipOffset ) - { - aT += " :"; - __AddHex( aT, UINT32(pIn->GetSvStreamPos() - 2 * sizeof(UINT16)) ); - aT += ':'; - } - - Print( aT ); - } - - if( HasModeNameOnly( nR ) ) - ; - else if( HasModeHex( nR ) || !bBIFF8 ) - { - if( bEncrypted ) - PreDumpDecrypted( nL ); - else - ContDump( nL ); - } - else if( nMaxBodyLines && nL ) - { - XclImpStream& rIn = *pIn; - - if( bEncrypted ) - { - PreDumpDecrypted( nL ); - LINESTART(); - ADDTEXT( "*** contents ***" ); - PRINT(); - pIn->Seek( EXC_REC_SEEK_TO_BEGIN ); - } - - LINESTART(); - - switch( nR ) - { - case 0x0000: // DIMENSIONS - used area - case 0x0200: - { - LINESTART(); - UINT32 nR1, nR2; - UINT16 nC1, nC2; - rIn >> nR1 >> nR2 >> nC1 >> nC2; - ADDTEXT( "first row: " ); __AddHex( t, nR1 ); - ADDTEXT( " last row+1: " ); __AddHex( t, nR2 ); - ADDTEXT( " first col: " ); __AddHex( t, nC1 ); - ADDTEXT( " last col+1: " ); __AddHex( t, nC2 ); - ADDTEXT( " (" ); lcl_AddRangeRef( t, nC1, (UINT16)nR1, nC2-1, (UINT16)nR2-1 ); - ADDTEXT( ")" ); - PRINT(); - } - break; - case 0x06: - { - ADDCELLHEAD(); - PRINT(); - LINESTART(); - ADDTEXT( "val = " ); - ADDDOUBLE(); - rIn >> __nFlags; - if( __nFlags ) - { - ADDTEXT( " " ); - STARTFLAG(); - ADDFLAG( 0x01, "fAlwaysCalc" ); - ADDFLAG( 0x02, "fCalcOnLoad" ); - ADDFLAG( 0x08, "fShrFmla" ); - } - PRINT(); - LINESTART(); - UINT16 n; - ADDTEXT( "chn = " ); - ADDHEX( 4 ); - rIn >> n; - ADDTEXT( " cce = " ); - __AddDec( t, n ); - PRINT(); - FormulaDump( n, FT_CellFormula ); - if( rIn.GetRecLeft() > 0 ) - { - LINESTART(); - ADDTEXT( "additional formula data" ); - PRINT(); - ContDump( rIn.GetRecLeft() ); - } - } - break; - case 0x0013: // PASSWORD - DumpValidPassword( rIn, pPre ); - break; - case 0x0014: // HEADER - case 0x0015: // FOOTER - if( rIn.GetRecLeft() ) - AddUNICODEString( t, rIn ); - PRINT(); - break; - case 0x17: - { - if( mnSubstream == EXC_BOF_WORKSPACE ) - { - ADDTEXT( "filename=" ); - AddUNICODEString( t, rIn ); - PRINT(); - } - else - { - UINT16 n; - rIn >> n; - ADDTEXT( "# of XTI: " ); - __AddDec( t, n ); - PRINT(); - UINT16 nSB, nF, nL; - while( n && rIn.IsValid() ) - { - LINESTART(); - rIn >> nSB >> nF >> nL; - ADDTEXT( "Supbook = " ); - __AddDec( t, nSB ); - ADDTEXT( " Tab = " ); - __AddDec( t, nF ); - ADDTEXT( " ... " ); - __AddDec( t, nL ); - PRINT(); - n--; - } - } - } - break; - case 0x0018: - case 0x0218: // NAME - { - sal_uInt8 nKey, nNameLen, nMenuLen, nDescrLen, nHelpLen, nStatusLen; - sal_uInt16 nFmlaSize, nRes, nTab; - - rIn >> __nFlags >> nKey >> nNameLen >> nFmlaSize >> nRes >> nTab >> nMenuLen >> nDescrLen >> nHelpLen >> nStatusLen; - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fHidden" ); - ADDFLAG( 0x0002, "fFunc" ); - ADDFLAG( 0x0004, "fVBProc" ); - ADDFLAG( 0x0008, "fProc" ); - ADDFLAG( 0x0010, "fCalcExp" ); - ADDFLAG( 0x0020, "fBuiltIn" ); - ADDFLAG( 0x1000, "fBig" ); - ADDRESERVED( 0xE000 ); - ADDTEXT( " func-group-idx=" ); - __AddDec( t, (UINT16)((__nFlags & 0x0FC0) >> 6) ); - ADDTEXT( " shortcut=" ); __AddHex( t, nKey ); - PRINT(); - - LINESTART(); - ADDTEXT( "fmla-size=" ); __AddDec( t, nFmlaSize ); - ADDTEXT( " reserved=" ); __AddHex( t, nRes ); - ADDTEXT( " tab=" ); __AddDec( t, nTab ); - if( !nTab ) ADDTEXT( " (global)" ); - PRINT(); - - LINESTART(); - sal_uInt16 nBuiltIn = 0; - bool bBuiltIn = (nNameLen == 1) && (__nFlags & 0x0020); - if( bBuiltIn ) - { - rIn.PushPosition(); - sal_uInt8 nStrFlags; - rIn >> nStrFlags; - nBuiltIn = (nStrFlags & 1) ? rIn.ReaduInt16() : rIn.ReaduInt8(); - rIn.PopPosition(); - } - ADDTEXT( "name=" ); - ByteString aName; - AddUNICODEString( t, rIn, false, nNameLen, &aName ); - if( bBuiltIn ) - { - static const sal_Char* const ppcNames[] = { - "Consolidate_Area", "Auto_Open", "Auto_Close", "Extract", "Database", - "Criteria", "Print_Area", "Print_Titles", "Recorder", "Data_Form", - "Auto_Activate", "Auto_Deactivate", "Sheet_Title", "_FilterDatabase" }; - lcl_AddEnum( t, nBuiltIn, ppcNames, STATIC_TABLE_SIZE( ppcNames ) ); - if( (0 <= nBuiltIn) && (nBuiltIn < STATIC_TABLE_SIZE( ppcNames )) ) - aName.Assign( ppcNames[ nBuiltIn ] ); - } - maNames.push_back( aName ); - PRINT(); - - if( nFmlaSize && (rIn.GetRecLeft() > 0) ) - { - LINESTART(); - ADDTEXT( "name-definition=" ); - PRINT(); - FormulaDump( nFmlaSize, FT_RangeName ); - } - if( nMenuLen ) - { - LINESTART(); - ADDTEXT( "menu-text=" ); - AddUNICODEString( t, rIn, false, nMenuLen ); - PRINT(); - } - if( nDescrLen ) - { - LINESTART(); - ADDTEXT( "descr-text=" ); - AddUNICODEString( t, rIn, false, nDescrLen ); - PRINT(); - } - if( nHelpLen ) - { - LINESTART(); - ADDTEXT( "help-text=" ); - AddUNICODEString( t, rIn, false, nHelpLen ); - PRINT(); - } - if( nStatusLen ) - { - LINESTART(); - ADDTEXT( "status-text=" ); - AddUNICODEString( t, rIn, false, nStatusLen ); - PRINT(); - } - } - break; - case 0x001D: // SELECTION - list of selections - { - ADDTEXT( "pane: " ); ADDDEC( 1 ); - ADDTEXT( " active cell: " ); - UINT16 nR, nC; - rIn >> nR >> nC; - lcl_AddRef( t, nC, nR ); - ADDTEXT( " active index: " ); ADDDEC( 2 ); - ADDTEXT( " ref count: " ); - UINT16 nCount; - rIn >> nCount; - __AddDec( t, nCount ); - PRINT(); - for( UINT16 nIndex = 0; nIndex < nCount && rIn.IsValid(); nIndex++ ) - { - LINESTART(); - UINT16 nR1, nR2; - UINT8 nC1, nC2; - rIn >> nR1 >> nR2 >> nC1 >> nC2; - ADDTEXT( "ref#" ); __AddDec( t, nIndex, 3 ); - ADDTEXT( ": " ); lcl_AddRangeRef( t, nC1, nR1, nC2, nR2 ); - PRINT(); - } - } - break; - case 0x0023: // EXTERNNAME - { - PreDump( rIn.GetRecSize() ); - rIn >> __nFlags; - STARTFLAG(); - ADDFLAG( 0x0001, "builtin" ); - ADDFLAG( 0x0002, "automatic" ); - ADDFLAG( 0x0004, "wantcliprepr" ); - ADDFLAG( 0x0008, "DDEstddocname" ); - ADDFLAG( 0x0010, "OLE" ); - ADDRESERVED( 0x8000 ); - sal_uInt16 nClip = (__nFlags & 0x7FE0) >> 5; - ADDTEXT( " clip-format=" ); __AddHex( t, nClip ); - PRINT(); LINESTART(); - bool bFormula = false, bArray = false; - if( (__nFlags & 0x0001) || !(__nFlags & 0x7FFE) ) - { - ADDTEXT( "type=external name" ); - ADDTEXT( " table=" ); ADDDEC( 2 ); - ADDTEXT( " reserved=" ); ADDHEX( 2 ); - bFormula = true; - } - else if( __nFlags & 0x0010 ) - { - ADDTEXT( "type=OLE" ); - ADDTEXT( " stream-id=" ); ADDHEX( 4 ); - } - else - { - ADDTEXT( "type=DDE" ); - ADDTEXT( " reserved=" ); ADDHEX( 4 ); - bArray = true; - } - PRINT(); LINESTART(); - ADDTEXT( "name=" ); AddUNICODEString( t, rIn, FALSE ); - PRINT(); - if( rIn.GetRecLeft() > 0 ) - { - LINESTART(); - if( bFormula ) - { - sal_uInt16 nSize = rIn.ReaduInt16(); - ADDTEXT( "formula (size=" ); __AddDec( t, nSize ); - ADDTEXT( "):" ); - PRINT(); - FormulaDump( nSize, FT_RangeName ); - } - else if( bArray && (rIn.GetRecLeft() >= 3) ) - { - LINESTART(); - ADDTEXT( "constant array width=" ); ADDDEC( 1 ); - ADDTEXT( " height=" ); ADDDEC( 2 ); - PRINT(); - while( rIn.GetRecLeft() > 0 ) - { - sal_uInt8 nType = rIn.ReaduInt8(); - LINESTART(); - ADDTEXT( "type=" ); __AddHex( t, nType ); - ADDTEXT( " (" ); - switch( nType ) - { - case 0x00: - ADDTEXT( "empty) reserved=" ); ADDHEX( 4 ); - ADDTEXT( " " ); ADDHEX( 4 ); - break; - case 0x01: - ADDTEXT( "double) value=" ); ADDDOUBLE(); - break; - case 0x02: - ADDTEXT( "string) text=" ); AddUNICODEString( t, rIn ); - break; - case 0x04: - ADDTEXT( "bool) value=" ); lcl_AddFlag( t, rIn.ReaduInt8() ); - ADDTEXT( " reserved=" ); ADDHEX( 1 ); - ADDTEXT( " " ); ADDHEX( 2 ); - ADDTEXT( " " ); ADDHEX( 4 ); - break; - case 0x10: - ADDTEXT( "error) code=" ); ADDHEX( 1 ); - ADDTEXT( " reserved=" ); ADDHEX( 1 ); - ADDTEXT( " " ); ADDHEX( 2 ); - ADDTEXT( " " ); ADDHEX( 4 ); - break; - default: - ADDTEXT( "!unknown!)" ); - rIn.Ignore( 8 ); - } - PRINT(); - } - } - if( rIn.GetRecLeft() > 0 ) - { - LINESTART(); - ADDTEXT( "additional data:" ); - PRINT(); - ContDump( rIn.GetRecLeft() ); - } - } - } - break; - case 0x0026: - case 0x0027: - case 0x0028: - case 0x0029: - LINESTART(); - ADDDOUBLE(); - PRINT(); - break; - case 0x002F: // FILEPASS - { - LINESTART(); - sal_uInt16 nType; - rIn >> nType; - ADDTEXT( "encrypt-type=" ); __AddHex( t, nType ); - ADDTEXT( " (" ); - switch( nType ) - { - case 0x0000: - { - ADDTEXT( "BIFF2-BIFF7 XOR) key=" ); - ADDHEX( 2 ); - ADDTEXT( " hash=" ); - ADDHEX( 2 ); - PRINT(); - } - break; - - case 0x0001: - { - ADDTEXT( "BIFF8 standard/strong)" ); - PRINT(); - LINESTART(); - ADDTEXT( "reserved=" ); ADDHEX( 2 ); - sal_uInt16 nMode; - rIn >> nMode; - ADDTEXT( " mode=" ); __AddHex( t, nMode ); - ADDTEXT( " (" ); - switch( nMode ) - { - case 0x0001: - { - ADDTEXT( "BIFF8 standard)" ); - PRINT(); - LINESTART(); - ADDTEXT( "document-id=..." ); - PRINT(); - ContDump( 16 ); - LINESTART(); - ADDTEXT( "salt-data=..." ); - PRINT(); - ContDump( 16 ); - LINESTART(); - ADDTEXT( "salt-hash=..." ); - PRINT(); - ContDump( 16 ); - } - break; - case 0x0002: - { - ADDTEXT( "BIFF8X strong) flags=" ); - ADDHEX( 4 ); - PRINT(); - LINESTART(); - ADDTEXT( "info-size=" ); ADDHEX( 4 ); - ADDTEXT( " flags=" ); ADDHEX( 4 ); - ADDTEXT( " unknown=" ); ADDHEX( 4 ); - PRINT(); - LINESTART(); - ADDTEXT( "stream-crypt-id=" ); ADDHEX( 4 ); - ADDTEXT( " hash-algo-id=" ); ADDHEX( 4 ); - ADDTEXT( " hash-key-len=" ); ADDDEC( 4 ); - PRINT(); - LINESTART(); - ADDTEXT( "crypt-prov-type=" ); ADDHEX( 4 ); - ADDTEXT( " unknown=" ); ADDHEX( 4 ); - ADDTEXT( " unknown=" ); ADDHEX( 4 ); - PRINT(); - LINESTART(); - ADDTEXT( "crypt-provider-name='" ); - sal_uInt16 nChar; - do - { - rIn >> nChar; - if( nChar ) - t += (sal_Char)(((32 <= nChar) && (nChar <=127)) ? nChar : '.'); - } - while( nChar ); - ADDTEXT( "'" ); - PRINT(); - LINESTART(); - sal_uInt32 nLen; - rIn >> nLen; - ADDTEXT( "*** document-id *** len=" ); __AddHex( t, nLen ); - PRINT(); - ContDump( nLen ); - LINESTART(); - ADDTEXT( "*** salt-data *** len=" ); __AddHex( t, nLen ); - PRINT(); - ContDump( nLen ); - LINESTART(); - rIn >> nLen; - ADDTEXT( "*** salt-hash *** len=" ); __AddHex( t, nLen ); - PRINT(); - ContDump( nLen ); - } - break; - default: - { - ADDTEXT( "!unknown!)" ); - PRINT(); - ContDump( rIn.GetRecLeft() ); - } - } - } - break; - - default: - { - ADDTEXT( "!unknown!)" ); - PRINT(); - ContDump( rIn.GetRecLeft() ); - } - } - } - break; - case 0x0031: // FONT - case 0x0231: - { - LINESTART(); - ADDTEXT( "(index=" ); __AddDec( t, nFontIndex ); - ADDTEXT( ") " ); - nFontIndex++; if( nFontIndex == 4 ) nFontIndex++; - ADDTEXT( "height: " ); ADDDEC( 2 ); - ADDTEXT( "/20pt " ); - rIn >> __nFlags; - STARTFLAG(); - ADDFLAG( 0x0002, "fItalic" ); - ADDFLAG( 0x0008, "fStrikeout" ); - ADDFLAG( 0x0010, "fOutline" ); - ADDFLAG( 0x0020, "fShadow" ); - ADDRESERVED( 0xFFC5 ); - PRINT(); - LINESTART(); - ADDTEXT( "color: " ); ADDDEC( 2 ); - ADDTEXT( " boldness: " ); ADDDEC( 2 ); - ADDTEXT( " sub/sup: " ); ADDDEC( 2 ); - ADDTEXT( " underline: " ); ADDHEX( 1 ); - PRINT(); - LINESTART(); - ADDTEXT( "family: " ); ADDDEC( 1 ); - ADDTEXT( " charset: " ); ADDDEC( 1 ); -// ADDTEXT( " reserved: " ); ADDHEX( 1 ); - rIn.Ignore( 1 ); - ADDTEXT( " " ); - AddUNICODEString( t, rIn, FALSE ); - PRINT(); - } - break; - case 0x003D: // WINDOW1 - { - LINESTART(); - ADDTEXT( "pos-x=" ); ADDDEC( 2 ); - ADDTEXT( " pos-y=" ); ADDDEC( 2 ); - ADDTEXT( " width=" ); ADDDEC( 2 ); - ADDTEXT( " height=" ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - rIn >> __nFlags; - STARTFLAG(); - ADDFLAG( 0x0001, "hide-window" ); - ADDFLAG( 0x0002, "min-window" ); - ADDFLAG( 0x0008, "show-hscroll" ); - ADDFLAG( 0x0010, "show-vscroll" ); - ADDFLAG( 0x0020, "show-tabbar" ); - ADDRESERVED( 0xFFC4 ); - PRINT(); - LINESTART(); - ADDTEXT( "active-tab=" ); ADDDEC( 2 ); - ADDTEXT( " first-vis-tab=" ); ADDDEC( 2 ); - ADDTEXT( " selected-tabs=" ); ADDDEC( 2 ); - ADDTEXT( " tabbar-width=" ); ADDDEC( 2 ); - PRINT(); - } - break; - case 0x0041: // PANE - { - LINESTART(); - ADDTEXT( "vert-split-pos=" ); ADDDEC( 2 ); - ADDTEXT( " hor-split-pos=" ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "first-row=" ); ADDDEC( 2 ); - ADDTEXT( " first-col=" ); ADDDEC( 2 ); - ADDTEXT( " active-pane=" ); ADDDEC( 2 ); - PRINT(); - } - break; - case 0x0042: // CODEPAGE - { - LINESTART(); - sal_uInt16 nCodePage = rIn.ReaduInt16(); - ADDTEXT( "codepage=" ); __AddHex( t, nCodePage ); - ADDTEXT( " (" ); __AddDec( t, nCodePage ); - ADDTEXT( ")" ); - PRINT(); - } - break; - case 0x004D: // PLS - { - LINESTART(); - static const sal_Char* const ppcTypes[] = { "Win", "Mac" }; - sal_uInt16 nType = rIn.ReaduInt16(); - ADDTEXT( "environment=" ); - lcl_AddEnum( t, nType, ppcTypes, STATIC_TABLE_SIZE( ppcTypes ) ); - PRINT(); - if( nType == 0 ) - { - String aData; - sal_uInt32 __nFlags; - LINESTART(); - rIn.SetNulSubstChar( '\0' ); - aData = rIn.ReadRawUniString( 32, true ); - ADDTEXT( "device-name='" ); ADDTEXT( GETSTR( aData ) ); - ADDTEXT( "'" ); - PRINT(); LINESTART(); - ADDTEXT( "spec-version=" ); ADDDEC( 2 ); - ADDTEXT( " driver-version=" ); ADDDEC( 2 ); - sal_uInt16 nOwnSize, nPrvSize; - rIn >> nOwnSize >> nPrvSize; - ADDTEXT( " own-size=" ); __AddDec( t, nOwnSize ); - ADDTEXT( " prv-size=" ); __AddDec( t, nPrvSize ); - PRINT(); LINESTART(); - rIn >> __nFlags; - STARTFLAG(); - ADDFLAG( 0x00000001, "orient" ); - ADDFLAG( 0x00000002, "paper-size" ); - ADDFLAG( 0x00000004, "paper-height" ); - ADDFLAG( 0x00000008, "paper-width" ); - ADDFLAG( 0x00000010, "scale" ); - ADDFLAG( 0x00000100, "copies" ); - ADDRESERVED( 0xE0000080 ); - PRINT(); LINESTART(); - static const sal_Char* const ppcOrient[] = { 0, "portrait", "landsc" }; - sal_uInt16 nOrient = rIn.ReaduInt16(); - ADDTEXT( "orientation=" ); - lcl_AddEnum( t, nOrient, ppcOrient, STATIC_TABLE_SIZE( ppcOrient ) ); - ADDTEXT( " paper-size=" ); ADDDEC( 2 ); - ADDTEXT( " paper-width=" ); ADDDEC( 2 ); - ADDTEXT( " paper-height=" ); ADDDEC( 2 ); - PRINT(); LINESTART(); - ADDTEXT( "scale=" ); ADDDEC( 2 ); - ADDTEXT( " copies=" ); ADDDEC( 2 ); - PRINT(); - if( nOwnSize > 88 ) - { - LINESTART(); ADDTEXT( "additional data:" ); PRINT(); - ContDump( nOwnSize - 88 ); - } - if( nPrvSize > 0 ) - { - LINESTART(); ADDTEXT( "private data:" ); PRINT(); - ContDump( nPrvSize ); - } - } - if( rIn.GetRecLeft() > 0 ) - { - LINESTART(); ADDTEXT( "unknown data:" ); PRINT(); - ContDump( rIn.GetRecLeft() ); - } - } - break; - case 0x51: - { - UINT16 nR1, nR2; - UINT8 nC1, nC2; - rIn >> nR1 >> nR2 >> nC1 >> nC2; - lcl_AddRangeRef( t, nC1, nR1, nC2, nR2 ); - PRINT(); - LINESTART(); - ADDTEXT( "workbook: " ); - AddUNICODEString( t, rIn, TRUE ); - PRINT(); - } - break; - case 0x0052: // DCONNAME - { - ADDTEXT( "name=" ); - AddUNICODEString( t, rIn, TRUE ); - PRINT(); - LINESTART(); - ADDTEXT( "sheet=" ); - AddUNICODEString( t, rIn, TRUE ); - PRINT(); - } - break; - case 0x5B: // FILESHARING - { - PreDump( nL ); - rIn >> __nFlags; - if( __nFlags ) - { - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fReadOnlyRec" ); - PRINT(); - } - DumpValidPassword( rIn, pPre ); - } - break; - case 0x5D: - ObjDump( nL ); - break; - case 0x007D: // COLINFO - col range info - { - LINESTART(); - ADDTEXT( "col range: " ); - ADDDEC( 2 ); - ADDTEXT( "-" ); - ADDDEC( 2 ); - ADDTEXT( " width: " ); - ADDDEC( 2 ); - ADDTEXT( "/256 charwidth ix to XF: " ); - ADDDEC( 2 ); - PRINT(); - rIn >> __nFlags; - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fHidden" ); - ADDTEXT( " outlnlev=" ); - __AddDec( t, (UINT16)((__nFlags & 0x0700) >> 8) ); - ADDFLAG( 0x1000, "fCollapsed" ); - ADDRESERVED( 0xE8FE ); - PRINT(); - LINESTART(); - ADDTEXT( "reserved: " ); - ADDHEX( 1 ); - PRINT(); - } - break; - case 0x7E: - { -// LINESTART(); - ADDCELLHEAD(); - ADDTEXT( " val = " ); - __AddRK( t, rIn.ReadInt32() ); - PRINT(); - } - break; - case 0x0080: // GUTS - row & col gutters for outlines - { - LINESTART(); - ADDTEXT( "size row gutter: " ); - __AddDec( t, Read2( rIn ), 5 ); - ADDTEXT( " | size col gutter: " ); - __AddDec( t, Read2( rIn ), 5 ); - PRINT(); - LINESTART(); - ADDTEXT( "max outline lev: " ); - __AddDec( t, Read2( rIn ), 5 ); - ADDTEXT( " | max outline lev: " ); - __AddDec( t, Read2( rIn ), 5 ); - PRINT(); - } - break; - case 0x0081: // WSBOOL - additional workspace info - { - rIn >> __nFlags; - LINESTART(); - STARTFLAG(); - if( __nFlags & 0x00F1 ) - { - ADDFLAG( 0x0001, "fShowAutoBreaks" ); - ADDFLAG( 0x0010, "fDialog" ); - ADDFLAG( 0x0020, "fApplyStyles" ); - ADDFLAG( 0x0040, "fRowSumsBelow" ); - ADDFLAG( 0x0080, "fColSumsBelow" ); - PRINT(); - LINESTART(); - } - if( __nFlags & (0xCD00 | 0x320E) ) - { - ADDTEXT( " " ); - ADDFLAG( 0x0100, "fFitToPage" ); - ADDFLAG( 0x0400, "fDispRowGuts" ); - ADDFLAG( 0x0800, "fDispColGuts" ); - ADDFLAG( 0x4000, "fAee" ); - ADDFLAG( 0x8000, "fAfe" ); - ADDRESERVED( 0x320E ); - PRINT(); - } - if( !__nFlags ) - PRINT(); - } - break; - case 0x008C: // COUNTRY - { - LINESTART(); - ADDTEXT( "ui-country=" ); ADDDEC( 2 ); - ADDTEXT( " doc-country=" ); ADDDEC( 2 ); - PRINT(); - } - break; - case 0x92: // PALETTE - { - UINT16 nColCnt; - rIn >> nColCnt; - LINESTART(); - ADDTEXT( "count: " ); - __AddDec( t, nColCnt ); - PRINT(); - LINESTART(); - for( UINT16 nCol = 0; nCol < nColCnt; nCol++ ) - { - __AddDec( t, nCol, 2 ); - ADDTEXT( "=" ); - ADDHEX( 4 ); - ADDTEXT( " " ); - if( (nCol % 5 == 4) || (nCol == nColCnt - 1) ) - { - PRINT(); - LINESTART(); - } - } - } - break; - case 0x9D: // AUTOFILTERINFO -- count of drop-down arrows - { - LINESTART(); - ADDTEXT( "count of drop-down arrows: " ); - ADDDEC( 2 ); - PRINT(); - } - break; - case 0x9E: // AUTOFILTER -- autofilter settings - { - UINT8 nType; - UINT8 nCompare; - ByteString sTemp[ 2 ]; - UINT16 nLen[ 2 ] = { 0, 0 }; - UINT8 nF; - LINESTART(); - ADDTEXT( "count: " ); - ADDDEC( 2 ); - rIn >> __nFlags; - STARTFLAG(); - ADDFLAG( 0x0003, "fJoin" ); - ADDFLAG( 0x0004, "fSimpleEq1" ); - ADDFLAG( 0x0008, "fSimpleEq2" ); - ADDFLAG( 0x0010, "fTop10" ); - ADDFLAG( 0x0020, "fTop" ); - ADDFLAG( 0x0040, "fPercent" ); - PRINT(); - LINESTART(); - if( __nFlags & 0x0003 ) - ADDTEXT( "(custom conditions are OR-ed" ); - else - ADDTEXT( "(custom conditions are AND-ed" ); - if( __nFlags & 0x0010 ) - { - if( __nFlags & 0x0020 ) - ADDTEXT( "; show top " ); - else - ADDTEXT( "; show bottom " ); - __AddDec( t, (UINT16)(__nFlags >> 7) ); - if( __nFlags & 0x0040 ) - ADDTEXT( " percent" ); - else - ADDTEXT( " items" ); - } - ADDTEXT( ")" ); - PRINT(); - for( nF = 0; nF < 2; nF++ ) - { - LINESTART(); - __AddDec( t, (UINT16)(nF + 1) ); - ADDTEXT( ". Filter: " ); - rIn >> nType >> nCompare; - switch( nType ) - { - case 0x00: ADDTEXT( "not used " ); break; - case 0x02: ADDTEXT( "RK " ); break; - case 0x04: ADDTEXT( "double " ); break; - case 0x06: ADDTEXT( "string " ); break; - case 0x08: ADDTEXT( "bool/err " ); break; - case 0x0A: ADDTEXT( "show nothing " ); break; - case 0x0C: ADDTEXT( "all blanks " ); break; - case 0x0E: ADDTEXT( "all non-blanks " ); break; - default: - ADDTEXT( "unknown (" ); - __AddHex( t, nType ); - ADDTEXT( ") " ); - } - switch( nCompare ) - { - case 0x01: ADDTEXT( "< " ); break; - case 0x02: ADDTEXT( "= " ); break; - case 0x03: ADDTEXT( "<= " ); break; - case 0x04: ADDTEXT( "> " ); break; - case 0x05: ADDTEXT( "<> " ); break; - case 0x06: ADDTEXT( ">= " ); break; - default: if( nCompare ) __AddHex( t, nCompare ); - } - sTemp[ nF ] = t; - switch( nType ) - { - case 0x02: - __AddRK( sTemp[ nF ], rIn.ReadInt32() ); - IGNORE( 4 ); - break; - case 0x04: - __AddDouble( sTemp[ nF ], Read8( rIn ) ); - break; - case 0x06: - IGNORE( 4 ); - nLen[ nF ] = Read1( rIn ); - IGNORE( 3 ); - break; - case 0x08: - __AddHex( sTemp[ nF ], Read1( rIn ) ); - sTemp[ nF ] += " "; - __AddHex( sTemp[ nF ], Read1( rIn ) ); - IGNORE( 6 ); - break; - default: - IGNORE( 8 ); - } - } - for( nF = 0; nF < 2; nF++ ) - { - t = sTemp[ nF ]; - if( nLen[ nF ] ) - AddUNICODEString( t, rIn, TRUE, nLen[ nF ] ); - PRINT(); - } - } - break; - case 0xA0: - { - UINT16 nN, nD; - rIn >> nN >> nD; - LINESTART(); - ADDTEXT( "Window Zoom Magnification = " ); - __AddDec( t, nN ); - ADDTEXT( "/" ); - __AddDec( t, nD ); - PRINT(); - } - break; - case 0x00A1: // SETUP - { - LINESTART(); - ADDTEXT( "paper size: " ); ADDDEC( 2 ); - ADDTEXT( " scaling: " ); ADDDEC( 2 ); - ADDTEXT( " start page: " ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "fit to width: " ); ADDDEC( 2 ); - ADDTEXT( " fit to height: " ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - rIn >> __nFlags; - STARTFLAG(); - ADDFLAG( 0x0001, "fLeftRight" ); - ADDFLAG( 0x0002, "fPortrait" ); - ADDFLAG( 0x0004, "fNoPrintSettings" ); - ADDFLAG( 0x0008, "fMonochrom" ); - ADDFLAG( 0x0010, "fDraft" ); - ADDFLAG( 0x0020, "fNotes" ); - ADDFLAG( 0x0040, "fNoOrientation" ); - ADDFLAG( 0x0080, "fCustomNumber" ); - PRINT(); - LINESTART(); - ADDTEXT( "Print res: " ); ADDDEC( 2 ); - ADDTEXT( " vert print res: " ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "header margin: " ); ADDDOUBLE(); - ADDTEXT( " footer margin: " ); ADDDOUBLE(); - ADDTEXT( " copies: " ); ADDDEC( 2 ); - PRINT(); - } - break; - case 0xAF: - { - UINT16 nCref; - UINT8 nLocked, nHidden, nName, nComment, nNameUser; - rIn >> nCref >> nLocked >> nHidden >> nName >> nComment >> nNameUser; - LINESTART(); - ADDTEXT( "Changing Cells = " ); - __AddDec( t, nCref ); - if( nLocked ) - ADDTEXT( " fLocked" ); - if( nHidden ) - ADDTEXT( " fHidden" ); - PRINT(); - LINESTART(); - ADDTEXT( "Name = " ); - __AddDec( t, nName ); - ADDTEXT( " Comment = " ); - __AddDec( t, nComment ); - ADDTEXT( " Name User = " ); - __AddDec( t, nNameUser ); - PRINT(); - ContDump( rIn.GetRecLeft() ); - } - break; - case 0xB0: // SXVIEW - { - UINT16 nColFirst, nColLast, nRowFirst, nRowLast; - rIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast; - nSXLIIndex = 0; // new pivot table - LINESTART(); - ADDTEXT( "PivotTable: " ); __AddDec( t, nColFirst ); - ADDTEXT( " / " ); __AddDec( t, nRowFirst ); - ADDTEXT( " - " ); __AddDec( t, nColLast ); - ADDTEXT( " / " ); __AddDec( t, nRowLast ); - PRINT(); - LINESTART(); - ADDTEXT( "1st Head: " ); ADDDEC( 2 ); - rIn >> nRowFirst; - ADDTEXT( " First Data: " ); ADDDEC( 2 ); - ADDTEXT( " / " ); __AddDec( t, nRowFirst ); - PRINT(); - LINESTART(); - ADDTEXT( "Cache index: " ); ADDDEC( 2 ); - ADDTEXT( " reserved: " ); ADDHEX( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "axis 4 data: " ); ADDDEC( 2 ); - ADDTEXT( " pos 4 Data: " ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "num of fields: " ); ADDDEC( 2 ); - rIn >> nSXLISize[0] >> nSXLISize[1]; - ADDTEXT( " ...row fields: " ); __AddDec( t, nSXLISize[0] ); - ADDTEXT( " ...col fields: " ); __AddDec( t, nSXLISize[1] ); - PRINT(); - LINESTART(); - ADDTEXT( "num of page fields: " ); ADDDEC( 2 ); - ADDTEXT( " ...data fields: " ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "data rows: " ); ADDDEC( 2 ); - ADDTEXT( " data cols: " ); ADDDEC( 2 ); - rIn >> __nFlags; - PRINT(); - if( __nFlags ) - { - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fRowGrand" ); - ADDFLAG( 0x0002, "fColGrand" ); - ADDFLAG( 0x0008, "fAutoFormat" ); - ADDFLAG( 0x0010, "fWidthHeightAuto" ); - ADDFLAG( 0x0020, "fFontAuto" ); - ADDFLAG( 0x0040, "fAlignAuto" ); - ADDFLAG( 0x0080, "fBorderAuto" ); - ADDFLAG( 0x0100, "fPatternAuto" ); - ADDFLAG( 0x0200, "fNumberAuto" ); - PRINT(); - } - LINESTART(); - ADDTEXT( "index 2 PivotTable autoform: " ); - ADDDEC( 2 ); - PRINT(); - LINESTART(); - UINT16 nTableLen = Read2( rIn ); - UINT16 nDataLen = Read2( rIn ); - ADDTEXT( "PivotTable name: " ); - if( nTableLen ) - AddUNICODEString( t, rIn, TRUE, nTableLen ); - else - ADDTEXT( "-/-" ); - PRINT(); - LINESTART(); - ADDTEXT( "data field name: " ); - if( nDataLen ) - AddUNICODEString( t, rIn, TRUE, nDataLen ); - else - ADDTEXT( "-/-" ); - PRINT(); - } - break; - case 0xB1: // SXVD - { - rIn >> __nFlags; - LINESTART(); - ADDTEXT( "Axis (" ); - __AddHex( t, __nFlags ); - ADDTEXT( "):" ); - if( __nFlags ) - { - ADDFLAG( 0x0001, "row" ); - ADDFLAG( 0x0002, "col" ); - ADDFLAG( 0x0004, "page" ); - ADDFLAG( 0x0008, "data" ); - } - else - ADDTEXT( " no axis" ); - ADDTEXT( " num of att. subtotals: " ); - ADDDEC( 2 ); - PRINT(); - rIn >> __nFlags; - LINESTART(); - ADDTEXT( "subtotal type(" ); - __AddHex( t, __nFlags ); - ADDTEXT( "):" ); - if( __nFlags ) - { - ADDFLAG( 0x0001, "Default" ); - ADDFLAG( 0x0002, "Sum" ); - ADDFLAG( 0x0004, "Counta" ); - ADDFLAG( 0x0008, "Average" ); - ADDFLAG( 0x0010, "Max" ); - ADDFLAG( 0x0020, "Min" ); - ADDFLAG( 0x0040, "Product" ); - ADDFLAG( 0x0080, "Count" ); - ADDFLAG( 0x0100, "Stdev" ); - ADDFLAG( 0x0200, "Stddevp" ); - ADDFLAG( 0x0400, "Var" ); - ADDFLAG( 0x0800, "Varp" ); - } - else - ADDTEXT( " none" ); - PRINT(); - LINESTART(); - ADDTEXT( "num of items: " ); - ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "Name: " ); - UINT16 nLen = Read2( rIn ); - if( nLen == 0xFFFF ) - ADDTEXT( "<name in cache>" ); - else if( nLen ) - AddUNICODEString( t, rIn, TRUE, nLen ); - PRINT(); - } - break; - case 0xB2: // SXVI - { - UINT16 nType, nCache; - rIn >> nType >> __nFlags >> nCache; - LINESTART(); - switch( nType ) - { - case 0xFE: p = "Page"; break; - case 0xFF: p = "Null"; break; - case 0x00: p = "Data"; break; - case 0x01: p = "Default"; break; - case 0x02: p = "SUM"; break; - case 0x03: p = "COUNT"; break; - case 0x04: p = "AVERAGE"; break; - case 0x05: p = "MAX"; break; - case 0x06: p = "MIN"; break; - case 0x07: p = "PRODUCT"; break; - case 0x08: p = "COUNTA"; break; - case 0x09: p = "STDEV"; break; - case 0x0A: p = "STDEVP"; break; - case 0x0B: p = "VAR"; break; - case 0x0C: p = "VARP"; break; - case 0x0D: p = "Grand total"; break; - default: p = pU; - } - ADDTEXT( "Type (" ); - __AddHex( t, nType ); - ADDTEXT( "): " ); - ADDTEXT( p ); - ADDTEXT( " iCache: " ); - __AddDec( t, nCache ); - PRINT(); - if( __nFlags ) - { - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x01, "fHidden" ); - ADDFLAG( 0x02, "fHideDetail" ); - ADDFLAG( 0x04, "fFormula" ); - ADDFLAG( 0x08, "fMissing" ); - PRINT(); - } - LINESTART(); - ADDTEXT( "Name: " ); - UINT16 nCch = Read2( rIn ); - if( nCch == 0xFFFF ) - ADDTEXT( "<name in cache>" ); - else if( nCch ) - AddUNICODEString( t, rIn, TRUE, nCch ); - else - ADDTEXT( "<empty string>" ); - PRINT(); - } - break; - case 0xB4: // SXIVD - { - const UINT16 nBrkNum = 5; - UINT16 nBrk = nBrkNum; - UINT16 nSize = (UINT16)(nL / 2); - LINESTART(); - for( UINT16 i = 0; i < nSize; i++ ) - { - ADDHEX( 2 ); - nBrk--; - if( nBrk ) - ADDTEXT( " " ); - else - { - PRINT(); - LINESTART(); - nBrk = nBrkNum; - } - } - if( nBrk < nBrkNum ) PRINT(); - } - break; - case 0xB5: // SXLI - pivot table line item array - { - UINT16 nIdent; - UINT16 nType; - UINT16 nMaxInd; - const sal_Char* pInd = " "; - const sal_Char* pType[] = { - "Data", "Default", "SUM", "COUNT","AVERAGE", - "MAX", "MIN", "PRODUCT", "COUNTA", "STDEV", - "STDEVP", "VAR", "VARP", "Grand total", - "Blank line" }; // undocumented - while( rIn.GetRecLeft() > 0 ) - { - rIn >> nIdent >> nType >> nMaxInd >> __nFlags; - LINESTART(); - ADDTEXT( "# of ident. items: " ); - __AddDec( t, nIdent ); - ADDTEXT( " Type (" ); - __AddHex( t, nType ); - ADDTEXT( "): " ); - if( nType > 0x0E ) - p = pU; - else - p = pType[ nType ]; - ADDTEXT( p ); - ADDTEXT( " relevant indexes: " ); - __AddDec( t, nMaxInd ); - PRINT(); - LINESTART(); - ADDTEXT( pInd ); - STARTFLAG(); - ADDFLAG( 0x0001, "fMultiDataName" ); - ADDFLAG( 0x0200, "fSub" ); - ADDFLAG( 0x0400, "fBlock" ); - ADDFLAG( 0x0800, "fGrand" ); - ADDFLAG( 0x1000, "fMultiDataOnAxis" ); - ADDFLAG( 0x2000, "fBlankLine" ); // undocumented - ADDFLAG( 0x4000, "fHideDetail" ); // undocumented - ADDRESERVED( 0x8000 ); - PRINT(); - LINESTART(); - ADDTEXT( pInd ); - ADDTEXT( "index to data field: " ); - __AddDec( t, (UINT16) ( (__nFlags & 0x01FE) >> 1 ) ); - PRINT(); - LINESTART(); - ADDTEXT( pInd ); - ADDTEXT( "array of " ); - __AddDec( t, nSXLISize[nSXLIIndex] ); - ADDTEXT( " indexes (^ are ident., * are irrelevant):" ); - PRINT(); - LINESTART(); - ADDTEXT( pInd ); - ADDTEXT( " " ); - const UINT16 nBrkNum = 5; - UINT16 nBrk = nBrkNum; - for( UINT16 i = 0; i < nSXLISize[nSXLIIndex]; i++ ) - { - __AddDec( t, Read2( rIn ), 7 ); - if( i < nIdent ) - ADDTEXT( "^" ); - else if( i < nMaxInd ) - ADDTEXT( " " ); - else - ADDTEXT( "*" ); - nBrk--; - if( !nBrk ) - { - PRINT(); - LINESTART(); - ADDTEXT( pInd ); - ADDTEXT( " " ); - nBrk = nBrkNum; - } - } - if( nBrk < nBrkNum ) - PRINT(); - } - nSXLIIndex = 1 - nSXLIIndex; - } - break; - case 0xB6: // SXPI - pivot table page item(s) - { - UINT16 nArrayCnt = (UINT16)(nL / 6); - LINESTART(); - __AddDec( t, nArrayCnt ); - ADDTEXT( " page items:" ); - PRINT(); - for( UINT16 iArray = 0; iArray < nArrayCnt; iArray++ ) - { - LINESTART(); - ADDTEXT( "index SXVD: " ); - __AddDec( t, Read2( rIn ), 3 ); - ADDTEXT( " index SXVI: " ); - UINT16 nSXVIInd; - rIn >> nSXVIInd; - __AddDec( t, nSXVIInd, 5 ); - if( nSXVIInd == 32765 ) - ADDTEXT( " (All items) Obj ID: " ); - else - ADDTEXT( " Obj ID: " ); - ADDHEX( 2 ); - PRINT(); - } - } - break; - case 0xBD: - { - UINT16 nC, nR, nXF; - INT32 nRK; - UINT16 n = (UINT16)((nL - 4) / 6); - - rIn >> nR >> nC; - while( n ) - { - rIn >> nXF >> nRK; - LINESTART(); - __AddCellHead( t, nC, nR, nXF ); - ADDTEXT( " val = " ); - __AddRK( t, nRK ); - PRINT(); - nC++; - n--; - } - } - break; - case 0xBE: - { - LINESTART(); - ADDCELLHEAD(); - PRINT(); - LINESTART(); - ADDTEXT( "next XFs: " ); - UINT16 n = (UINT16)((nL - 6) / 2); - while( n ) - { - __AddDec( t, Read2( rIn ) ); - n--; - if( n ) - ADDTEXT( ' ' ); - } - PRINT(); - } - break; - case 0x00C5: // SXDI - { - LINESTART(); - ADDTEXT( "Field: " ); - ADDDEC( 2 ); - UINT16 nFunc = Read2( rIn ); - ADDTEXT( " aggregation func (" ); - __AddHex( t, nFunc ); - ADDTEXT( "): " ); - const sal_Char* pFunc[] = { "Sum", "Count", "Average", "Max", "Min", - "Product", "Count Nums", "StdDev", "StdDevp", "Var", - "Varp" }; - p = (nFunc > 0x0A) ? pU : pFunc[ nFunc ]; - ADDTEXT( p ); - ADDTEXT( " display format (" ); - const sal_Char* pDispl[] = { - "Normal", "Difference", "Percentage of", "Percentage difference from", "Running total in", - "Percentage of row", "Percentage of column", "Percentage of total", "Index" }; - UINT16 nDispl = Read2( rIn ); - __AddHex( t, nDispl ); - ADDTEXT( "): " ); - p = (nDispl > 0x08) ? pU : pDispl[ nDispl ]; - ADDTEXT( p ); - PRINT(); - LINESTART(); - ADDTEXT( "ind. to SXVD: " ); ADDDEC( 2 ); - ADDTEXT( " ind. to SXVI: " ); ADDDEC( 2 ); - ADDTEXT( " num format: " ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "name: " ); - UINT16 nCch = Read2( rIn ); - if( nCch == 0xFFFF ) - ADDTEXT( "<name in cache>" ); - else if( nCch ) - AddUNICODEString( t, rIn, TRUE, nCch ); - else - ADDTEXT( "<empty string>" ); - PRINT(); - } - break; - case 0x00C6: // SXDB - cache info - { - ADDTEXT( "number of recs: " ); ADDDEC( 4 ); - ADDTEXT( " stream id: " ); ADDHEX( 2 ); - ADDTEXT( " flags: " ); ADDHEX( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "DB block recs: " ); ADDDEC( 2 ); - ADDTEXT( " base fields: " ); ADDDEC( 2 ); - ADDTEXT( " all fields: " ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "reserved: " ); ADDHEX( 2 ); - ADDTEXT( " type: " ); ADDHEX( 2 ); - ADDTEXT( " changed by:" ); - PRINT(); - LINESTART(); - AddUNICODEString( t, rIn ); - PRINT(); - } - break; - case 0x00C7: // SXFIELD - Pivot Field - { - nItemCnt = 0; - - ADDTEXT( "#" ); - __AddDec( t, nFieldCnt, 3 ); - nFieldCnt++; - ADDTEXT( " (pivot field): " ); - if( rIn.GetRecLeft() < 14 ) - { - ADDTEXT( "<break in pivot field start>" ); - PRINT(); - } - else - { - PRINT(); - LINESTART(); - ADDTEXT( pPre ); - rIn >> __nFlags; - STARTFLAG(); - ADDFLAG( 0x0001, "fOrigItems" ); - ADDFLAG( 0x0002, "fPostponed" ); - ADDFLAG( 0x0004, "fCalculated" ); - ADDFLAG( 0x0008, "fGroupChild" ); - ADDFLAG( 0x0010, "fNumGroup" ); - ADDFLAG( 0x0200, "fLongIndex" ); - ADDFLAG( 0x1000, "f1000?" ); - ADDFLAG( 0x8000, "f8000?" ); - ADDRESERVED( 0x6000 ); - ADDTEXT( " data-type=" ); - __AddHex( t, static_cast< sal_uInt16 >( __nFlags & 0x0DE0 ) ); - ADDTEXT( "=" ); - switch( __nFlags & 0x0DE0 ) - { - case 0x0000: ADDTEXT( "spc" ); break; - case 0x0480: ADDTEXT( "str" ); break; - case 0x0520: ADDTEXT( "int[+dbl]" ); break; - case 0x0560: ADDTEXT( "dbl" ); break; - case 0x05A0: ADDTEXT( "str+int[+dbl]" ); break; - case 0x05E0: ADDTEXT( "str+dbl" ); break; - case 0x0900: ADDTEXT( "dat" ); break; - case 0x0D00: ADDTEXT( "dat+int/dbl" ); break; - case 0x0D80: ADDTEXT( "dat+str[+int/dbl]" ); break; - default: ADDTEXT( pU ); - } - PRINT(); - LINESTART(); - ADDTEXT( pPre ); - ADDTEXT( "group-subfield=" ); ADDDEC( 2 ); - ADDTEXT( " group-basefield=" ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( pPre ); - ADDTEXT( "item-count=" ); ADDDEC( 2 ); - ADDTEXT( " group-item-count=" ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( pPre ); - ADDTEXT( "base-item-count=" ); ADDDEC( 2 ); - ADDTEXT( " source-item-count=" ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( pPre ); - if( rIn.GetRecLeft() < 3 ) - { - ADDTEXT( "<break in pivot field name>" ); - PRINT(); - } - else - { - ADDTEXT( "name=" ); - AddUNICODEString( t, rIn ); - PRINT(); - } - } - } - break; - case 0x00C8: // SXINDEXLIST - indexes to source data - { - ADDTEXT( "#" ); - __AddDec( t, nTabIndexCnt, 3 ); - nTabIndexCnt++; - ADDTEXT( " (index list):" ); - for( UINT16 iIndex = 0; iIndex < rIn.GetRecSize(); iIndex++ ) - { - ADDTEXT( " " ); - ADDHEX( 1 ); - } - PRINT(); - } - break; - case 0x00C9: // SXDOUBLE - cache entry: double value - { - ADDTEXT( "#" ); - __AddDec( t, nItemCnt, 3 ); - ADDTEXT( " (double): " ); - nItemCnt++; - ADDTEXT( " " ); - ADDDOUBLE(); - PRINT(); - } - break; - case 0x00CA: // SXBOOLEAN - cache entry: boolean value - { - ADDTEXT( "#" ); - __AddDec( t, nItemCnt, 3 ); - ADDTEXT( " (boolean): " ); - nItemCnt++; - ADDTEXT( " " ); - lcl_AddFlag( t, rIn.ReaduInt16() != 0 ); - PRINT(); - } - break; - case 0x00CB: // SXERROR - cache entry: error code - { - ADDTEXT( "#" ); - __AddDec( t, nItemCnt, 3 ); - ADDTEXT( " (error): " ); - nItemCnt++; - ADDTEXT( " " ); - ADDHEX( 2 ); - PRINT(); - } - break; - case 0x00CC: // SXINTEGER - signed 16bit integer - { - ADDTEXT( "#" ); - __AddDec( t, nItemCnt, 3 ); - ADDTEXT( " (integer): " ); - nItemCnt++; - ADDTEXT( " " ); - ADDDEC( 2 ); - PRINT(); - } - break; - case 0x00CD: // SXSTRING - String - { - if( bSubStream ) - { - ADDTEXT( "#" ); - __AddDec( t, nItemCnt, 3 ); - ADDTEXT( " (string): " ); - nItemCnt++; - } - AddUNICODEString( t, rIn ); - PRINT(); - } - break; - case 0x00CE: // SXDATETIME - date & time special format - { - ADDTEXT( "#" ); - __AddDec( t, nItemCnt, 3 ); - ADDTEXT( " (date/time): " ); - nItemCnt++; - UINT8 nDay, nHour, nMin, nSec; - UINT16 nYear, nMonth; - rIn >> nYear >> nMonth >> nDay >> nHour >> nMin >> nSec; - if( nDay ) - { - __AddDec( t, nDay ); - ADDTEXT( "." ); - __AddDec( t, nMonth ); - ADDTEXT( "." ); - __AddDec( t, nYear ); - ADDTEXT( " " ); - } - __AddDec( t, nHour, 2, '0' ); - ADDTEXT( ":" ); - __AddDec( t, nMin, 2, '0' ); - ADDTEXT( ":" ); - __AddDec( t, nSec, 2, '0' ); - PRINT(); - } - break; - case 0x00CF: // SXEMPTY - cache entry: empty - { - ADDTEXT( "#" ); - __AddDec( t, nItemCnt, 3 ); - ADDTEXT( " (empty): " ); - nItemCnt++; - PRINT(); - } - break; - case 0x00D5: // SXIDSTM - pivot table cache stream id - { - LINESTART(); - UINT16 nStrId = Read2( rIn ); - ADDTEXT( "Stream ID: " ); - __AddHex( t, nStrId ); - PRINT(); - DumpRecordStream( OpenStorage( EXC_STORAGE_PTCACHE ), ScfTools::GetHexStr( nStrId ), EMPTY_STRING ); - } - break; - case 0x00D8: // SXNUMGROUP - numerical grouping in pivot cache field - { - LINESTART(); - rIn >> __nFlags; - STARTFLAG(); - ADDFLAG( 0x0001, "fAutoMin" ); - ADDFLAG( 0x0002, "fAutoMax" ); - ADDTEXT( " data-type=" ); - switch( (__nFlags & 0x003C) >> 2 ) - { - case 0x0001: ADDTEXT( "seconds" ); break; - case 0x0002: ADDTEXT( "minutes" ); break; - case 0x0003: ADDTEXT( "hours" ); break; - case 0x0004: ADDTEXT( "days" ); break; - case 0x0005: ADDTEXT( "months" ); break; - case 0x0006: ADDTEXT( "quarters" ); break; - case 0x0007: ADDTEXT( "years" ); break; - case 0x0008: ADDTEXT( "numeric" ); break; - default: ADDTEXT( pU ); - } - (__nFlags &= 0xFFC0) >>= 6; - ADDTEXT( " remaining=" ); __AddHex( t, __nFlags ); - ADDTEXT( "=" ); __AddDec( t, __nFlags ); - PRINT(); - } - break; - case 0xE0: - DumpXF( rIn, pPre ); - break; - case 0xE3: - { - LINESTART(); - ADDTEXT( "view source (" ); - UINT16 n = Read2( rIn ); - __AddHex( t, n ); - ADDTEXT( "): " ); - switch( n ) - { - case 0x01: p = "M$ Excel list or database"; break; - case 0x02: p = "external data source"; break; - case 0x04: p = "multiple consolidation ranges"; break; - case 0x08: p = "pivot table"; break; - case 0x10: p = "scenario manager summary report"; break; - default: p = pU; - } - ADDTEXT( p ); - PRINT(); - } - break; - case 0x00E5: // CELLMERGING - { - UINT16 nCount, nInd; - UINT16 nRow1, nRow2, nCol1, nCol2; - rIn >> nCount; - LINESTART(); - ADDTEXT( "Count: " ); - __AddDec( t, nCount ); - PRINT(); - LINESTART(); - for( nInd = 0; nInd < 3; nInd++ ) - ADDTEXT( " row - row / col-col | " ); - PRINT(); - LINESTART(); - if( (ULONG)(nCount * 8 + 2) == nL ) - { - for( nInd = 0; nInd < nCount; nInd++ ) - { - rIn >> nRow1 >> nRow2 >> nCol1 >> nCol2; - __AddDec( t, nRow1, 5 ); - ADDTEXT( "-" ); - __AddDec( t, nRow2, 5 ); - ADDTEXT( " / " ); - __AddDec( t, nCol1, 3 ); - ADDTEXT( "-" ); - __AddDec( t, nCol2, 3 ); - ADDTEXT( " | " ); - if( (nInd % 3 == 2) || (nInd == nCount - 1) ) - { - PRINT(); - LINESTART(); - } - } - } - else - { - LINESTART(); - ADDTEXT( "<Wrong record length!>" ); - PRINT(); - } - } - break; - case 0xEB: - case 0xEC: - case 0xED: - EscherDump( nL, true ); - break; - case 0x00F6: // SXNAME - { - LINESTART(); - rIn >> __nFlags; - STARTFLAG(); - ADDFLAG( 0x0002, "fNameErr" ); - ADDRESERVED( 0xFFFD ); - ADDTEXT( " field=" ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - sal_Int16 nFunc; - rIn >> nFunc; - ADDTEXT( "function=" ); __AddHex( t, (INT32)nFunc ); - static const sal_Char* const ppcFuncs[] = { - "none", 0, "sum", "counta", "count", "average", "max", "min", - "product", "stdev", "stdevp", "var", "varp" }; - lcl_AddEnum( t, nFunc, ppcFuncs, STATIC_TABLE_SIZE( ppcFuncs ), 0, -1 ); - ADDTEXT( " SXPAIR-count=" ); ADDDEC( 2 ); - PRINT(); - } - break; - case 0x00F9: // SXFMLA - { - LINESTART(); - sal_uInt16 nSize; - rIn >> nSize; - ADDTEXT( "formula-size=" ); __AddDec( t, nSize ); - ADDTEXT( " SXNAME-count=" ); ADDDEC( 2 ); - PRINT(); - FormulaDump( nSize, FT_RangeName ); - } - break; - case 0xFC: - { - UINT16 nCnt = 0; - BOOL bOK = TRUE; - ContDump( 8 ); - - while( bOK && (rIn.GetRecLeft() > 0) ) - { - LINESTART(); - __AddDec( t, nCnt ); - ADDTEXT( ": " ); - bOK = AddUNICODEString( t, rIn ); - PRINT(); - nCnt++; - } - } - break; - case 0xFD: - { - LINESTART(); - ADDCELLHEAD(); - ADDTEXT( " sst = " ); - ADDDEC(4); - PRINT(); - } - break; - case 0x0100: // SXVDEX - { - LINESTART(); - sal_uInt32 __nFlags = Read4( rIn ); - STARTFLAG(); - if( __nFlags & 0x0000009F ) - { - ADDFLAG( 0x00000001, "fShowAllItems" ); - ADDFLAG( 0x00000002, "fDragToRow" ); - ADDFLAG( 0x00000004, "fDragToColumn" ); - ADDFLAG( 0x00000008, "fDragToPage" ); - ADDFLAG( 0x00000010, "fDragToHide" ); - ADDFLAG( 0x00000080, "fServerBased" ); - PRINT(); - LINESTART(); - } - if( __nFlags & 0x00007E00 ) - { - ADDTEXT( " " ); - ADDFLAG( 0x00000200, "fAutoSort" ); - ADDFLAG( 0x00000400, "fAscendSort" ); - ADDFLAG( 0x00000800, "fAutoShow" ); - ADDFLAG( 0x00001000, "fAscendShow" ); - ADDFLAG( 0x00002000, "fCalculatedField" ); - ADDFLAG( 0x00004000, "fLONewPage" ); // undocumented - PRINT(); - LINESTART(); - } - if( __nFlags & 0xFFE00000 ) - { - ADDTEXT( " " ); // Layout flags: - ADDFLAG( 0x00200000, "fLOReport" ); // undocumented - ADDFLAG( 0x00400000, "fLOBlankLine" ); // undocumented - ADDFLAG( 0x00800000, "fLOSubTotalTop" ); // undocumented - ADDTEXT( " show-items=" ); __AddDec( t, sal_uInt32( __nFlags >> 24 ) ); - PRINT(); - LINESTART(); - } - if( __nFlags & 0x001F8160 ) - { - ADDTEXT( " !RESERVED!" ); - PRINT(); - } - if( !__nFlags ) - PRINT(); - LINESTART(); - ADDTEXT( " sort-field=" ); - ADDDEC( 2 ); - ADDTEXT( " show-field=" ); - ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "format=" ); - UINT16 n = Read2( rIn ); - if( n ) - __AddDec( t, n ); - else - ADDTEXT( "none" ); - PRINT(); - } - break; - case 0x0122: // SXDBEX - ext. cache info - { - ADDTEXT( "last changed: " ); ADDDOUBLE(); - ADDTEXT( " SXFORMULA recs: " ); ADDDEC( 4 ); - PRINT(); - } - break; - case 0x0138: // CHTRINFO - change tracking info - { - rIn.DisableDecryption(); - ADDTEXT( "14 bytes of unknown data..." ); - PRINT(); - ContDump( 14 ); - LINESTART(); - ADDTEXT( "16 bytes unknown identification:" ); - PRINT(); - ContDump( 16 ); - LINESTART(); - ADDTEXT( "unknown: " ); ADDHEX( 2 ); - ADDTEXT( " user: " ); - if( rIn.GetRecLeft() > 3 ) - AddUNICODEString( t, rIn ); - PRINT(); - LINESTART(); - __AddDec( t, (UINT16)(rIn.GetRecLeft() - 10) ); - ADDTEXT( " bytes of unknown data..." ); - PRINT(); - ContDump( rIn.GetRecLeft() - 10 ); - LINESTART(); - ADDTEXT( "date/time: " ); ADDDEC( 2 ); - ADDTEXT( "-" ); ADDDEC( 1 ); - ADDTEXT( "-" ); ADDDEC( 1 ); - ADDTEXT( " " ); ADDDEC( 1 ); - ADDTEXT( ":" ); ADDDEC( 1 ); - ADDTEXT( ":" ); ADDDEC( 1 ); - ADDTEXT( " unknown: " ); ADDHEX( 1 ); - ADDTEXT( " " ); ADDHEX( 2 ); - PRINT(); - } - break; - case 0x0137: // CHTRINSERT - change tracking: insert/remove - { - ADDTEXT( "len: " ); ADDDEC( 4 ); - ADDTEXT( " index: " ); ADDDEC( 4 ); - ADDTEXT( " op: " ); - UINT16 nOp; - rIn >> nOp; - switch( nOp ) - { - case 0x0000: ADDTEXT( "insert row" ); break; - case 0x0001: ADDTEXT( "insert column" ); break; - case 0x0002: ADDTEXT( "delete row" ); break; - case 0x0003: ADDTEXT( "delete column" ); break; - default: - __AddHex( t, nOp ); - ADDTEXT( " *UNKNOWN*" ); - } - ADDTEXT( " accept: " ); ADDHEX( 2 ); - ADDTEXT( " tab: " ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - UINT16 __nFlags = Read2( rIn ); - STARTFLAG(); - ADDFLAG( 0x0001, "fAuto" ); - ADDRESERVED( 0xFFFE ); - UINT16 nCol1, nRow1, nCol2, nRow2; - rIn >> nRow1 >> nRow2 >> nCol1 >> nCol2; - ADDTEXT( " range: " ); lcl_AddRangeRef( t, nCol1, nRow1, nCol2, nRow2 ); - ADDTEXT( " unknown: " ); ADDHEX( 4 ); - PRINT(); - } - break; - case 0x013B: // CHTRCELLCONTENT: change tracking: changed cell - { - PreDump( nL ); - ADDTEXT( "len: " ); ADDDEC( 4 ); - ADDTEXT( " index: " ); ADDDEC( 4 ); - ADDTEXT( " opcode: " ); ADDHEX( 2 ); - ADDTEXT( " accept: " ); ADDHEX( 2 ); - ADDTEXT( " tab: " ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - UINT16 nChg, nOldType, nNewType; - rIn >> nChg; - nOldType = (nChg & 0x0038) >> 3; - nNewType = nChg & 0x0007; - ADDTEXT( "change (" ); __AddHex( t, nChg ); - ADDTEXT( "): " ); - switch( nOldType ) - { - case 0x0000: ADDTEXT( "empty->" ); break; - case 0x0001: ADDTEXT( "RK->" ); break; - case 0x0002: ADDTEXT( "double->" ); break; - case 0x0003: ADDTEXT( "string->" ); break; - case 0x0004: ADDTEXT( "bool->" ); break; - case 0x0005: ADDTEXT( "formula->" ); break; - default: ADDTEXT( "*UNKNOWN*->" ); - } - switch( nNewType ) - { - case 0x0000: ADDTEXT( "empty" ); break; - case 0x0001: ADDTEXT( "RK" ); break; - case 0x0002: ADDTEXT( "double" ); break; - case 0x0003: ADDTEXT( "string" ); break; - case 0x0004: ADDTEXT( "bool" ); break; - case 0x0005: ADDTEXT( "formula" ); break; - default: ADDTEXT( "*UNKNOWN*" ); - } - UINT16 nFormatData = (nChg & 0xFF00); - if( (nFormatData == 0x1100) || (nFormatData == 0x1300) ) - ADDTEXT( "; contains add. data" ); - ADDTEXT( " format: " ); ADDHEX( 2 ); - UINT16 nCol, nRow; - rIn >> nRow >> nCol; - ADDTEXT( " address: " ); lcl_AddRef( t, nCol, nRow ); - PRINT(); - LINESTART(); - UINT16 nOldLen; - rIn >> nOldLen; - ADDTEXT( "old value len: " ); __AddHex( t, nOldLen ); - if( nOldType == 0x0003 ) - nOldLen >>= 1; - ADDTEXT( " unknown: " ); ADDHEX( 4 ); - PRINT(); - UINT16 nCount = 0; - switch( nFormatData ) - { - case 0x1100: nCount = 8; break; - case 0x1300: nCount = 4; break; - } - if( nCount ) - { - LINESTART(); - ADDTEXT( "additional format data:" ); - for( UINT16 nIndex = 0; nIndex < nCount; nIndex ++ ) - { - ADDTEXT( " " ); - ADDHEX( 2 ); - } - PRINT(); - } - if( nOldType ) - { - LINESTART(); - ADDTEXT( "old value: " ); - switch( nOldType ) - { - case 0x0001: - __AddRK( t, rIn.ReadInt32() ); - PRINT(); - break; - case 0x0002: - ADDDOUBLE(); - PRINT(); - break; - case 0x0003: - AddUNICODEString( t, rIn ); - PRINT(); - break; - case 0x0004: - if( Read2( rIn ) ) - ADDTEXT( "true" ); - else - ADDTEXT( "false" ); - PRINT(); - break; - case 0x0005: - { - PRINT(); - UINT16 nLen; - rIn >> nLen; - FormulaDump( nLen, FT_CellFormula ); - IGNORE( 1 ); - } - break; - } - } - if( nNewType ) - { - LINESTART(); - ADDTEXT( "new value: " ); - switch( nNewType ) - { - case 0x0001: - __AddRK( t, rIn.ReadInt32() ); - PRINT(); - break; - case 0x0002: - ADDDOUBLE(); - PRINT(); - break; - case 0x0003: - AddUNICODEString( t, rIn ); - PRINT(); - break; - case 0x0004: - if( Read2( rIn ) ) - ADDTEXT( "true" ); - else - ADDTEXT( "false" ); - PRINT(); - break; - case 0x0005: - { - PRINT(); - UINT16 nLen; - rIn >> nLen; - FormulaDump( nLen, FT_CellFormula ); - IGNORE( 1 ); - } - break; - } - } - if( rIn.GetRecLeft() > 0 ) - { - LINESTART(); - ADDTEXT( "*UNKNOWN* data:" ); - PRINT(); - PreDump( rIn.GetRecLeft() ); - } - } - break; - case 0x013D: // TABID - { - ADDTEXT( "tab ids:" ); - while( rIn.GetRecLeft() ) - { - ADDTEXT( " " ); - ADDDEC( 2 ); - } - PRINT(); - } - break; - case 0x0140: // CHTRMOVE - change tracking: moved range - { - ADDTEXT( "len: " ); ADDDEC( 4 ); - ADDTEXT( " index: " ); ADDDEC( 4 ); - ADDTEXT( " opcode: " ); ADDHEX( 2 ); - ADDTEXT( " accept: " ); ADDHEX( 2 ); - PRINT(); - UINT16 nTab1, nTab2; - UINT16 nCol11, nCol12, nCol21, nCol22; - UINT16 nRow11, nRow12, nRow21, nRow22; - rIn >> nTab2 >> nRow11 >> nRow12 >> nCol11 >> nCol12 >> nRow21 >> nRow22 >> nCol21 >> nCol22 >> nTab1; - LINESTART(); - ADDTEXT( "move range from: tab=" ); __AddDec( t, nTab1 ); - ADDTEXT( " " ); lcl_AddRangeRef( t, nCol11, nRow11, nCol12, nRow12 ); - ADDTEXT( " to: tab=" ); __AddDec( t, nTab2 ); - ADDTEXT( " " ); lcl_AddRangeRef( t, nCol21, nRow21, nCol22, nRow22 ); - ADDTEXT( " unknown: " ); ADDHEX( 4 ); - PRINT(); - } - break; - case 0x014D: // CHTRINSERTTAB - change tracking: insert tab - { - ADDTEXT( "len: " ); ADDDEC( 4 ); - ADDTEXT( " index: " ); ADDDEC( 4 ); - ADDTEXT( " opcode: " ); ADDHEX( 2 ); - ADDTEXT( " accept: " ); ADDHEX( 2 ); - ADDTEXT( " tab: " ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "unknown: " ); ADDHEX( 4 ); - ADDTEXT( " table name: " ); - AddUNICODEString( t, rIn ); - PRINT(); - LINESTART(); - __AddDec( t, (sal_uInt32)rIn.GetRecLeft() ); - ADDTEXT( " bytes of unknown data:" ); - PRINT(); - ContDump( rIn.GetRecLeft() ); - } - break; - case 0x015F: // LABELRANGES - { - UINT16 nCnt, nR1, nR2, nC1, nC2; - rIn >> nCnt; - ADDTEXT( "row headers: " ); __AddDec( t, nCnt ); - PRINT(); - while( nCnt-- ) - { - rIn >> nR1 >> nR2 >> nC1 >> nC2; - LINESTART(); - AddRangeRef( t, nR1, nC1 | 0xC000, nR2, nC2 | 0xC000, FALSE ); - PRINT(); - } - rIn >> nCnt; - LINESTART(); - ADDTEXT( "column headers: " ); __AddDec( t, nCnt ); - PRINT(); - while( nCnt-- ) - { - rIn >> nR1 >> nR2 >> nC1 >> nC2; - LINESTART(); - AddRangeRef( t, nR1, nC1 | 0xC000, nR2, nC2 | 0xC000, FALSE ); - PRINT(); - } - } - break; - case 0x0193: - { - ADDTEXT( "unknown: " ); ADDHEX( 4 ); - PRINT(); - LINESTART(); - ADDTEXT( "16 bytes unknown identification:" ); - PRINT(); - ContDump( 16 ); - LINESTART(); - ADDTEXT( "date/time: " ); ADDDEC( 2 ); - ADDTEXT( "-" ); ADDDEC( 1 ); - ADDTEXT( "-" ); ADDDEC( 1 ); - ADDTEXT( " " ); ADDDEC( 1 ); - ADDTEXT( ":" ); ADDDEC( 1 ); - ADDTEXT( ":" ); ADDDEC( 1 ); - ADDTEXT( " unknown: " ); ADDHEX( 1 ); - PRINT(); - LINESTART(); - ADDTEXT( "user: " ); - if( rIn.GetRecLeft() > 3 ) - AddUNICODEString( t, rIn ); - PRINT(); - } - break; - case 0x0194: - { - rIn.DisableDecryption(); - ADDTEXT( "unknown: " ); ADDHEX( 4 ); - ADDTEXT( " date/time: " ); ADDDEC( 2 ); - ADDTEXT( "-" ); ADDDEC( 1 ); - ADDTEXT( "-" ); ADDDEC( 1 ); - ADDTEXT( " " ); ADDDEC( 1 ); - ADDTEXT( ":" ); ADDDEC( 1 ); - ADDTEXT( ":" ); ADDDEC( 1 ); - ADDTEXT( " unknown: " ); ADDHEX( 1 ); - PRINT(); - LINESTART(); - ADDTEXT( "user: " ); - if( rIn.GetRecLeft() > 3 ) - AddUNICODEString( t, rIn ); - PRINT(); - LINESTART(); - __AddDec( t, (sal_uInt32)rIn.GetRecLeft() ); - ADDTEXT( " bytes of unknown data:" ); - PRINT(); - ContDump( rIn.GetRecLeft() ); - } - break; - case 0x0195: - rIn.DisableDecryption(); - ContDump( nL ); - break; - case 0x0196: - { - rIn.DisableDecryption(); - ADDTEXT( "unknown: " ); ADDHEX( 2 ); - ADDTEXT( " " ); ADDHEX( 2 ); - ADDTEXT( " " ); ADDHEX( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "16 bytes unknown identification:" ); - PRINT(); - ContDump( 16 ); - LINESTART(); - ADDTEXT( "16 bytes unknown identification:" ); - PRINT(); - ContDump( 16 ); - LINESTART(); - ADDTEXT( "count of changes: " ); ADDDEC( 2 ); - ADDTEXT( " " ); - __AddDec( t, (sal_uInt32)rIn.GetRecLeft() ); - ADDTEXT( " bytes of unknown data:" ); - PRINT(); - ContDump( rIn.GetRecLeft() ); - } - break; - case 0x01A9: // USERBVIEW - { - LINESTART(); - ADDTEXT( "view id: " ); ADDHEX( 4 ); - ADDTEXT( " tab id: " ); ADDDEC( 4 ); - ADDTEXT( " guid: " ); __AddGUID( t, rIn ); - PRINT(); - LINESTART(); - ADDTEXT( "window x: " ); ADDDEC( 4 ); - ADDTEXT( " y: " ); ADDDEC( 4 ); - ADDTEXT( " width: " ); ADDDEC( 4 ); - ADDTEXT( " height: " ); ADDDEC( 4 ); - ADDTEXT( " ratio: " ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - UINT16 __nFlags = Read2( rIn ); - STARTFLAG(); - ADDFLAG( 0x0001, "fDsplFormulaBar" ); - ADDFLAG( 0x0002, "fDsplStatus" ); - ADDFLAG( 0x0004, "fNoteOff" ); - ADDFLAG( 0x0008, "fDsplHScroll" ); - ADDFLAG( 0x0010, "fDsplVScroll" ); - ADDFLAG( 0x0020, "fBotAdornment" ); - ADDFLAG( 0x0040, "fZoom" ); - ADDFLAG( 0x0080, "fShowPlaceHld" ); - ADDFLAG( 0x0100, "fHideAll" ); - if( !(__nFlags & 0x0180) ) - ADDTEXT( " fShowAll" ); - PRINT(); - LINESTART(); - ADDTEXT( "flags2: " ); ADDHEX( 2 ); - ADDTEXT( " merge int: " ); ADDDEC( 2 ); - ADDTEXT( " reserved: " ); ADDHEX( 2 ); - PRINT(); - if( rIn.GetRecLeft() > 3 ) - { - LINESTART(); - ADDTEXT( "name: " ); - AddUNICODEString( t, rIn ); - PRINT(); - } - } - break; - case 0x01AA: // USERSVIEWBEGIN - { - LINESTART(); - ADDTEXT( "guid: " ); __AddGUID( t, rIn ); - ADDTEXT( " tab id: " ); ADDDEC( 4 ); - PRINT(); - LINESTART(); - ADDTEXT( "wscale: " ); ADDDEC( 4 ); - ADDTEXT( " icolor: " ); ADDDEC( 4 ); - ADDTEXT( " pane: " ); ADDDEC( 4 ); - PRINT(); - LINESTART(); - UINT32 __nFlags = Read4( rIn ); - STARTFLAG(); - if( __nFlags & 0x000000FF ) - { - ADDFLAG( 0x00000001, "fShowPgBrk" ); - ADDFLAG( 0x00000002, "fDsplForml" ); - ADDFLAG( 0x00000004, "fDsplGrid" ); - ADDFLAG( 0x00000008, "fDsplRCHead" ); - ADDFLAG( 0x00000010, "fDsplGuts" ); - ADDFLAG( 0x00000020, "fDsplZeros" ); - ADDFLAG( 0x00000040, "fPrintHorC" ); - ADDFLAG( 0x00000080, "fPrintVerC" ); - PRINT(); - LINESTART(); - } - if( __nFlags & 0x00007F00 ) - { - ADDTEXT( " " ); - ADDFLAG( 0x00000100, "fPrintRCHead" ); - ADDFLAG( 0x00000200, "fPrintGrid" ); - ADDFLAG( 0x00000400, "fFitToPage" ); - ADDFLAG( 0x00000800, "fPrintArea" ); - ADDFLAG( 0x00001000, "fOnePrintArea" ); - ADDFLAG( 0x00002000, "fFilter" ); - ADDFLAG( 0x00004000, "fAutoFilter" ); - PRINT(); - LINESTART(); - } - if( __nFlags & 0xFFF80000 ) - { - ADDTEXT( " " ); - ADDFLAG( 0x00020000, "fSplitV" ); - ADDFLAG( 0x00040000, "fSplitH" ); - ADDFLAG( 0x00180000, "fHiddenRow" ); - ADDFLAG( 0x00200000, "fHiddenCol" ); - ADDFLAG( 0x01000000, "fChartSize" ); - ADDFLAG( 0x02000000, "fFilterUnique" ); - ADDFLAG( 0x04000000, "fLayoutView" ); - ADDRESERVED( 0xF8C18000 ); - PRINT(); - LINESTART(); - } - if( !__nFlags ) - PRINT(); - ADDTEXT( "visible: " ); ADDHEX( 2 ); - ADDTEXT( " " ); ADDHEX( 2 ); - ADDTEXT( " " ); ADDHEX( 2 ); - ADDTEXT( " " ); ADDHEX( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "pane pos vert: " ); ADDDOUBLE(); - ADDTEXT( " hor: " ); ADDDOUBLE(); - ADDTEXT( " 1st vis right: " ); ADDDEC( 2 ); - ADDTEXT( " bott: " ); ADDDEC( 2 ); - PRINT(); - } - break; - case 0x01AB: // USERSVIEWEND - { - LINESTART(); - ADDTEXT( "settings are valid: " ); ADDHEX( 2 ); - PRINT(); - } - break; - case 0x01AD: // QSI - web query range - { - LINESTART(); - rIn >> __nFlags; - STARTFLAG(); - ADDFLAG( 0x0001, "fTitles" ); - ADDFLAG( 0x0002, "fRowNums" ); - ADDFLAG( 0x0004, "fDisRefr" ); - ADDFLAG( 0x0080, "fFill" ); - ADDFLAG( 0x0100, "fAutoFmt" ); - ADDFLAG( 0x0400, "fDisEdit" ); - ADDRESERVED( 0xFA78 ); - PRINT(); - LINESTART(); - ADDTEXT( "AutoFmt: " ); ADDDEC( 2 ); - ADDTEXT( " AutoFmtAttr: " ); ADDHEX( 2 ); - ADDTEXT( " reserved: " ); ADDHEX( 4 ); - PRINT(); - LINESTART(); - ADDTEXT( "name: " ); - AddUNICODEString( t, rIn ); - PRINT(); - } - break; - case 0x01AE: - { - LINESTART(); - ADDTEXT( "# of tabs: " ); - UINT16 nTabs; - rIn >> nTabs; - __AddDec( t, nTabs ); - rIn.PushPosition(); - PRINT(); - LINESTART(); - if( nL <= (ULONG)(2 + 2 * nTabs) ) - { - ADDTEXT( "----- shortened record -----" ); - PRINT(); - - rIn.PopPosition(); - ContDump( nL - 2 ); - } - else - { - rIn.RejectPosition(); - ADDTEXT( "file name: " ); - AddUNICODEString( t, rIn ); - PRINT(); - while( nTabs ) - { - LINESTART(); - ADDTEXT( " " ); - AddUNICODEString( t, rIn ); - PRINT(); - nTabs--; - } - } - - } - break; - case 0x01B0: // CONDFMT - { - LINESTART(); - ADDTEXT( "cf-count=" ); ADDDEC( 2 ); - rIn >> __nFlags; - ADDTEXT( " " ); - STARTFLAG(); - ADDFLAG( 0x0001, "tough-recalc" ); - ADDRESERVED( 0xFFFE ); - PRINT(); - LINESTART(); - sal_uInt16 nR1, nR2, nC1, nC2, nCount; - rIn >> nR1 >> nR2 >> nC1 >> nC2 >> nCount; - ADDTEXT( "max-range=" ); lcl_AddRangeRef( t, nC1, nR1, nC2, nR2 ); - ADDTEXT( " range-count=" ); __AddDec( t, nCount ); - PRINT(); - - for( sal_uInt16 nRange = 0; rIn.IsValid() && (nRange < nCount); ++nRange ) - { - if( !(nRange % 4) ) - { - LINESTART(); - ADDTEXT( pPre ); - } - rIn >> nR1 >> nR2 >> nC1 >> nC2; - ByteString aRef; - lcl_AddRangeRef( aRef, nC1, nR1, nC2, nR2 ); - aRef.Expand( 16, ' ' ); - ADDTEXT( aRef ); - if( (nRange % 4 == 3) || (nRange + 1 == nCount) ) - PRINT(); - } - } - break; - case 0x01B1: // CF - conditional format - { - sal_uInt8 nType, nOp; - sal_uInt16 nSize1, nSize2; - sal_uInt32 nFlags; - rIn >> nType >> nOp >> nSize1 >> nSize2 >> nFlags; - LINESTART(); - ADDTEXT( "type=" ); __AddHex( t, nType ); - ADDTEXT( " (" ); - switch( nType ) - { - case 0x01: ADDTEXT( "compare" ); break; - case 0x02: ADDTEXT( "formula" ); break; - default: ADDTEXT( "!unknown!" ); - } - ADDTEXT( ") operator=" ); __AddHex( t, nOp ); - ADDTEXT( " (" ); - switch( nOp ) - { - case 0x00: ADDTEXT( "none" ); break; - case 0x01: ADDTEXT( "between" ); break; - case 0x02: ADDTEXT( "not-between" ); break; - case 0x03: ADDTEXT( "equal" ); break; - case 0x04: ADDTEXT( "not-equal" ); break; - case 0x05: ADDTEXT( "greater" ); break; - case 0x06: ADDTEXT( "less" ); break; - case 0x07: ADDTEXT( "greater-eq" ); break; - case 0x08: ADDTEXT( "less-eq" ); break; - default: ADDTEXT( "!unknown!" ); - } - ADDTEXT( ")" ); - PRINT(); - LINESTART(); - ADDTEXT( "formula-size-1=" ); __AddDec( t, nSize1 ); - ADDTEXT( " formula-size-2=" ); __AddDec( t, nSize2 ); - PRINT(); - LINESTART(); - sal_uInt32 __nFlags = nFlags; - STARTFLAG(); - __nFlags = ~__nFlags; - ADDFLAG( 0x00000400, "bord-lft" ); - ADDFLAG( 0x00000800, "bord-rgt" ); - ADDFLAG( 0x00001000, "bord-top" ); - ADDFLAG( 0x00002000, "bord-bot" ); - ADDFLAG( 0x00010000, "patt-style" ); - ADDFLAG( 0x00020000, "patt-fgcol" ); - ADDFLAG( 0x00040000, "patt-bgcol" ); - __nFlags = ~__nFlags; - ADDFLAG( 0x04000000, "font" ); - ADDFLAG( 0x10000000, "bord" ); - ADDFLAG( 0x20000000, "patt" ); - ADDRESERVED( 0xCBC00000 ); - PRINT(); - LINESTART(); - ADDTEXT( "unknown=" ); ADDHEX( 2 ); - PRINT(); - if( nFlags & 0x04000000 ) - { - LINESTART(); ADDTEXT( "*** FONT ***" ); PRINT(); - ContDump( 64 ); - LINESTART(); - ADDTEXT( "height=" ); ADDHEX( 4 ); - rIn >> __nFlags; - ADDTEXT( " style-" ); - STARTFLAG(); - ADDFLAG( 0x00000002, "italic" ); - ADDFLAG( 0x00000080, "strikeout" ); - ADDRESERVED( 0xFFFFFF7D ); - ADDTEXT( " weight=" ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - sal_uInt16 nEsc; - rIn >> nEsc; - ADDTEXT( "escapement=" ); __AddDec( t, nEsc ); - ADDTEXT( " (" ); - switch( nEsc ) - { - case 0x0000: ADDTEXT( "none" ); break; - case 0x0001: ADDTEXT( "super" ); break; - case 0x0002: ADDTEXT( "sub" ); break; - default: ADDTEXT( "!unknown!" ); - } - sal_uInt8 nUnd; - rIn >> nUnd; - ADDTEXT( ") underline=" ); __AddDec( t, nUnd ); - ADDTEXT( " (" ); - switch( nUnd ) - { - case 0x00: ADDTEXT( "none" ); break; - case 0x01: ADDTEXT( "single" ); break; - case 0x02: ADDTEXT( "double" ); break; - default: ADDTEXT( "!unknown!" ); - } - ADDTEXT( ") unknown=" ); ADDHEX( 1 ); - ADDTEXT( " " ); ADDHEX( 1 ); - ADDTEXT( " " ); ADDHEX( 1 ); - PRINT(); - LINESTART(); - ADDTEXT( "color=" ); ADDHEX( 4 ); - ADDTEXT( " unknown=" ); ADDHEX( 4 ); - rIn >> __nFlags; - ADDTEXT( " used-" ); - STARTFLAG(); - __nFlags = ~__nFlags; - ADDFLAG( 0x00000002, "italic" ); - ADDFLAG( 0x00000080, "strikeout" ); - __nFlags = ~__nFlags; - ADDRESERVED( 0xFFFFFF65 ); - PRINT(); - LINESTART(); - ADDTEXT( "escape-def=" ); ADDHEX( 4 ); - ADDTEXT( " underl-def=" ); ADDHEX( 4 ); - PRINT(); - ContDump( 18 ); - } - if( nFlags & 0x10000000 ) - { - LINESTART(); ADDTEXT( "*** BORDER ***" ); PRINT(); - sal_uInt16 nLine; - sal_uInt32 nColor; - rIn >> nLine >> nColor; - LINESTART(); - ADDTEXT( "line-style=" ); __AddHex( t, nLine ); - ADDTEXT( " (lft=" ); __AddDec( t, (sal_uInt16)(nLine & 0x000F) ); - ADDTEXT( " rgt=" ); __AddDec( t, (sal_uInt16)((nLine & 0x00F0) >> 4) ); - ADDTEXT( " top=" ); __AddDec( t, (sal_uInt16)((nLine & 0x0F00) >> 8) ); - ADDTEXT( " bot=" ); __AddDec( t, (sal_uInt16)((nLine & 0xF000) >> 12) ); - ADDTEXT( ")" ); - PRINT(); - LINESTART(); - ADDTEXT( "line-color=" ); __AddHex( t, nColor ); - ADDTEXT( " (lft=" ); __AddDec( t, (sal_uInt16)(nColor & 0x0000007F) ); - ADDTEXT( " rgt=" ); __AddDec( t, (sal_uInt16)((nColor & 0x00003F80) >> 7) ); - ADDTEXT( " top=" ); __AddDec( t, (sal_uInt16)((nColor & 0x007F0000) >> 16) ); - ADDTEXT( " bot=" ); __AddDec( t, (sal_uInt16)((nColor & 0x3F800000) >> 23) ); - ADDTEXT( ") unknown=" ); ADDHEX( 2 ); - PRINT(); - } - if( nFlags & 0x20000000 ) - { - LINESTART(); ADDTEXT( "*** AREA ***" ); PRINT(); - sal_uInt16 nPatt, nColor; - rIn >> nPatt >> nColor; - LINESTART(); - ADDTEXT( "pattern=" ); __AddHex( t, nPatt ); - ADDTEXT( " (" ); __AddDec( t, (sal_uInt16)((nPatt & 0xFC00) >> 10) ); - ADDTEXT( ") color=" ); __AddHex( t, nColor ); - ADDTEXT( " (fg=" ); __AddDec( t, (sal_uInt16)(nColor & 0x007F) ); - ADDTEXT( " bg=" ); __AddDec( t, (sal_uInt16)((nColor & 0x3F80) >> 7) ); - ADDTEXT( ")" ); - PRINT(); - } - if( rIn.IsValid() && nSize1 && (rIn.GetRecLeft() >= nSize1) ) - { - LINESTART(); ADDTEXT( "*** FORMULA 1 ***" ); PRINT(); - FormulaDump( nSize1, FT_RangeName ); - } - if( rIn.IsValid() && nSize2 && (rIn.GetRecLeft() >= nSize2) ) - { - LINESTART(); ADDTEXT( "*** FORMULA 2 ***" ); PRINT(); - FormulaDump( nSize2, FT_RangeName ); - } - } - break; - case 0x01B2: // DVAL - header of DV recs - { - rIn >> __nFlags; - LINESTART(); - STARTFLAG(); - ADDTEXT( " (" ); - __AddPureBin( t, __nFlags ); - ADDTEXT( ")" ); - ADDTEXT( "):" ); - ADDFLAG( 0x0001, "fWnClosed" ); - ADDFLAG( 0x0002, "fWnPinned" ); - ADDFLAG( 0x0004, "fCached" ); - PRINT(); - LINESTART(); - ADDTEXT( "input window: " ); - ADDHEX( 4 ); - ADDTEXT( " / " ); - ADDHEX( 4 ); - PRINT(); - LINESTART(); - ADDTEXT( "object id: " ); - ADDHEX( 4 ); - PRINT(); - LINESTART(); - ADDTEXT( "num of DV recs: " ); - ADDDEC( 4 ); - PRINT(); - } - break; - case 0x01B6: // TXO - text box - { - LINESTART(); - rIn >> __nFlags; - STARTFLAG(); - switch( __nFlags & 0x000E ) - { - case 0x0002: ADDTEXT( " h-left" ); break; - case 0x0004: ADDTEXT( " h-center" ); break; - case 0x0006: ADDTEXT( " h-right" ); break; - case 0x0008: ADDTEXT( " h-block" ); break; - default: ADDTEXT( " *h-unknown*" ); - } - switch( __nFlags & 0x0070 ) - { - case 0x0010: ADDTEXT( " v-top" ); break; - case 0x0020: ADDTEXT( " v-center" ); break; - case 0x0030: ADDTEXT( " v-bottom" ); break; - case 0x0040: ADDTEXT( " v-block" ); break; - default: ADDTEXT( " *v-unknown*" ); - } - ADDFLAG( 0x0200, "lock-text" ); - ADDRESERVED( 0xFD81 ); - ADDTEXT( " orient=" ); - sal_uInt16 nOrient = rIn.ReaduInt16(); - __AddDec( t, nOrient ); - ADDTEXT( " (" ); - switch( nOrient ) - { - case 0: ADDTEXT( "no-rot" ); break; - case 1: ADDTEXT( "stacked" ); break; - case 2: ADDTEXT( "90\xB0 ccw" ); break; - case 3: ADDTEXT( "90\xB0 cw" ); break; - default: ADDTEXT( "!unknown!" ); - } - ADDTEXT( ")" ); - PRINT(); - LINESTART(); - ADDTEXT( "reserved=" ); - ADDHEX( 2 ); ADDTEXT( " " ); ADDHEX( 2 ); ADDTEXT( " " ); ADDHEX( 2 ); - ADDTEXT( " text-len=" ); ADDDEC( 2 ); - ADDTEXT( " format-size=" ); ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "reserved=" ); ADDHEX( 2 ); - sal_uInt16 nLinkSize = rIn.ReaduInt16(); - ADDTEXT( " link-size=" ); __AddDec( t, nLinkSize ); - PRINT(); - if( nLinkSize > 0 ) - { - LINESTART(); - sal_uInt16 nFmlaSize = rIn.ReaduInt16(); - ADDTEXT( "fmla-size=" ); __AddDec( t, nFmlaSize ); - ADDTEXT( " reserved=" ); ADDHEX( 4 ); - PRINT(); - FormulaDump( nFmlaSize, FT_CellFormula ); - } - } - break; - case 0x01BE: // DV - data validation record - { - UINT32 __nFlags; - rIn >> __nFlags; - LINESTART(); - STARTFLAG(); - ADDTEXT( " (" ); - __AddPureBin( t, __nFlags ); - ADDTEXT( ")" ); - PRINT(); - LINESTART(); - if( __nFlags ) - { - ADDTEXT( " " ); - ADDFLAG( 0x00000080, "fStrLookup" ); - ADDFLAG( 0x00000100, "fAllowBlank" ); - ADDFLAG( 0x00000200, "fSuppressCombo" ); - ADDFLAG( 0x00040000, "fShowInputMsg" ); - ADDFLAG( 0x00080000, "fShowErrorMsg" ); - } - PRINT(); - LINESTART(); - ADDTEXT( "error style: " ); - const char* pErrStyle[] = { "stop", "warning", "info", "4" }; - ADDTEXT( pErrStyle[ ( __nFlags >> 4 ) & 0x03 ] ); - PRINT(); - LINESTART(); - const char* pValType[] = - { - "all", "integer", "decimal", "list", "date", "time", "text len", "user", - "8", "9", "A", "B", "C", "D", "E", "F" - }; - LINESTART(); - ADDTEXT( "validation type: " ); - ADDTEXT( pValType[ __nFlags & 0x0000000F ] ); - PRINT(); - - const char* pOpType[] = - { - "between", "not between", "equal", "not equal", - "greater", "less", "greater or equal", "less or equal", - "8", "9", "A", "B", "C", "D", "E", "F" - }; - LINESTART(); - ADDTEXT( "operator type: " ); - ADDTEXT( pOpType[ ( __nFlags >> 20 ) & 0x0000000F ] ); - PRINT(); - - LINESTART(); - ADDTEXT( "Prompt Title: " ); - AddUNICODEString( t, rIn ); - PRINT(); - LINESTART(); - ADDTEXT( "Error Title: " ); - AddUNICODEString( t, rIn ); - PRINT(); - LINESTART(); - ADDTEXT( "Prompt Message: " ); - AddUNICODEString( t, rIn ); - PRINT(); - LINESTART(); - ADDTEXT( "Error Message: " ); - AddUNICODEString( t, rIn ); - PRINT(); - if( rIn.GetRecLeft() > 8 ) - { - UINT16 nLen; - rIn >> nLen; - LINESTART(); - ADDTEXT( "Len1: " ); - __AddDec( t, nLen ); - ADDTEXT( " (unknown1: " ); - ADDHEX( 2 ); - ADDTEXT( ")" ); - PRINT(); - FormulaDump( nLen, FT_RangeName ); - - rIn >> nLen; - LINESTART(); - ADDTEXT( "Len2: " ); - __AddDec( t, nLen ); - ADDTEXT( " (unknown2: " ); - ADDHEX( 2 ); - ADDTEXT( ")" ); - PRINT(); - FormulaDump( nLen, FT_RangeName ); - - LINESTART(); - ADDTEXT( "range count: " ); - ADDHEX( 2 ); - PRINT(); - } - - while( rIn.GetRecLeft() >= 8 ) - { - // Row-Row / Col-Col - UINT16 nR1, nR2, nC1, nC2; - rIn >> nR1 >> nR2 >> nC1 >> nC2; - LINESTART(); - AddRangeRef( t, nR1, nC1 | 0xC000, nR2, nC2 | 0xC000, FALSE ); - PRINT(); - } - } - break; - case 0x01B8: // HLINK - { - PreDump( nL ); - - UINT32 n1, n2; - LINESTART(); - PRINT(); - UINT16 nR1, nR2, nC1, nC2; - rIn >> nR1 >> nR2 >> nC1 >> nC2; - ADDTEXT( "Cellrange=" ); - lcl_AddRangeRef( t, nC1, nR1, nC2, nR2 ); - PRINT(); - LINESTART(); - ADDTEXT( "GUID StdLink=" ); __AddGUID( t, rIn ); - PRINT(); - LINESTART(); - ADDTEXT( " must=79EAC9D0-BAF9-11CE-8C82-00AA004BA90B" ); - PRINT(); - LINESTART(); - ADDTEXT( "unknown=" ); ADDHEX( 4 ); - PRINT(); - UINT32 __nFlags = Read4( rIn ); - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x00000001, "fBody" ); - ADDFLAG( 0x00000002, "fAbs" ); - ADDFLAG( 0x00000014, "fDescr" ); - ADDFLAG( 0x00000008, "fMark" ); - ADDFLAG( 0x00000080, "fFrame" ); - ADDFLAG( 0x00000100, "fUNC" ); - ADDRESERVED( 0xFFFFFE60 ); - PRINT(); - - //description - String aData; - if( __nFlags & 0x00000014 ) - { - LINESTART(); - rIn >> n1; - ADDTEXT( "## Description ## [l=" ); - __AddDec( t, n1 ); - ADDTEXT( "]: '" ); - aData = rIn.ReadRawUniString( (USHORT)(n1 - 1), TRUE ); - t += GETSTR( aData ); - ADDTEXT( "<" ); ADDHEX( 2 ); ADDTEXT( ">'" ); // trailing zero - PRINT(); - } - - // frame name - if( __nFlags & 0x00000080 ) - { - LINESTART(); - rIn >> n1; - ADDTEXT( "## Frame ## [l=" ); - __AddDec( t, n1 ); - ADDTEXT( "]: '" ); - aData = rIn.ReadRawUniString( (USHORT)(n1 - 1), TRUE ); - t += GETSTR( aData ); - ADDTEXT( "<" ); ADDHEX( 2 ); ADDTEXT( ">'" ); // trailing zero - PRINT(); - } - - // network path - if( __nFlags & 0x00000100 ) - { - LINESTART(); - rIn >> n1; - ADDTEXT( "## UNC ## [l=" ); - __AddDec( t, n1 ); - ADDTEXT( "]: '" ); - aData = rIn.ReadRawUniString( (USHORT)(n1 - 1), TRUE ); - t += GETSTR( aData ); - ADDTEXT( "<" ); ADDHEX( 2 ); ADDTEXT( ">'" ); // trailing zero - PRINT(); - } - - // file link or URL - else if( __nFlags & 0x00000001 ) - { - rIn.PushPosition(); - rIn >> n1; - rIn.PopPosition(); - LINESTART(); - ADDTEXT( "## Content GUID ## " ); - __AddGUID( t, rIn ); - switch( n1 ) - { - case 0x00000303: // file - { - ADDTEXT( " File Moniker" ); - PRINT(); - LINESTART(); - ADDTEXT( " must=00000303-0000-0000-C000-000000000046" ); - PRINT(); - LINESTART(); - ADDTEXT( "## File link ## up level=" ); - ADDDEC( 2 ); - rIn >> n2; - ADDTEXT( " [l=" ); __AddDec( t, n2 ); - ADDTEXT( ", 8-Bit]: '" ); - aData = rIn.ReadRawByteString( (USHORT)(n2 - 1) ); - t += GETSTR( aData ); - ADDTEXT( "<" ); ADDHEX( 1 ); ADDTEXT( ">'" ); // trailing zero - PRINT(); - ContDump( 24 ); - rIn >> n2; - LINESTART(); - ADDTEXT( "bytes left=" ); __AddDec( t, n2 ); - if( n2 ) - { - rIn >> n2; - LINESTART(); - ADDTEXT( " string byte count=" ); - __AddDec( t, n2 ); - ADDTEXT( " unknown=" ); - ADDHEX( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "[l=" ); - __AddDec( t, n2 / 2 ); - ADDTEXT( "]: '" ); - aData = rIn.ReadRawUniString( (USHORT)n2, TRUE ); - t += GETSTR( aData ); - ADDTEXT( "'" ); - } - PRINT(); - } - break; - case 0x79EAC9E0: // URL - { - ADDTEXT( " URL Moniker" ); - PRINT(); - LINESTART(); - ADDTEXT( " must=79EAC9E0-BAF9-11CE-8C82-00AA004BA90B" ); - PRINT(); - rIn >> n2; - LINESTART(); - ADDTEXT( "## URL ## string byte count=" ); - __AddDec( t, n2 ); - PRINT(); - LINESTART(); - ADDTEXT( "[l=" ); - __AddDec( t, n2 / 2 ); - ADDTEXT( "]: '" ); - aData = rIn.ReadRawUniString( (USHORT)(n2 / 2 - 1), TRUE ); - t += GETSTR( aData ); - ADDTEXT( "<" ); ADDHEX( 2 ); ADDTEXT( ">'" ); // trailing zero - PRINT(); - } - break; - default: - { - ADDTEXT( " (!!UNKNOWN!!)" ); - PRINT(); - } - break; - } - } - - // text mark - if( __nFlags & 0x00000008 ) - { - LINESTART(); - rIn >> n1; - ADDTEXT( "## Text mark ## [l=" ); - __AddDec( t, n1 ); - ADDTEXT( "]: '" ); - aData = rIn.ReadRawUniString( (USHORT)(n1 - 1), TRUE ); - t += GETSTR( aData ); - ADDTEXT( "<" ); ADDHEX( 2 ); ADDTEXT( ">'" ); // trailing zero - PRINT(); - } - } - break; - case 0x01BB: // SXFDBTYPE - SQL data type - { - ADDTEXT( "SQL data type: " ); ADDHEX( 2 ); - PRINT(); - } - break; - case 0x0201: - { - LINESTART(); - ADDCELLHEAD(); - PRINT(); - } - break; - case 0x0203: - { - LINESTART(); - ADDCELLHEAD(); - ADDTEXT( " val = " ); - ADDDOUBLE(); - PRINT(); - } - break; - case 0x0205: - { - LINESTART(); - ADDCELLHEAD(); - ADDTEXT( " val = " ); ADDHEX( 1 ); - ADDTEXT( " type = " ); ADDDEC( 1 ); - PRINT(); - } - break; - case 0x0208: // ROW - row info - { - LINESTART(); - ADDTEXT( "row #: " ); ADDDEC( 2 ); - ADDTEXT( " def. cols: " ); ADDDEC( 2 ); - ADDTEXT( "-" ); ADDDEC( 2 ); - ADDTEXT( " ht: " ); ADDDEC( 2 ); - ADDTEXT( " reserved: " ); ADDHEX( 4 ); - PRINT(); - rIn >> __nFlags; - LINESTART(); - STARTFLAG(); - ADDTEXT( " outlnlev=" ); - __AddDec( t, (UINT16)(__nFlags & 0x0007) ); - ADDFLAG( 0x0010, "fCollapsed" ); - ADDFLAG( 0x0020, "fRowHeightZero" ); - ADDFLAG( 0x0040, "fUnsynced" ); - ADDFLAG( 0x0080, "fGhostDirty" ); - ADDRESERVED( 0xFF08 ); - PRINT(); - UINT16 nXF; - rIn >> nXF; - LINESTART(); - ADDTEXT( "ix to XF: " ); __AddDec( t, (UINT16)(nXF & 0x0FFF) ); - ADDTEXT( " add. flags(" ); __AddHex( t, nXF ); - ADDTEXT( "):" ); - ADDFLAG( 0x1000, "fExAsc" ); - ADDFLAG( 0x2000, "fExDsc" ); - ADDRESERVED( 0xC000 ); - PRINT(); - } - break; - case 0x0021: // ARRAY - case 0x0221: - { - UINT16 nR1, nR2; - UINT8 nC1, nC2; - rIn >> nR1 >> nR2 >> nC1 >> nC2 >> __nFlags; - LINESTART(); - ADDTEXT( "range: " ); - lcl_AddRangeRef( t, nC1, nR1, nC2, nR2 ); - PRINT(); - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fAlwaysCalc" ); - ADDFLAG( 0x0002, "fCalcOnLoad" ); - ADDRESERVED( 0xFFFC ); - PRINT(); - LINESTART(); - ADDTEXT( "chn = " ); - ADDHEX( 4 ); - UINT16 n; - rIn >> n; - ADDTEXT( " cce = " ); - __AddDec( t, n ); - PRINT(); - FormulaDump( n, FT_SharedFormula ); - } - break; - case 0x0225: // DEFAULTROWHEIGHT - height & flags - { - rIn >> __nFlags; - LINESTART(); - ADDTEXT( "default row " ); - STARTFLAG(); - ADDFLAG( 0x0001, "fUnsynced" ); - ADDFLAG( 0x0002, "fRowHtZero" ); - ADDFLAG( 0x0004, "fExAsc" ); - ADDFLAG( 0x0008, "fExDsc" ); - ADDRESERVED( 0xFFF0 ); - PRINT(); - LINESTART(); - ADDTEXT( "default row height: " ); - ADDDEC( 2 ); - PRINT(); - } - break; - case 0x023E: // WINDOW2 - { - LINESTART(); - rIn >> __nFlags; - STARTFLAG(); - ADDFLAG( 0x0001, "show-formulas" ); - ADDFLAG( 0x0002, "show-grid" ); - ADDFLAG( 0x0004, "show-headers" ); - ADDFLAG( 0x0008, "frozen" ); - ADDFLAG( 0x0010, "show-zero" ); - ADDFLAG( 0x0020, "auto-grid-color" ); - ADDFLAG( 0x0040, "right-to-left" ); - ADDFLAG( 0x0080, "show-outline" ); - ADDFLAG( 0x0100, "remove-splits" ); - ADDFLAG( 0x0200, "sheet-selected" ); - ADDFLAG( 0x0400, "sheet-visible" ); - ADDFLAG( 0x0800, "show-pagebreak" ); - ADDRESERVED( 0xF000 ); - PRINT(); - LINESTART(); - ADDTEXT( "first-row=" ); ADDDEC( 2 ); - ADDTEXT( " first-col=" ); ADDDEC( 2 ); - ADDTEXT( " grid-color=" ); ADDDEC( 2 ); - ADDTEXT( " reserved=" ); ADDHEX( 2 ); - PRINT(); - // reallife: WINDOW2 in charts do not have teh following fields - if( rIn.GetRecLeft() >= 8 ) - { - LINESTART(); - ADDTEXT( "pagebreak-zoom=" ); ADDDEC( 2 ); - ADDTEXT( "% view-zoom=" ); ADDDEC( 2 ); - ADDTEXT( "% reserved=" ); ADDHEX( 4 ); - PRINT(); - } - } - break; - case 0x027E: - { - ADDCELLHEAD(); - ADDTEXT( " val = " ); - __AddRK( t, rIn.ReadInt32() ); - PRINT(); - } - break; - case 0x0293: // STYLE - { - LINESTART(); - sal_uInt16 nXF; - rIn >> nXF; - ADDTEXT( "xf-ref=" ); __AddHex( t, nXF ); - ADDTEXT( " (xf=#" ); __AddDec( t, static_cast< sal_uInt16 >( nXF & EXC_STYLE_XFMASK ) ); - if( ::get_flag( nXF, EXC_STYLE_BUILTIN ) ) - { - sal_uInt8 nStyleId, nLevel; - rIn >> nStyleId >> nLevel; - ADDTEXT( " builtin) style-id=" ); __AddDec( t, nStyleId ); - ADDTEXT( " (" ); - static const sal_Char* ppcStyles[] = { - "Normal", "RowLevel", "ColLevel", "Comma", "Currency", - "Percent", "Comma_0", "Currency_0", - "Hyperlink", "Followed_Hyperlink" }; - if( nStyleId < STATIC_TABLE_SIZE( ppcStyles ) ) - ADDTEXT( ppcStyles[ nStyleId ] ); - else - ADDTEXT( "!unknown!" ); - ADDTEXT( ") outline-level=" ); __AddDec( t, nLevel ); - } - else - { - ADDTEXT( ") name=" ); - AddUNICODEString( t, rIn ); - } - PRINT(); - } - break; - case 0x041E: - { - LINESTART(); - ADDTEXT( "Index: " ); ADDHEX( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "Format: " ); AddUNICODEString( t, rIn ); - PRINT(); - } - break; - case 0x04BC: - { - UINT16 nR1, nR2; - UINT8 nC1, nC2; - LINESTART(); - rIn >> nR1 >> nR2 >> nC1 >> nC2; - lcl_AddRangeRef( t, nC1, nR1, nC2, nR2 ); - PRINT(); - LINESTART(); - ADDTEXT( "reserved = " ); - __AddPureHex( t, Read2( rIn ) ); - UINT16 n; - rIn >> n; - ADDTEXT( " cce = " ); - __AddDec( t, n ); - PRINT(); - FormulaDump( n, FT_SharedFormula ); - } - break; - case 0x0803: // WEBQRYSETTINGS - web query: options - { - UINT16 nCnt; - LINESTART(); - ADDTEXT( "repeated recnum: " ); - ADDHEX( 2 ); - ADDTEXT( " unknown:" ); - for( nCnt = 0; nCnt < 3; nCnt++ ) - { - ADDTEXT( " " ); - ADDHEX( 2 ); - } - PRINT(); - LINESTART(); - rIn >> __nFlags; - STARTFLAG(); - ADDFLAG( 0x0001, "fImportPRE" ); - ADDFLAG( 0x0002, "fIgnoreSep" ); - ADDFLAG( 0x0004, "fUseSetting" ); - ADDFLAG( 0x0010, "fIgnoreDate" ); - ADDFLAG( 0x0020, "fWhatIsIt?" ); - ADDRESERVED( 0xFFC8 ); - PRINT(); - LINESTART(); - rIn >> __nFlags; - STARTFLAG(); - ADDFLAG( 0x0002, "fTables" ); - ADDRESERVED( 0xFFFD ); - PRINT(); - LINESTART(); - ADDTEXT( "unknown: " ); ADDHEX( 2 ); - ADDTEXT( " " ); ADDHEX( 2 ); - ADDTEXT( " " ); ADDHEX( 2 ); - ADDTEXT( " " ); ADDHEX( 2 ); - ADDTEXT( " " ); ADDHEX( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "refresh: " ); ADDDEC( 2 ); - ADDTEXT( " unknown: " ); ADDHEX( 2 ); - ADDTEXT( " " ); ADDHEX( 2 ); - PRINT(); - } - break; - case 0x0804: // WEBQRYTABLES - web query: selected tables - { - LINESTART(); - ADDTEXT( "repeated recnum: " ); ADDHEX( 2 ); - ADDTEXT( " unknown: " ); ADDHEX( 2 ); - PRINT(); - if( nL > 6 ) - { - LINESTART(); - ADDTEXT( "text: " ); - AddUNICODEString( t, rIn ); - PRINT(); - } - } - break; - case 0x0809: // BOF - { - rIn.DisableDecryption(); - LINESTART(); - ADDTEXT( "version number: " ); - ADDHEX( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "substream type: " ); - rIn >> mnSubstream; - __AddHex( t, mnSubstream ); - ADDTEXT( " (" ); - switch( mnSubstream ) - { - case 0x0005: p = "Workbook globals"; break; - case 0x0006: p = "Visual Basic module"; break; - case 0x0010: p = "Worksheet or dialog sheet"; break; - case 0x0020: p = "Chart"; break; - case 0x0040: p = "MS 4.0 Macro"; break; - case 0x0100: p = "Workspace file"; break; - default: p = pU; - } - ADDTEXT( p ); - ADDTEXT( ")" ); - PRINT(); - LINESTART(); - UINT16 n; - rIn >> n; - ADDTEXT( "build identifier: "); - __AddHex( t, n ); - ADDTEXT( " (=" ); - __AddDec( t, n ); - ADDTEXT( ")" ); - PRINT(); - - LINESTART(); - rIn >> n; - ADDTEXT( "build year: "); - __AddHex( t, n ); - ADDTEXT( " (=" ); - __AddDec( t, n ); - ADDTEXT( ")" ); - PRINT(); - - UINT32 __nFlags; - rIn >> __nFlags; - LINESTART(); - ADDTEXT( "file history " ); - STARTFLAG(); - if( __nFlags ) - { - ADDFLAG( 0x00000001, "fWin" ); - ADDFLAG( 0x00000002, "fRisc" ); - ADDFLAG( 0x00000004, "fBeta" ); - ADDFLAG( 0x00000008, "fWinAny" ); - ADDFLAG( 0x00000010, "fMacAny" ); - ADDFLAG( 0x00000020, "fBetaAny" ); - ADDFLAG( 0x00000100, "fRiscAny" ); - ADDRESERVED( 0xFFFFE0C0 ); - } - PRINT(); - - LINESTART(); - ADDTEXT( "lowest BIFF version: "); - ADDHEX( 4 ); - PRINT(); - } - break; - case 0x1002: // ChartChart - { - LINESTART(); - ADDTEXT( "Pos = " ); - ADD16P16(); - ADDTEXT( " / " ); - ADD16P16(); - ADDTEXT( " Size = " ); - ADD16P16(); - ADDTEXT( " / " ); - ADD16P16(); - PRINT(); - } - break; - case 0x1003: // ChartSeries - { - sal_uInt16 nCatType, nValType, nCatCnt, nValCnt, nBubType, nBubCnt; - rIn >> nCatType >> nValType >> nCatCnt >> nValCnt >> nBubType >> nBubCnt; - LINESTART(); - ADDTEXT( "category-type=" ); __AddDec( t, nCatType ); - ADDTEXT( " " ); ADDTEXT( GetSeriesType( nCatType ) ); - ADDTEXT( " count=" ); __AddDec( t, nCatCnt ); - PRINT(); - LINESTART(); - ADDTEXT( " value-type=" ); __AddDec( t, nValType ); - ADDTEXT( " " ); ADDTEXT( GetSeriesType( nValType ) ); - ADDTEXT( " count=" ); __AddDec( t, nValCnt ); - PRINT(); - LINESTART(); - ADDTEXT( " bubble-type=" ); __AddDec( t, nBubType ); - ADDTEXT( " " ); ADDTEXT( GetSeriesType( nBubType ) ); - ADDTEXT( " count=" ); __AddDec( t, nBubCnt ); - PRINT(); - } - break; - case 0x1006: // ChartDataformat - { - INT16 n; - LINESTART(); - rIn >> n; - ADDTEXT( "Point number = " ); - __AddDec( t, n ); - if( n == -1 ) - ADDTEXT( " (entire series)" ); - PRINT(); - LINESTART(); - ADDTEXT( "Series index = " ); - ADDDEC( 2 ); - ADDTEXT( " Series number = " ); - ADDDEC( 2 ); - if( Read2( rIn ) & 0x01 ) - ADDTEXT( " (fXL4iss)" ); - PRINT(); - } - break; - case 0x1007: // ChartLineform - { - LINESTART(); - ADDTEXT( "Color = " ); - ADDTEXT( GetRGB( Read4( rIn ) ) ); - ADDTEXT( " Pattern : " ); - ADDTEXT( GetLineType( Read2( rIn ) ) ); - switch( ( INT16 ) Read2( rIn ) ) - { - case -1: p = "hairline"; break; - case 0: p = "narrow (single)"; break; - case 1: p = "medium (double)"; break; - case 2: p = "wide (triple)"; break; - default: p = pU; - } - ADDTEXT( ", " ); - ADDTEXT( p ); - PRINT(); - rIn >> __nFlags; - if( __nFlags ) - { - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fAuto" ); - ADDFLAG( 0x0004, "fDrawTick" ); - PRINT(); - } - LINESTART(); - ADDTEXT( "color index = " ); - ADDDEC( 2 ); - PRINT(); - } - break; - case 0x1009: // ChartMarkerformat - { - UINT16 n; - LINESTART(); - ADDTEXT( "Fore = " ); - ADDTEXT( GetRGB( Read4( rIn ) ) ); - ADDTEXT( " Back = " ); - ADDTEXT( GetRGB( Read4( rIn ) ) ); - rIn >> n; - switch( n ) - { - case 0: p = "no marker"; break; - case 1: p = "square"; break; - case 2: p = "diamond"; break; - case 3: p = "triangle"; break; - case 4: p = "X"; break; - case 5: p = "star"; break; - case 6: p = "Dow-Jones"; break; - case 7: p = "std deviation"; break; - case 8: p = "circle"; break; - case 9: p = "plus sign"; break; - default: p = pU; - } - ADDTEXT( " Type = " ); - ADDTEXT( p ); - PRINT(); - rIn >> __nFlags; - if( __nFlags ) - { - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fAuto" ); - ADDFLAG( 0x0010, "fNoBackg" ); - ADDFLAG( 0x0020, "fNoFore" ); - ADDRESERVED( 0xFFCE ); - PRINT(); - } - LINESTART(); - ADDTEXT( "border color = " ); - ADDDEC( 2 ); - ADDTEXT( " fill color = " ); - ADDDEC( 2 ); - ADDTEXT( " size = " ); - ADDDEC(4); - PRINT(); - } - break; - case 0x100A: // ChartAreaformat - { - LINESTART(); - ADDTEXT( "Fore = " ); - ADDTEXT( GetRGB( Read4( rIn ) ) ); - ADDTEXT( " Back = " ); - ADDTEXT( GetRGB( Read4( rIn ) ) ); - ADDTEXT( " Pattern = " ); - UINT16 n; - rIn >> n >> __nFlags; - __AddDec( t, n ); - ADDTEXT( " (" ); - __AddHex( t, n ); - ADDTEXT( ")" ); - PRINT(); - if( __nFlags ) - { - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x01, "fAuto" ); - ADDFLAG( 0x02, "fInvertNeg" ); - PRINT(); - } - } - LINESTART(); - ADDTEXT( "color index fore = " ); - ADDDEC( 2 ); - ADDTEXT( ", back = " ); - ADDDEC( 2 ); - PRINT(); - break; - case 0x100B: // ChartPieformat - LINESTART(); - ADDDEC( 2 ); - ADDTEXT( "%" ); - PRINT(); - break; - case 0x100C: // ChartAttachedlabel - ContDump( nL ); - break; - case 0x100D: // ChartSeriestext - ContDump( nL ); - break; - case 0x1014: // ChartChartformat - { - ContDump( 16 ); - LINESTART(); - rIn >> __nFlags; - if( __nFlags ) - { - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fVaried" ); - PRINT(); - } - LINESTART(); - ADDTEXT( "drawing order = " ); - ADDDEC( 2 ); - PRINT(); - } - break; - case 0x1015: // ChartLegend - { - UINT32 nX, nY, nDx, nDy; - UINT8 nWType, nWSpacing; - rIn >> nX >> nY >> nDx >> nDy >> nWType >> nWSpacing >> __nFlags; - LINESTART(); - __AddDec( t, nX ); - ADDTEXT( " / " ); - __AddDec( t, nY ); - ADDTEXT( " [" ); - __AddDec( t, nDx ); - ADDTEXT( " / " ); - __AddDec( t, nDy ); - ADDTEXT( "]" ); - PRINT(); - LINESTART(); - ADDTEXT( " Type: " ); - switch( nWType ) - { - case 0: p = "bottom"; break; - case 1: p = "corner"; break; - case 2: p = "top"; break; - case 3: p = "right"; break; - case 4: p = "left"; break; - case 7: p = "not docked or inside the plot area"; break; - default: p = pU; - } - ADDTEXT( p ); - ADDTEXT( " Spacing: " ); - switch( nWSpacing ) - { - case 0: p = "close"; break; - case 1: p = "medium"; break; - case 2: p = "open"; break; - default: p = pU; - } - ADDTEXT( p ); - PRINT(); - if( __nFlags ) - { - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x01, "fAutoPosition" ); - ADDFLAG( 0x02, "fAutoSeries" ); - ADDFLAG( 0x04, "fAutoPosX" ); - ADDFLAG( 0x08, "fAutoPosY" ); - ADDFLAG( 0x10, "fVert" ); - ADDFLAG( 0x20, "fWasDataTable" ); - PRINT(); - } - } - break; - case 0x1016: // ChartSerieslist - ContDump( nL ); - break; - case 0x1017: // ChartBar - { - LINESTART(); - ADDTEXT( "space betw. bars = " ); - ADDDEC( 2 ); - ADDTEXT( " space betw. cat = " ); - ADDDEC( 2 ); - PRINT(); - rIn >> __nFlags; - if( __nFlags ) - { - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fTranspose" ); - ADDFLAG( 0x0002, "fStacked" ); - ADDFLAG( 0x0004, "f100" ); - ADDFLAG( 0x0008, "fHasShadow" ); - PRINT(); - } - } - break; - case 0x1018: // ChartLine - ContDump( nL ); - break; - case 0x1019: // ChartPie - ContDump( nL ); - break; - case 0x101A: // ChartArea - ContDump( nL ); - break; - case 0x101C: // ChartLine - ContDump( nL ); - break; - case 0x101D: // ChartAxis - { - static const sal_Char* const ppcIds[] = { "x-axis", "y-axis", "z-axis" }; - LINESTART(); - sal_uInt16 nAxisId = rIn.ReaduInt16(); - ADDTEXT( "axis-id=" ); __AddDec( t, nAxisId ); - lcl_AddEnum( t, nAxisId, ppcIds, STATIC_TABLE_SIZE( ppcIds ) ); - PRINT(); - ContDump( 16 ); - } - break; - case 0x101E: // CHTICK - { - static const sal_Char* const ppcTickMode[] = { "off", "inside", "outside", "cross" }; - static const sal_Char* const ppcTickPos[] = { "off", "low", "high", "next-to-axis" }; - static const sal_Char* const ppcText[] = { "transparent", "opaque" }; - LINESTART(); - sal_uInt8 nMajor, nMinor, nPos, nText; - rIn >> nMajor >> nMinor >> nPos >> nText; - ADDTEXT( "major=" ); __AddDec( t, nMajor ); - lcl_AddEnum( t, nMajor, ppcTickMode, STATIC_TABLE_SIZE( ppcTickMode ) ); - ADDTEXT( " minor=" ); __AddDec( t, nMinor ); - lcl_AddEnum( t, nMinor, ppcTickMode, STATIC_TABLE_SIZE( ppcTickMode ) ); - PRINT(); - LINESTART(); - ADDTEXT( "position=" ); __AddDec( t, nPos ); - lcl_AddEnum( t, nPos, ppcTickPos, STATIC_TABLE_SIZE( ppcTickPos ) ); - ADDTEXT( " text-mode=" ); __AddDec( t, nText ); - lcl_AddEnum( t, nText, ppcText, STATIC_TABLE_SIZE( ppcText ) ); - ADDTEXT( " text-color=" ); - ADDTEXT( GetRGB( Read4( rIn ) ) ); - PRINT(); - LINESTART(); - ADDTEXT( "reserved=" ); ADDHEX( 4 ); - ADDTEXT( "," ); ADDHEX( 4 ); - ADDTEXT( "," ); ADDHEX( 4 ); - ADDTEXT( "," ); ADDHEX( 4 ); - PRINT(); - rIn >> __nFlags; - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fAutoCol" ); - ADDFLAG( 0x0002, "fAutoBack" ); - ADDFLAG( 0x0020, "fAutoRot" ); - ADDRESERVED( 0xFFDC ); - PRINT(); - LINESTART(); - ADDTEXT( "color=" ); ADDDEC( 2 ); - ADDTEXT( " rotation=" ); ADDDEC( 2 ); - PRINT(); - } - break; - case 0x101F: // CHVALUERANGE - { - LINESTART(); - ADDTEXT( "min=" ); ADDDOUBLE(); - ADDTEXT( " max=" ); ADDDOUBLE(); - ADDTEXT( " major=" ); ADDDOUBLE(); - ADDTEXT( " minor=" ); ADDDOUBLE(); - ADDTEXT( " axis-cross=" ); ADDDOUBLE(); - PRINT(); - rIn >> __nFlags; - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fAutoMin" ); - ADDFLAG( 0x0002, "fAutoMax" ); - ADDFLAG( 0x0004, "fAutoMajor" ); - ADDFLAG( 0x0008, "fAutoMinor" ); - ADDFLAG( 0x0010, "fAutoCross" ); - ADDFLAG( 0x0020, "fLogScale" ); - ADDFLAG( 0x0040, "fReverse" ); - ADDFLAG( 0x0080, "fMaxCross" ); - ADDRESERVED( 0xFF00 ); - PRINT(); - } - break; - case 0x1020: // CHEXTRANGE - { - LINESTART(); - ADDTEXT( "axis-cross=" ); ADDDEC( 2 ); - ADDTEXT( " label-freq=" ); ADDDEC( 2 ); - ADDTEXT( " mark-freq=" ); ADDDEC( 2 ); - PRINT(); - rIn >> __nFlags; - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fBetween" ); - ADDFLAG( 0x0002, "fMaxCross" ); - ADDFLAG( 0x0004, "fReverse" ); - ADDRESERVED( 0xFFF8 ); - PRINT(); - } - break; - case 0x1021: // ChartAxislineformat - { - LINESTART(); - switch( Read2( rIn ) ) - { - case 0: p = "axis line itself"; break; - case 1: p = "major grid line"; break; - case 2: p = "minor grid line"; break; - case 3: p = "walls or floor"; break; - default: p = pU; - } - ADDTEXT( p ); - PRINT(); - } - break; - case 0x1022: // CHARTFORMATLINK - ContDump( nL ); - break; - case 0x1024: // ChartDefaulttext - ContDump( nL ); - break; - case 0x1025: // ChartText - { - LINESTART(); - UINT8 nAt, nVat; - UINT16 nBkgMode; - INT32 nX, nY, nDx, nDy; - UINT16 nGrbit2, nIcvText; - INT16 nTrot; - rIn >> nAt >> nVat >> nBkgMode; - ADDTEXT( "h = " ); - switch( nAt ) - { - case 1: p = "left"; break; - case 2: p = "center"; break; - case 3: p = "right"; break; - case 4: p = "justify"; break; - case 5: p = "distribute"; break; - default: p = pU; - } - ADDTEXT( p ); - ADDTEXT( " v = " ); - switch( nVat ) - { - case 1: p = "top"; break; - case 2: p = "center"; break; - case 3: p = "bottom"; break; - case 4: p = "justify"; break; - case 5: p = "distribute"; break; - default: p = pU; - } - ADDTEXT( p ); - ADDTEXT( " mode = " ); - if( nBkgMode == 1 ) - ADDTEXT( "transparent" ); - else if( nBkgMode == 2 ) - ADDTEXT( "opaque" ); - else - ADDTEXT( pU ); - PRINT(); - LINESTART(); - ADDTEXT( "color = " ); - ADDTEXT( GetRGB( Read4( rIn ) ) ); - rIn >> nX >> nY >> nDx >> nDy >> __nFlags >> nIcvText >> nGrbit2 >> nTrot; - ADDTEXT( " pos[size] = " ); - __AddDec( t, nX ); - ADDTEXT( " / " ); - __AddDec( t, nY ); - ADDTEXT( " [" ); - __AddDec( t, nDx ); - ADDTEXT( " / " ); - __AddDec( t, nDy ); - ADDTEXT( "]" ); - PRINT(); - LINESTART(); - ADDTEXT( " (pos[size] = " ); - __AddHex( t, nX ); - ADDTEXT( " / " ); - __AddHex( t, nY ); - ADDTEXT( " [" ); - __AddHex( t, nDx ); - ADDTEXT( " / " ); - __AddHex( t, nDy ); - ADDTEXT( "])" ); - PRINT(); - if( __nFlags ) - { - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fAutoColor" ); - ADDFLAG( 0x0002, "fShowKey" ); - ADDFLAG( 0x0004, "fShowValue" ); - ADDFLAG( 0x0008, "fVert" ); - ADDFLAG( 0x0010, "fAutoText" ); - ADDFLAG( 0x0020, "fGenerated" ); - ADDFLAG( 0x0040, "fDeleted" ); - ADDFLAG( 0x0080, "fAutoMode" ); - ADDFLAG( 0x0800, "fShLabPct" ); - ADDFLAG( 0x1000, "fShowPct" ); - ADDFLAG( 0x2000, "fShowBubbleSizes" ); - ADDFLAG( 0x4000, "fShowLabel" ); - PRINT(); - } - LINESTART(); - ADDTEXT( "rot = " ); - switch( __nFlags & 0x0700 ) - { - case 0x0000: p = "no rotation"; break; - case 0x0100: p = "top to bottom, upright"; break; - case 0x0200: p = "90 deg counterclockwise"; break; - case 0x0300: p = "90 deg clockwise"; break; - default: p = pU; - } - ADDTEXT( p ); - ADDTEXT( " trot = " ); - __AddDec( t, nTrot ); - PRINT(); - LINESTART(); - ADDTEXT( "text color = " ); - __AddDec( t, nIcvText ); - PRINT(); - LINESTART(); - ADDTEXT( "placement: " ); - switch( nGrbit2 & 0x000F ) - { - case 0: p = "0 default"; break; - case 1: p = "outside"; break; - case 2: p = "inside"; break; - case 3: p = "center"; break; - case 4: p = "axis"; break; - case 5: p = "above"; break; - case 6: p = "below"; break; - case 7: p = "left"; break; - case 8: p = "right"; break; - case 9: p = "auto"; break; - case 10: p = "moved"; break; - default: p = pU; - } - ADDTEXT( p ); - PRINT(); - } - break; - case 0x1026: // ChartFontx - ContDump( nL ); - break; - case 0x1027: // CHOBJECTLINK - { - static const sal_Char* const ppcObjLink[] = { 0, "title", "y-axis", "x-axis", "data", "legend", "none", "z-axis" }; - LINESTART(); - sal_uInt16 nObjLink; - rIn >> nObjLink; - ADDTEXT( "link=" ); __AddDec( t, nObjLink ); - lcl_AddEnum( t, nObjLink, ppcObjLink, STATIC_TABLE_SIZE( ppcObjLink ) ); - ADDTEXT( " series=" ); ADDDEC( 2 ); - ADDTEXT( " point=" ); ADDDEC( 2 ); - PRINT(); - } - break; - case 0x1032: // ChartFrame - { - LINESTART(); - switch( Read2( rIn ) ) - { - case 0: p = "no border"; break; - case 1: - case 2: - case 3: p = "reserved"; break; - case 4: p = "with shadow"; break; - default: p = pU; - } - ADDTEXT( "Frame type: " ); - ADDTEXT( p ); - PRINT(); - rIn >> __nFlags; - if( __nFlags ) - { - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x01, "fAutoSize" ); - ADDFLAG( 0x02, "fAutoPosition" ); - PRINT(); - } - } - break; - case 0x1035: // ChartPlotarea - ContDump( nL ); - break; - case 0x103A: // Chart3D - ContDump( nL ); - break; - case 0x103C: // ChartPicf - LINESTART(); - ADDTEXT( "bmp-mode=" ); ADDDEC( 2 ); - ADDTEXT( " format=" ); ADDDEC( 2 ); - ADDTEXT( " flags=" ); ADDHEX( 2 ); - ADDTEXT( " scale=" ); ADDDOUBLE(); - PRINT(); - break; - case 0x103D: // ChartDropbar - ContDump( nL ); - break; - case 0x103E: // ChartRadar - ContDump( nL ); - break; - case 0x103F: // ChartSurface - ContDump( nL ); - break; - case 0x1040: // ChartRadararea - ContDump( nL ); - break; - case 0x1041: // ChartAxisparent - { - LINESTART(); - switch( Read2( rIn ) ) - { - case 0: p = "main"; break; - case 1: p = "secondary"; break; - default: p = pU; - } - ADDTEXT( "Index: " ); - ADDTEXT( p ); - ADDTEXT( " " ); - ADDDEC(4); - ADDTEXT( '/' ); - ADDDEC(4); - ADDTEXT( " [" ); - ADDDEC(4); - ADDTEXT( '/' ); - ADDDEC(4); - ADDTEXT( ']' ); - PRINT(); - } - break; - case 0x1043: // ChartLegendxn - ContDump( nL ); - break; - case 0x1044: // ChartShtprops - ContDump( nL ); - break; - case 0x1045: // ChartSertocrt - ContDump( nL ); - break; - case 0x1046: // ChartAxesused - { - LINESTART(); - ADDTEXT( "Used : " ); - ADDDEC( 2 ); - PRINT(); - } - break; - case 0x1048: // ChartSbaseref - ContDump( nL ); - break; - case 0x104A: // CHSERPARENT - LINESTART(); - ADDTEXT( "parent-index=" ); ADDDEC( 2 ); - ADDTEXT( " (one-based)" ); - PRINT(); - break; - case 0x104B: // CHSERTRENDLINE - { - static const sal_Char* const ppcType[] = - { "poynomial", "exponential", "logarithmic", "power", "moving-avg" }; - sal_uInt8 nType; - rIn >> nType; - LINESTART(); - ADDTEXT( "line-type=" ); __AddDec( t, nType ); - lcl_AddEnum( t, nType, ppcType, STATIC_TABLE_SIZE( ppcType ) ); - ADDTEXT( " order=" ); ADDDEC( 1 ); - ADDTEXT( " intercept=" ); ADDDOUBLE(); - PRINT(); - LINESTART(); - ADDTEXT( "show-equation=" ); ADDDEC( 1 ); - ADDTEXT( " show-r-sqr=" ); ADDDEC( 1 ); - PRINT(); - LINESTART(); - ADDTEXT( "forecast-for=" ); ADDDOUBLE(); - ADDTEXT( " forecast-back=" ); ADDDOUBLE(); - PRINT(); - } - break; - case 0x104E: // ChartIfmt - ContDump( nL ); - break; - case 0x104F: // ChartPos - { - LINESTART(); - UINT16 nMdTopLt, nMdBotRt; - INT32 nX, nY, nDx, nDy; - rIn >> nMdTopLt >> nMdBotRt >> nX >> nY >> nDx >> nDy; - ADDTEXT( "TopLr = " ); - __AddDec( t, nMdTopLt ); - ADDTEXT( " BotRt = " ); - __AddDec( t, nMdBotRt ); - PRINT(); - LINESTART(); - __AddDec( t, nX ); - ADDTEXT( " / " ); - __AddDec( t, nY ); - ADDTEXT( " [" ); - __AddDec( t, nDx ); - ADDTEXT( " / " ); - __AddDec( t, nDy ); - ADDTEXT( "]" ); - PRINT(); - } - break; - case 0x1050: // ChartAlruns - ContDump( nL ); - break; - case 0x1051: // AI - { - LINESTART(); - UINT8 n8 = Read1( rIn ); - switch( n8 ) - { - case 0: p = "title or text"; break; - case 1: p = "values"; break; - case 2: p = "categories"; break; - case 3: p = "bubble sizes"; break; - default: p = pU; - } - ADDTEXT( "Link index identifier: " ); - ADDTEXT( p ); - if ( p == pU ) - __AddHex( t, n8 ); - PRINT(); - LINESTART(); - switch( Read1( rIn ) ) - { - case 0: p = "default categories"; break; - case 1: p = "text or value"; break; - case 2: p = "linked to worksheet"; break; - case 3: p = "not used (HaHaHa...)"; break; - case 4: p = "error reported"; break; - default: p = pU; - } - ADDTEXT( "Refernce type: " ); - ADDTEXT( p ); - PRINT(); - rIn >> __nFlags; - if( __nFlags ) - { - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x01, "fCustomIfmt" ); - PRINT(); - } - LINESTART(); - ADDTEXT( "Numberformat = " ); - ADDDEC( 2 ); - PRINT(); - LINESTART(); - UINT16 n; - rIn >> n; - ADDTEXT( "Formula [" ); - __AddDec( t, n ); - ADDTEXT( "]: ---------------- " ); - PRINT(); - FormulaDump( n, FT_CellFormula ); - } - break; - case 0x105B: // CHSERERRORBAR - { - static const sal_Char* const ppcType[] = { 0, "x-plus", "x-minus", "y-plus", "y-minus" }; - static const sal_Char* const ppcSource[] = { 0, "percent", "fixed", "std-dev", "custom", "std-error" }; - static const sal_Char* const ppcLineEnd[] = { "blank", "t-shape" }; - sal_uInt8 nType, nSource, nLineEnd; - rIn >> nType >> nSource >> nLineEnd; - LINESTART(); - ADDTEXT( "bar-type=" ); __AddDec( t, nType ); - lcl_AddEnum( t, nType, ppcType, STATIC_TABLE_SIZE( ppcType ) ); - ADDTEXT( " value-source=" ); __AddDec( t, nSource ); - lcl_AddEnum( t, nSource, ppcSource, STATIC_TABLE_SIZE( ppcSource ) ); - ADDTEXT( " line-end=" ); __AddDec( t, nLineEnd ); - lcl_AddEnum( t, nLineEnd, ppcLineEnd, STATIC_TABLE_SIZE( ppcLineEnd ) ); - PRINT(); - LINESTART(); - ADDTEXT( "reserved=" ); ADDHEX( 1 ); - ADDTEXT( " value=" ); ADDDOUBLE(); - ADDTEXT( " ref-count=" ); ADDDEC( 2 ); - PRINT(); - } - break; - case 0x105D: // ChartSerfmt - ContDump( nL ); - break; - case 0x105F: // Chart3DDataForm - { - UINT8 nGround, nTop; - nGround = Read1( rIn ); - nTop = Read1( rIn ); - UINT16 nStyle = ((UINT16)nGround << 8) | nTop; - LINESTART(); - ADDTEXT( "3D - format (" ); - __AddHex( t, nGround ); - ADDTEXT( " " ); - __AddHex( t, nTop ); - ADDTEXT( "): " ); - switch( nStyle ) - { - case 0x0000: ADDTEXT( "bar" ); break; - case 0x0001: ADDTEXT( "pyramid" ); break; - case 0x0002: ADDTEXT( "pyramid, cut" ); break; - case 0x0100: ADDTEXT( "cylinder" ); break; - case 0x0101: ADDTEXT( "cone" ); break; - case 0x0102: ADDTEXT( "cone, cut" ); break; - default: ADDTEXT( pU ); - } - PRINT(); - } - break; - case 0x1060: // ChartFbi - { - LINESTART(); - ADDTEXT( "dmixBasis = " ); - ADDDEC( 2 ); - ADDTEXT( " dmiyBasis = " ); - ADDDEC( 2 ); - ADDTEXT( " twpHeightBasis = " ); - ADDDEC( 2 ); - ADDTEXT( " scab = " ); - ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "ifnt = " ); - ADDDEC( 2 ); - PRINT(); - } - break; - case 0x1061: // ChartBoppop - ContDump( nL ); - break; - case 0x1062: // ChartAxcext - { - LINESTART(); - ADDTEXT( "cat on axis: " ); - ADDDEC( 2 ); - ADDTEXT( " ... " ); - ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "major unit: val = " ); - ADDDEC( 2 ); - ADDTEXT( " units = " ); - ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "minor unit: val = " ); - ADDDEC( 2 ); - ADDTEXT( " units = " ); - ADDDEC( 2 ); - PRINT(); - LINESTART(); - ADDTEXT( "base unit = " ); - ADDDEC( 2 ); - ADDTEXT( " crossing point of val axis = " ); - ADDDEC( 2 ); - PRINT(); - rIn >> __nFlags; - if( __nFlags ) - { - LINESTART(); - STARTFLAG(); - ADDFLAG( 0x0001, "fAutoMin" ); - ADDFLAG( 0x0002, "fAutoMax" ); - ADDFLAG( 0x0004, "fAutoMajor" ); - ADDFLAG( 0x0008, "fAutoMinor" ); - ADDFLAG( 0x0010, "fDateAxis" ); - ADDFLAG( 0x0020, "fAutoBase" ); - ADDFLAG( 0x0040, "fAutoCross" ); - ADDFLAG( 0x0080, "fAutoDate" ); - PRINT(); - } - } - break; - case 0x1063: // ChartDat - ContDump( nL ); - break; - case 0x1064: // ChartPlotgrowth - { - UINT32 nDx, nDy; - rIn >> nDx >> nDy; - LINESTART(); - ADDTEXT( "dxPlotGrowth = " ); - __Add16p16( t, nDx ); - ADDTEXT( " (" ); - __AddHex( t, nDx ); - ADDTEXT( ") dyPlotGrowth = " ); - __Add16p16( t, nDy ); - ADDTEXT( " (" ); - __AddHex( t, nDy ); - ADDTEXT( ")" ); - PRINT(); - } - break; - case 0x1065: // ChartSiindex - ContDump( nL ); - break; - case 0x1066: // ChartGelframe - EscherDump( nL, false ); - break; - case 0x1067: // ChartBoppcustom - ContDump( nL ); - break; - default: - if( !bEncrypted ) - ContDump( nL ); - } - - } - - if( nR == EXC_ID_FILEPASS ) - { - bEncrypted = true; - pIn->Seek( EXC_REC_SEEK_TO_BEGIN ); - bool bValid = (XclImpDecryptHelper::ReadFilepass( *pIn ) == ERRCODE_NONE); - LINESTART(); - ADDTEXT( "decrypter=" ); lcl_AddOnOff( t, bValid ); - PRINT(); - bBIFF8 = bBIFF8 && bValid; // dump BIFF8 hex only on invalid decrypter - } - - if( bDec ) - pLevelPre -= nLevelInc; -} - - -static const sal_Char* GetBlipType( UINT8 n ) -{ - switch ( n ) - { - case 0 : - return " ERROR"; - break; - case 1 : - return " UNKNOWN"; - break; - case 2 : - return " EMF"; - break; - case 3 : - return " WMF"; - break; - case 4 : - return " PICT"; - break; - case 5 : - return " JPEG"; - break; - case 6 : - return " PNG"; - break; - case 7 : - return " DIB"; - break; - default: - if ( n < 32 ) - return " NotKnown"; - else - return " Client"; - } -} - -void Biff8RecDumper::EscherDump( const ULONG nMaxLen, bool bDumpOffset ) -{ - ULONG n = nMaxLen; - UINT16 nPre, nR; - UINT32 nL; - const sal_Char* p; - ByteString aT; - UINT16 nDumpSize; - - aT += pLevelPre; - - ULONG nStartPos = pIn->GetSvStreamPos(); - while( pIn->IsValid() && (n > 0) ) - { - ULONG nCurrPos = pIn->GetSvStreamPos(); - *pIn >> nPre >> nR >> nL; - n -= sizeof( nPre ) + sizeof( nR ) + sizeof( nL ); - - switch( nR ) - { - case 0xF000: p = "MsofbtDggContainer"; break; - case 0xF006: p = "MsofbtDgg"; break; - case 0xF016: p = "MsofbtCLSID"; break; - case 0xF00B: p = "MsofbtOPT"; break; - case 0xF11A: p = "MsofbtColorMRU"; break; - case 0xF11E: p = "MsofbtSplitMenuColors"; break; - case 0xF001: p = "MsofbtBstoreContainer"; break; - case 0xF007: p = "MsofbtBSE"; break; - case 0xF002: p = "MsofbtDgContainer"; break; - case 0xF008: p = "MsofbtDg"; break; - case 0xF118: p = "MsofbtRegroupItem"; break; - case 0xF120: p = "MsofbtColorScheme"; break; - case 0xF003: p = "MsofbtSpgrContainer"; break; - case 0xF004: p = "MsofbtSpContainer"; break; - case 0xF009: p = "MsofbtSpgr"; break; - case 0xF00A: p = "MsofbtSp"; break; - case 0xF00C: p = "MsofbtTextbox"; break; - case 0xF00D: p = "MsofbtClientTextbox"; break; - case 0xF00E: p = "MsofbtAnchor"; break; - case 0xF00F: p = "MsofbtChildAnchor"; break; - case 0xF010: p = "MsofbtClientAnchor"; break; - case 0xF011: p = "MsofbtClientData"; break; - case 0xF11F: p = "MsofbtOleObject"; break; - case 0xF11D: p = "MsofbtDeletedPspl"; break; - case 0xF005: p = "MsofbtSolverContainer"; break; - case 0xF012: p = "MsofbtConnectorRule"; break; - case 0xF013: p = "MsofbtAlignRule"; break; - case 0xF014: p = "MsofbtArcRule"; break; - case 0xF015: p = "MsofbtClientRule"; break; - case 0xF017: p = "MsofbtCalloutRule"; break; - case 0xF119: p = "MsofbtSelection"; break; - case 0xF122: p = "MsofbtUDefProp"; break; - default: - if( nR >= 0xF018 && nR <= 0xF117 ) - p = "MsofbtBLIP"; - else if ( ( nPre & 0x000F ) == 0x000F ) - p = "UNKNOWN container"; - else - p = "UNKNOWN ID"; - } - - aT += " "; - __AddHex( aT, nR ); - ((aT += " ") += p) += " ["; - __AddHex( aT, nPre ); - aT += ','; - __AddHex( aT, nL ); - aT += "] instance: "; - __AddDec( aT, (UINT16)(nPre >> 4) ); - if( bDumpOffset ) - { - aT.Append( " pos=" ); - __AddHex( aT, static_cast< sal_uInt32 >( mnEscherPos + nCurrPos - nStartPos ) ); - } - Print( aT ); - - if ( nR == 0xF007 && 36 <= n && 36 <= nL ) - { // BSE, FBSE - ULONG nP = pIn->GetRecPos(); - UINT8 n8; - UINT16 n16; - UINT32 n32; - - aT = " btWin32: "; - *pIn >> n8; - __AddHex( aT, n8 ); - aT += GetBlipType( n8 ); - aT += " btMacOS: "; - *pIn >> n8; - __AddHex( aT, n8 ); - aT += GetBlipType( n8 ); - Print( aT ); - - aT = " rgbUid:"; - Print( aT ); - ContDump( 16 ); - - aT = " tag: "; - *pIn >> n16; - __AddHex( aT, n16 ); - Print( aT ); - - aT = " size: "; - *pIn >> n32; - __AddHex( aT, n32 ); - Print( aT ); - - aT = " cRef: "; - *pIn >> n32; - __AddHex( aT, n32 ); - Print( aT ); - - aT = " offs: "; - *pIn >> n32; - __AddHex( aT, n32 ); - Print( aT ); - - aT = " usage: "; - *pIn >> n8; - __AddHex( aT, n8 ); - aT += " cbName: "; - *pIn >> n8; - __AddHex( aT, n8 ); - aT += " unused2: "; - *pIn >> n8; - __AddHex( aT, n8 ); - aT += " unused3: "; - *pIn >> n8; - __AddHex( aT, n8 ); - Print( aT ); - - n -= pIn->GetRecPos() - nP; - nL = 0; // loop to MsofbtBLIP - } - else if ( nR == 0xF00F && 0x10 <= n && 0x10 <= nL ) - { // ChildAnchor - ULONG nP = pIn->GetRecPos(); - sal_Int32 n32; - - aT.Assign( " pos1=" ); - *pIn >> n32; lclAppendDec( aT, n32 ); - aT.Append( " pos2=" ); - *pIn >> n32; lclAppendDec( aT, n32 ); - aT.Append( " pos3=" ); - *pIn >> n32; lclAppendDec( aT, n32 ); - aT.Append( " pos4=" ); - *pIn >> n32; lclAppendDec( aT, n32 ); - Print( aT ); - - ULONG nC = pIn->GetRecPos() - nP; - n -= nC; - nL -= nC; - } - else if ( nR == 0xF010 && 0x12 <= n && 0x12 <= nL ) - { // ClientAnchor - ULONG nP = pIn->GetRecPos(); - UINT16 n16; - - aT = " Flag: "; - *pIn >> n16; - __AddHex( aT, n16 ); - if( n16 & 0x0001 ) aT += " -fixedpos"; - if( n16 & 0x0002 ) aT += " -fixedsize"; - Print( aT ); - - aT = " Col1: "; - *pIn >> n16; - __AddHex( aT, n16 ); - aT += " dX1: "; - *pIn >> n16; - __AddHex( aT, n16 ); - aT += " Row1: "; - *pIn >> n16; - __AddHex( aT, n16 ); - aT += " dY1: "; - *pIn >> n16; - __AddHex( aT, n16 ); - Print( aT ); - - aT = " Col2: "; - *pIn >> n16; - __AddHex( aT, n16 ); - aT += " dX2: "; - *pIn >> n16; - __AddHex( aT, n16 ); - aT += " Row2: "; - *pIn >> n16; - __AddHex( aT, n16 ); - aT += " dY2: "; - *pIn >> n16; - __AddHex( aT, n16 ); - Print( aT ); - - ULONG nC = pIn->GetRecPos() - nP; - n -= nC; - nL -= nC; - } - else if ( nR == 0xF00A ) - { - sal_uInt32 nId, nFlags; - *pIn >> nId >> nFlags; - aT.Assign( " shape-id=" ); - __AddHex( aT, nId ); - aT.Append( " flags=" ); - __AddHex( aT, nFlags ); - Print( aT ); - nL -= 8; n -= 8; - } - else if ( nR == 0xF00B || nR == 0xF122 ) - { // OPT - sal_uInt32 nComplex = 0; - while ( nL >= 6 + nComplex && n >= 6 + nComplex ) - { - UINT16 n16; - UINT32 n32; - *pIn >> n16 >> n32; - nL -= 6; n -= 6; - aT = " "; - __AddHex( aT, n16 ); - aT += " ("; - __AddDec( aT, n16 & 0x3FFF, 5 ); - if ( (n16 & 0x8000) == 0 ) - { - if ( n16 & 0x4000 ) - aT += ", fBlipID"; - aT += ") "; - __AddHex( aT, n32 ); - if ( (n16 & 0x4000) == 0 ) - { - aT += " ("; - __AddDec1616( aT, n32 ); - aT += ')'; - } - Print( aT ); - } - else - { - aT += ", fComplex) "; - __AddHex( aT, n32 ); - Print( aT ); - nComplex += n32; - } - } - // complex property data - while ( nComplex && n > 0 ) - { - sal_uInt32 nDumpSize = (nComplex > n) ? n : nComplex; - ContDump( nDumpSize ); - nComplex -= nDumpSize; - nL -= nDumpSize; - n -= nDumpSize; - } - } - else if ( nR == 0xF012 ) - { - aT = " Connector rule: "; __AddDec( aT, pIn->ReaduInt32() ); - aT += " ShapeID A: "; __AddHex( aT, pIn->ReaduInt32() ); - aT += " ShapeID B: "; __AddHex( aT, pIn->ReaduInt32() ); - Print( aT ); - aT = " ShapeID connector: "; __AddHex( aT, pIn->ReaduInt32() ); - aT += " Connect pt A: "; __AddHex( aT, pIn->ReaduInt32() ); - aT += " Connect pt B: "; __AddHex( aT, pIn->ReaduInt32() ); - Print( aT ); - nL -= 24; n -= 24; - } - - if( ( nPre & 0x000F ) == 0x000F ) - { // Container - if ( nL <= (UINT32) n ) - Print( " completed within" ); - else - Print( " continued elsewhere" ); - } - else - // -> 0x0000 ... 0x0FFF - { - nDumpSize = ( ( UINT32 ) nL > ( UINT32 ) n )? ( UINT16 ) n : ( UINT16 ) nL; - - if( nDumpSize ) - { - ContDump( nDumpSize ); - n -= nDumpSize; - } - } - - aT.Erase(); - } - if( bDumpOffset ) - mnEscherPos += nMaxLen; -} - - -void Biff8RecDumper::ObjDump( const ULONG nMaxLen ) -{ -#if 0 -// if an entire hex block is needed - pIn->PushPosition(); - ContDump( nMaxLen ); - pIn->PopPosition(); -#endif - - ULONG n = nMaxLen; - UINT16 nR, nL; - const sal_Char* p; - ByteString t; - XclImpStream& rIn = *pIn; - UINT16 nDumpSize; - sal_uInt16 nObjFlags = 0; - - t += pLevelPre; - - while( n > 0 ) - { - rIn >> nR >> nL; - n -= sizeof( nR ) + sizeof( nL ); - - BOOL bDetails = FALSE; - switch( nR ) - { - case 0x0000: p = "ftEnd"; break; - case 0x0001: p = "(Reserved)"; break; - case 0x0002: p = "(Reserved)"; break; - case 0x0003: p = "(Reserved)"; break; - case 0x0004: p = "ftMacro"; break; - case 0x0005: p = "ftButton"; break; - case 0x0006: p = "ftGmo"; break; - case 0x0007: p = "ftCf"; break; - case 0x0008: p = "ftPioGrbit"; bDetails = TRUE; break; - case 0x0009: p = "ftPictFmla"; bDetails = TRUE; break; - case 0x000A: p = "ftCbls"; break; - case 0x000B: p = "ftRbo"; break; - case 0x000C: p = "ftSbs"; break; - case 0x000D: p = "ftNts"; break; - case 0x000E: p = "ftSbsFmla"; break; - case 0x000F: p = "ftGboData"; break; - case 0x0010: p = "ftEdoData"; break; - case 0x0011: p = "ftRboData"; break; - case 0x0012: p = "ftCblsData"; break; - case 0x0013: p = "ftLbsData"; break; - case 0x0014: p = "ftCblsFmla"; break; - case 0x0015: p = "ftCmo"; bDetails = TRUE; break; - default: - p = "UNKNOWN ID"; - } - - t += " "; - __AddHex( t, nR ); - t += " ["; - __AddHex( t, nL ); - (t += "] ") += p; - Print( t ); - - nDumpSize = ( ( UINT32 ) nL > ( UINT32 ) n )? ( UINT16 ) n : ( UINT16 ) nL; - - if( nDumpSize ) - { - ULONG nPos1 = (bDetails ? rIn.GetRecPos() : 0); - ContDump( nDumpSize ); - n -= nDumpSize; - if ( bDetails ) - { - ULONG nPos2 = rIn.GetRecPos(); - rIn.Seek( nPos1 ); - t.Erase(); - switch ( nR ) - { - case 0x0008 : // ftPioGrbit - { - rIn >> nObjFlags; - UINT16 __nFlags = nObjFlags; - if ( __nFlags ) - { - ADDTEXT( " " ); - STARTFLAG(); - ADDFLAG( 0x0001, "man-size" ); - ADDFLAG( 0x0002, "linked" ); - ADDFLAG( 0x0008, "symbol" ); - ADDFLAG( 0x0010, "control" ); - ADDFLAG( 0x0020, "ctls-stream" ); - ADDFLAG( 0x0200, "autoload" ); - ADDRESERVED( 0xFDC4 ); - } - } - break; - case 0x0009 : // ftPictFmla - { - ADDTEXT( " Document type " ); - UINT16 nFmlaLen; - rIn >> nFmlaLen; - if( nObjFlags & 0x0002 ) - { - ADDTEXT( "linked\n OLE stream: LNK??? (from EXTERNNAME) " ); - rIn >> nFmlaLen; - ADDTEXT( " unknown=" ); ADDHEX( 4 ); - PRINT(); - t.Erase(); - FormulaDump( nFmlaLen, FT_CellFormula ); - } - else - { - ADDTEXT( "embedded " ); - const UINT16 nStringOffset = 14; // MAY be right - rIn.Seek( nPos1 + nStringOffset ); - INT32 nBytesLeft = nL - nStringOffset; - UINT16 nStrLen = rIn.ReaduInt16(); - ULONG nPos3 = rIn.GetRecPos(); - if( nStrLen ) - AddUNICODEString( t, rIn, TRUE, nStrLen ); - nBytesLeft -= (rIn.GetRecPos() - nPos3); - ADDTEXT( '\n' ); - if ( nBytesLeft < 4 ) - ADDTEXT( " >> ByteString OVERRUN <<\n" ); - - rIn.Seek( nPos1 + sizeof(nFmlaLen) + nFmlaLen ); - if( nObjFlags & 0x0020 ) - { - sal_uInt32 nStrmStart, nStrmLen; - rIn >> nStrmStart >> nStrmLen; - ADDTEXT( " 'Ctls' stream start=" ); - __AddHex( t, nStrmStart ); - ADDTEXT( " size=" ); - __AddHex( t, nStrmLen ); - maCtlsPosMap[ nStrmStart ] = nStrmLen; - } - else - { - ADDTEXT( " OLE storage name: MBD" ); - __AddPureHex( t, rIn.ReaduInt32() ); - } - } - } - break; - case 0x0015 : // ftCmo - { - UINT16 nType, nId; - rIn >> nType >> nId; - ADDTEXT( " Object ID " ); - __AddHex( t, nId ); - switch ( nType ) - { - case 0x0000 : p = "Group"; break; - case 0x0001 : p = "Line"; break; - case 0x0002 : p = "Rectangle"; break; - case 0x0003 : p = "Oval"; break; - case 0x0004 : p = "Arc"; break; - case 0x0005 : p = "Chart"; break; - case 0x0006 : p = "Text"; break; - case 0x0007 : p = "Button"; break; - case 0x0008 : p = "Picture"; break; - case 0x0009 : p = "Polygon"; break; - case 0x000a : p = "(Reserved)"; break; - case 0x000b : p = "Check box"; break; - case 0x000c : p = "Option button";break; - case 0x000d : p = "Edit box"; break; - case 0x000e : p = "Label"; break; - case 0x000f : p = "Dialog box"; break; - case 0x0010 : p = "Spinner"; break; - case 0x0011 : p = "Scroll bar"; break; - case 0x0012 : p = "List box"; break; - case 0x0013 : p = "Group box"; break; - case 0x0014 : p = "Combo box"; break; - case 0x0015 : p = "(Reserved)"; break; - case 0x0016 : p = "(Reserved)"; break; - case 0x0017 : p = "(Reserved)"; break; - case 0x0018 : p = "(Reserved)"; break; - case 0x0019 : p = "Comment"; break; - case 0x001a : p = "(Reserved)"; break; - case 0x001b : p = "(Reserved)"; break; - case 0x001c : p = "(Reserved)"; break; - case 0x001d : p = "(Reserved)"; break; - case 0x001e : p = "Microsoft Office drawing"; break; - default: - p = "UNKNOWN"; - } - ADDTEXT( ", type " ); - __AddHex( t, nType ); - ADDTEXT( ' ' ); - ADDTEXT( p ); - } - break; - } - if ( t.Len() ) - PRINT(); - rIn.Seek( nPos2 ); - } - } - - t.Erase(); - } -} - - -#undef LINESTART -#undef IGNORE -#undef ADDHEX -#undef ADDDEC -#undef PRINT -#undef PreDump -#undef ADDCELLHEAD - -void Biff8RecDumper::ContDump( const ULONG nL ) -{ - UINT32 nC = nMaxBodyLines; - UINT32 n = nL; - UINT32 nInL, nTmp; - UINT8* pB = new UINT8[ nL ]; - UINT8* p; - const UINT16 nLineLen = 16; - UINT16 nCharCnt; - BOOL bPart; - ByteString aT; - - aT += pLevelPre; - - while( n && nC ) - { - bPart = n < nLineLen; - nInL = bPart? n : nLineLen; - n -= nInL; - - pIn->Read( pB, nInL ); - - // als Hex-Codes - nTmp = nInL; - p = pB; - nCharCnt = 0; - while( nTmp ) - { - if( nCharCnt == nLineLen / 2 ) - aT += ' '; - - nCharCnt++; - - aT += ' '; - __AddPureHex( aT, *p ); - p++; - - nTmp--; - } - - if( bPart ) - aT += GetBlanks( ( UINT16 ) ( ( nLineLen - nInL ) * 3 ) ); - - // als chars - - aT += " "; - if( nInL < 9 ) - aT += ' '; - - nTmp = nInL; - p = pB; - nCharCnt = 0; - while( nTmp ) - { - if( nCharCnt == nLineLen / 2 ) - aT += ' '; - - nCharCnt++; - - if( IsPrintable( *p ) ) - aT += static_cast< sal_Char >( *p ); - else - aT += '.'; - - p++; - - nTmp--; - } - - Print( aT ); - aT.Erase(); - aT += pLevelPre; - - nC--; - } - - delete[] pB; -} - - -// Formula dumper ============================================================= - -/** Name and parameter count of an Excel function. */ -struct XclDumpFunc -{ - const sal_Char* pName; /// Name of the function. - sal_uInt16 nParam; /// Parameter count for fixed functions. -}; - -static const XclDumpFunc pFuncData[] = -{ -/* 0*/ { "COUNT", 0 }, - { "IF", 0 }, - { "ISNA", 1 }, - { "ISERROR", 1 }, - { "SUM", 0 }, -/* 5*/ { "AVERAGE", 0 }, - { "MIN", 0 }, - { "MAX", 0 }, - { "ROW", 0 }, - { "COLUMN", 0 }, -/* 10*/ { "NA", 0 }, - { "NPV", 0 }, - { "STDEV", 0 }, - { "DOLLAR", 0 }, - { "FIXED", 0 }, -/* 15*/ { "SIN", 1 }, - { "COS", 1 }, - { "TAN", 1 }, - { "ATAN", 1 }, - { "PI", 0 }, -/* 20*/ { "SQRT", 1 }, - { "EXP", 1 }, - { "LN", 1 }, - { "LOG10", 1 }, - { "ABS", 1 }, -/* 25*/ { "INT", 1 }, - { "SIGN", 1 }, - { "ROUND", 2 }, - { "LOOKUP", 0 }, - { "INDEX", 0 }, -/* 30*/ { "REPT", 2 }, - { "MID", 3 }, - { "LEN", 1 }, - { "VALUE", 1 }, - { "TRUE", 0 }, -/* 35*/ { "FALSE", 0 }, - { "AND", 0 }, - { "OR", 0 }, - { "NOT", 1 }, - { "MOD", 2 }, -/* 40*/ { "DCOUNT", 3 }, - { "DSUM", 3 }, - { "DAVERAGE", 3 }, - { "DMIN", 3 }, - { "DMAX", 3 }, -/* 45*/ { "DSTDEV", 3 }, - { "VAR", 0 }, - { "DVAR", 3 }, - { "TEXT", 2 }, - { "LINEST", 0 }, -/* 50*/ { "TREND", 0 }, - { "LOGEST", 0 }, - { "GROWTH", 0 }, - { "GOTO" }, // macro/internal - { "HALT" }, // macro/internal -/* 55*/ { "RETURN" }, // macro/internal - { "PV", 0 }, - { "FV", 0 }, - { "NPER", 0 }, - { "PMT", 0 }, -/* 60*/ { "RATE", 0 }, - { "MIRR", 3 }, - { "IRR", 0 }, - { "RAND", 0 }, - { "MATCH", 0 }, -/* 65*/ { "DATE", 3 }, - { "TIME", 3 }, - { "DAY", 1 }, - { "MONTH", 1 }, - { "YEAR", 1 }, -/* 70*/ { "WEEKDAY", 0 }, - { "HOUR", 1 }, - { "MINUTE", 1 }, - { "SECOND", 1 }, - { "NOW", 0 }, -/* 75*/ { "AREAS", 1 }, - { "ROWS", 1 }, - { "COLUMNS", 1 }, - { "OFFSET", 0 }, - { "ABSREF" }, // macro/internal -/* 80*/ { "RELREF" }, // macro/internal - { "ARGUMENT" }, // macro/internal - { "SEARCH", 0 }, - { "TRANSPOSE", 1 }, - { "ERROR" }, // macro/internal -/* 85*/ { "STEP" }, // macro/internal - { "TYPE", 1 }, - { "ECHO" }, // macro/internal - { "SET.NAME" }, // macro/internal - { "CALLER" }, // macro/internal -/* 90*/ { "DEREF" }, // macro/internal - { "WINDOWS" }, // macro/internal - { "SERIES" }, // macro/internal - { "DOCUMENTS" }, // macro/internal - { "ACTIVE.CELL" }, // macro/internal -/* 95*/ { "SELECTION" }, // macro/internal - { "RESULT" }, // macro/internal - { "ATAN2", 2 }, - { "ASIN", 1 }, - { "ACOS", 1 }, -/*100*/ { "CHOOSE", 0 }, - { "HLOOKUP", 0 }, - { "VLOOKUP", 0 }, - { "LINKS" }, // macro/internal - { "INPUT" }, // macro/internal -/*105*/ { "ISREF", 1 }, - { "GET.FORMULA" }, // macro/internal - { "GET.NAME" }, // macro/internal - { "SET.VALUE", 2 }, // macro/internal - { "LOG", 0 }, -/*110*/ { "EXEC" }, // macro/internal - { "CHAR", 1 }, - { "LOWER", 1 }, - { "UPPER", 1 }, - { "PROPER", 1 }, -/*115*/ { "LEFT", 0 }, - { "RIGHT", 0 }, - { "EXACT", 2 }, - { "TRIM", 1 }, - { "REPLACE", 4 }, -/*120*/ { "SUBSTITUTE", 0 }, - { "CODE", 1 }, - { "NAMES" }, // macro/internal - { "DIRECTORY" }, // macro/internal - { "FIND", 0 }, -/*125*/ { "CELL", 0 }, - { "ISERR", 1 }, - { "ISTEXT", 1 }, - { "ISNUMBER", 1 }, - { "ISBLANK", 1 }, -/*130*/ { "T", 1 }, - { "N", 1 }, - { "FOPEN" }, // macro/internal - { "FCLOSE" }, // macro/internal - { "FSIZE" }, // macro/internal -/*135*/ { "FREADLN" }, // macro/internal - { "FREAD" }, // macro/internal - { "FWRITELN" }, // macro/internal - { "FWRITE" }, // macro/internal - { "FPOS" }, // macro/internal -/*140*/ { "DATEVALUE", 1 }, - { "TIMEVALUE", 1 }, - { "SLN", 3 }, - { "SYD", 4 }, - { "DDB", 0 }, -/*145*/ { "GET.DEF" }, // macro/internal - { "REFTEXT" }, // macro/internal - { "TEXTREF" }, // macro/internal - { "INDIRECT", 0 }, - { "REGISTER" }, // macro/internal -/*150*/ { "CALL" }, - { "ADD.BAR" }, // macro/internal - { "ADD.MENU" }, // macro/internal - { "ADD.COMMAND" }, // macro/internal - { "ENABLE.COMMAND" }, // macro/internal -/*155*/ { "CHECK.COMMAND" }, // macro/internal - { "RENAME.COMMAND" }, // macro/internal - { "SHOW.BAR" }, // macro/internal - { "DELETE.MENU" }, // macro/internal - { "DELETE.COMMAND" }, // macro/internal -/*160*/ { "GET.CHART.ITEM" }, // macro/internal - { "DIALOG.BOX" }, // macro/internal - { "CLEAN", 1 }, - { "MDETERM", 1 }, - { "MINVERSE", 1 }, -/*165*/ { "MMULT", 2 }, - { "FILES" }, // macro/internal - { "IPMT", 0 }, - { "PPMT", 0 }, - { "COUNTA", 0 }, -/*170*/ { "CANCEL.KEY" }, // macro/internal - { "FOR" }, // macro/internal - { "WHILE" }, // macro/internal - { "BREAK" }, // macro/internal - { "NEXT" }, // macro/internal -/*175*/ { "INITIATE" }, // macro/internal - { "REQUEST" }, // macro/internal - { "POKE" }, // macro/internal - { "EXECUTE" }, // macro/internal - { "TERMINATE" }, // macro/internal -/*180*/ { "RESTART" }, // macro/internal - { "HELP" }, // macro/internal - { "GET.BAR" }, // macro/internal - { "PRODUCT", 0 }, - { "FACT", 1 }, -/*185*/ { "GET.CELL" }, // macro/internal - { "GET.WORKSPACE" }, // macro/internal - { "GET.WINDOW" }, // macro/internal - { "GET.DOCUMENT" }, // macro/internal - { "DPRODUCT", 3 }, -/*190*/ { "ISNONTEXT", 1 }, - { "GET.NOTE" }, // macro/internal - { "NOTE" }, // macro/internal - { "STDEVP", 0 }, - { "VARP", 0 }, -/*195*/ { "DSTDDEVP", 3 }, - { "DVARP", 3 }, - { "TRUNC", 0 }, - { "ISLOGICAL", 1 }, - { "DBCOUNTA", 3 }, -/*200*/ { "DELETE.BAR" }, // macro/internal - { "UNREGISTER" }, // macro/internal - { "202" }, // not used - { "203" }, // not used - { "USDOLLAR" }, -/*205*/ { "FINDB" }, - { "SEARCHB" }, - { "REPLACEB", 4 }, - { "LEFTB" }, - { "RIGHTB" }, -/*210*/ { "MIDB", 3 }, - { "LENB", 1 }, - { "ROUNDUP", 2 }, - { "ROUNDDOWN", 2 }, - { "ASC", 1 }, -/*215*/ { "DBSC", 1 }, - { "RANK", 0 }, - { "217" }, // not used - { "218" }, // not used - { "ADDRESS", 0 }, -/*220*/ { "DAYS360", 0 }, - { "TODAY", 0 }, - { "VDB", 0 }, - { "ELSE" }, // macro/internal - { "ELSE.IF" }, // macro/internal -/*225*/ { "END.IF" }, // macro/internal - { "FOR.CELL" }, // macro/internal - { "MEDIAN", 0 }, - { "SUMPRODUCT", 0 }, - { "SINH", 1 }, -/*230*/ { "COSH", 1 }, - { "TANH", 1 }, - { "ASINH", 1 }, - { "ACOSH", 1 }, - { "ATANH", 1 }, -/*235*/ { "DGET", 3 }, - { "CREATE.OBJECT" }, // macro/internal - { "VOLATILE" }, // macro/internal - { "LAST.ERROR" }, // macro/internal - { "CUSTOM.UNDO" }, // macro/internal -/*240*/ { "CUSTOM.REPEAT" }, // macro/internal - { "FORMULA.CONVERT" }, // macro/internal - { "GET.LINK.INFO" }, // macro/internal - { "TEXT.BOX" }, // macro/internal - { "INFO", 1 }, -/*245*/ { "GROUP" }, // macro/internal - { "GET.OBJECT" }, // macro/internal - { "DB", 0 }, - { "PAUSE" }, // macro/internal - { "249" }, // not used -/*250*/ { "250" }, // not used - { "RESUME" }, // macro/internal - { "FREQUENCY", 2 }, - { "ADD.TOOLBAR" }, // macro/internal - { "DELETE.TOOLBAR" }, // macro/internal -/*255*/ { "EXTERN.CALL" }, // macro/internal - { "RESET.TOOLBAR" }, // macro/internal - { "EVALUATE" }, // macro/internal - { "GET.TOOLBAR" }, // macro/internal - { "GET.TOOL" }, // macro/internal -/*260*/ { "SPELLING.CHECK" }, // macro/internal - { "ERROR.TYPE", 1 }, - { "APP.TITLE" }, // macro/internal - { "WINDOW.TITLE" }, // macro/internal - { "SAVE.TOOLBAR" }, // macro/internal -/*265*/ { "ENABLE.TOOL" }, // macro/internal - { "PRESS.TOOL" }, // macro/internal - { "REGISTER.ID" }, // macro/internal - { "GET.WORKBOOK" }, // macro/internal - { "AVEDEV", 0 }, -/*270*/ { "BETADIST", 0 }, - { "GAMMALN", 1 }, - { "BETAINV", 0 }, - { "BINOMDIST", 4 }, - { "CHIDIST", 2 }, -/*275*/ { "CHIINV", 2 }, - { "COMBIN", 2 }, - { "CONFIDENCE", 3 }, - { "CRITBINOM", 3 }, - { "EVEN", 1 }, -/*280*/ { "EXPONDIST", 3 }, - { "FDIST", 3 }, - { "FINV", 3 }, - { "FISHER", 1 }, - { "FISHERINV", 1 }, -/*285*/ { "FLOOR", 2 }, - { "GAMMADIST", 4 }, - { "GAMMAINV", 3 }, - { "CEILING", 2 }, - { "HYPGEOMDIST", 4 }, -/*290*/ { "LOGNORMDIST", 3 }, - { "LOGINV", 3 }, - { "NEGBINOMDIST", 3 }, - { "NORMDIST", 4 }, - { "NORMSDIST", 1 }, -/*295*/ { "NORMINV", 3 }, - { "NORMSINV", 1 }, - { "STANDARDIZE", 3 }, - { "ODD", 1 }, - { "PERMUT", 2 }, -/*300*/ { "POISSON", 3 }, - { "TDIST", 3 }, - { "WEIBULL", 4 }, - { "SUMXMY2", 2 }, - { "SUMX2MY2", 2 }, -/*305*/ { "SUMX2PY2", 2 }, - { "CHITEST", 2 }, - { "CORREL", 2 }, - { "COVAR", 2 }, - { "FORECAST", 3 }, -/*310*/ { "FTEST", 2 }, - { "INTERCEPT", 2 }, - { "PEARSON", 2 }, - { "RSQ", 2 }, - { "STEYX", 2 }, -/*315*/ { "SLOPE", 2 }, - { "TTEST", 4 }, - { "PROB", 0 }, - { "DEVSQ", 0 }, - { "GEOMEAN", 0 }, -/*320*/ { "HARMEAN", 0 }, - { "SUMSQ", 0 }, - { "KURT", 0 }, - { "SKEW", 0 }, - { "ZTEST", 0 }, -/*325*/ { "LARGE", 2 }, - { "SMALL", 2 }, - { "QUARTILE", 2 }, - { "PERCENTILE", 2 }, - { "PERCENTRANK", 0 }, -/*330*/ { "MODE", 0 }, - { "TRIMMEAN", 2 }, - { "TINV", 2 }, - { "333" }, // not used - { "MOVIE.COMMAND" }, // macro/internal -/*335*/ { "GET.MOVIE" }, // macro/internal - { "CONCATENATE", 0 }, - { "POWER", 2 }, - { "PIVOT.ADD.DATA" }, // macro/internal - { "GET.PIVOT.TABLE" }, // macro/internal -/*340*/ { "GET.PIVOT.FIELD" }, // macro/internal - { "GET.PIVOT.ITEM" }, // macro/internal - { "RADIANS", 1 }, - { "DEGREES", 1 }, - { "SUBTOTAL", 0 }, -/*345*/ { "SUMIF", 0 }, - { "COUNTIF", 2 }, - { "COUNTBLANK", 1 }, - { "SCENARIO.GET" }, // macro/internal - { "OPTIONS.LISTS.GET" }, // macro/internal -/*350*/ { "ISPMT", 4 }, - { "DATEDIF", 3 }, - { "DATESTRING", 1 }, - { "NUMBERSTRING", 2 }, - { "ROMAN", 0 }, -/*355*/ { "OPEN.DIALOG" }, // macro/internal - { "SAVE.DIALOG" }, // macro/internal - { "VIEW.GET" }, // macro/internal - { "GETPIVOTDATA", 0 }, - { "HYPERLINK", 2 }, -/*360*/ { "PHONETIC", 1 }, - { "AVERAGEA", 0 }, - { "MAXA", 0 }, - { "MINA", 0 }, - { "STDEVPA", 0 }, -/*365*/ { "VARPA", 0 }, - { "STDEVA", 0 }, - { "VARA", 0 }, - { "BAHTTEXT", 1 }, - { "THAIDAYOFWEEK", 1 }, -/*370*/ { "THAIDIGIT", 1 }, - { "THAIMONTHOFYEAR", 1 }, - { "THAINUMSOUND", 1 }, - { "THAINUMSTRING", 1 }, - { "THAISTRINGLENGTH", 1 }, -/*375*/ { "ISTHAIDIGIT", 1 }, - { "ROUNDBAHTDOWN", 1 }, - { "ROUNDBAHTUP", 1 }, - { "THAIYEAR", 1 }, - { "RTD" }, -/*380*/ { "ISHYPERLINK", 1 } -}; - -const XclDumpFunc* lcl_GetFuncData( sal_uInt16 nIndex ) -{ - return (nIndex < STATIC_TABLE_SIZE( pFuncData )) ? (pFuncData + nIndex) : NULL; -} - -// ---------------------------------------------------------------------------- - -/** Stack helper to create a human readable formula string from UPN. */ -class XclDumpFormulaStackImpl : private ScfDelStack< ByteString > -{ -public: - void PushOperand( const ByteString& rOperand ); - void PushUnary( const ByteString& rOperator, bool bInFront ); - void PushBinary( const ByteString& rOperator ); - void PushFunction( const ByteString& rFuncName, sal_uInt16 nParamCount ); - inline ByteString GetString() const { return Top() ? *Top() : ByteString(); } -}; - -void XclDumpFormulaStackImpl::PushOperand( const ByteString& rOperand ) -{ - Push( new ByteString( rOperand ) ); -} - -void XclDumpFormulaStackImpl::PushUnary( const ByteString& rOperator, bool bInFront ) -{ - if( !Count() ) return; - ByteString* pOp = Top(); - pOp->Insert( rOperator, bInFront ? 0 : pOp->Len() ); -} - -void XclDumpFormulaStackImpl::PushBinary( const ByteString& rOperator ) -{ - if( Count() < 2 ) return; - // second operand is on top - ByteString* pSecond = Pop(); - ByteString* pFirst = Top(); - *pFirst += rOperator; - *pFirst += *pSecond; - delete pSecond; -} - -void XclDumpFormulaStackImpl::PushFunction( const ByteString& rFuncName, sal_uInt16 nParamCount ) -{ - if( Count() < nParamCount ) return; - ByteString* pNew = new ByteString( ')' ); - for( sal_uInt16 nIndex = 0; nIndex < nParamCount; ++nIndex ) - { - if( nIndex ) pNew->Insert( ';', 0 ); - ByteString* pOp = Pop(); - pNew->Insert( *pOp, 0 ); - delete pOp; - } - pNew->Insert( '(', 0 ); - pNew->Insert( rFuncName, 0 ); - Push( pNew ); -} - -// ---------------------------------------------------------------------------- - -/** Stack to create a human readable formula and token class overview from UPN. */ -class XclDumpFormulaStack -{ -public: - void PushOperand( const ByteString& rOperand, sal_uInt8 nToken ); - inline void PushOperand( const sal_Char* pcOperand, sal_uInt8 nToken ) - { PushOperand( ByteString( pcOperand ), nToken ); } - - void PushUnary( const ByteString& rOperator, bool bInFront = true ); - inline void PushUnary( const sal_Char* pcOperator, bool bInFront = true ) - { PushUnary( ByteString( pcOperator ), bInFront ); } - - void PushBinary( const ByteString& rOperator ); - inline void PushBinary( const sal_Char* pcOperator ) - { PushBinary( ByteString( pcOperator ) ); } - - void PushFunction( const ByteString& rFuncName, sal_uInt16 nParamCount, sal_uInt8 nToken ); - inline void PushFunction( const sal_Char* pcFuncName, sal_uInt16 nParamCount, sal_uInt8 nToken ) - { PushFunction( ByteString( pcFuncName ), nParamCount, nToken ); } - - inline ByteString GetFormula() const { return maFmla.GetString(); } - inline ByteString GetTokenClasses() const { return maClass.GetString(); } - - static ByteString GetTokenClass( sal_uInt8 nToken ); - -private: - void PushTokenClass( sal_uInt8 nToken ); - - XclDumpFormulaStackImpl maFmla; - XclDumpFormulaStackImpl maClass; -}; - -void XclDumpFormulaStack::PushOperand( const ByteString& rOperand, sal_uInt8 nToken ) -{ - maFmla.PushOperand( rOperand ); - maClass.PushOperand( GetTokenClass( nToken ) ); -} - -void XclDumpFormulaStack::PushUnary( const ByteString& rOperator, bool bInFront ) -{ - maFmla.PushUnary( rOperator, bInFront ); - maClass.PushUnary( rOperator, bInFront ); -} - -void XclDumpFormulaStack::PushBinary( const ByteString& rOperator ) -{ - maFmla.PushBinary( rOperator ); - maClass.PushBinary( rOperator ); -} - -void XclDumpFormulaStack::PushFunction( const ByteString& rFuncName, sal_uInt16 nParamCount, sal_uInt8 nToken ) -{ - maFmla.PushFunction( rFuncName, nParamCount ); - maClass.PushFunction( GetTokenClass( nToken ), nParamCount ); -} - -ByteString XclDumpFormulaStack::GetTokenClass( sal_uInt8 nToken ) -{ - sal_Char cClass = 'B'; - switch( nToken & 0xE0 ) - { - case 0x20: cClass = 'R'; break; - case 0x40: cClass = 'V'; break; - case 0x60: cClass = 'A'; break; - } - return ByteString( cClass ); -} - -// ---------------------------------------------------------------------------- - -const sal_Char* lcl_GetErrorString( sal_uInt8 nErr ) -{ - switch( nErr ) - { - case 0x00: return "#NULL!"; - case 0x07: return "#DIV/0!"; - case 0x0F: return "#VALUE!"; - case 0x17: return "#REF!"; - case 0x1D: return "#NAME?"; - case 0x24: return "#NUM!"; - case 0x2A: return "#N/A!"; - } - return "!unknown!"; -} - - - -void lcl_StartToken( ByteString& rString, sal_uInt16 nPos, sal_uInt8 nToken, const sal_Char* pTokenName ) -{ - rString.Erase(); - rString.Append( " " ); - __AddHex( rString, nPos ); - rString.Append( " " ); - __AddHex( rString, nToken ); - rString.Append( " t" ).Append( pTokenName ).Expand( 33, ' ' ); -} - -void lcl_StartTokenClass( ByteString& rString, sal_uInt16 nPos, sal_uInt8 nToken, const sal_Char* pTokenName ) -{ - ByteString aToken( pTokenName ); - aToken.Append( XclDumpFormulaStack::GetTokenClass( nToken ) ); - lcl_StartToken( rString, nPos, nToken, aToken.GetBuffer() ); -} - -void Biff8RecDumper::FormulaDump( const UINT16 nL, const FORMULA_TYPE eFT ) -{ - if( !nL ) - return; - - sal_uInt32 nStartPos = pIn->GetRecPos(); - const sal_uInt32 nAfterPos = nStartPos + nL; - - BYTE nOp; - ByteString t, aOperand; - BOOL bError = FALSE; - const BOOL bRangeName = eFT == FT_RangeName; - const BOOL bSharedFormula = eFT == FT_SharedFormula; - const BOOL bRNorSF = bRangeName || bSharedFormula; - - XclDumpFormulaStack aStack; - sal_Bool bPrinted = sal_True; - -#define PRINTTOKEN() { if( !bPrinted ) Print( t ); bPrinted = sal_True; } -#define STARTTOKEN( name ) lcl_StartToken( t, static_cast< sal_uInt16 >( pIn->GetRecPos() - nStartPos - 1 ), nOp, name ) -#define STARTTOKENCLASS( name ) lcl_StartTokenClass( t, static_cast< sal_uInt16 >( pIn->GetRecPos() - nStartPos - 1 ), nOp, name ) - - while( pIn->IsValid() && ( pIn->GetRecPos() < nAfterPos ) && !bError ) - { - *pIn >> nOp; - bPrinted = sal_False; - aOperand.Erase(); - - switch( nOp ) // Buch Seite: - { // SDK4 SDK5 - case 0x01: // Array Formula [325 ] - { - STARTTOKEN( "Exp" ); - sal_uInt16 nRow, nCol; - *pIn >> nRow >> nCol; - t += "array formula or shared formula, base-address="; - lcl_AddRef( t, nCol, nRow ); - aStack.PushFunction( "ARRAY", 0, nOp ); - } - break; - case 0x02: // Data Table [325 277] - { - STARTTOKEN( "Tbl" ); - sal_uInt16 nRow, nCol; - *pIn >> nRow >> nCol; - t += "multiple operation, base-address="; - lcl_AddRef( t, nCol, nRow ); - aStack.PushFunction( "MULTIPLE.OPERATIONS", 0, nOp ); - } - break; - case 0x03: // Addition [312 264] - STARTTOKEN( "Add" ); - aStack.PushBinary( "+" ); - break; - case 0x04: // Subtraction [313 264] - STARTTOKEN( "Sub" ); - aStack.PushBinary( "-" ); - break; - case 0x05: // Multiplication [313 264] - STARTTOKEN( "Mul" ); - aStack.PushBinary( "*" ); - break; - case 0x06: // Division [313 264] - STARTTOKEN( "Div" ); - aStack.PushBinary( "/" ); - break; - case 0x07: // Exponetiation [313 265] - STARTTOKEN( "Power" ); - aStack.PushBinary( "^" ); - break; - case 0x08: // Concatenation [313 265] - STARTTOKEN( "Concat" ); - aStack.PushBinary( "&" ); - break; - case 0x09: // Less Than [313 265] - STARTTOKEN( "LT" ); - aStack.PushBinary( "<" ); - break; - case 0x0A: // Less Than or Equal [313 265] - STARTTOKEN( "LE" ); - aStack.PushBinary( "<=" ); - break; - case 0x0B: // Equal [313 265] - STARTTOKEN( "EQ" ); - aStack.PushBinary( "=" ); - break; - case 0x0C: // Greater Than or Equal [313 265] - STARTTOKEN( "GE" ); - aStack.PushBinary( ">=" ); - break; - case 0x0D: // Greater Than [313 265] - STARTTOKEN( "GT" ); - aStack.PushBinary( ">" ); - break; - case 0x0E: // Not Equal [313 265] - STARTTOKEN( "NE" ); - aStack.PushBinary( "<>" ); - break; - case 0x0F: // Intersection [314 265] - STARTTOKEN( "Isect" ); - aStack.PushBinary( " " ); - break; - case 0x10: // List [314 265] - STARTTOKEN( "List" ); - aStack.PushBinary( ";" ); - break; - case 0x11: // Range [314 265] - STARTTOKEN( "Range" ); - aStack.PushBinary( ":" ); - break; - case 0x12: // Unary Plus [312 264] - STARTTOKEN( "Uplus" ); - aStack.PushUnary( "+" ); - break; - case 0x13: // Unary Minus [312 264] - STARTTOKEN( "Uminus" ); - aStack.PushUnary( "-" ); - break; - case 0x14: // Percent Sign [312 264] - STARTTOKEN( "Percent" ); - aStack.PushUnary( "%", false ); - break; - case 0x15: // Parenthesis [326 278] - STARTTOKEN( "Paren" ); - // simulate two unary operators to enclose operand - aStack.PushUnary( "(" ); - aStack.PushUnary( ")", false ); - break; - case 0x16: // Missing Argument [314 266] - STARTTOKEN( "MissArg" ); - aStack.PushOperand( "~", nOp ); - break; - case 0x17: // ByteString Constant [314 266] - { - STARTTOKEN( "Str" ); - - UINT8 nLen; - *pIn >> nLen; - - t += "string [len="; - __AddDec( t, nLen ); - t += "] "; - - aOperand += '"'; - if( nLen ) - aOperand += GETSTR( pIn->ReadUniString( nLen ) ); - else - pIn->Ignore( 1 ); - aOperand += '"'; - t += aOperand; - aStack.PushOperand( aOperand, nOp ); - } - break; - case 0x18: - { - STARTTOKEN( "Extended" ); - UINT8 nEptg; - *pIn >> nEptg; - -#define D(name,size,ext,type) {t+="eptg ";__AddDec(t,(UINT16)nEptg);t+=": "; \ - t+=name;t+=" [";__AddDec(t,(UINT16)size);t+="] ";t+=type; \ - if(ext)t+=" + ext";PRINTTOKEN();ContDump(size);aStack.PushOperand(name,nOp);} - switch( nEptg ) - { // name size ext type - case 0x00: // res - D( "res", 0, 0, "" ); - break; - case 0x01: // Lel 4 - err - D( "Lel", 4, 0, "err" ); - break; - case 0x02: // Rw 4 - ref - D( "Rw", 4, 0, "ref" ); - break; - case 0x03: // Col 4 - ref - D( "Col", 4, 0, "ref" ); - break; - case 0x04: // res - case 0x05: // res - D( "res", 0, 0, "" ); - break; - case 0x06: // RwV 4 - val - D( "RwV", 4, 0, "val" ); - break; - case 0x07: // ColV 4 - val - D( "ColV", 4, 0, "val" ); - break; - case 0x08: // res - case 0x09: // res - D( "res", 0, 0, "" ); - break; - case 0x0A: // Radical 13 - ref - D( "Radical", 13, 0, "ref" ); - break; - case 0x0B: // RadicalS 13 x ref - D( "RadicalS", 13, 1, "ref" ); - break; - case 0x0C: // RwS 4 x ref - D( "RwS", 4, 1, "ref" ); - break; - case 0x0D: // ColS 4 x ref - D( "ColS", 4, 1, "ref" ); - break; - case 0x0E: // RwSV 4 x val - D( "RwSV", 4, 1, "val" ); - break; - case 0x0F: // ColSV 4 x val - D( "ColSV", 4, 1, "val" ); - break; - case 0x10: // RadicalLel 4 - err - D( "RadicalLel", 4, 0, "err" ); - break; - case 0x11: // res - case 0x12: // res - case 0x13: // res - case 0x14: // res - case 0x15: // res - case 0x16: // res - case 0x17: // res - case 0x18: // res - D( "res", 0, 0, "" ); - break; - case 0x19: // invalid values - case 0x1A: // invalid values - D( "invalid vals", 0, 0, "" ); - break; - case 0x1B: // res - case 0x1C: // res - D( "res", 0, 0, "" ); - break; - case 0x1D: // SxName 4 - val - D( "SxName", 4, 0, "val" ); - break; - case 0x1E: // res - D( "res", 0, 0, "" ); - break; - default: - D( "!unknown!", 0, 0, "" ); - } -#undef D - } - break; - case 0x19: // Special Attribute [327 279] - { - STARTTOKEN( "Attr" ); - UINT16 nData, nFakt; - BYTE nOpt; - - *pIn >> nOpt >> nData; - nFakt = 2; - - t += "flags="; __AddHex( t, nOpt ); - - if( nOpt & 0x01 ) t += " volatile"; - if( nOpt & 0x02 ) t += " if"; - if( nOpt & 0x04 ) t += " choose"; - if( nOpt & 0x08 ) t += " skip"; - if( nOpt & 0x10 ) t += " sum"; - if( nOpt & 0x20 ) t += " assignment"; - if( nOpt & 0x40 ) t += " space"; - if( nOpt & 0x80 ) t += " unknown"; - - if( nOpt & 0x02 ) - { - t += " skip-to-false="; - __AddHex( t, nData ); - } - if( nOpt & 0x04 ) - { - t += " count="; - __AddDec( t, nData ); - t += " skip="; - for( sal_uInt16 nIdx = 0; nIdx <= nData; ++nIdx ) - { - if( nIdx ) t += ','; - __AddDec( t, pIn->ReaduInt16() ); - } - } - if( nOpt & 0x08 ) - { - t += " skip="; - __AddHex( t, nData ); - t += " ("; - __AddDec( t, sal_uInt8( nData + 1 ) ); - t += " bytes)"; - } - if( nOpt & 0x10 ) - aStack.PushFunction( "ATTRSUM", 1, nOp ); - if( nOpt & 0x40 ) - { - t += " type="; - __AddDec( t, static_cast< sal_uInt8 >( nData ) ); - t += " count="; - __AddDec( t, static_cast< sal_uInt8 >( nData >> 8 ) ); - } - } - break; - case 0x1C: // Error Value [314 266] - { - STARTTOKEN( "Err" ); - sal_uInt8 nErr = pIn->ReaduInt8(); - t += "error value ("; __AddHex( t, nErr ); - t += ") "; - t += lcl_GetErrorString( nErr ); - aStack.PushOperand( lcl_GetErrorString( nErr ), nOp ); - } - break; - case 0x1D: // Boolean [315 266] - STARTTOKEN( "Bool" ); - aOperand += pIn->ReaduInt8() ? "TRUE" : "FALSE"; - t += aOperand; - aStack.PushOperand( aOperand, nOp ); - break; - case 0x1E: // Integer [315 266] - STARTTOKEN( "Int" ); - __AddDec( aOperand, pIn->ReaduInt16() ); - t += aOperand; - aStack.PushOperand( aOperand, nOp ); - break; - case 0x1F: // Number [315 266] - STARTTOKEN( "Num" ); - __AddDouble( aOperand, pIn->ReadDouble() ); - t += aOperand; - aStack.PushOperand( aOperand, nOp ); - break; - case 0x20: // Array Constant [317 268] - case 0x40: - case 0x60: - STARTTOKENCLASS( "Array" ); - pIn->Ignore( 7 ); - aStack.PushOperand( "{ConstArray}", nOp ); - break; - case 0x21: // Function, Fixed Number of Arguments [333 282] - case 0x41: - case 0x61: - { - STARTTOKENCLASS( "Func" ); - UINT16 nInd = pIn->ReaduInt16(); - const XclDumpFunc* pFunc = lcl_GetFuncData( nInd ); - aOperand += pFunc ? pFunc->pName : "!unknown!"; - - t += "fix function: index="; __AddHex( t, nInd ); - t += " ("; t += aOperand; - t += ')'; - aStack.PushFunction( aOperand, pFunc ? pFunc->nParam : 0, nOp ); - } - break; - case 0x22: // Function, Variable Number of Arg. [333 283] - case 0x42: - case 0x62: - { - STARTTOKENCLASS( "FuncVar" ); - BYTE nAnz; - UINT16 nInd; - *pIn >> nAnz >> nInd; - const XclDumpFunc* pFunc = lcl_GetFuncData( nInd & 0x7FFF ); - aOperand += pFunc ? pFunc->pName : "!unknown!"; - - t += "var function: index="; __AddHex( t, nInd ); - t += " ("; t += aOperand; - t += ") param count="; __AddHex( t, nAnz ); - t += " ("; __AddDec( t, (UINT8)(nAnz & 0x7F) ); - t += ')'; - if( nAnz & 0x8000 ) - t += " cmd-equiv."; - aStack.PushFunction( aOperand, nAnz & 0x7F, nOp ); - } - break; - case 0x23: // Name [318 269] - case 0x43: - case 0x63: - { - STARTTOKENCLASS( "Name" ); - sal_uInt16 nNameIdx = pIn->ReaduInt16(); - __AddDec( aOperand, nNameIdx ); - t += "internal name: index="; - t += aOperand; - pIn->Ignore( 2 ); - if( (0 < nNameIdx) && (nNameIdx <= maNames.size()) ) - aOperand = maNames[ nNameIdx - 1 ]; - else - aOperand.Insert( "NAME(", 0 ).Append( ')' ); - aStack.PushOperand( aOperand, nOp ); - } - break; - case 0x24: // Cell Reference [319 270] - case 0x44: - case 0x64: - case 0x2A: // Deleted Cell Reference [323 273] - case 0x4A: - case 0x6A: - { - if( (nOp & 0x1F) == 0x04 ) - STARTTOKENCLASS( "Ref" ); - else - STARTTOKENCLASS( "RefErr" ); - - UINT16 nCol, nRow; - *pIn >> nRow >> nCol; - AddRef( aOperand, nRow, nCol, bRangeName ); - t += "2D cell ref C/R="; __AddHex( t, nCol ); - t += '/'; __AddHex( t, nRow ); - t += ' '; t += aOperand; - aStack.PushOperand( aOperand, nOp ); - } - break; - case 0x25: // Area Reference [320 270] - case 0x45: - case 0x65: - case 0x2B: // Deleted Area Refernce [323 273] - case 0x4B: - case 0x6B: - { - if( (nOp & 0x1F) == 0x05 ) - STARTTOKENCLASS( "Area" ); - else - STARTTOKENCLASS( "AreaErr" ); - - UINT16 nRowFirst, nRowLast, nColFirst, nColLast; - *pIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast; - AddRangeRef( aOperand, nRowFirst, nColFirst, nRowLast, nColLast, bRangeName ); - t += "2D area ref C/R:C/R="; __AddHex( t, nColFirst ); - t += '/'; __AddHex( t, nRowFirst ); - t += ':'; __AddHex( t, nColLast ); - t += '/'; __AddHex( t, nRowLast ); - t += ' '; t += aOperand; - aStack.PushOperand( aOperand, nOp ); - } - break; - case 0x26: // Constant Reference Subexpression [321 271] - case 0x46: - case 0x66: - { - STARTTOKENCLASS( "MemArea" ); - sal_uInt32 nRes; - sal_uInt16 nSize; - *pIn >> nRes >> nSize; - t += "reserved="; __AddHex( t, nRes ); - t += " size="; __AddDec( t, nSize ); - } - break; - case 0x27: // Erroneous Constant Reference Subexpr. [322 272] - case 0x47: - case 0x67: - { - STARTTOKENCLASS( "MemErr" ); - sal_uInt32 nRes; - sal_uInt16 nSize; - *pIn >> nRes >> nSize; - t += "reserved="; __AddHex( t, nRes ); - t += " size="; __AddDec( t, nSize ); - } - break; - case 0x28: // Incomplete Constant Reference Subexpr.[331 281] - case 0x48: - case 0x68: - { - STARTTOKENCLASS( "MemNoMem" ); - sal_uInt32 nRes; - sal_uInt16 nSize; - *pIn >> nRes >> nSize; - t += "reserved="; __AddHex( t, nRes ); - t += " size="; __AddDec( t, nSize ); - } - break; - case 0x29: // Variable Reference Subexpression [331 281] - case 0x49: - case 0x69: - { - STARTTOKENCLASS( "MemFunc" ); - sal_uInt16 nSize; - *pIn >> nSize; - t += "size="; __AddDec( t, nSize ); - } - break; - case 0x2C: // Cell Reference Within a Name/ShrdFmla [323 273] - case 0x4C: - case 0x6C: - { - STARTTOKENCLASS( "RefN" ); - UINT16 nRow, nCol; - *pIn >> nRow >> nCol; - AddRef( aOperand, nRow, nCol, bRNorSF ); - t += "2D cell ref in name C/R="; __AddHex( t, nCol ); - t += '/'; __AddHex( t, nRow ); - t += ' '; t += aOperand; - aStack.PushOperand( aOperand, nOp ); - } - break; - case 0x2D: // Area Reference Within a Name/ShrdFmla [324 274] - case 0x4D: - case 0x6D: - { - STARTTOKENCLASS( "AreaN" ); - UINT16 nRowFirst, nRowLast, nColFirst, nColLast; - *pIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast; - AddRangeRef( aOperand, nRowFirst, nColFirst, nRowLast, nColLast, bRNorSF ); - t += "2D area ref in name C/R:C/R"; __AddHex( t, nColFirst ); - t += '/'; __AddHex( t, nRowFirst ); - t += ':'; __AddHex( t, nColLast ); - t += '/'; __AddHex( t, nRowLast ); - t += ' '; t += aOperand; - aStack.PushOperand( aOperand, nOp ); - } - break; - case 0x2E: // Reference Subexpression Within a Name [332 282] - case 0x4E: - case 0x6E: - { - STARTTOKENCLASS( "MemAreaN" ); - sal_uInt16 nSize; - *pIn >> nSize; - t += "size="; __AddDec( t, nSize ); - } - break; - case 0x2F: // Incomplete Reference Subexpression... [332 282] - case 0x4F: - case 0x6F: - { - STARTTOKENCLASS( "MemNoMemN" ); - sal_uInt16 nSize; - *pIn >> nSize; - t += "size="; __AddDec( t, nSize ); - } - break; - case 0x39: // Name or External Name [ 275] - case 0x59: - case 0x79: - { - STARTTOKENCLASS( "NameX" ); - UINT16 nXti, nName; - *pIn >> nXti >> nName; - pIn->Ignore( 2 ); - t += "external name: XTI="; __AddDec( t, nXti ); - t += " name index="; __AddDec( t, nName ); - aOperand += "EXTNAME(XTI("; - __AddDec( aOperand, nXti ); - aOperand += "),"; - __AddDec( aOperand, nName ); - aOperand += ')'; - aStack.PushOperand( aOperand, nOp ); - } - break; - case 0x3A: // 3-D Cell Reference [ 275] - case 0x5A: - case 0x7A: - case 0x3C: // Deleted 3-D Cell Reference [ 277] - case 0x5C: - case 0x7C: - { - if( (nOp & 0x1F) == 0x1A ) - STARTTOKENCLASS( "Ref3d" ); - else - STARTTOKENCLASS( "Ref3dErr" ); - - UINT16 nXti, nRow, nCol; - *pIn >> nXti >> nRow >> nCol; - AddRef( aOperand, nRow, nCol, bRangeName, nXti ); - t += "3D cell ref Xti!C/R="; __AddHex( t, nXti ); - t += '!'; __AddHex( t, nCol ); - t += '/'; __AddHex( t, nRow ); - t += ' '; t += aOperand; - aStack.PushOperand( aOperand, nOp ); - } - break; - case 0x3B: // 3-D Area Reference [ 276] - case 0x5B: - case 0x7B: - case 0x3D: // Deleted 3-D Area Reference [ 277] - case 0x5D: - case 0x7D: - { - if( (nOp & 0x1F) == 0x1B ) - STARTTOKENCLASS( "Area3d" ); - else - STARTTOKENCLASS( "Area3dErr" ); - - UINT16 nXti, nRow1, nCol1, nRow2, nCol2; - *pIn >> nXti >> nRow1 >> nRow2 >> nCol1 >> nCol2; - AddRangeRef( aOperand, nRow1, nCol1, nRow2, nCol2, bRangeName, nXti ); - t += "3D area ref Xti!C/R:C/R="; __AddHex( t, nXti ); - t += '!'; __AddHex( t, nCol1 ); - t += '/'; __AddHex( t, nRow1 ); - t += ':'; __AddHex( t, nCol2 ); - t += '/'; __AddHex( t, nRow2 ); - t += ' '; t += aOperand; - aStack.PushOperand( aOperand, nOp ); - } - break; - default: - STARTTOKEN( "unknown" ); - bError = TRUE; - } - PRINTTOKEN(); - } - t.Assign( " Formula = " ); - if( aStack.GetFormula().Len() ) t += aStack.GetFormula(); else t += "ERROR IN STACK"; - Print( t ); - t.Assign( " Tokencl = " ).Append( aStack.GetTokenClasses() ); - Print( t ); - pIn->Seek( nAfterPos ); -} - - -// ============================================================================ -// -// S T R E A M C O N T E N T S -// -// ============================================================================ - -void Biff8RecDumper::DumpBinary( SvStream& rInStrm, ULONG nSize ) -{ - ULONG nStrmPos = rInStrm.Tell(); - rInStrm.Seek( STREAM_SEEK_TO_END ); - ULONG nStrmLen = rInStrm.Tell(); - rInStrm.Seek( nStrmPos ); - ULONG nDumpEnd = (nSize == STREAM_SEEK_TO_END) ? nStrmLen : ::std::min( nStrmPos + nSize, nStrmLen ); - - const ULONG LINE_SIZE = 16; - sal_uInt8 pnData[ LINE_SIZE ]; - - while( rInStrm.Tell() < nDumpEnd ) - { - ByteString aBinLine; - ByteString aTextLine; - - ULONG nLineLen = ::std::min( nDumpEnd - rInStrm.Tell(), LINE_SIZE ); - rInStrm.Read( pnData, nLineLen ); - - for( sal_uInt8 *pnByte = pnData, *pnEnd = pnData + nLineLen; pnByte != pnEnd; ++pnByte ) - { - if( pnByte - pnData == LINE_SIZE / 2 ) - { - aBinLine.Append( ' ' ); - aTextLine.Append( ' ' ); - } - __AddPureHex( aBinLine, *pnByte ); - aBinLine.Append( ' ' ); - aTextLine.Append( static_cast< sal_Char >( IsPrintable( *pnByte ) ? *pnByte : '.' ) ); - } - - aBinLine.Expand( LINE_SIZE * 3 + 3, ' ' ); - (*pDumpStream) << aBinLine.GetBuffer() << aTextLine.GetBuffer() << "\n"; - } -} - -// ============================================================================ -// -// F O R M C O N T R O L S -// -// ============================================================================ - -namespace { - -// little helpers ------------------------------------------------------------- - -/** Import from bytestream. */ -SvStream& operator>>( SvStream& rStrm, XclGuid& rGuid ) -{ - rStrm.Read( rGuid.mpnData, 16 ); - return rStrm; -} - -/** Output guid into text stream. */ -SvStream& operator<<( SvStream& rStrm, const XclGuid& rGuid ) -{ - ByteString aOut; - lclAppendGuid( aOut, rGuid ); - return rStrm << aOut.GetBuffer(); -} - -void lclAlignStream( SvStream& rInStrm, ULONG nStartPos, ULONG nDataWidth ) -{ - rInStrm.SeekRel( nDataWidth - 1 - (rInStrm.Tell() - nStartPos + nDataWidth - 1) % nDataWidth ); -} - -// control types -------------------------------------------------------------- - -const sal_uInt16 EXC_CTRL_PAGE = 0x0007; -const sal_uInt16 EXC_CTRL_IMAGE = 0x000C; -const sal_uInt16 EXC_CTRL_FRAME = 0x000E; -const sal_uInt16 EXC_CTRL_SPINBUTTON = 0x0010; -const sal_uInt16 EXC_CTRL_PUSHBUTTON = 0x0011; -const sal_uInt16 EXC_CTRL_TABSTRIP = 0x0012; -const sal_uInt16 EXC_CTRL_LABEL = 0x0015; -const sal_uInt16 EXC_CTRL_TEXTBOX = 0x0017; -const sal_uInt16 EXC_CTRL_LISTBOX = 0x0018; -const sal_uInt16 EXC_CTRL_COMBOBOX = 0x0019; -const sal_uInt16 EXC_CTRL_CHECKBOX = 0x001A; -const sal_uInt16 EXC_CTRL_OPTIONBUTTON = 0x001B; -const sal_uInt16 EXC_CTRL_TOGGLEBUTTON = 0x001C; -const sal_uInt16 EXC_CTRL_SCROLLBAR = 0x002F; -const sal_uInt16 EXC_CTRL_MULTIPAGE = 0x0039; -const sal_uInt16 EXC_CTRL_REFEDIT = 0x8000; -const sal_uInt16 EXC_CTRL_FONTDATA = 0xFFF0; // internal use only -const sal_uInt16 EXC_CTRL_USERFORM = 0xFFF1; // internal use only -const sal_uInt16 EXC_CTRL_ADDDATA = 0xFFF2; // internal use only -const sal_uInt16 EXC_CTRL_FRAMECHILD = 0xFFF3; // internal use only -const sal_uInt16 EXC_CTRL_PROGRESSBAR = 0xFFF4; // internal use only -const sal_uInt16 EXC_CTRL_UNKNOWN = 0xFFFF; // internal use only - -const sal_uInt16 EXC_CTRL_RECORD_ID = 0x0000; -const sal_uInt16 EXC_CTRL_CLIENT_ID = 0x0200; -const sal_uInt16 EXC_CTRL_CONTAINER_ID = 0x0400; - -// control names -------------------------------------------------------------- - -struct XclDumpControlInfo -{ - sal_uInt16 mnType; - const sal_Char* mpcName; - sal_uInt16 mnId; -}; - -static const XclDumpControlInfo spControlInfos[] = -{ - { EXC_CTRL_PAGE, "Page", EXC_CTRL_CONTAINER_ID }, - { EXC_CTRL_IMAGE, "Image", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_FRAME, "Frame", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_SPINBUTTON, "Spin", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_PUSHBUTTON, "PushButton", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_TABSTRIP, "TabStrip", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_LABEL, "Label", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_TEXTBOX, "TextBox", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_LISTBOX, "ListBox", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_COMBOBOX, "ComboBox", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_CHECKBOX, "CheckBox", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_OPTIONBUTTON, "OptionButton", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_TOGGLEBUTTON, "ToggleButton", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_SCROLLBAR, "ScrollBar", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_MULTIPAGE, "MultiPage", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_REFEDIT, "RefEdit", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_FONTDATA, "FontData", EXC_CTRL_CLIENT_ID }, - { EXC_CTRL_USERFORM, "UserForm", EXC_CTRL_CONTAINER_ID }, - { EXC_CTRL_ADDDATA, "AddData", EXC_CTRL_RECORD_ID }, - { EXC_CTRL_FRAMECHILD, "FrameChild", EXC_CTRL_RECORD_ID }, - { EXC_CTRL_PROGRESSBAR, "ProgressBar", EXC_CTRL_RECORD_ID } -}; - -typedef ::std::map< sal_uInt16, const XclDumpControlInfo* > XclDumpControlInfoMap; -typedef ScfRef< XclDumpControlInfoMap > XclDumpControlInfoMapRef; - -XclDumpControlInfoMapRef lclCreateControlInfoMap() -{ - XclDumpControlInfoMapRef xMap( new XclDumpControlInfoMap ); - for( const XclDumpControlInfo *pIt = spControlInfos, *pEnd = STATIC_TABLE_END( spControlInfos ); pIt != pEnd; ++pIt ) - (*xMap)[ pIt->mnType ] = pIt; - return xMap; -} - -const XclDumpControlInfoMap& lclGetControlInfoMap() -{ - static const XclDumpControlInfoMapRef sxMap = lclCreateControlInfoMap(); - return *sxMap; -} - -void lclAppendControlType( ByteString& rStr, sal_uInt16 nCtrlType ) -{ - const XclDumpControlInfoMap& rMap = lclGetControlInfoMap(); - XclDumpControlInfoMap::const_iterator aIt = rMap.find( nCtrlType ); - rStr.Append( (aIt == rMap.end()) ? "*UNKNOWN*" : aIt->second->mpcName ); -} - -void lclDumpControlType( SvStream& rOutStrm, sal_uInt16 nCtrlType ) -{ - ByteString aTitle( "type=" ); - lclAppendHex( aTitle, nCtrlType ); - aTitle.Append( " (" ); - lclAppendControlType( aTitle, nCtrlType ); - aTitle.Append( ')' ); - rOutStrm << aTitle.GetBuffer(); -} - -sal_uInt16 lclDumpControlHeader( SvStream& rInStrm, SvStream& rOutStrm, sal_uInt16 nCtrlType ) -{ - lclDumpControlType( rOutStrm, nCtrlType ); - sal_uInt16 nId, nSize; - rInStrm >> nId >> nSize; - ByteString aLine( " id=" ); lclAppendHex( aLine, nId ); - const XclDumpControlInfoMap& rMap = lclGetControlInfoMap(); - XclDumpControlInfoMap::const_iterator aIt = rMap.find( nCtrlType ); - bool bValid = (aIt != rMap.end()) && (aIt->second->mnId == nId); - aLine.Append( bValid ? " (valid)" : " (invalid)" ); - aLine.Append( " size=" ); lclAppendHex( aLine, nSize ); - rOutStrm << aLine.GetBuffer() << "\n"; - return nSize; -} - -// control GUIDs -------------------------------------------------------------- - -struct XclDumpControlGuid -{ - sal_uInt16 mnType; - sal_uInt32 mnGuidData1; - sal_uInt16 mnGuidData2; - sal_uInt16 mnGuidData3; - sal_uInt8 mnGuidData41; - sal_uInt8 mnGuidData42; - sal_uInt8 mnGuidData43; - sal_uInt8 mnGuidData44; - sal_uInt8 mnGuidData45; - sal_uInt8 mnGuidData46; - sal_uInt8 mnGuidData47; - sal_uInt8 mnGuidData48; -}; - -static const XclDumpControlGuid spControlGuids[] = -{ - { EXC_CTRL_PUSHBUTTON, 0xD7053240, 0xCE69, 0x11CD, 0xA7, 0x77, 0x00, 0xDD, 0x01, 0x14, 0x3C, 0x57 }, - { EXC_CTRL_TOGGLEBUTTON, 0x8BD21D60, 0xEC42, 0x11CE, 0x9E, 0x0D, 0x00, 0xAA, 0x00, 0x60, 0x02, 0xF3 }, - { EXC_CTRL_CHECKBOX, 0x8BD21D40, 0xEC42, 0x11CE, 0x9E, 0x0D, 0x00, 0xAA, 0x00, 0x60, 0x02, 0xF3 }, - { EXC_CTRL_OPTIONBUTTON, 0x8BD21D50, 0xEC42, 0x11CE, 0x9E, 0x0D, 0x00, 0xAA, 0x00, 0x60, 0x02, 0xF3 }, - { EXC_CTRL_LABEL, 0x978C9E23, 0xD4B0, 0x11CE, 0xBF, 0x2D, 0x00, 0xAA, 0x00, 0x3F, 0x40, 0xD0 }, - { EXC_CTRL_TEXTBOX, 0x8BD21D10, 0xEC42, 0x11CE, 0x9E, 0x0D, 0x00, 0xAA, 0x00, 0x60, 0x02, 0xF3 }, - { EXC_CTRL_LISTBOX, 0x8BD21D20, 0xEC42, 0x11CE, 0x9E, 0x0D, 0x00, 0xAA, 0x00, 0x60, 0x02, 0xF3 }, - { EXC_CTRL_COMBOBOX, 0x8BD21D30, 0xEC42, 0x11CE, 0x9E, 0x0D, 0x00, 0xAA, 0x00, 0x60, 0x02, 0xF3 }, - { EXC_CTRL_SPINBUTTON, 0x79176FB0, 0xB7F2, 0x11CE, 0x97, 0xEF, 0x00, 0xAA, 0x00, 0x6D, 0x27, 0x76 }, - { EXC_CTRL_SCROLLBAR, 0xDFD181E0, 0x5E2F, 0x11CE, 0xA4, 0x49, 0x00, 0xAA, 0x00, 0x4A, 0x80, 0x3D }, - { EXC_CTRL_IMAGE, 0x4C599241, 0x6926, 0x101B, 0x99, 0x92, 0x00, 0x00, 0x0B, 0x65, 0xC6, 0xF9 }, - { EXC_CTRL_PROGRESSBAR, 0x35053A22, 0x8589, 0x11D1, 0xB1, 0x6A, 0x00, 0xC0, 0xF0, 0x28, 0x36, 0x28 } -}; - -typedef ::std::map< XclGuid, sal_uInt16 > XclDumpControlGuidMap; -typedef ScfRef< XclDumpControlGuidMap > XclDumpControlGuidMapRef; - -XclDumpControlGuidMapRef lclCreateControlGuidMap() -{ - XclDumpControlGuidMapRef xMap( new XclDumpControlGuidMap ); - for( const XclDumpControlGuid *pIt = spControlGuids, *pEnd = STATIC_TABLE_END( spControlGuids ); pIt != pEnd; ++pIt ) - { - XclGuid aGuid( pIt->mnGuidData1, pIt->mnGuidData2, pIt->mnGuidData3, - pIt->mnGuidData41, pIt->mnGuidData42, pIt->mnGuidData43, pIt->mnGuidData44, - pIt->mnGuidData45, pIt->mnGuidData46, pIt->mnGuidData47, pIt->mnGuidData48 ); - (*xMap)[ aGuid ] = pIt->mnType; - } - return xMap; -} - -const XclDumpControlGuidMap& lclGetControlGuidMap() -{ - static const XclDumpControlGuidMapRef sxMap = lclCreateControlGuidMap(); - return *sxMap; -} - -sal_uInt16 lclDumpControlGuid( SvStream& rInStrm, SvStream& rOutStrm ) -{ - XclGuid aGuid; - rInStrm >> aGuid; - const XclDumpControlGuidMap& rMap = lclGetControlGuidMap(); - XclDumpControlGuidMap::const_iterator aIt = rMap.find( aGuid ); - sal_uInt16 nCtrlType = (aIt == rMap.end()) ? EXC_CTRL_UNKNOWN : aIt->second; - rOutStrm << "guid=" << aGuid; - return nCtrlType; -}; - -// other guids ---------------------------------------------------------------- - -static const XclGuid saStdFontGuid( 0x0BE35203, 0x8F91, 0x11CE, 0x9D, 0xE3, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51 ); -static const XclGuid saStdPicGuid( 0x0BE35204, 0x8F91, 0x11CE, 0x9D, 0xE3, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51 );\ - -// ---------------------------------------------------------------------------- - -} // namespace - -// *** yet some other ugly macros for the specials of form control dumping *** - -// align the instream -#define EXC_CTRLDUMP_ALIGN_INSTRM( val ) lclAlignStream( rInStrm, nStartPos, val ) -// push the string to outstream -#define EXC_CTRLDUMP_PRINT() { if( t.Len() ) { rOutStrm << t.GetBuffer() << '\n'; t.Erase(); } } - -// implementation, don't use -#define IMPL_EXC_CTRLDUMP_PLAIN_VALUE( type, func, text ) { type n; rInStrm >> n; t.Append( " " text "=" ); func( t, n ); EXC_CTRLDUMP_PRINT(); } -#define IMPL_EXC_CTRLDUMP_VALUE( type, func, text ) { EXC_CTRLDUMP_ALIGN_INSTRM( sizeof( type ) ); IMPL_EXC_CTRLDUMP_PLAIN_VALUE( type, func, text ); } -#define IMPL_EXC_CTRLDUMP_PLAIN_VAR( var, mask, func, text ) { rInStrm >> var; var &= (mask); t.Append( " " text "=" ); func( t, var ); EXC_CTRLDUMP_PRINT(); } -#define IMPL_EXC_CTRLDUMP_VAR( var, mask, func, text ) { EXC_CTRLDUMP_ALIGN_INSTRM( sizeof( var ) ); IMPL_EXC_CTRLDUMP_PLAIN_VAR( var, mask, func, text ); } - -// read a value from stream (no stream alignment) -#define EXC_CTRLDUMP_PLAIN_HEX4( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( sal_uInt32, lclAppendHex, text ) -#define EXC_CTRLDUMP_PLAIN_DEC4( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( sal_Int32, lclAppendDec, text ) -#define EXC_CTRLDUMP_PLAIN_HEX2( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( sal_uInt16, lclAppendHex, text ) -#define EXC_CTRLDUMP_PLAIN_DEC2( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( sal_Int16, lclAppendDec, text ) -#define EXC_CTRLDUMP_PLAIN_HEX1( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( sal_uInt8, lclAppendHex, text ) -#define EXC_CTRLDUMP_PLAIN_DEC1( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( sal_Int8, lclAppendDec, text ) -#define EXC_CTRLDUMP_PLAIN_DECF( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( float, lclAppendDec, text ) -// read a value from stream (with stream alignment) -#define EXC_CTRLDUMP_HEX4( text ) IMPL_EXC_CTRLDUMP_VALUE( sal_uInt32, lclAppendHex, text ) -#define EXC_CTRLDUMP_DEC4( text ) IMPL_EXC_CTRLDUMP_VALUE( sal_Int32, lclAppendDec, text ) -#define EXC_CTRLDUMP_HEX2( text ) IMPL_EXC_CTRLDUMP_VALUE( sal_uInt16, lclAppendHex, text ) -#define EXC_CTRLDUMP_DEC2( text ) IMPL_EXC_CTRLDUMP_VALUE( sal_Int16, lclAppendDec, text ) -#define EXC_CTRLDUMP_HEX1( text ) IMPL_EXC_CTRLDUMP_VALUE( sal_uInt8, lclAppendHex, text ) -#define EXC_CTRLDUMP_DEC1( text ) IMPL_EXC_CTRLDUMP_VALUE( sal_Int8, lclAppendDec, text ) -// read a value from stream into existing variable (no stream alignment) -#define EXC_CTRLDUMP_PLAIN_HEXVAR( var, text ) IMPL_EXC_CTRLDUMP_PLAIN_VAR( var, ~0, lclAppendHex, text ) -#define EXC_CTRLDUMP_PLAIN_DECVAR( var, text ) IMPL_EXC_CTRLDUMP_PLAIN_VAR( var, ~0, lclAppendDec, text ) -#define EXC_CTRLDUMP_PLAIN_HEXVARMASK( var, mask, text ) IMPL_EXC_CTRLDUMP_PLAIN_VAR( var, mask, lclAppendHex, text ) -#define EXC_CTRLDUMP_PLAIN_DECVARMASK( var, mask, text ) IMPL_EXC_CTRLDUMP_PLAIN_VAR( var, mask, lclAppendDec, text ) -// read a value from stream into existing variable (with stream alignment) -#define EXC_CTRLDUMP_HEXVAR( var, text ) IMPL_EXC_CTRLDUMP_VAR( var, ~0, lclAppendHex, text ) -#define EXC_CTRLDUMP_DECVAR( var, text ) IMPL_EXC_CTRLDUMP_VAR( var, ~0, lclAppendDec, text ) -#define EXC_CTRLDUMP_HEXVARMASK( var, mask, text ) IMPL_EXC_CTRLDUMP_VAR( var, mask, lclAppendHex, text ) -#define EXC_CTRLDUMP_DECVARMASK( var, mask, text ) IMPL_EXC_CTRLDUMP_VAR( var, mask, lclAppendDec, text ) -// read flag fields -#define EXC_CTRLDUMP_PLAIN_STARTOPTFLAG( text, doread, defaults )\ -{ \ - nFlags = defaults; \ - t.Append( " " text ); \ - if( doread ) \ - rInStrm >> nFlags; \ - else \ - t.Append( "-defaulted" ); \ - t.Append( '=' ); \ - lclAppendHex( t, nFlags ); \ -} -#define EXC_CTRLDUMP_STARTOPTFLAG( text, doread, defaults ) { if( doread ) { EXC_CTRLDUMP_ALIGN_INSTRM( sizeof( nFlags ) ); } EXC_CTRLDUMP_PLAIN_STARTOPTFLAG( text, doread, defaults ) } -#define EXC_CTRLDUMP_PLAIN_STARTFLAG( text ) EXC_CTRLDUMP_PLAIN_STARTOPTFLAG( text, true, 0 ) -#define EXC_CTRLDUMP_STARTFLAG( text ) EXC_CTRLDUMP_STARTOPTFLAG( text, true, 0 ) -#define EXC_CTRLDUMP_ADDFLAG( flag, text ) { if( nFlags & (flag) ) t.Append( " " text ); } -#define EXC_CTRLDUMP_ADDFLAGVALUE( start, width, text ) { sal_uInt32 nValue; ::extract_value( nValue, nFlags, start, width ); t.Append( " " text "=" ); lclAppendDec( t, nValue ); } -#define EXC_CTRLDUMP_ENDFLAG( reserved ) { if( nFlags & (reserved) ) { t.Append( " ?" ); lclAppendHex( t, static_cast< sal_uInt32 >( nFlags & (reserved) ) ); } EXC_CTRLDUMP_PRINT(); } -// read coordinates -#define EXC_CTRLDUMP_COORD2( text ) { EXC_CTRLDUMP_ALIGN_INSTRM( 4 ); EXC_CTRLDUMP_DEC2( text "-x" ); EXC_CTRLDUMP_DEC2( text "-y" ); } -#define EXC_CTRLDUMP_COORD4( text ) { EXC_CTRLDUMP_DEC4( text "-x" ); EXC_CTRLDUMP_DEC4( text "-y" ); } -#define EXC_CTRLDUMP_SIZE4( text ) { EXC_CTRLDUMP_DEC4( text "-width" ); EXC_CTRLDUMP_DEC4( text "-height" ); } -// read guid -#define EXC_CTRLDUMP_PLAIN_GUID( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( XclGuid, lclAppendGuid, text ) -#define EXC_CTRLDUMP_GUID( text ) { EXC_CTRLDUMP_ALIGN_INSTRM( 4 ); EXC_CTRLDUMP_PLAIN_GUID( text ); } -// read control type -#define EXC_CTRLDUMP_CTRLTYPE( var, text ) \ -{ \ - EXC_CTRLDUMP_ALIGN_INSTRM( 2 ); \ - rInStrm >> var; \ - t.Assign( " " text "=" ); lclAppendHex( t, var ); \ - t.Append( " (" ); lclAppendControlType( t, var ); \ - t.Append( ')' ); \ - EXC_CTRLDUMP_PRINT(); \ -} -// read character array, add to string, but do not print -#define EXC_CTRLDUMP_RAWSTRING( var ) \ -{ \ - t.Append( "='" ); \ - if( var ) \ - { \ - EXC_CTRLDUMP_ALIGN_INSTRM( 4 ); \ - ULONG nNextPos = rInStrm.Tell() + (var); \ - if( var > 128 ) var = 128; \ - sal_Char pc[ 129 ]; \ - rInStrm.Read( pc, var ); pc[ var ] = '\0'; \ - t.Append( pc ); \ - rInStrm.Seek( nNextPos ); \ - } \ - t.Append( '\'' ); \ -} -// read a string -#define EXC_CTRLDUMP_STRING( var, text ) \ -{ \ - t.Append( " " text ); \ - EXC_CTRLDUMP_RAWSTRING( var ); \ - EXC_CTRLDUMP_PRINT(); \ -} -// read an array of strings -#define EXC_CTRLDUMP_STRINGARRAY( total, count, text ) \ -{ \ - ULONG nNextPos = rInStrm.Tell() + (total); \ - for( sal_uInt32 nIdx = 0; (nIdx < (count)) && (rInStrm.Tell() < nNextPos); ++nIdx )\ - { \ - EXC_CTRLDUMP_ALIGN_INSTRM( 4 ); \ - sal_uInt32 nLen; \ - rInStrm >> nLen; \ - nLen &= 0x7FFFFFFF; \ - t.Append( " " text "[" ); \ - lclAppendDec( t, nIdx + 1 ); \ - t.Append( ']' ); \ - EXC_CTRLDUMP_RAWSTRING( nLen ); \ - } \ - EXC_CTRLDUMP_PRINT(); \ - rInStrm.Seek( nNextPos ); \ -} -// read embedded font data -#define EXC_CTRLDUMP_FONT( var, text ) \ -if( var ) \ -{ \ - EXC_CTRLDUMP_PRINT(); \ - XclGuid aGuid; rInStrm >> aGuid; \ - rOutStrm << "embedded-font-guid=" << aGuid; \ - if( aGuid == saStdFontGuid ) \ - { \ - rOutStrm << " (StdFont)\n"; \ - EXC_CTRLDUMP_PLAIN_HEX1( "unknown1" ); \ - EXC_CTRLDUMP_PLAIN_DEC1( "script-type" ); \ - EXC_CTRLDUMP_PLAIN_HEX1( "unknown2" ); \ - sal_uInt8 nFlags; \ - EXC_CTRLDUMP_PLAIN_STARTFLAG( "font-style-flags" ); \ - EXC_CTRLDUMP_ADDFLAG( 0x02, "italic" ); \ - EXC_CTRLDUMP_ADDFLAG( 0x04, "underline" ); \ - EXC_CTRLDUMP_ADDFLAG( 0x08, "strikeout" ); \ - EXC_CTRLDUMP_ENDFLAG( 0xF1 ); \ - EXC_CTRLDUMP_PLAIN_DEC2( "font-weight" ); \ - EXC_CTRLDUMP_PLAIN_DEC4( "font-size" ); \ -/* font-size := pt*10000 + (1-((pt+1)%3))*2500 */ \ - sal_uInt8 nLen; \ - EXC_CTRLDUMP_PLAIN_DECVAR( nLen, "font-name-len" ); \ - sal_Char* p = new sal_Char[ nLen + 1 ]; \ - rInStrm.Read( p, nLen ); p[ nLen ] = '\0'; \ - t.Append( " font-name='" ).Append( p ).Append( '\'' );\ - delete [] p; \ - EXC_CTRLDUMP_PRINT(); \ - } \ - else \ - rOutStrm << " (*UNKNOWN*)\n"; \ -} -// read image data -#define EXC_CTRLDUMP_IMAGE( var, text ) \ -if( var ) \ -{ \ - EXC_CTRLDUMP_PRINT(); \ - XclGuid aGuid; rInStrm >> aGuid; \ - rOutStrm << "embedded-" text "-guid=" << aGuid; \ - if( aGuid == saStdPicGuid ) \ - { \ - rOutStrm << " (StdPict)\n"; \ - EXC_CTRLDUMP_PLAIN_HEX2( "u1" ); \ - EXC_CTRLDUMP_PLAIN_HEX2( "u2" ); \ - sal_uInt32 nLen; \ - EXC_CTRLDUMP_PLAIN_DECVAR( nLen, text "-len" ); \ - rInStrm.SeekRel( nLen ); \ - } \ - else \ - rOutStrm << " (*UNKNOWN*)\n"; \ -} -// hex dump remaining or unknown data -#define EXC_CTRLDUMP_REMAINING( nextpos ) \ -{ \ - EXC_CTRLDUMP_ALIGN_INSTRM( 4 ); \ - if( rInStrm.Tell() < (nextpos) ) \ - { \ - rOutStrm << " unknown-data=\n"; \ - DumpBinary( rInStrm, ::std::min< ULONG >( (nextpos) - rInStrm.Tell(), 1024 ) );\ - } \ - rInStrm.Seek( nextpos ); \ -} - -// *** macros end *** - -void Biff8RecDumper::DumpControlContents( SvStream& rInStrm, sal_uInt16 nCtrlType ) -{ - SvStream& rOutStrm = *pDumpStream; - - if( nCtrlType == EXC_CTRL_PROGRESSBAR ) - { - lclDumpControlType( rOutStrm, nCtrlType ); - rOutStrm << '\n'; - - ByteString t; // "t" needed for macros - sal_uInt32 nFlags = 0; // "nFlags" needed for macros - - EXC_CTRLDUMP_PLAIN_HEX4( "unknown" ); - EXC_CTRLDUMP_PLAIN_HEX4( "unknown" ); - EXC_CTRLDUMP_PLAIN_DEC4( "width" ); - EXC_CTRLDUMP_PLAIN_DEC4( "height" ); - EXC_CTRLDUMP_PLAIN_HEX4( "unknown" ); - EXC_CTRLDUMP_PLAIN_HEX4( "unknown" ); - EXC_CTRLDUMP_PLAIN_HEX4( "unknown" ); - EXC_CTRLDUMP_PLAIN_DECF( "min" ); - EXC_CTRLDUMP_PLAIN_DECF( "max" ); - EXC_CTRLDUMP_PLAIN_STARTFLAG( "flags1" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000001, "vertical" ); - EXC_CTRLDUMP_ADDFLAG( 0x00010000, "smooth-scroll" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFEFFFE ); - EXC_CTRLDUMP_PLAIN_HEX4( "unknown" ); - EXC_CTRLDUMP_PLAIN_HEX4( "unknown" ); - EXC_CTRLDUMP_PLAIN_HEX4( "unknown" ); - EXC_CTRLDUMP_PLAIN_STARTFLAG( "flags2" ); - EXC_CTRLDUMP_ADDFLAG( 0x0001, "border-single" ); - EXC_CTRLDUMP_ADDFLAG( 0x0002, "enabled" ); - EXC_CTRLDUMP_ADDFLAG( 0x0004, "3d-style" ); - EXC_CTRLDUMP_ADDFLAGVALUE( 3, 8, "mouse-icon" ); - EXC_CTRLDUMP_ADDFLAG( 0x2000, "ole-drop-manual" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFFD800 ); - return; - } - - sal_uInt16 nSize = lclDumpControlHeader( rInStrm, rOutStrm, nCtrlType ); - if( nSize > 0 ) - { - ULONG nStartPos = rInStrm.Tell(); // for stream alignment macro - ByteString t; // "t" needed for macros - sal_uInt32 nFlags = 0; // "nFlags" needed for macros - - bool bHasFontData = false; - sal_uInt32 nNameLen = 0; - sal_uInt32 nCaptionLen = 0; - sal_uInt32 nValueLen = 0; - sal_uInt32 nGroupNameLen = 0; - sal_uInt32 nTagLen = 0; - sal_uInt32 nTipLen = 0; - sal_uInt32 nCtrlIdLen = 0; - sal_uInt32 nCtrlSrcLen = 0; - sal_uInt32 nRowSrcLen = 0; - sal_uInt16 nPic = 0; - sal_uInt16 nIcon = 0; - sal_uInt16 nFont = 0; - - switch( nCtrlType ) - { - case EXC_CTRL_PUSHBUTTON: - { - EXC_CTRLDUMP_STARTFLAG( "content-flags" ); - EXC_CTRLDUMP_ADDFLAG( 0x0001, "forecolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x0002, "backcolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x0004, "option" ); - EXC_CTRLDUMP_ADDFLAG( 0x0008, "caption" ); - EXC_CTRLDUMP_ADDFLAG( 0x0010, "picpos" ); - EXC_CTRLDUMP_ADDFLAG( 0x0020, "size" ); - EXC_CTRLDUMP_ADDFLAG( 0x0040, "mouseptr" ); - EXC_CTRLDUMP_ADDFLAG( 0x0080, "pic" ); - EXC_CTRLDUMP_ADDFLAG( 0x0100, "accel" ); - EXC_CTRLDUMP_ADDFLAG( 0x0200, "notakefocus" ); - EXC_CTRLDUMP_ADDFLAG( 0x0400, "icon" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFFF800 ); - sal_uInt32 nCtrlFlags = nFlags; - - if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_HEX4( "forecolor" ); - if( nCtrlFlags & 0x0002 ) EXC_CTRLDUMP_HEX4( "backcolor" ); - - EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x0004, 0x0000001B ); - EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000004, "locked" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000008, "opaque" ); - EXC_CTRLDUMP_ADDFLAG( 0x00800000, "wordwrap" ); - EXC_CTRLDUMP_ADDFLAG( 0x10000000, "autosize" ); - EXC_CTRLDUMP_ENDFLAG( 0xEF7FFFF1 ); - - if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_DECVARMASK( nCaptionLen, 0x7FFFFFFF, "caption-len" ); - if( nCtrlFlags & 0x0010 ) EXC_CTRLDUMP_COORD2( "picpos" ); - if( nCtrlFlags & 0x0040 ) EXC_CTRLDUMP_DEC1( "mouseptr" ); - if( nCtrlFlags & 0x0080 ) EXC_CTRLDUMP_HEXVAR( nPic, "pic" ); - if( nCtrlFlags & 0x0100 ) EXC_CTRLDUMP_HEX2( "accel" ); - if( nCtrlFlags & 0x0400 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" ); - - if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_STRING( nCaptionLen, "caption" ); - if( nCtrlFlags & 0x0020 ) EXC_CTRLDUMP_SIZE4( "size" ); - EXC_CTRLDUMP_REMAINING( nStartPos + nSize ); - - EXC_CTRLDUMP_IMAGE( nPic, "pic" ); - EXC_CTRLDUMP_IMAGE( nIcon, "icon" ); - bHasFontData = true; - } - break; - - case EXC_CTRL_TOGGLEBUTTON: - case EXC_CTRL_CHECKBOX: - case EXC_CTRL_OPTIONBUTTON: - case EXC_CTRL_TEXTBOX: - case EXC_CTRL_LISTBOX: - case EXC_CTRL_COMBOBOX: - case EXC_CTRL_REFEDIT: - { - EXC_CTRLDUMP_STARTFLAG( "content-flags" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000001, "option" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000002, "backcolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000004, "forecolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000008, "maxlen" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000010, "borderstyle" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000020, "scrollbars" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000040, "style" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000080, "mouseptr" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000100, "size" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000200, "passwordchar" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000400, "listwidth" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000800, "boundcol" ); - EXC_CTRLDUMP_ADDFLAG( 0x00001000, "textcol" ); - EXC_CTRLDUMP_ADDFLAG( 0x00002000, "colcount" ); - EXC_CTRLDUMP_ADDFLAG( 0x00004000, "listrows" ); - EXC_CTRLDUMP_ADDFLAG( 0x00008000, "colwidth?" ); - EXC_CTRLDUMP_ADDFLAG( 0x00010000, "matchentry" ); - EXC_CTRLDUMP_ADDFLAG( 0x00020000, "liststyle" ); - EXC_CTRLDUMP_ADDFLAG( 0x00040000, "showdropbtn" ); - EXC_CTRLDUMP_ADDFLAG( 0x00100000, "dropbtnstyle" ); - EXC_CTRLDUMP_ADDFLAG( 0x00200000, "multistate" ); - EXC_CTRLDUMP_ADDFLAG( 0x00400000, "value" ); - EXC_CTRLDUMP_ADDFLAG( 0x00800000, "caption" ); - EXC_CTRLDUMP_ADDFLAG( 0x01000000, "picpos" ); - EXC_CTRLDUMP_ADDFLAG( 0x02000000, "bordercolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x04000000, "specialeff" ); - EXC_CTRLDUMP_ADDFLAG( 0x08000000, "icon" ); - EXC_CTRLDUMP_ADDFLAG( 0x10000000, "pic" ); - EXC_CTRLDUMP_ADDFLAG( 0x20000000, "accel" ); - EXC_CTRLDUMP_ENDFLAG( 0x40080000 ); // 0x80000000 always set? - sal_uInt32 nCtrlFlags = nFlags; - - EXC_CTRLDUMP_STARTFLAG( "2nd-content-flags" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000001, "groupname" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFFFFFE ); - sal_uInt32 nCtrlFlags2 = nFlags; - - EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x00000001, 0x2C80081B ); - EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000004, "locked" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000008, "opaque" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000400, "colheads" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000800, "intheight" ); - EXC_CTRLDUMP_ADDFLAG( 0x00001000, "matchreq" ); - EXC_CTRLDUMP_ADDFLAG( 0x00002000, "align" ); - EXC_CTRLDUMP_ADDFLAGVALUE( 15, 4, "ime-mode" ); - EXC_CTRLDUMP_ADDFLAG( 0x00080000, "dragbehav" ); - EXC_CTRLDUMP_ADDFLAG( 0x00100000, "enterkeybehav" ); - EXC_CTRLDUMP_ADDFLAG( 0x00200000, "enterfieldbehav" ); - EXC_CTRLDUMP_ADDFLAG( 0x00400000, "tabkeybehav" ); - EXC_CTRLDUMP_ADDFLAG( 0x00800000, "wordwrap" ); - EXC_CTRLDUMP_ADDFLAG( 0x04000000, "selmargin" ); - EXC_CTRLDUMP_ADDFLAG( 0x08000000, "autowordsel" ); - EXC_CTRLDUMP_ADDFLAG( 0x10000000, "autosize" ); - EXC_CTRLDUMP_ADDFLAG( 0x20000000, "hidesel" ); - EXC_CTRLDUMP_ADDFLAG( 0x40000000, "autotab" ); - EXC_CTRLDUMP_ADDFLAG( 0x80000000, "multiline" ); - EXC_CTRLDUMP_ENDFLAG( 0x030043F1 ); - - if( nCtrlFlags & 0x00000002 ) EXC_CTRLDUMP_HEX4( "backcolor" ); - if( nCtrlFlags & 0x00000004 ) EXC_CTRLDUMP_HEX4( "forecolor" ); - if( nCtrlFlags & 0x00000008 ) EXC_CTRLDUMP_DEC4( "maxlen" ); - if( nCtrlFlags & 0x00000010 ) EXC_CTRLDUMP_DEC1( "borderstyle" ); - if( nCtrlFlags & 0x00000020 ) EXC_CTRLDUMP_DEC1( "scrollbars" ); - if( nCtrlFlags & 0x00000040 ) EXC_CTRLDUMP_DEC1( "style" ); - if( nCtrlFlags & 0x00000080 ) EXC_CTRLDUMP_DEC1( "mouseptr" ); - if( nCtrlFlags & 0x00000200 ) EXC_CTRLDUMP_HEX2( "passwordchar" ); - if( nCtrlFlags & 0x00000400 ) EXC_CTRLDUMP_DEC4( "listwidth" ); - if( nCtrlFlags & 0x00000800 ) EXC_CTRLDUMP_DEC2( "boundcol" ); - if( nCtrlFlags & 0x00001000 ) EXC_CTRLDUMP_DEC2( "textcol" ); - if( nCtrlFlags & 0x00002000 ) EXC_CTRLDUMP_DEC2( "colcount" ); - if( nCtrlFlags & 0x00004000 ) EXC_CTRLDUMP_DEC2( "listrows" ); - if( nCtrlFlags & 0x00008000 ) EXC_CTRLDUMP_DEC2( "colwidth?" ); - if( nCtrlFlags & 0x00010000 ) EXC_CTRLDUMP_DEC1( "matchentry" ); - if( nCtrlFlags & 0x00020000 ) EXC_CTRLDUMP_DEC1( "liststyle" ); - if( nCtrlFlags & 0x00040000 ) EXC_CTRLDUMP_DEC1( "showdropbtn" ); - if( nCtrlFlags & 0x00100000 ) EXC_CTRLDUMP_DEC1( "dropbtnstyle" ); - if( nCtrlFlags & 0x00200000 ) EXC_CTRLDUMP_DEC1( "multistate" ); - if( nCtrlFlags & 0x00400000 ) EXC_CTRLDUMP_DECVARMASK( nValueLen, 0x7FFFFFFF, "value-len" ); - if( nCtrlFlags & 0x00800000 ) EXC_CTRLDUMP_DECVARMASK( nCaptionLen, 0x7FFFFFFF, "caption-len" ); - if( nCtrlFlags & 0x01000000 ) EXC_CTRLDUMP_COORD2( "picpos" ); - if( nCtrlFlags & 0x02000000 ) EXC_CTRLDUMP_HEX4( "bordercolor" ); - if( nCtrlFlags & 0x04000000 ) EXC_CTRLDUMP_DEC4( "specialeff" ); - if( nCtrlFlags & 0x08000000 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" ); - if( nCtrlFlags & 0x10000000 ) EXC_CTRLDUMP_HEXVAR( nPic, "pic" ); - if( nCtrlFlags & 0x20000000 ) EXC_CTRLDUMP_HEX1( "accel" ); - if( nCtrlFlags2 & 0x00000001 ) EXC_CTRLDUMP_DECVARMASK( nGroupNameLen, 0x7FFFFFFF, "groupname-len" ); - - if( nCtrlFlags & 0x00000100 ) EXC_CTRLDUMP_SIZE4( "size" ); - if( nCtrlFlags & 0x00400000 ) EXC_CTRLDUMP_STRING( nValueLen, "value" ); - if( nCtrlFlags & 0x00800000 ) EXC_CTRLDUMP_STRING( nCaptionLen, "caption" ); - if( nCtrlFlags2 & 0x00000001 ) EXC_CTRLDUMP_STRING( nGroupNameLen, "groupname" ); - EXC_CTRLDUMP_REMAINING( nStartPos + nSize ); - - EXC_CTRLDUMP_IMAGE( nIcon, "icon" ); - EXC_CTRLDUMP_IMAGE( nPic, "pic" ); - bHasFontData = true; - } - break; - - case EXC_CTRL_LABEL: - { - EXC_CTRLDUMP_STARTFLAG( "content-flags" ); - EXC_CTRLDUMP_ADDFLAG( 0x0001, "forecolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x0002, "backcolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x0004, "option" ); - EXC_CTRLDUMP_ADDFLAG( 0x0008, "caption" ); - EXC_CTRLDUMP_ADDFLAG( 0x0010, "picpos" ); - EXC_CTRLDUMP_ADDFLAG( 0x0020, "size" ); - EXC_CTRLDUMP_ADDFLAG( 0x0040, "mouseptr" ); - EXC_CTRLDUMP_ADDFLAG( 0x0080, "bordercolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x0100, "borderstyle" ); - EXC_CTRLDUMP_ADDFLAG( 0x0200, "specialeff" ); - EXC_CTRLDUMP_ADDFLAG( 0x0400, "pic" ); - EXC_CTRLDUMP_ADDFLAG( 0x0800, "accel" ); - EXC_CTRLDUMP_ADDFLAG( 0x1000, "icon" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFFE000 ); - sal_uInt32 nCtrlFlags = nFlags; - - if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_HEX4( "forecolor" ); - if( nCtrlFlags & 0x0002 ) EXC_CTRLDUMP_HEX4( "backcolor" ); - - EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x0004, 0x0080001B ); - EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000004, "locked" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000008, "opaque" ); - EXC_CTRLDUMP_ADDFLAG( 0x00800000, "wordwrap" ); - EXC_CTRLDUMP_ADDFLAG( 0x10000000, "autosize" ); - EXC_CTRLDUMP_ENDFLAG( 0xEF7FFFF0 ); // 0x00000001 always set? - - if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_DECVARMASK( nCaptionLen, 0x7FFFFFFF, "caption-len" ); - if( nCtrlFlags & 0x0010 ) EXC_CTRLDUMP_COORD2( "picpos" ); - if( nCtrlFlags & 0x0040 ) EXC_CTRLDUMP_DEC1( "mouseptr" ); - if( nCtrlFlags & 0x0080 ) EXC_CTRLDUMP_HEX4( "bordercolor" ); - if( nCtrlFlags & 0x0100 ) EXC_CTRLDUMP_HEX2( "borderstyle" ); - if( nCtrlFlags & 0x0200 ) EXC_CTRLDUMP_HEX2( "specialeff" ); - if( nCtrlFlags & 0x0400 ) EXC_CTRLDUMP_HEXVAR( nPic, "pic" ); - if( nCtrlFlags & 0x0800 ) EXC_CTRLDUMP_HEX2( "accel" ); - if( nCtrlFlags & 0x1000 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" ); - - if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_STRING( nCaptionLen, "caption" ); - if( nCtrlFlags & 0x0020 ) EXC_CTRLDUMP_SIZE4( "size" ); - EXC_CTRLDUMP_REMAINING( nStartPos + nSize ); - - EXC_CTRLDUMP_IMAGE( nPic, "pic" ); - EXC_CTRLDUMP_IMAGE( nIcon, "icon" ); - bHasFontData = true; - } - break; - - case EXC_CTRL_SPINBUTTON: - case EXC_CTRL_SCROLLBAR: - { - EXC_CTRLDUMP_STARTFLAG( "content-flags" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000001, "forecolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000002, "backcolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000004, "option" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000008, "size" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000010, "mouseptr" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000100, "unknown1" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000200, "unknown2" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000400, "unknown3" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000020, "min" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000040, "max" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000080, "value" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000800, "step" ); - EXC_CTRLDUMP_ADDFLAG( 0x00001000, "page-step" ); - EXC_CTRLDUMP_ADDFLAG( 0x00002000, "orient" ); - EXC_CTRLDUMP_ADDFLAG( 0x00004000, "prop-thumb" ); - EXC_CTRLDUMP_ADDFLAG( 0x00008000, "delay" ); - EXC_CTRLDUMP_ADDFLAG( 0x00010000, "icon" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFE0000 ); - sal_uInt32 nCtrlFlags = nFlags; - - if( nCtrlFlags & 0x00000001 ) EXC_CTRLDUMP_HEX4( "forecolor" ); - if( nCtrlFlags & 0x00000002 ) EXC_CTRLDUMP_HEX4( "backcolor" ); - - EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x00000004, 0x0000001B ); - EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000004, "locked" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000008, "opaque" ); - EXC_CTRLDUMP_ADDFLAG( 0x10000000, "autosize" ); - EXC_CTRLDUMP_ENDFLAG( 0xEFFFFFF1 ); - - if( nCtrlFlags & 0x00000010 ) EXC_CTRLDUMP_DEC1( "mouseptr" ); - if( nCtrlFlags & 0x00000020 ) EXC_CTRLDUMP_DEC4( "min" ); - if( nCtrlFlags & 0x00000040 ) EXC_CTRLDUMP_DEC4( "max" ); - if( nCtrlFlags & 0x00000080 ) EXC_CTRLDUMP_DEC4( "value" ); - if( nCtrlFlags & 0x00000100 ) EXC_CTRLDUMP_HEX4( "unknown1" ); - if( nCtrlFlags & 0x00000200 ) EXC_CTRLDUMP_HEX4( "unknown2" ); - if( nCtrlFlags & 0x00000400 ) EXC_CTRLDUMP_HEX4( "unknown3" ); - if( nCtrlFlags & 0x00000800 ) EXC_CTRLDUMP_DEC4( "step" ); - if( nCtrlFlags & 0x00001000 ) EXC_CTRLDUMP_DEC4( "page-step" ); - if( nCtrlFlags & 0x00002000 ) EXC_CTRLDUMP_DEC4( "orient" ); - if( nCtrlFlags & 0x00004000 ) EXC_CTRLDUMP_DEC4( "prop-thumb" ); - if( nCtrlFlags & 0x00008000 ) EXC_CTRLDUMP_DEC4( "delay" ); - if( nCtrlFlags & 0x00010000 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" ); - - if( nCtrlFlags & 0x00000008 ) EXC_CTRLDUMP_SIZE4( "size" ); - EXC_CTRLDUMP_REMAINING( nStartPos + nSize ); - - EXC_CTRLDUMP_IMAGE( nIcon, "icon" ); - } - break; - - case EXC_CTRL_IMAGE: - { - EXC_CTRLDUMP_STARTFLAG( "content-flags" ); - EXC_CTRLDUMP_ADDFLAG( 0x0004, "autosize" ); - EXC_CTRLDUMP_ADDFLAG( 0x0008, "bordercolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x0010, "backcolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x0020, "borderstyle" ); - EXC_CTRLDUMP_ADDFLAG( 0x0040, "mouseptr" ); - EXC_CTRLDUMP_ADDFLAG( 0x0080, "picsizemode" ); - EXC_CTRLDUMP_ADDFLAG( 0x0100, "speceffect" ); - EXC_CTRLDUMP_ADDFLAG( 0x0200, "size" ); - EXC_CTRLDUMP_ADDFLAG( 0x0400, "pic" ); - EXC_CTRLDUMP_ADDFLAG( 0x0800, "picalign" ); - EXC_CTRLDUMP_ADDFLAG( 0x1000, "pictiling" ); - EXC_CTRLDUMP_ADDFLAG( 0x2000, "option" ); - EXC_CTRLDUMP_ADDFLAG( 0x4000, "icon" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFF8003 ); - sal_uInt32 nCtrlFlags = nFlags; - - if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_HEX4( "bordercolor" ); - if( nCtrlFlags & 0x0010 ) EXC_CTRLDUMP_HEX4( "backcolor" ); - if( nCtrlFlags & 0x0020 ) EXC_CTRLDUMP_HEX1( "borderstyle" ); - if( nCtrlFlags & 0x0040 ) EXC_CTRLDUMP_DEC1( "mouseptr" ); - if( nCtrlFlags & 0x0080 ) EXC_CTRLDUMP_DEC1( "picsizemode" ); - if( nCtrlFlags & 0x0100 ) EXC_CTRLDUMP_HEX1( "speceffect" ); - if( nCtrlFlags & 0x0400 ) EXC_CTRLDUMP_HEXVAR( nPic, "pic" ); - if( nCtrlFlags & 0x0800 ) EXC_CTRLDUMP_HEX1( "picalign" ); - - EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x2000, 0x0000001B ); - EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000008, "opaque" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFFFFF5 ); - - if( nCtrlFlags & 0x4000 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" ); - - if( nCtrlFlags & 0x0200 ) EXC_CTRLDUMP_SIZE4( "size" ); - EXC_CTRLDUMP_REMAINING( nStartPos + nSize ); - - EXC_CTRLDUMP_IMAGE( nPic, "pic" ); - EXC_CTRLDUMP_IMAGE( nIcon, "icon" ); - } - break; - - case EXC_CTRL_TABSTRIP: - { - EXC_CTRLDUMP_STARTFLAG( "content-flags" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000001, "selected-tab" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000002, "backcolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000004, "forecolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000010, "size" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000020, "caption-arr-len" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000040, "mouseptr" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000100, "taborientation" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000200, "tabstyle" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000400, "multirow" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000800, "fixed-width" ); - EXC_CTRLDUMP_ADDFLAG( 0x00001000, "fixed-height" ); - EXC_CTRLDUMP_ADDFLAG( 0x00008000, "infotip-arr-len" ); - EXC_CTRLDUMP_ADDFLAG( 0x00020000, "id-arr-len" ); - EXC_CTRLDUMP_ADDFLAG( 0x00040000, "option" ); - EXC_CTRLDUMP_ADDFLAG( 0x00080000, "last-id" ); - EXC_CTRLDUMP_ADDFLAG( 0x00200000, "unknown-arr-len" ); - EXC_CTRLDUMP_ADDFLAG( 0x00400000, "tab-count" ); - EXC_CTRLDUMP_ADDFLAG( 0x00800000, "shortcut-arr-len" ); - EXC_CTRLDUMP_ADDFLAG( 0x01000000, "icon" ); - EXC_CTRLDUMP_ENDFLAG( 0xFE116088 ); - sal_uInt32 nCtrlFlags = nFlags; - - sal_uInt32 nTabCount = 0; - sal_uInt32 nIdArrLen = 0; - sal_uInt32 nUnknownArrLen = 0; - sal_uInt32 nShortArrLen = 0; - - if( nCtrlFlags & 0x00000001 ) EXC_CTRLDUMP_DEC4( "selected-tab" ); // size ok? - if( nCtrlFlags & 0x00000002 ) EXC_CTRLDUMP_HEX4( "backcolor" ); - if( nCtrlFlags & 0x00000004 ) EXC_CTRLDUMP_HEX4( "forecolor" ); - if( nCtrlFlags & 0x00000020 ) EXC_CTRLDUMP_HEXVAR( nCaptionLen, "caption-arr-len" ); - if( nCtrlFlags & 0x00000040 ) EXC_CTRLDUMP_DEC1( "mouseptr" ); // size ok? - if( nCtrlFlags & 0x00000100 ) EXC_CTRLDUMP_DEC4( "taborientation" ); // size ok? - if( nCtrlFlags & 0x00000200 ) EXC_CTRLDUMP_DEC4( "tabstyle" ); // size ok? - if( nCtrlFlags & 0x00000800 ) EXC_CTRLDUMP_DEC4( "fixed-width" ); - if( nCtrlFlags & 0x00001000 ) EXC_CTRLDUMP_DEC4( "fixed-height" ); - if( nCtrlFlags & 0x00008000 ) EXC_CTRLDUMP_HEXVAR( nTipLen, "infotip-arr-len" ); - if( nCtrlFlags & 0x00020000 ) EXC_CTRLDUMP_HEXVAR( nIdArrLen, "id-arr-len" ); - - EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x00040000, 0x0000001B ); - EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFFFFFD ); - - if( nCtrlFlags & 0x00080000 ) EXC_CTRLDUMP_DEC4( "last-id" ); - if( nCtrlFlags & 0x00200000 ) EXC_CTRLDUMP_HEXVAR( nUnknownArrLen, "unknown-arr-len" ); - if( nCtrlFlags & 0x00400000 ) EXC_CTRLDUMP_DECVAR( nTabCount, "tab-count" ); - if( nCtrlFlags & 0x00800000 ) EXC_CTRLDUMP_HEXVAR( nShortArrLen, "shortcut-arr-len" ); - if( nCtrlFlags & 0x01000000 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" ); - - if( nCtrlFlags & 0x00000010 ) EXC_CTRLDUMP_SIZE4( "size" ); - if( nCtrlFlags & 0x00000020 ) EXC_CTRLDUMP_STRINGARRAY( nCaptionLen, nTabCount, "caption" ); - if( nCtrlFlags & 0x00008000 ) EXC_CTRLDUMP_STRINGARRAY( nTipLen, nTabCount, "infotip" ); - if( nCtrlFlags & 0x00020000 ) EXC_CTRLDUMP_STRINGARRAY( nIdArrLen, nTabCount, "id" ); - if( nCtrlFlags & 0x00200000 ) EXC_CTRLDUMP_STRINGARRAY( nUnknownArrLen, nTabCount, "unknown" ); - if( nCtrlFlags & 0x00800000 ) EXC_CTRLDUMP_STRINGARRAY( nShortArrLen, nTabCount, "shortcut" ); - EXC_CTRLDUMP_REMAINING( nStartPos + nSize ); - - EXC_CTRLDUMP_IMAGE( nIcon, "icon" ); - bHasFontData = true; - } - break; - - case EXC_CTRL_USERFORM: - case EXC_CTRL_FRAME: - case EXC_CTRL_MULTIPAGE: - case EXC_CTRL_PAGE: - { - EXC_CTRLDUMP_STARTFLAG( "content-flags" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000002, "backcolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000004, "forecolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000008, "last-id" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000040, "option" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000080, "borderstyle" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000100, "mouseptr" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000200, "scrollbars" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000400, "size" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000800, "scrollsize" ); - EXC_CTRLDUMP_ADDFLAG( 0x00001000, "scrollpos" ); - EXC_CTRLDUMP_ADDFLAG( 0x00008000, "icon" ); - EXC_CTRLDUMP_ADDFLAG( 0x00010000, "cycle" ); - EXC_CTRLDUMP_ADDFLAG( 0x00020000, "speceffect" ); - EXC_CTRLDUMP_ADDFLAG( 0x00040000, "bordercolor" ); - EXC_CTRLDUMP_ADDFLAG( 0x00080000, "caption" ); - EXC_CTRLDUMP_ADDFLAG( 0x00100000, "font" ); - EXC_CTRLDUMP_ADDFLAG( 0x00200000, "pic" ); - EXC_CTRLDUMP_ADDFLAG( 0x00400000, "zoom" ); - EXC_CTRLDUMP_ADDFLAG( 0x00800000, "picalign" ); - EXC_CTRLDUMP_ADDFLAG( 0x01000000, "pictiling" ); - EXC_CTRLDUMP_ADDFLAG( 0x02000000, "picsizemode" ); - EXC_CTRLDUMP_ADDFLAG( 0x04000000, "typeinfover" ); - EXC_CTRLDUMP_ADDFLAG( 0x08000000, "drawbuffer" ); - EXC_CTRLDUMP_ENDFLAG( 0xF0006031 ); - sal_uInt32 nCtrlFlags = nFlags; - - if( nCtrlFlags & 0x00000002 ) EXC_CTRLDUMP_HEX4( "backcolor" ); - if( nCtrlFlags & 0x00000004 ) EXC_CTRLDUMP_HEX4( "forecolor" ); - if( nCtrlFlags & 0x00000008 ) EXC_CTRLDUMP_DEC4( "last-id" ); - - EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x00000040, 0x00000002 ); - EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFFFFFD ); - - if( nCtrlFlags & 0x00000080 ) EXC_CTRLDUMP_HEX1( "borderstyle" ); - if( nCtrlFlags & 0x00000100 ) EXC_CTRLDUMP_DEC1( "mouseptr" ); - if( nCtrlFlags & 0x00000200 ) EXC_CTRLDUMP_HEX1( "scrollbars" ); - if( nCtrlFlags & 0x00008000 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" ); - if( nCtrlFlags & 0x00010000 ) EXC_CTRLDUMP_DEC1( "cycle" ); - if( nCtrlFlags & 0x00020000 ) EXC_CTRLDUMP_HEX1( "speceffect" ); - if( nCtrlFlags & 0x00040000 ) EXC_CTRLDUMP_HEX4( "bordercolor" ); - if( nCtrlFlags & 0x00080000 ) EXC_CTRLDUMP_DECVARMASK( nCaptionLen, 0x7FFFFFFF, "caption-len" ); - if( nCtrlFlags & 0x00100000 ) EXC_CTRLDUMP_HEXVAR( nFont, "font" ); - if( nCtrlFlags & 0x00200000 ) EXC_CTRLDUMP_HEXVAR( nPic, "pic" ); - if( nCtrlFlags & 0x00400000 ) EXC_CTRLDUMP_DEC4( "zoom" ); - if( nCtrlFlags & 0x00800000 ) EXC_CTRLDUMP_HEX1( "picalign" ); - if( nCtrlFlags & 0x02000000 ) EXC_CTRLDUMP_DEC1( "picsizemode" ); - if( nCtrlFlags & 0x04000000 ) EXC_CTRLDUMP_DEC4( "typeinfover" ); - if( nCtrlFlags & 0x08000000 ) EXC_CTRLDUMP_DEC4( "drawbuffer" ); - - if( nCtrlFlags & 0x00000400 ) EXC_CTRLDUMP_SIZE4( "size" ); - if( nCtrlFlags & 0x00000800 ) EXC_CTRLDUMP_SIZE4( "scrollsize" ); - if( nCtrlFlags & 0x00001000 ) EXC_CTRLDUMP_COORD4( "scrollpos" ); - if( nCtrlFlags & 0x00080000 ) EXC_CTRLDUMP_STRING( nCaptionLen, "caption" ); - EXC_CTRLDUMP_REMAINING( nStartPos + nSize ); - - EXC_CTRLDUMP_FONT( nFont, "font" ); - EXC_CTRLDUMP_IMAGE( nIcon, "icon" ); - EXC_CTRLDUMP_IMAGE( nPic, "pic" ); - } - break; - - case EXC_CTRL_FONTDATA: - { - EXC_CTRLDUMP_STARTFLAG( "content-flags" ); - EXC_CTRLDUMP_ADDFLAG( 0x01, "font-name" ); - EXC_CTRLDUMP_ADDFLAG( 0x02, "font-style" ); - EXC_CTRLDUMP_ADDFLAG( 0x04, "font-size" ); - EXC_CTRLDUMP_ADDFLAG( 0x10, "language-id" ); - EXC_CTRLDUMP_ADDFLAG( 0x40, "align" ); - EXC_CTRLDUMP_ADDFLAG( 0x80, "font-weight" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFFFF08 ); // 0x20 always set? - sal_uInt32 nCtrlFlags = nFlags; - - if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_DECVARMASK( nNameLen, 0x7FFFFFFF, "font-name-len" ); - - EXC_CTRLDUMP_STARTOPTFLAG( "font-style-flags", nCtrlFlags & 0x0002, 0x40000000 ); - EXC_CTRLDUMP_ADDFLAG( 0x0001, "bold" ); - EXC_CTRLDUMP_ADDFLAG( 0x0002, "italic" ); - EXC_CTRLDUMP_ADDFLAG( 0x0004, "underline" ); - EXC_CTRLDUMP_ADDFLAG( 0x0008, "strikeout" ); - EXC_CTRLDUMP_ADDFLAG( 0x2000, "sunken" ); - EXC_CTRLDUMP_ENDFLAG( 0xBFFFDFF0 ); // 0x40000000 always set? - - if( nCtrlFlags & 0x0004 ) EXC_CTRLDUMP_DEC4( "font-size" ); - if( nCtrlFlags & 0x0010 ) EXC_CTRLDUMP_HEX2( "language-id" ); - if( nCtrlFlags & 0x0040 ) - { - EXC_CTRLDUMP_ALIGN_INSTRM( 2 ); - sal_uInt16 nAlign; rInStrm >> nAlign; - t += " align="; lclAppendDec( t, nAlign ); - switch( nAlign ) - { - case 1: t += "=left"; break; - case 2: t += "=right"; break; - case 3: t += "=center"; break; - default: t += "=!unknown!"; - } - EXC_CTRLDUMP_PRINT(); - } - if( nCtrlFlags & 0x0080 ) EXC_CTRLDUMP_DEC2( "font-weight" ); - - if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_STRING( nNameLen, "font-name" ); - EXC_CTRLDUMP_REMAINING( nStartPos + nSize ); - } - break; - - case EXC_CTRL_ADDDATA: - { - EXC_CTRLDUMP_STARTFLAG( "content-flags" ); - EXC_CTRLDUMP_ADDFLAG( 0x0001, "guid1" ); - EXC_CTRLDUMP_ADDFLAG( 0x0002, "guid2" ); - EXC_CTRLDUMP_ADDFLAG( 0x0008, "guid4" ); - EXC_CTRLDUMP_ADDFLAG( 0x0040, "unknown1" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFFFFB4 ); - sal_uInt32 nCtrlFlags = nFlags; - - if( nCtrlFlags & 0x0040 ) EXC_CTRLDUMP_HEX4( "unknown1" ); - - if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_GUID( "guid1" ); - if( nCtrlFlags & 0x0002 ) EXC_CTRLDUMP_GUID( "guid2" ); - if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_GUID( "guid4" ); - EXC_CTRLDUMP_REMAINING( nStartPos + nSize ); - } - break; - - case EXC_CTRL_FRAMECHILD: - { - EXC_CTRLDUMP_STARTFLAG( "content-flags" ); - EXC_CTRLDUMP_ADDFLAG( 0x0001, "name-len" ); - EXC_CTRLDUMP_ADDFLAG( 0x0002, "tag-len" ); - EXC_CTRLDUMP_ADDFLAG( 0x0004, "storage-id" ); - EXC_CTRLDUMP_ADDFLAG( 0x0008, "helpcontext-id" ); - EXC_CTRLDUMP_ADDFLAG( 0x0010, "option" ); - EXC_CTRLDUMP_ADDFLAG( 0x0020, "substream-len" ); - EXC_CTRLDUMP_ADDFLAG( 0x0040, "tabpos" ); - EXC_CTRLDUMP_ADDFLAG( 0x0080, "type" ); - EXC_CTRLDUMP_ADDFLAG( 0x0100, "pos" ); - EXC_CTRLDUMP_ADDFLAG( 0x0800, "tiptext" ); - EXC_CTRLDUMP_ADDFLAG( 0x1000, "ctrl-id" ); - EXC_CTRLDUMP_ADDFLAG( 0x2000, "ctrl-source" ); - EXC_CTRLDUMP_ADDFLAG( 0x4000, "row-source" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFF8600 ); - sal_uInt32 nCtrlFlags = nFlags; - - sal_uInt32 nStorageId = 0; - sal_uInt32 nSubStrmLen = 0; - sal_uInt16 nChildType = EXC_CTRL_UNKNOWN; - - if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_DECVARMASK( nNameLen, 0x7FFFFFFF, "name-len" ); - if( nCtrlFlags & 0x0002 ) EXC_CTRLDUMP_DECVARMASK( nTagLen, 0x7FFFFFFF, "tag-len" ); - if( nCtrlFlags & 0x0004 ) EXC_CTRLDUMP_PLAIN_DECVAR( nStorageId, "storage-id" ); - if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_PLAIN_DEC4( "helpcontext-id" ); - - EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x0010, 0x00000033 ); - EXC_CTRLDUMP_ADDFLAG( 0x00000001, "tabstop" ); - EXC_CTRLDUMP_ADDFLAG( 0x00000002, "visible" ); - EXC_CTRLDUMP_ADDFLAG( 0x00040000, "container" ); - EXC_CTRLDUMP_ENDFLAG( 0xFFFBFFFC ); - - if( nCtrlFlags & 0x0020 ) EXC_CTRLDUMP_HEXVAR( nSubStrmLen, "substream-len" ); - if( nCtrlFlags & 0x0040 ) EXC_CTRLDUMP_DEC2( "tabpos" ); - if( nCtrlFlags & 0x0080 ) EXC_CTRLDUMP_CTRLTYPE( nChildType, "type" ); - if( nCtrlFlags & 0x0800 ) EXC_CTRLDUMP_DECVARMASK( nTipLen, 0x7FFFFFFF, "infotip-len" ); - if( nCtrlFlags & 0x1000 ) EXC_CTRLDUMP_DECVARMASK( nCtrlIdLen, 0x7FFFFFFF, "ctrl-id-len" ); - if( nCtrlFlags & 0x2000 ) EXC_CTRLDUMP_DECVARMASK( nCtrlSrcLen, 0x7FFFFFFF, "ctrl-source-len" ); - if( nCtrlFlags & 0x4000 ) EXC_CTRLDUMP_DECVARMASK( nRowSrcLen, 0x7FFFFFFF, "row-source-len" ); - - if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_STRING( nNameLen, "name" ); - if( nCtrlFlags & 0x0002 ) EXC_CTRLDUMP_STRING( nTagLen, "tag" ); - if( nCtrlFlags & 0x0100 ) EXC_CTRLDUMP_COORD4( "pos" ); - if( nCtrlFlags & 0x0800 ) EXC_CTRLDUMP_STRING( nTipLen, "infotip" ); - if( nCtrlFlags & 0x1000 ) EXC_CTRLDUMP_STRING( nCtrlIdLen, "ctrl-id" ); - if( nCtrlFlags & 0x2000 ) EXC_CTRLDUMP_STRING( nCtrlSrcLen, "ctrl-source" ); - if( nCtrlFlags & 0x4000 ) EXC_CTRLDUMP_STRING( nRowSrcLen, "row-source" ); - EXC_CTRLDUMP_REMAINING( nStartPos + nSize ); - - if( (nCtrlFlags & 0x0080) && (nChildType != EXC_CTRL_UNKNOWN) ) - { - if( (nFlags & 0x00040000) && (nStorageId > 0) ) - maCtrlStorages.push_back( XclDumpCtrlPortion( nStorageId, nChildType ) ); - if( (nCtrlFlags & 0x0020) && (nSubStrmLen > 0) ) - maCtrlPortions.push_back( XclDumpCtrlPortion( nSubStrmLen, nChildType ) ); - } - } - break; - - default: - EXC_CTRLDUMP_REMAINING( nStartPos + nSize ); - } - - // font data - if( bHasFontData ) - DumpControlContents( rInStrm, EXC_CTRL_FONTDATA ); - } -} - -// ============================================================================ -// -// S T R E A M S -// -// ============================================================================ - -void Biff8RecDumper::DumpBinaryStream( SotStorageRef xStrg, const String& rStrmName, const String& rStrgPath ) -{ - SotStorageStreamRef xInStrm = OpenStream( xStrg, rStrmName ); - if( !xInStrm || !pDumpStream ) return; - - XclDumpStreamHeader aStrmHeader( *xInStrm, *pDumpStream, rStrmName, rStrgPath ); - DumpBinary( *xInStrm ); - (*pDumpStream) << "\n"; -} - -void Biff8RecDumper::DumpTextStream( SotStorageRef xStrg, const String& rStrmName, const String& rStrgPath ) -{ - SotStorageStreamRef xInStrm = OpenStream( xStrg, rStrmName ); - if( !xInStrm || !pDumpStream ) return; - - XclDumpStreamHeader aStrmHeader( *xInStrm, *pDumpStream, rStrmName, rStrgPath ); - while( xInStrm->Tell() < aStrmHeader.GetStreamLen() ) - { - ByteString aLine; - xInStrm->ReadLine( aLine ); - lclDumpString( *pDumpStream, aLine ); - (*pDumpStream) << "\n"; - } - (*pDumpStream) << "\n"; -} - -void Biff8RecDumper::DumpRecordStream( SotStorageRef xStrg, const String& rStrmName, const String& rStrgPath ) -{ - SotStorageStreamRef xInStrm = OpenStream( xStrg, rStrmName ); - if( !xInStrm || !pDumpStream ) return; - - XclDumpStreamHeader aStrmHeader( *xInStrm, *pDumpStream, rStrmName, rStrgPath ); - - XclImpStream* pOldStream = pIn; - pIn = new XclImpStream( *xInStrm, GetRoot() ); - XclImpStream& rIn = *pIn; - if( pOldStream ) - rIn.CopyDecrypterFrom( *pOldStream ); - - // -- dump from here -- - UINT16 nId; - BOOL bLoop = TRUE; - - while( bLoop && rIn.StartNextRecord() ) - { - nId = rIn.GetRecId(); - if( HasModeDump( nId ) ) - RecDump( TRUE ); - - bLoop = (nId != 0x000A); - } - - delete pIn; - pIn = pOldStream; -} - -void Biff8RecDumper::DumpCtlsStream() -{ - SotStorageStreamRef xInStrm = OpenStream( EXC_STREAM_CTLS ); - if( !xInStrm || !pDumpStream ) return; - - SvStream& rInStrm = *xInStrm; - SvStream& rOutStrm = *pDumpStream; - XclDumpStreamHeader aStrmHeader( rInStrm, rOutStrm, EXC_STREAM_CTLS, EMPTY_STRING ); - - for( StrmPortionMap::const_iterator aIt = maCtlsPosMap.begin(), aEnd = maCtlsPosMap.end(); aIt != aEnd; ++aIt ) - { - ULONG nCtrlPos = static_cast< ULONG >( aIt->first ); - ULONG nCtrlEnd = nCtrlPos + static_cast< ULONG >( aIt->second ); - if( nCtrlEnd <= aStrmHeader.GetStreamLen() ) - { - // stream position - ULONG nStartPos = nCtrlPos; // for stream alignment macro - rInStrm.Seek( nStartPos ); - - ByteString t( "\npos=" ); __AddHex( t, aIt->first ); - t.Append( " len=" ); __AddHex( t, aIt->second ); - rOutStrm << t.GetBuffer() << " "; - - // control type - sal_uInt16 nCtrlType = lclDumpControlGuid( rInStrm, rOutStrm ); - rOutStrm << "\n"; - - // control contents - if( nCtrlType != EXC_CTRL_UNKNOWN ) - DumpControlContents( rInStrm, nCtrlType ); - - // remaining unknown data - EXC_CTRLDUMP_REMAINING( nCtrlEnd ); - rOutStrm << "\n"; - } - } -} - -void Biff8RecDumper::DumpControlFrameStream( SotStorageRef xInStrg, sal_uInt16 nCtrlType, const String& rStrgPath ) -{ - static const String saStrmName( sal_Unicode( 'f' ) ); - - SotStorageStreamRef xInStrm = OpenStream( xInStrg, saStrmName ); - if( !xInStrm || !pDumpStream ) return; - - SvStream& rInStrm = *xInStrm; - SvStream& rOutStrm = *pDumpStream; - XclDumpStreamHeader aStrmHeader( rInStrm, rOutStrm, saStrmName, rStrgPath ); - - if( aStrmHeader.GetStreamLen() > 0 ) - { - ByteString t; // "t" needed for macros - - rOutStrm << "header-record\n"; - DumpControlContents( rInStrm, nCtrlType ); - rOutStrm << "\n"; - - if( nCtrlType == EXC_CTRL_USERFORM ) - { - rOutStrm << "add-records\n"; - sal_uInt16 nAddCount; - EXC_CTRLDUMP_PLAIN_DECVAR( nAddCount, "count" ); - EXC_CTRLDUMP_PRINT(); - rOutStrm << "\n"; - - for( sal_uInt16 nAdd = 0; (nAdd < nAddCount) && (rInStrm.Tell() < aStrmHeader.GetStreamLen()); ++nAdd ) - { - DumpControlContents( rInStrm, EXC_CTRL_ADDDATA ); - rOutStrm << "\n"; - } - } - - rOutStrm << "children-records\n"; - sal_uInt32 nRecCount, nTotalSize; - EXC_CTRLDUMP_PLAIN_DECVAR( nRecCount, "count" ); - EXC_CTRLDUMP_PLAIN_HEXVAR( nTotalSize, "total-size" ); - if( nTotalSize > 0 ) - { - EXC_CTRLDUMP_PLAIN_HEX4( "header-unknown" ); - rOutStrm << "\n"; - - for( sal_uInt32 nRec = 0; (nRec < nRecCount) && (rInStrm.Tell() < aStrmHeader.GetStreamLen()); ++nRec ) - { - DumpControlContents( rInStrm, EXC_CTRL_FRAMECHILD ); - rOutStrm << "\n"; - } - } - else - rOutStrm << "\n"; - - if( rInStrm.Tell() < aStrmHeader.GetStreamLen() ) - { - rOutStrm << "remaining=\n"; - DumpBinary( rInStrm ); - rOutStrm << "\n"; - } - } -} - -void Biff8RecDumper::DumpControlObjectsStream( SotStorageRef xInStrg, const String& rStrgPath ) -{ - static const String saStrmName( sal_Unicode( 'o' ) ); - - SotStorageStreamRef xInStrm = OpenStream( xInStrg, saStrmName ); - if( !xInStrm || !pDumpStream ) return; - - SvStream& rInStrm = *xInStrm; - SvStream& rOutStrm = *pDumpStream; - XclDumpStreamHeader aStrmHeader( rInStrm, rOutStrm, saStrmName, rStrgPath ); - - if( aStrmHeader.GetStreamLen() > 0 ) - { - ULONG nStrmPos = 0; - for( XclDumpCtrlPortionVec::const_iterator aIt = maCtrlPortions.begin(), aEnd = maCtrlPortions.end(); aIt != aEnd; ++aIt ) - { - rInStrm.Seek( nStrmPos ); - DumpControlContents( rInStrm, aIt->second ); - rOutStrm << "\n"; - nStrmPos += aIt->first; - } - - if( rInStrm.Tell() < aStrmHeader.GetStreamLen() ) - { - rOutStrm << "remaining=\n"; - DumpBinary( rInStrm ); - rOutStrm << "\n"; - } - } -} - -// ============================================================================ -// -// S T O R A G E S -// -// ============================================================================ - -void Biff8RecDumper::DumpAnyStorage( SotStorageRef xParentStrg, const String& rStrgName, const String& rStrgPath ) -{ - SotStorageRef xInStrg = OpenStorage( xParentStrg, rStrgName ); - if( !xInStrg || !pDumpStream ) return; - - XclDumpStorageHeader aStrgHeader( *xInStrg, *pDumpStream, rStrgPath ); -} - -void Biff8RecDumper::DumpUserFormStorage( SotStorageRef xParentStrg, const String& rStrgName, sal_uInt16 nCtrlType, const String& rStrgPath ) -{ - SotStorageRef xInStrg = OpenStorage( xParentStrg, rStrgName ); - if( !xInStrg || !pDumpStream ) return; - - XclDumpStorageHeader aStrgHeader( *xInStrg, *pDumpStream, rStrgPath ); - - // streams - maCtrlStorages.clear(); - maCtrlPortions.clear(); - DumpControlFrameStream( xInStrg, nCtrlType, rStrgPath ); - DumpControlObjectsStream( xInStrg, rStrgPath ); - DumpTextStream( xInStrg, CREATE_STRING( "\003VBFrame" ), rStrgPath ); - - // frame substorages - XclDumpCtrlPortionVec aCtrlStorages( maCtrlStorages ); // make local copy, maCtrlStorages is reused in loop - for( XclDumpCtrlPortionVec::const_iterator aIt = aCtrlStorages.begin(), aEnd = aCtrlStorages.end(); aIt != aEnd; ++aIt ) - { - sal_uInt32 nStorageId = aIt->first; - String aSubName( sal_Unicode( 'i' ) ); - if( nStorageId < 10 ) - aSubName.Append( sal_Unicode( '0' ) ); - aSubName.Append( String::CreateFromInt32( static_cast< sal_Int32 >( nStorageId ) ) ); - - String aPath( rStrgPath ); - aPath.Append( sal_Unicode( '/' ) ).Append( rStrgName ); - - DumpUserFormStorage( xInStrg, aSubName, aIt->second, aPath ); - } -} - -void Biff8RecDumper::DumpVbaProjectStorage() -{ - SotStorageRef xInStrg = OpenStorage( EXC_STORAGE_VBA_PROJECT ); - if( !xInStrg || !pDumpStream ) return; - - XclDumpStorageHeader aStrgHeader( *xInStrg, *pDumpStream, EMPTY_STRING ); - // PROJECT substream - DumpTextStream( xInStrg, CREATE_STRING( "PROJECT" ), EXC_STORAGE_VBA_PROJECT ); - // VBA storage - DumpAnyStorage( xInStrg, EXC_STORAGE_VBA, EXC_STORAGE_VBA_PROJECT ); - // user forms - SvStorageInfoList aInfoList; - xInStrg->FillInfoList( &aInfoList ); - for( ULONG nInfo = 0; nInfo < aInfoList.Count(); ++nInfo ) - { - SvStorageInfo& rInfo = aInfoList.GetObject( nInfo ); - if( rInfo.IsStorage() && (rInfo.GetName() != EXC_STORAGE_VBA) ) - DumpUserFormStorage( xInStrg, rInfo.GetName(), EXC_CTRL_USERFORM, EXC_STORAGE_VBA_PROJECT ); - } -} - -// ============================================================================ -// -// ============================================================================ - -const sal_Char* Biff8RecDumper::GetBlanks( const UINT16 nNumOfBlanks ) -{ - DBG_ASSERT( pBlankLine, "-Biff8RecDumper::GetBlanks(): nicht so schnell mein Freund!" ); - DBG_ASSERT( nNumOfBlanks <= nLenBlankLine, - "+Biff8RecDumper::GetBlanks(): So viel kannst Du nicht von mir verlangen!" ); - - return pBlankLine + ( ( nNumOfBlanks <= nLenBlankLine )? ( nLenBlankLine - nNumOfBlanks ) : 0 ); -} - - -BOOL Biff8RecDumper::IsLineEnd( const sal_Char c, sal_Char& rNext, SvStream& rIn, INT32& rLeft ) -{ - static const sal_Char cNL = '\n'; - static const sal_Char cRET = '\r'; - - if( IsEndOfLine( c ) ) - { - sal_Char cDouble = ( c == cNL )? cRET : cNL; - - if( rNext == cDouble ) - { - rIn >> rNext; - rLeft--; - } - - return TRUE; - } - else - return FALSE; -} - - -_KEYWORD Biff8RecDumper::GetKeyType( const ByteString& r ) -{ - ByteString t( r ); - _KEYWORD e; - - t.ToUpperAscii(); - - if( t == "SKIPDUMP" ) - e = Skipdump; - else if( t == "SKIPOFFSET" ) - e = SkipOffset; - else if( t == "READCONTRECS" ) - e = ReadContRecs; - else if( t == "NOWARNINGS" ) - e = NoWarnings; - else if( t == "CONTLOAD" ) - e = Contload; - else if( t == "BLANKLINE" ) - e = BlankLine; - else if( t == "EXPORTBOOKSTREAM" ) - e = ExportBookStream; - else if( t == "PARSEP" ) - e = Parsep; - else if( t == "MAXBODYLINES" ) - e = Maxbodylines; - else if( t == "INCLUDE" || t == "+" ) - e = Include; - else if( t == "EXCLUDE" || t == "-" ) - e = Exclude; - else if( t == "HEX" || t == "H" ) - e = Hex; - else if( t == "BODY" || t == "B" ) - e = Body; - else if( t == "NAMEONLY" || t =="N" ) - e = NameOnly; - else if( t == "COMMENT" ) - e = Comment; - else if( t == "OUTPUT" ) - e = Output; - else if( t == "TITLE" ) - e = Title; - else if( t == "CLEARFILE" ) - e = ClearFile; - else - e = KW_Unknown; - - return e; -} - - -void Biff8RecDumper::Init( void ) -{ - bClearFile = FALSE; - - if( pDumpModes || ppRecNames ) - return; - - const sal_Char* pDefName = "biffrecdumper.ini"; - const sal_Char* pIniKey = "BIFFRECDUMPERINI"; - const sal_Char pPathSep[] = { SAL_PATHDELIMITER, '\0' }; - ByteString aIniName; - - SvFileStream* pIn = NULL; - - // first try: search for biffrecdumper.ini in dir, specified in %HOME% - const sal_Char* pHome = getenv( "HOME" ); - if( pHome ) - { - aIniName = pHome; - aIniName.EraseTrailingChars( *pPathSep ); - aIniName += pPathSep; - aIniName += pDefName; - - pIn = CreateInStream( aIniName.GetBuffer() ); - } - - if( !pIn ) - { // %HOME% not set or %HOME%\biffrecdumper.ini could not be opened - const sal_Char* pIni = getenv( pIniKey ); - if( pIni ) - { - pIn = CreateInStream( pIni ); - if( !pIn ) - { - AddError( 0, "Could not open ini file", ByteString( pIni ) ); - bEndLoading = TRUE; // zur Sicherheit.... - } - } - } - - if( pIn ) - { - pIn->Seek( STREAM_SEEK_TO_END ); - - const UINT32 nStreamLen = pIn->Tell(); - - if( nStreamLen <= 1 ) - { - pIn->Close(); - delete pIn; - return; - } - - pIn->Seek( STREAM_SEEK_TO_BEGIN ); - - pDumpModes = new UINT16[ nRecCnt ]; - ppRecNames = new ByteString*[ nRecCnt ]; - - memset( pDumpModes, 0x00, sizeof( UINT16 ) * nRecCnt ); - memset( ppRecNames, 0x00, sizeof( ByteString* )* nRecCnt ); - - enum STATE { PreLine, InCommand, PostCommand, InId, PostEqu, - InVal, InName, InInExClude, InBodyMode, PostSepIEC, - PostSepBM, InComment }; - - STATE eAct = PreLine; - sal_Char c; - sal_Char cNext; - INT32 n = ( INT32 ) nStreamLen; - ByteString aCommand; - ByteString aVal; - ByteString aInExClude; - ByteString aHexBody; - UINT32 nLine = 1; - BOOL bCommand = FALSE; - - *pIn >> c >> cNext; - - while( n > 0 ) - { - n--; - - switch( eAct ) - { - case PreLine: - if( IsAlphaNum( c ) ) - { - if( IsNum( c ) ) - { - eAct = InId; - bCommand = FALSE; - } - else - { - eAct = InCommand; - bCommand = TRUE; - } - aCommand.Erase(); - aCommand += c; - } - else if( c == cComm1 && cNext == cComm2 ) - eAct = InComment; - else if( IsLineEnd( c, cNext, *pIn, n ) ) - nLine++; - else if( !IsBlank( c ) ) - { - AddError( nLine, "Unexpected command or id" ); - n = 0; - } - break; - case InCommand: - if( c == '=' ) - { - eAct = PostEqu; - aVal.Erase(); - } - else if( IsAlpha( c ) ) - aCommand += c; - else if( IsBlank( c ) ) - eAct = PostCommand; - else if( IsLineEnd( c, cNext, *pIn, n ) ) - { - if( ExecCommand( nLine, aCommand ) ) - { - eAct = PreLine; - nLine++; - } - else - n = 0; - } - else if( c == cComm1 && cNext == cComm2 ) - { - if( ExecCommand( nLine, aCommand ) ) - eAct = InComment; - else - { - AddError( nLine, "Invalid command before comment", aCommand ); - n = 0; - } - } - else - { - aCommand += '>'; - aCommand += c; - aCommand += '<'; - AddError( nLine, "Invalid character in command or id", aCommand ); - n = 0; - } - break; - case PostCommand: - if( c == '=' ) - { - eAct = PostEqu; - aVal.Erase(); - } - else if( IsLineEnd( c, cNext, *pIn, n ) ) - { - if( ExecCommand( nLine, aCommand ) ) - { - eAct = PreLine; - nLine++; - } - else - n = 0; - } - else if( c == cComm1 && cNext == cComm2 ) - { - if( ExecCommand( nLine, aCommand ) ) - eAct = InComment; - else - { - AddError( nLine, "Invalid command before comment", aCommand ); - n = 0; - } - } - else if( !IsBlank( c ) ) - { - AddError( nLine, "Expecting blank or \'=\' following the command", aCommand ); - n = 0; - } - break; - case InId: - if( c == '=' ) - { - eAct = PostEqu; - aVal.Erase(); - } - else if( IsAlphaNum( c ) ) - aCommand += c; - else if( IsBlank( c ) ) - eAct = PostCommand; - else if( ( c == cComm1 && cNext == cComm2 ) || IsLineEnd( c, cNext, *pIn, n ) ) - { - AddError( nLine, "Unexpected end of record id", aCommand ); - eAct = InComment; - } - else - { - AddError( nLine, "Unexpected sal_Char in record id", aCommand ); - n = 0; - } - break; - case PostEqu: - if( bCommand ) - { // Command - if( c == cComm1 && cNext == cComm2 ) - { - if( ExecCommand( nLine, aCommand ) ) - eAct = InComment; - else - { - AddError( nLine, "Unknown command", aCommand ); - n = 0; - } - } - else if( IsLineEnd( c, cNext, *pIn, n ) ) - { - if( ExecCommand( nLine, aCommand ) ) - { - eAct = PreLine; - nLine++; - } - else - { - AddError( nLine, "Unknown command", aCommand ); - n = 0; - } - } - else if( !bCommand && c == cParSep ) - eAct = PostSepIEC; - else if( !IsBlank( c ) ) - { - aVal.Erase(); - aVal += c; - eAct = InVal; - } - } - else - { // Set - if( ( c == cComm1 && cNext == cComm2 ) || IsLineEnd( c, cNext, *pIn, n ) ) - { - AddError( nLine, "No mode set for record", aCommand ); - n = 0; - } - else if( !bCommand && c == cParSep ) - eAct = PostSepIEC; - else - { - aVal.Erase(); - aVal += c; - eAct = InName; - aInExClude.Erase(); - aHexBody.Erase(); - } - } - break; - case InVal: - if( c == cComm1 && cNext == cComm2 ) - { - if( ExecCommand( nLine, aCommand, &aVal ) ) - eAct = InComment; - else - { - AddError( nLine, "Unknown command", aCommand ); - n = 0; - } - } - else if( IsLineEnd( c, cNext, *pIn, n ) ) - { - if( ExecCommand( nLine, aCommand, &aVal ) ) - { - eAct = PreLine; - nLine++; - } - else - { - AddError( nLine, "Unknown command", aCommand ); - n = 0; - } - } - else - aVal += c; - break; - case InName: - if( c == cParSep ) - eAct = PostSepIEC; - else if( c == cComm1 && cNext == cComm2 ) - { - if( ExecSetVal( nLine, aCommand, &aVal, NULL, NULL ) ) - eAct = InComment; - else - n = 0; - } - else if( IsLineEnd( c, cNext, *pIn, n ) ) - { - if( ExecSetVal( nLine, aCommand, &aVal, NULL, NULL ) ) - { - eAct = PreLine; - nLine++; - } - else - n = 0; - } - else - aVal += c; - break; - case InInExClude: - if( c == cParSep ) - eAct = PostSepBM; - else if( c == cComm1 && cNext == cComm2 ) - { - if( ExecSetVal( nLine, aCommand, &aVal, &aInExClude, NULL ) ) - eAct = InComment; - else - n = 0; - } - else if( IsLineEnd( c, cNext, *pIn, n ) ) - { - if( ExecSetVal( nLine, aCommand, &aVal, &aInExClude, NULL ) ) - { - eAct = PreLine; - nLine++; - } - else - n = 0; - } - else - aInExClude += c; - break; - case InBodyMode: - if( c == cParSep ) - { - AddError( nLine, "Only 3 parameter possible" ); - n = 0; - } - else if( c == cComm1 && cNext == cComm2 ) - { - if( ExecSetVal( nLine, aCommand, &aVal, &aInExClude, &aHexBody ) ) - eAct = InComment; - else - n = 0; - } - else if( IsLineEnd( c, cNext, *pIn, n ) ) - { - if( ExecSetVal( nLine, aCommand, &aVal, &aInExClude, &aHexBody ) ) - { - eAct = PreLine; - nLine++; - } - else - n = 0; - } - else - aInExClude += c; - break; - case PostSepIEC: - if( c == cParSep ) - eAct = PostSepBM; - else if( c == cComm1 && cNext == cComm2 ) - { - if( ExecSetVal( nLine, aCommand, &aVal, NULL, NULL ) ) - eAct = InComment; - else - n = 0; - } - else if( IsLineEnd( c, cNext, *pIn, n ) ) - { - if( ExecSetVal( nLine, aCommand, &aVal, NULL, NULL ) ) - { - eAct = PreLine; - nLine++; - } - else - n = 0; - } - else if( !IsBlank( c ) ) - { - aInExClude += c; - eAct = InInExClude; - } - break; - case PostSepBM: - if( c == cParSep ) - eAct = PostSepBM; - else if( c == cComm1 && cNext == cComm2 ) - { - if( ExecSetVal( nLine, aCommand, &aVal, &aInExClude, NULL ) ) - eAct = InComment; - else - n = 0; - } - else if( IsLineEnd( c, cNext, *pIn, n ) ) - { - if( ExecSetVal( nLine, aCommand, &aVal, &aInExClude, NULL ) ) - { - eAct = PreLine; - nLine++; - } - else - n = 0; - } - else if( !IsBlank( c ) ) - { - aHexBody += c; - eAct = InBodyMode; - } - break; - case InComment: - if( IsLineEnd( c, cNext, *pIn, n ) ) - { - eAct = PreLine; - nLine++; - } - break; - default: - n = 0; - } - - c = cNext; - *pIn >> cNext; - } - - pIn->Close(); - delete pIn; - } -} - - -BOOL Biff8RecDumper::ExecCommand( const UINT32 nL, const ByteString& r, const ByteString* pVal ) -{ - _KEYWORD e = GetKeyType( r ); - BOOL b = TRUE; - const UINT32 nValLen = ( pVal )? pVal->Len() : 0; - BOOL bSet; - UINT16 nMode; - - switch( e ) - { - case Skipdump: bSkip = TRUE; break; - case SkipOffset: bSkipOffset = TRUE; break; - case ReadContRecs: bReadContRecs = TRUE; break; - case NoWarnings: bWarnings = FALSE; break; - case Contload: bEndLoading = TRUE; break; - case BlankLine: bBlankLine = TRUE; break; - case ExportBookStream: bExportBookStream = TRUE; break; - case Parsep: - if( nValLen == 0 ) - { - AddError( nL, "No separator found" ); - b = FALSE; - } - else if( nValLen == 1 ) - cParSep = *( pVal->GetBuffer() ); - else - { - AddError( nL, "More than 1 sal_Char is not valid for separator", *pVal ); - b = FALSE; - } - break; - case Maxbodylines: - if( nValLen ) - { - UINT32 n = GetVal( *pVal ); - - if( n == 0xFFFFFFFF ) - { - AddError( nL, "Syntax error in value of body lines" ); - b = FALSE; - } - else - nMaxBodyLines = n; - } - else - { - AddError( nL, "No value specified for number of body lines" ); - b = FALSE; - } - break; - case Include: - bSet = FALSE; - nMode = MODE_SKIP; - goto _common; - case Exclude: - bSet = TRUE; - nMode = MODE_SKIP; - goto _common; - case Hex: - bSet = TRUE; - nMode = MODE_HEX; - goto _common; - case Body: - bSet = FALSE; - nMode = MODE_HEX; - goto _common; - case NameOnly: - bSet = TRUE; - nMode = MODE_NAMEONLY; - goto _common; -_common: - if( pVal ) - { - IdRangeList aRL; - if( FillIdRangeList( nL, aRL, *pVal ) ) - { - const IdRange* p = aRL.First(); - if( bSet ) - { - while( p ) - { SetFlag( p->nFirst, p->nLast, nMode ); p = aRL.Next(); } - } - else - { - while( p ) - { ClrFlag( p->nFirst, p->nLast, nMode ); p = aRL.Next(); } - } - } - else - b = FALSE; - } - break; - case Comment: - if( pVal && pVal->Len() >= 2 ) - { - cComm1 = pVal->GetChar( 0 ); - cComm2 = pVal->GetChar( 1 ); - } - break; - case Output: - CopyStrpOnStrp( pOutName, pVal ); - if( pOutName ) - { - if( *pOutName == "*" ) - { - ByteString aDefault( "DefaultDumpName.txt" ); - SfxObjectShell* pShell = GetDocShell(); - if( pShell ) - { - SfxMedium* pMedium = pShell->GetMedium(); - if( pMedium ) - { - const ByteString aTextExtension( ".txt" ); - aDefault = GETSTR( pMedium->GetPhysicalName() ); - xub_StrLen nStrLen = aDefault.Len(); - if( nStrLen >= 4 ) - { - ByteString aTmp( aDefault ); - aTmp.ToLowerAscii(); - if( aTmp.Copy( nStrLen -4 ) == ".xls" ) - aDefault.Replace( nStrLen - 4, aTextExtension.Len(), aTextExtension ); - else - aDefault += aTextExtension; - } - else - aDefault += aTextExtension; - } - } - - *pOutName = aDefault; - } - CreateOutStream(); - } - else if( pDumpStream ) - { - pDumpStream->Close(); - DELANDNULL( pDumpStream ); - } - break; - case Title: - CopyStrpOnStrp( pTitle, pVal ); - break; - case ClearFile: - bClearFile = TRUE; - break; - default: - AddError( nL, "Unknown command", r ); - b = FALSE; - } - - return b; -} - - -BOOL Biff8RecDumper::ExecSetVal( const UINT32 nL, const ByteString& rId, const ByteString* pName, - const ByteString* pIEC, const ByteString* pHB ) -{ - UINT32 _nId = GetVal( rId ); - - if( _nId == 0xFFFFFFFF ) - { - AddError( nL, "Syntax error in record id", rId ); - return FALSE; - } - else if( _nId >= ( UINT32 ) nRecCnt ) - { - AddError( nL, "Record id to high", rId ); - return FALSE; - } - - UINT16 nId = ( UINT16 ) _nId; - - if( pName && pName->Len() ) - SetName( nId, *pName ); - - _KEYWORD e; - UINT16 n = GetMode( nId ); - - if( pIEC && pIEC->Len() ) - { - e = GetKeyType( *pIEC ); - - if( e == Include ) - n &= ~MODE_SKIP; - else if( e == Exclude ) - n |= MODE_SKIP; - else - { - AddError( nL, "Invalid key for in-/exclude", *pIEC ); - return FALSE; - } - } - - if( pHB && pHB->Len() ) - { - e = GetKeyType( *pHB ); - - if( e == NameOnly ) - n |= MODE_NAMEONLY; - else - { - n &= ~MODE_NAMEONLY; - if( e == Hex ) - n |= MODE_HEX; - else if( e == Body ) - n &= ~MODE_HEX; - else - { - AddError( nL, "Invalid key for hex/body/name only", *pIEC ); - return FALSE; - } - } - } - - SetMode( nId, n ); - return TRUE; -} - - -void Biff8RecDumper::SetFlag( const UINT16 nF, const UINT16 nL, const UINT16 nFl ) -{ - UINT16 n = ( nF < nL )? nF : nL; - UINT16 nLast = ( nF < nL )? nL : nF; - - if( nLast >= nRecCnt ) - nLast = nRecCnt - 1; - - while( n <= nLast ) - { - pDumpModes[ n ] |= nFl; - n++; - } -} - - -void Biff8RecDumper::ClrFlag( const UINT16 nF, const UINT16 nL, const UINT16 nFlags ) -{ - UINT16 n = ( nF < nL )? nF : nL; - UINT16 nLast = ( nF < nL )? nL : nF; - UINT16 nFl = ~nFlags; - - if( nLast >= nRecCnt ) - nLast = nRecCnt - 1; - - while( n <= nLast ) - { - pDumpModes[ n ] &= nFl; - n++; - } -} - - -void Biff8RecDumper::SetName( const UINT16 n, ByteString* p ) -{ - if( n < nRecCnt ) - CopyStrpOnStrp( ppRecNames[ n ], p ); -} - - -UINT32 Biff8RecDumper::GetVal( const ByteString& r ) -{ - const sal_Char* p = r.GetBuffer(); - sal_Char c = *p; - UINT32 n = 0; - const UINT32 nLimitDec = 0xFFFFFFFF / 10; - const UINT32 nLimitHex = 0xFFFFFFFF / 16; - BOOL bError = FALSE; - - enum STATE { First, Dec, MaybeHex, Hex }; - - STATE e = First; - - while( c ) - { - switch( e ) - { - case First: - if( IsNum( c ) ) - { - if( c == '0' ) - e = MaybeHex; - else - { - e = Dec; - n = GetVal( c ); - } - } - else - bError = TRUE; - break; - case Dec: - if( n < nLimitDec && IsNum( c ) ) - { - n *= 10; - n += GetVal( c ); - } - else - bError = TRUE; - break; - case MaybeHex: - if( c == 'x' || c == 'X' ) - { - e = Hex; - n = 0; - } - else if( IsNum( c ) ) - { - n = GetVal( c ); - e = Dec; - } - else - bError = TRUE; - break; - case Hex: - if( n < nLimitHex && IsHex( c ) ) - { - n *= 16; - n += GetVal( c ); - } - else - bError = TRUE; - break; - } - - if( bError ) - c = 0x00; - else - { - p++; - c = *p; - } - } - - if( bError ) - return 0xFFFFFFFF; - else - return n; -} - - -BOOL Biff8RecDumper::FillIdRangeList( const UINT32 nL, IdRangeList& rRL, const ByteString& rV ) -{ - rRL.Clear(); - - const sal_Char* pSyntErr = "Syntax error in number (list)"; - -#define SYNTERR(ch) AddError( ((UINT32)(b=FALSE))+nL, pSyntErr, ch? ((((t+=">")+=ByteString::CreateFromInt32(ch))+="<")) : t ) -#define NEWVAL(_n) _n=(n>=(UINT32)nRecCnt)?nRecCnt-1:(UINT16)n -#define ORDERN() {if(n1>n2){UINT16 nT=n1;n1=n2;n2=nT;}} - - const sal_Char* p = rV.GetBuffer(); - sal_Char c = *p; - const sal_Char cSep = cParSep; - const sal_Char cCont = '.'; - const sal_Char cAll = '*'; - ByteString t; - UINT16 n1 = 0, n2 = 0; - UINT32 n; - BOOL b = TRUE; - BOOL bExp2 = FALSE; - - enum STATE { PreFirst, InFirst, PostFirst, InCont, PreLast, InLast, PostLast }; - STATE e = PreFirst; - - while( c ) - { - switch( e ) - { - case PreFirst: - if( IsAlphaNum( c ) ) - { - t += c; - e = InFirst; - } - else if( c == cAll ) - { - rRL.Append( 0, nRecCnt - 1 ); - e = PostLast; - } - else if( !IsBlank( c ) ) - SYNTERR( c ); - break; - case InFirst: - if( c == cSep || c == cCont || IsBlank( c ) ) - { - n = GetVal( t ); - if( n == 0xFFFFFFFF ) - SYNTERR( 0 ); - else - NEWVAL( n1 ); - - t.Erase(); - - if( c == cSep ) - { - rRL.Append( n1, n1 ); - e = PreFirst; - } - else if( c == cCont ) - { - bExp2 = TRUE; - e = InCont; - } - else - e = PostFirst; - } - else if( IsAlphaNum( c ) ) - t += c; - else - SYNTERR( c ); - break; - case PostFirst: - if( c == cCont ) - { - e = InCont; - bExp2 = TRUE; - } - else if( c == cSep ) - { - n = GetVal( t ); - if( n == 0xFFFFFFFF ) - SYNTERR( 0 ); - else - NEWVAL( n1 ); - - e = PreFirst; - } - else if( !IsBlank( c ) ) - SYNTERR( c ); - break; - case InCont: - if( IsAlphaNum( c ) ) - { - t += c; - e = InLast; - } - else if( IsBlank( c ) ) - e = PreLast; - else if( c == cSep || c == cAll ) - { - rRL.Append( n1, nRecCnt - 1 ); - bExp2 = FALSE; - e = PreFirst; - } - else if( c != cCont ) - SYNTERR( c ); - break; - case PreLast: - if( IsAlphaNum( c ) ) - { - t += c; - e = InLast; - } - else if( !IsBlank( c ) ) - SYNTERR( c ); - break; - break; - case InLast: - if( c == cSep || IsBlank( c ) ) - { - n = GetVal( t ); - if( n == 0xFFFFFFFF ) - SYNTERR( 0 ); - else - NEWVAL( n2 ); - - t.Erase(); - ORDERN(); - rRL.Append( n1, n2 ); - bExp2 = FALSE; - e = ( c == cSep )? PreFirst : PostLast; - } - else if( IsAlphaNum( c ) ) - t += c; - else - SYNTERR( c ); - break; - case PostLast: - if( c == cSep ) - { - e = PreFirst; - bExp2 = FALSE; - } - else if( !IsBlank( c ) ) - SYNTERR( c ); - break; - } - - if( b ) - { - p++; - c = *p; - } - else - c = 0x00; - } - - if( bExp2 ) - { - if( t.Len() ) - { - n = GetVal( t ); - if( n == 0xFFFFFFFF ) - SYNTERR( 0 ); - else - NEWVAL( n2 ); - ORDERN(); - } - else - n2 = nRecCnt - 1; - - if( b ) - rRL.Append( n1, n2 ); - } - -#undef SYNTERR -#undef NEWVAL -#undef ORDERN - - return b; -} - - -BOOL Biff8RecDumper::CreateOutStream() -{ - if( pDumpStream ) - { - pDumpStream->Close(); - DELANDNULL( pDumpStream ); - } - - if( !bSkip && pOutName ) - { - pOutName->EraseLeadingChars( ' ' ); - pOutName->EraseTrailingChars( ' ' ); - pOutName->EraseLeadingChars( '\t' ); - pOutName->EraseTrailingChars( '\t' ); - - pDumpStream = new SvFileStream( String::CreateFromAscii( pOutName->GetBuffer() ), STREAM_WRITE|STREAM_SHARE_DENYWRITE|(bClearFile?STREAM_TRUNC:0) ); - - if( pDumpStream->IsOpen() ) - { - pDumpStream->Seek( bClearFile? STREAM_SEEK_TO_BEGIN : STREAM_SEEK_TO_END ); - return TRUE; - } - else - { - DELANDNULL( pDumpStream ); - } - } - - return FALSE; -} - - -SvFileStream* Biff8RecDumper::CreateInStream( const sal_Char* pN ) -{ - SvFileStream* p = new SvFileStream( String::CreateFromAscii( pN ), STREAM_READ|STREAM_SHARE_DENYWRITE ); - - if( p->IsOpen() ) - return p; - else - { - delete p; - return NULL; - } -} - - -SvFileStream* Biff8RecDumper::CreateInStream( const sal_Char* pP, const sal_Char* pN ) -{ - ByteString t( pP ); - const sal_Char c = t.GetChar( t.Len() - 1 ); - - if( c != '\\' ) - t += '\\'; - else if( c != '/' ) - t += '/'; - - t += pN; - - return CreateInStream( t.GetBuffer() ); -} - - -void Biff8RecDumper::AddError( const UINT32 n, const ByteString& rT, const ByteString& rH ) -{ - DUMP_ERR* p = new DUMP_ERR( n, rT, rH ); - - if( pFirst ) - pLast->pNext = p; - else - pFirst = p; - - pLast = p; -} - - -Biff8RecDumper::Biff8RecDumper( const XclImpRoot& rRoot, BOOL _bBIFF8 ) : - XclImpRoot( rRoot ), - bBIFF8( _bBIFF8 ), - bEncrypted( false ), - mnEscherPos( 0 ) -{ - nXFCount = 0; - nFontIndex = 0; - nInstances++; - mnSubstream = EXC_BOF_UNKNOWN; - - if( !pCharType ) - { - pCharType = new UINT8[ 256 ]; - memset( pCharType, 0x00, 256 ); - - pCharVal = new UINT8[ 256 ]; - memset( pCharVal, 0x00, 256 ); - - sal_Char c; - UINT8 n; - -#define __TYPE(n) pCharType[(UINT8)n] -#define __VAL(n) pCharVal[(UINT8)n] - - __TYPE( '\n' ) = CT_EOL; - __TYPE( '\r' ) = CT_EOL; - - __TYPE( ' ' ) = CT_BLANK; - __TYPE( '\t' ) = CT_BLANK; - - for( c = '0', n = 0 ; c <= '9' ; c++, n++ ) - { - __TYPE( c ) = CT_NUM|CT_HEX|CT_ALPHANUM; - __VAL( c ) = n; - } - for( c = 'a', n = 10 ; c <= 'f' ; c++, n++ ) - { - __TYPE( c ) = CT_HEX|CT_ALPHA|CT_ALPHANUM|CT_LOWERALPHA; - __VAL( c ) = n; - } - for( c = 'g' ; c <= 'z' ; c++ ) - __TYPE( c ) = CT_ALPHA|CT_ALPHANUM|CT_LOWERALPHA; - for( c = 'A', n = 10 ; c <= 'F' ; c++, n++ ) - { - __TYPE( c ) = CT_HEX|CT_ALPHA|CT_ALPHANUM|CT_UPPERALPHA; - __VAL( c ) = n; - } - for( c = 'G' ; c <= 'Z' ; c++ ) - __TYPE( c ) = CT_ALPHA|CT_ALPHANUM|CT_UPPERALPHA; - -#undef __TYPE -#undef __VAL - } - - pDumpStream = NULL; - - if( !pBlankLine ) - { - pBlankLine = new sal_Char[ nLenBlankLine + 1 ]; - memset( pBlankLine, ' ', nLenBlankLine ); - pBlankLine[ nLenBlankLine ] = 0x00; - } - - pTitle = NULL; - pOutName = NULL; - pLevelPre = pLevelPreStringNT; - - nMaxBodyLines = 1024; - bEndLoading = bSkip = bSkipOffset = bReadContRecs = bBlankLine = bExportBookStream = FALSE; - bWarnings = TRUE; - - pDumpModes = NULL; - ppRecNames = NULL; - - pFirst = pLast = pAct = NULL; - - cParSep = ','; - cComm1 = cComm2 = '/'; - - nFieldCnt = nItemCnt = nTabIndexCnt = 0; - - Init(); -} - - -Biff8RecDumper::~Biff8RecDumper() -{ - if( pDumpStream ) - { - pDumpStream->Close(); - delete pDumpStream; - } - - if( nInstances ) - { - nInstances--; - if( !nInstances ) - { - delete[] pBlankLine; - pBlankLine = NULL; - - delete[] pCharType; - pCharType = NULL; - - delete[] pCharVal; - pCharVal = NULL; - } - } - - if( pDumpModes ) - delete[] pDumpModes; - - if( ppRecNames ) - { - ByteString** pp = ppRecNames; - UINT16 n = nRecCnt; - while( n ) - { - if( *pp ) - delete *pp; - pp++; - n--; - } - delete[] ppRecNames; - } - - if( pTitle ) - delete pTitle; - - if( pOutName ) - delete pOutName; - - DUMP_ERR* p = pFirst; - DUMP_ERR* pD; - if( p ) - { - pD = p; - p = p->pNext; - delete pD; - } -} - - -BOOL Biff8RecDumper::Dump( XclImpStream& r ) -{ - const DUMP_ERR* pErr = FirstErr(); - - if( pErr ) - { - if( pDumpStream ) - { - SvFileStream& rOut = *pDumpStream; - while( pErr ) - { - rOut << "\nError"; - if( pErr->nLine ) - { - ByteString t; - t += ByteString::CreateFromInt32( pErr->nLine ); - rOut << " at line " << t.GetBuffer(); - } - - rOut << ": " << pErr->aText.GetBuffer(); - - if( pErr->pHint ) - rOut << " (" << pErr->pHint->GetBuffer() << ')'; - pErr = NextErr(); - } - rOut << '\n'; - } - } - else if( pDumpStream && !bSkip ) - { - SvStream& rOutStrm = *pDumpStream; - - if( bExportBookStream && pOutName ) - { - ByteString aBookOutName( *pOutName, 0, pOutName->Len() - 4 ); - aBookOutName.Append( "_book.xls" ); - SvFileStream aBook( String::CreateFromAscii( aBookOutName.GetBuffer() ), STREAM_WRITE|STREAM_SHARE_DENYWRITE|STREAM_TRUNC ); - if( aBook.IsOpen() ) - { - const sal_uInt32 nBufLen = 0xFFFF; - sal_uInt8 pBuffer[ nBufLen ]; - r.StoreGlobalPosition(); - while( r.StartNextRecord() ) - { - r.ResetRecord( false ); - sal_uInt16 nRecSize = (sal_uInt16) Min( r.GetRecSize(), nBufLen ); - aBook << r.GetRecId() << nRecSize; - r.Read( pBuffer, nRecSize ); - aBook.Write( pBuffer, nRecSize ); - } - r.SeekGlobalPosition(); - } - } - - if( pTitle ) - rOutStrm << pTitle->GetBuffer(); - - pIn = &r; - r.StoreGlobalPosition(); - - ::std::auto_ptr< XclDumpStorageHeader > xStrgHerader; - SotStorageRef xRootStrg = GetRootStorage(); - if( xRootStrg.Is() ) - xStrgHerader.reset( new XclDumpStorageHeader( *xRootStrg, rOutStrm, EMPTY_STRING ) ); - - ::std::auto_ptr< ScfProgressBar > xProgress( new ScfProgressBar( - GetDocShell(), String( RTL_CONSTASCII_USTRINGPARAM( "Dumper" ) ) ) ); - sal_Int32 nStreamSeg = xProgress->AddSegment( r.GetSvStreamSize() ); - xProgress->ActivateSegment( nStreamSeg ); - - while( r.StartNextRecord() ) - { - xProgress->ProgressAbs( r.GetSvStreamPos() ); - if( HasModeDump( r.GetRecId() ) ) - RecDump(); - } - - rOutStrm << "\n\n"; - - pIn = NULL; - xProgress.reset(); - - r.SeekGlobalPosition(); - - // dump substreams - if( xRootStrg.Is() ) - { - pIn = NULL; - bool bOldEncr = bEncrypted; - bEncrypted = false; - DumpRecordStream( xRootStrg, EXC_STREAM_USERNAMES, EMPTY_STRING ); - - pIn = &r; - bEncrypted = bOldEncr; - DumpRecordStream( xRootStrg, EXC_STREAM_REVLOG, EMPTY_STRING ); - - pIn = NULL; - - DumpCtlsStream(); - DumpVbaProjectStorage(); - } - } - - return !bEndLoading; -} - -#undef Read1 -#undef Read2 -#undef Read4 -#undef Read8 - -#endif - diff --git a/sc/source/filter/excel/excel.cxx b/sc/source/filter/excel/excel.cxx index 3965d0acaf4e..8365ef0db3f9 100644 --- a/sc/source/filter/excel/excel.cxx +++ b/sc/source/filter/excel/excel.cxx @@ -98,15 +98,21 @@ FltError ScFormatFilterPluginImpl::ScImportExcel( SfxMedium& rMedium, ScDocument CREATE_OUSTRING( "com.sun.star.comp.oox.ExcelBiffFilter" ), aArgs ), uno::UNO_QUERY_THROW ); xImporter->setTargetDocument( xComponent ); - MediaDescriptor aDescriptor; - if( const SfxItemSet* pItemSet = rMedium.GetItemSet() ) + MediaDescriptor aMediaDesc; + SfxItemSet* pItemSet = rMedium.GetItemSet(); + if( pItemSet ) + { if( const SfxStringItem* pItem = static_cast< const SfxStringItem* >( pItemSet->GetItem( SID_FILE_NAME ) ) ) - aDescriptor[ MediaDescriptor::PROP_URL() ] <<= ::rtl::OUString( pItem->GetValue() ); - aDescriptor[ MediaDescriptor::PROP_INPUTSTREAM() ] <<= rMedium.GetInputStream(); + aMediaDesc[ MediaDescriptor::PROP_URL() ] <<= ::rtl::OUString( pItem->GetValue() ); + if( const SfxStringItem* pItem = static_cast< const SfxStringItem* >( pItemSet->GetItem( SID_PASSWORD ) ) ) + aMediaDesc[ MediaDescriptor::PROP_PASSWORD() ] <<= ::rtl::OUString( pItem->GetValue() ); + } + aMediaDesc[ MediaDescriptor::PROP_INPUTSTREAM() ] <<= rMedium.GetInputStream(); + aMediaDesc[ MediaDescriptor::PROP_INTERACTIONHANDLER() ] <<= rMedium.GetInteractionHandler(); // call the filter uno::Reference< document::XFilter > xFilter( xImporter, uno::UNO_QUERY_THROW ); - bool bResult = xFilter->filter( aDescriptor.getAsConstPropertyValueList() ); + bool bResult = xFilter->filter( aMediaDesc.getAsConstPropertyValueList() ); // if filter returns false, document is invalid, or dumper has disabled import -> exit here if( !bResult ) @@ -141,27 +147,27 @@ FltError ScFormatFilterPluginImpl::ScImportExcel( SfxMedium& rMedium, ScDocument if( xRootStrg.Is() ) { // try to open the "Book" stream - SotStorageStreamRef xBookStrm5 = ScfTools::OpenStorageStreamRead( xRootStrg, EXC_STREAM_BOOK ); - XclBiff eBookStrm5Biff = xBookStrm5.Is() ? XclImpStream::DetectBiffVersion( *xBookStrm5 ) : EXC_BIFF_UNKNOWN; + SotStorageStreamRef xBookStrm = ScfTools::OpenStorageStreamRead( xRootStrg, EXC_STREAM_BOOK ); + XclBiff eBookBiff = xBookStrm.Is() ? XclImpStream::DetectBiffVersion( *xBookStrm ) : EXC_BIFF_UNKNOWN; // try to open the "Workbook" stream - SotStorageStreamRef xBookStrm8 = ScfTools::OpenStorageStreamRead( xRootStrg, EXC_STREAM_WORKBOOK ); - XclBiff eBookStrm8Biff = xBookStrm8.Is() ? XclImpStream::DetectBiffVersion( *xBookStrm8 ) : EXC_BIFF_UNKNOWN; + SotStorageStreamRef xWorkbookStrm = ScfTools::OpenStorageStreamRead( xRootStrg, EXC_STREAM_WORKBOOK ); + XclBiff eWorkbookBiff = xWorkbookStrm.Is() ? XclImpStream::DetectBiffVersion( *xWorkbookStrm ) : EXC_BIFF_UNKNOWN; // decide which stream to use - if( (eBookStrm8Biff != EXC_BIFF_UNKNOWN) && ((eBookStrm5Biff == EXC_BIFF_UNKNOWN) || (eBookStrm8Biff > eBookStrm5Biff)) ) + if( (eWorkbookBiff != EXC_BIFF_UNKNOWN) && ((eBookBiff == EXC_BIFF_UNKNOWN) || (eWorkbookBiff > eBookBiff)) ) { /* Only "Workbook" stream exists; or both streams exist, and "Workbook" has higher BIFF version than "Book" stream. */ - xStrgStrm = xBookStrm8; - eBiff = eBookStrm8Biff; + xStrgStrm = xWorkbookStrm; + eBiff = eWorkbookBiff; } - else if( eBookStrm5Biff != EXC_BIFF_UNKNOWN ) + else if( eBookBiff != EXC_BIFF_UNKNOWN ) { /* Only "Book" stream exists; or both streams exist, and "Book" has higher BIFF version than "Workbook" stream. */ - xStrgStrm = xBookStrm5; - eBiff = eBookStrm5Biff; + xStrgStrm = xBookStrm; + eBiff = eBookBiff; } pBookStrm = xStrgStrm; diff --git a/sc/source/filter/excel/impop.cxx b/sc/source/filter/excel/impop.cxx index cfbef0a15a6e..5a0ae1f9a972 100644 --- a/sc/source/filter/excel/impop.cxx +++ b/sc/source/filter/excel/impop.cxx @@ -46,6 +46,7 @@ #include <svx/pageitem.hxx> #include <svx/colritem.hxx> #include <sfx2/printer.hxx> +#include <sfx2/docfile.hxx> #include <svtools/zforlist.hxx> #include <sfx2/objsh.hxx> @@ -175,6 +176,15 @@ ImportExcel::~ImportExcel( void ) } +void ImportExcel::ReadFileSharing() +{ + sal_uInt16 nRecommendReadOnly, nPasswordHash; + maStrm >> nRecommendReadOnly >> nPasswordHash; + if( (nRecommendReadOnly != 0) || (nPasswordHash != 0) ) + if( SfxItemSet* pItemSet = GetMedium().GetItemSet() ) + pItemSet->Put( SfxBoolItem( SID_DOC_READONLY, TRUE ) ); +} + sal_uInt16 ImportExcel::ReadXFIndex( bool bBiff2 ) { sal_uInt16 nXFIdx = 0; @@ -604,7 +614,6 @@ void ImportExcel::DocPasssword( void ) void ImportExcel::Codepage( void ) { - maStrm.EnableDecryption(); SetCodePage( maStrm.ReaduInt16() ); } diff --git a/sc/source/filter/excel/makefile.mk b/sc/source/filter/excel/makefile.mk index 4fffb1ef3ed1..5b483f04729d 100644 --- a/sc/source/filter/excel/makefile.mk +++ b/sc/source/filter/excel/makefile.mk @@ -103,7 +103,6 @@ SLOFILES = \ $(SLO)$/xlpage.obj \ $(SLO)$/xlpivot.obj \ $(SLO)$/xlroot.obj \ - $(SLO)$/xlstream.obj \ $(SLO)$/xlstyle.obj \ $(SLO)$/xltools.obj \ $(SLO)$/xltracer.obj \ @@ -153,6 +152,7 @@ EXCEPTIONSFILES = \ $(SLO)$/xlchart.obj \ $(SLO)$/xlformula.obj \ $(SLO)$/xlpivot.obj \ + $(SLO)$/xlroot.obj \ $(SLO)$/xlstyle.obj \ $(SLO)$/xlview.obj diff --git a/sc/source/filter/excel/read.cxx b/sc/source/filter/excel/read.cxx index e7473ba23d02..a4a286d27171 100644 --- a/sc/source/filter/excel/read.cxx +++ b/sc/source/filter/excel/read.cxx @@ -305,6 +305,7 @@ FltError ImportExcel::Read( void ) if( eLastErr != ERRCODE_NONE ) eAkt = Z_Ende; break; + case EXC_ID_FILESHARING: ReadFileSharing(); break; case 0x41: rTabViewSett.ReadPane( maStrm ); break; case 0x42: Codepage(); break; // CODEPAGE [ 2345] case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ] @@ -374,6 +375,7 @@ FltError ImportExcel::Read( void ) if( eLastErr != ERRCODE_NONE ) eAkt = Z_Ende; break; + case EXC_ID_FILESHARING: ReadFileSharing(); break; case 0x41: rTabViewSett.ReadPane( maStrm ); break; case 0x42: Codepage(); break; // CODEPAGE [ 2345] case 0x55: DefColWidth(); break; @@ -412,6 +414,7 @@ FltError ImportExcel::Read( void ) if( eLastErr != ERRCODE_NONE ) eAkt = Z_Ende; break; + case EXC_ID_FILESHARING: ReadFileSharing(); break; case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345] case 0x42: Codepage(); break; // CODEPAGE [ 2345] case 0x55: DefColWidth(); break; @@ -546,6 +549,7 @@ FltError ImportExcel::Read( void ) if( eLastErr != ERRCODE_NONE ) eAkt = Z_Ende; break; + case EXC_ID_FILESHARING: ReadFileSharing(); break; case 0x3D: Window1(); break; case 0x42: Codepage(); break; // CODEPAGE [ 2345] case 0x85: Boundsheet(); break; // BOUNDSHEET [ 5] @@ -902,6 +906,7 @@ FltError ImportExcel8::Read( void ) if( eLastErr != ERRCODE_NONE ) eAkt = EXC_STATE_END; break; + case EXC_ID_FILESHARING: ReadFileSharing(); break; case 0x3D: Window1(); break; case 0x42: Codepage(); break; // CODEPAGE [ 2345 ] case 0x85: Boundsheet(); break; // BOUNDSHEET [ 5 ] diff --git a/sc/source/filter/excel/xestream.cxx b/sc/source/filter/excel/xestream.cxx index 6b2f53c8056a..45ced68de006 100644 --- a/sc/source/filter/excel/xestream.cxx +++ b/sc/source/filter/excel/xestream.cxx @@ -485,7 +485,7 @@ XclExpBiff8Encrypter::XclExpBiff8Encrypter( const XclExpRoot& rRoot, const sal_u String aPass = rRoot.GetPassword(); if (aPass.Len() == 0) // Empty password. Get the default biff8 password. - aPass = XclCryptoHelper::GetBiff8WbProtPassword(); + aPass = rRoot.GetDefaultPassword(); Init(aPass, nDocId, nSalt); } diff --git a/sc/source/filter/excel/xicontent.cxx b/sc/source/filter/excel/xicontent.cxx index 24c1999b581b..b57297b344dc 100644 --- a/sc/source/filter/excel/xicontent.cxx +++ b/sc/source/filter/excel/xicontent.cxx @@ -1011,7 +1011,7 @@ XclImpDecrypterRef lclReadFilepass5( XclImpStream& rStrm ) { sal_uInt16 nKey, nHash; rStrm >> nKey >> nHash; - xDecr.reset( new XclImpBiff5Decrypter( rStrm.GetRoot(), nKey, nHash ) ); + xDecr.reset( new XclImpBiff5Decrypter( nKey, nHash ) ); } return xDecr; } @@ -1022,14 +1022,13 @@ XclImpDecrypterRef lclReadFilepass8_Standard( XclImpStream& rStrm ) DBG_ASSERT( rStrm.GetRecLeft() == 48, "lclReadFilepass8 - wrong record size" ); if( rStrm.GetRecLeft() == 48 ) { - sal_uInt8 pnDocId[ 16 ]; - sal_uInt8 pnSaltData[ 16 ]; - sal_uInt8 pnSaltHash[ 16 ]; - rStrm.Read( pnDocId, 16 ); - rStrm.Read( pnSaltData, 16 ); - rStrm.Read( pnSaltHash, 16 ); - xDecr.reset( new XclImpBiff8Decrypter( - rStrm.GetRoot(), pnDocId, pnSaltData, pnSaltHash ) ); + sal_uInt8 pnSalt[ 16 ]; + sal_uInt8 pnVerifier[ 16 ]; + sal_uInt8 pnVerifierHash[ 16 ]; + rStrm.Read( pnSalt, 16 ); + rStrm.Read( pnVerifier, 16 ); + rStrm.Read( pnVerifierHash, 16 ); + xDecr.reset( new XclImpBiff8Decrypter( pnSalt, pnVerifier, pnVerifierHash ) ); } return xDecr; } @@ -1087,6 +1086,7 @@ ErrCode XclImpDecryptHelper::ReadFilepass( XclImpStream& rStrm ) XclImpDecrypterRef xDecr; rStrm.DisableDecryption(); + // read the FILEPASS record and create a new decrypter object switch( rStrm.GetRoot().GetBiff() ) { case EXC_BIFF2: @@ -1097,21 +1097,15 @@ ErrCode XclImpDecryptHelper::ReadFilepass( XclImpStream& rStrm ) default: DBG_ERROR_BIFF(); }; - if (!xDecr.is()) - return EXC_ENCR_ERROR_UNSUPP_CRYPT; - // set decrypter at import stream rStrm.SetDecrypter( xDecr ); - // Store the document password for export. - SfxItemSet* pSet = rStrm.GetRoot().GetDocShell()->GetMedium()->GetItemSet(); - if (pSet) - { - String aPass = xDecr->GetPassword(); - pSet->Put( SfxStringItem(SID_PASSWORD, aPass) ); - } + // request and verify a password (decrypter implements IDocPasswordVerifier) + if( xDecr.is() ) + rStrm.GetRoot().RequestPassword( *xDecr ); - return xDecr->GetError(); + // return error code (success, wrong password, etc.) + return xDecr.is() ? xDecr->GetError() : EXC_ENCR_ERROR_UNSUPP_CRYPT; } // Document protection ======================================================== diff --git a/sc/source/filter/excel/xiroot.cxx b/sc/source/filter/excel/xiroot.cxx index 55ba4bdc4cb4..30cab47f57f5 100644 --- a/sc/source/filter/excel/xiroot.cxx +++ b/sc/source/filter/excel/xiroot.cxx @@ -52,7 +52,6 @@ XclImpRootData::XclImpRootData( XclBiff eBiff, SfxMedium& rMedium, SotStorageRef xRootStrg, ScDocument& rDoc, rtl_TextEncoding eTextEnc ) : XclRootData( eBiff, rMedium, xRootStrg, rDoc, eTextEnc, false ), - mbPassQueried( false ), mbHasCodePage( false ) { } @@ -270,16 +269,5 @@ String XclImpRoot::GetScAddInName( const String& rXclName ) const return rXclName; } -const String& XclImpRoot::QueryPassword() const -{ - if( !mrImpData.mbPassQueried ) - { - mrImpData.maPassw = ScfApiHelper::QueryPasswordForMedium( GetMedium() ); - // set to true, even if dialog has been cancelled (never ask twice) - mrImpData.mbPassQueried = true; - } - return mrImpData.maPassw; -} - // ============================================================================ diff --git a/sc/source/filter/excel/xistream.cxx b/sc/source/filter/excel/xistream.cxx index e7780c065118..b168c4389c4c 100644 --- a/sc/source/filter/excel/xistream.cxx +++ b/sc/source/filter/excel/xistream.cxx @@ -31,13 +31,16 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" -// ============================================================================ #include "xistream.hxx" #include "xlstring.hxx" #include "xiroot.hxx" #include <vector> +using ::rtl::OString; +using ::rtl::OUString; +using ::rtl::OUStringToOString; + // ============================================================================ // Decryption // ============================================================================ @@ -50,6 +53,7 @@ XclImpDecrypter::XclImpDecrypter() : } XclImpDecrypter::XclImpDecrypter( const XclImpDecrypter& rSrc ) : + ::comphelper::IDocPasswordVerifier(), mnError( rSrc.mnError ), mnOldPos( STREAM_SEEK_TO_END ), mnRecSize( 0 ) @@ -68,6 +72,13 @@ XclImpDecrypterRef XclImpDecrypter::Clone() const return xNewDecr; } +::comphelper::DocPasswordVerifierResult XclImpDecrypter::verifyPassword( const OUString& rPassword ) +{ + bool bValid = OnVerify( rPassword ); + mnError = bValid ? ERRCODE_NONE : ERRCODE_ABORT; + return bValid ? ::comphelper::DocPasswordVerifierResult_OK : ::comphelper::DocPasswordVerifierResult_WRONG_PASSWORD; +} + void XclImpDecrypter::Update( SvStream& rStrm, sal_uInt16 nRecSize ) { if( IsValid() ) @@ -99,47 +110,48 @@ sal_uInt16 XclImpDecrypter::Read( SvStream& rStrm, void* pData, sal_uInt16 nByte return nRet; } -const String XclImpDecrypter::GetPassword() const -{ - return maPass; -} +// ---------------------------------------------------------------------------- -void XclImpDecrypter::SetHasValidPassword( bool bValid ) +XclImpBiff5Decrypter::XclImpBiff5Decrypter( sal_uInt16 nKey, sal_uInt16 nHash ) : + maPassword( 16 ), + mnKey( nKey ), + mnHash( nHash ) { - mnError = bValid ? ERRCODE_NONE : EXC_ENCR_ERROR_WRONG_PASS; } -void XclImpDecrypter::SetPassword( const String& rPass ) +XclImpBiff5Decrypter::XclImpBiff5Decrypter( const XclImpBiff5Decrypter& rSrc ) : + XclImpDecrypter( rSrc ), + maPassword( rSrc.maPassword ), + mnKey( rSrc.mnKey ), + mnHash( rSrc.mnHash ) { - maPass = rPass; + if( IsValid() ) + maCodec.InitKey( &maPassword.front() ); } -// ---------------------------------------------------------------------------- - -XclImpBiff5Decrypter::XclImpBiff5Decrypter( const XclImpRoot& rRoot, sal_uInt16 nKey, sal_uInt16 nHash ) +XclImpBiff5Decrypter* XclImpBiff5Decrypter::OnClone() const { - Init( XclCryptoHelper::GetBiff5WbProtPassword(), nKey, nHash ); - if( !IsValid() ) - { - //! TODO: correct byte string encoding in all cases? - ByteString aPass( rRoot.QueryPassword(), RTL_TEXTENCODING_MS_1252 ); - Init( aPass, nKey, nHash ); - } + return new XclImpBiff5Decrypter( *this ); } -XclImpBiff5Decrypter::XclImpBiff5Decrypter( const XclImpBiff5Decrypter& rSrc ) : - XclImpDecrypter( rSrc ) +bool XclImpBiff5Decrypter::OnVerify( const OUString& rPassword ) { - if( rSrc.IsValid() ) + /* Convert password to a byte string. TODO: this needs some finetuning + according to the spec... */ + OString aBytePassword = OUStringToOString( rPassword, osl_getThreadTextEncoding() ); + sal_Int32 nLen = aBytePassword.getLength(); + if( (0 < nLen) && (nLen < 16) ) { - memcpy( mpnPassw, rSrc.mpnPassw, sizeof( mpnPassw ) ); - maCodec.InitKey( mpnPassw ); - } -} + // copy byte string to sal_uInt8 array + maPassword.clear(); + maPassword.resize( 16, 0 ); + memcpy( &maPassword.front(), aBytePassword.getStr(), static_cast< size_t >( nLen ) ); -XclImpBiff5Decrypter* XclImpBiff5Decrypter::OnClone() const -{ - return new XclImpBiff5Decrypter( *this ); + // init codec + maCodec.InitKey( &maPassword.front() ); + return maCodec.VerifyKey( mnKey, mnHash ); + } + return false; } void XclImpBiff5Decrypter::OnUpdate( sal_Size /*nOldStrmPos*/, sal_Size nNewStrmPos, sal_uInt16 nRecSize ) @@ -155,48 +167,26 @@ sal_uInt16 XclImpBiff5Decrypter::OnRead( SvStream& rStrm, sal_uInt8* pnData, sal return nRet; } -void XclImpBiff5Decrypter::Init( const ByteString& rPass, sal_uInt16 nKey, sal_uInt16 nHash ) -{ - xub_StrLen nLen = rPass.Len(); - bool bValid = (0 < nLen) && (nLen < 16); - - if( bValid ) - { - // transform ByteString to sal_uInt8 array - memset( mpnPassw, 0, sizeof( mpnPassw ) ); - for( xub_StrLen nChar = 0; nChar < nLen; ++nChar ) - mpnPassw[ nChar ] = static_cast< sal_uInt8 >( rPass.GetChar( nChar ) ); - // init codec - maCodec.InitKey( mpnPassw ); - bValid = maCodec.VerifyKey( nKey, nHash ); - - String aUniPass( rPass, RTL_TEXTENCODING_MS_1252 ); - SetPassword( aUniPass ); - } - - SetHasValidPassword( bValid ); -} - // ---------------------------------------------------------------------------- -XclImpBiff8Decrypter::XclImpBiff8Decrypter( - const XclImpRoot& rRoot, sal_uInt8 pnDocId[ 16 ], - sal_uInt8 pnSaltData[ 16 ], sal_uInt8 pnSaltHash[ 16 ] ) +XclImpBiff8Decrypter::XclImpBiff8Decrypter( sal_uInt8 pnSalt[ 16 ], + sal_uInt8 pnVerifier[ 16 ], sal_uInt8 pnVerifierHash[ 16 ] ) : + maPassword( 16, 0 ), + maSalt( pnSalt, pnSalt + 16 ), + maVerifier( pnVerifier, pnVerifier + 16 ), + maVerifierHash( pnVerifierHash, pnVerifierHash + 16 ) { - Init( XclCryptoHelper::GetBiff8WbProtPassword(), pnDocId, pnSaltData, pnSaltHash ); - if( !IsValid() ) - Init( rRoot.QueryPassword(), pnDocId, pnSaltData, pnSaltHash ); } XclImpBiff8Decrypter::XclImpBiff8Decrypter( const XclImpBiff8Decrypter& rSrc ) : - XclImpDecrypter( rSrc ) + XclImpDecrypter( rSrc ), + maPassword( rSrc.maPassword ), + maSalt( rSrc.maSalt ), + maVerifier( rSrc.maVerifier ), + maVerifierHash( rSrc.maVerifierHash ) { - if( rSrc.IsValid() ) - { - memcpy( mpnPassw, rSrc.mpnPassw, sizeof( mpnPassw ) ); - memcpy( mpnDocId, rSrc.mpnDocId, sizeof( mpnDocId ) ); - maCodec.InitKey( mpnPassw, mpnDocId ); - } + if( IsValid() ) + maCodec.InitKey( &maPassword.front(), &maSalt.front() ); } XclImpBiff8Decrypter* XclImpBiff8Decrypter::OnClone() const @@ -204,6 +194,27 @@ XclImpBiff8Decrypter* XclImpBiff8Decrypter::OnClone() const return new XclImpBiff8Decrypter( *this ); } +bool XclImpBiff8Decrypter::OnVerify( const OUString& rPassword ) +{ + sal_Int32 nLen = rPassword.getLength(); + if( (0 < nLen) && (nLen < 16) ) + { + // copy string to sal_uInt16 array + maPassword.clear(); + maPassword.resize( 16, 0 ); + const sal_Unicode* pcChar = rPassword.getStr(); + const sal_Unicode* pcCharEnd = pcChar + nLen; + ::std::vector< sal_uInt16 >::iterator aIt = maPassword.begin(); + for( ; pcChar < pcCharEnd; ++pcChar, ++aIt ) + *aIt = static_cast< sal_uInt16 >( *pcChar ); + + // init codec + maCodec.InitKey( &maPassword.front(), &maSalt.front() ); + return maCodec.VerifyKey( &maVerifier.front(), &maVerifierHash.front() ); + } + return false; +} + void XclImpBiff8Decrypter::OnUpdate( sal_Size nOldStrmPos, sal_Size nNewStrmPos, sal_uInt16 /*nRecSize*/ ) { if( nNewStrmPos != nOldStrmPos ) @@ -252,31 +263,6 @@ sal_uInt16 XclImpBiff8Decrypter::OnRead( SvStream& rStrm, sal_uInt8* pnData, sal return nRet; } -void XclImpBiff8Decrypter::Init( - const String& rPass, sal_uInt8 pnDocId[ 16 ], - sal_uInt8 pnSaltData[ 16 ], sal_uInt8 pnSaltHash[ 16 ] ) -{ - xub_StrLen nLen = rPass.Len(); - bool bValid = (0 < nLen) && (nLen < 16); - - if( bValid ) - { - // transform String to sal_uInt16 array - memset( mpnPassw, 0, sizeof( mpnPassw ) ); - for( xub_StrLen nChar = 0; nChar < nLen; ++nChar ) - mpnPassw[ nChar ] = static_cast< sal_uInt16 >( rPass.GetChar( nChar ) ); - // copy document ID - memcpy( mpnDocId, pnDocId, sizeof( mpnDocId ) ); - // init codec - maCodec.InitKey( mpnPassw, mpnDocId ); - bValid = maCodec.VerifyKey( pnSaltData, pnSaltHash ); - - SetPassword(rPass); - } - - SetHasValidPassword( bValid ); -} - sal_uInt32 XclImpBiff8Decrypter::GetBlock( sal_Size nStrmPos ) const { return static_cast< sal_uInt32 >( nStrmPos / EXC_ENCR_BLOCKSIZE ); diff --git a/sc/source/filter/excel/xlroot.cxx b/sc/source/filter/excel/xlroot.cxx index 8f5ddadd0370..29522f4f50ff 100644 --- a/sc/source/filter/excel/xlroot.cxx +++ b/sc/source/filter/excel/xlroot.cxx @@ -79,6 +79,7 @@ XclRootData::XclRootData( XclBiff eBiff, SfxMedium& rMedium, mrMedium( rMedium ), mxRootStrg( xRootStrg ), mrDoc( rDoc ), + maDefPassword( CREATE_STRING( "VelvetSweatshop" ) ), meTextEnc( eTextEnc ), meSysLang( Application::GetSettings().GetLanguage() ), meDocLang( Application::GetSettings().GetLanguage() ), @@ -198,6 +199,13 @@ void XclRoot::SetCharWidth( const XclFontData& rFontData ) } } +String XclRoot::RequestPassword( ::comphelper::IDocPasswordVerifier& rVerifier ) const +{ + ::std::vector< OUString > aDefaultPasswords; + aDefaultPasswords.push_back( mrData.maDefPassword ); + return ScfApiHelper::QueryPasswordForMedium( mrData.mrMedium, rVerifier, &aDefaultPasswords ); +} + bool XclRoot::HasVbaStorage() const { SotStorageRef xRootStrg = GetRootStorage(); diff --git a/sc/source/filter/excel/xlstream.cxx b/sc/source/filter/excel/xlstream.cxx deleted file mode 100644 index 7340e073c51f..000000000000 --- a/sc/source/filter/excel/xlstream.cxx +++ /dev/null @@ -1,52 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: xlstream.cxx,v $ - * $Revision: 1.5 $ - * - * 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_sc.hxx" - -// ============================================================================ -#include "xlstream.hxx" - -// Encryption/decryption ====================================================== - -const ByteString XclCryptoHelper::GetBiff5WbProtPassword() -{ - static const ByteString saPass( "VelvetSweatshop" ); - return saPass; -} - -const String XclCryptoHelper::GetBiff8WbProtPassword() -{ - static const String saPass( GetBiff5WbProtPassword(), RTL_TEXTENCODING_ASCII_US ); - return saPass; -} - -// ============================================================================ - diff --git a/sc/source/filter/ftools/fapihelper.cxx b/sc/source/filter/ftools/fapihelper.cxx index 3befbf4d866f..31190b6407b1 100644 --- a/sc/source/filter/ftools/fapihelper.cxx +++ b/sc/source/filter/ftools/fapihelper.cxx @@ -35,9 +35,8 @@ #include <algorithm> #include <com/sun/star/lang/XServiceName.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/task/XInteractionHandler.hpp> -#include <com/sun/star/task/XInteractionRequest.hpp> #include <com/sun/star/beans/XPropertyState.hpp> +#include <comphelper/docpasswordhelper.hxx> #include <comphelper/processfactory.hxx> #include <tools/urlobj.hxx> #include <sfx2/objsh.hxx> @@ -45,7 +44,6 @@ #include <sfx2/sfxsids.hrc> #include <svtools/stritem.hxx> #include <svtools/itemset.hxx> -#include <svtools/docpasswdrequest.hxx> #include "miscuno.hxx" using ::rtl::OUString; @@ -55,14 +53,14 @@ using ::com::sun::star::uno::Sequence; using ::com::sun::star::uno::Exception; using ::com::sun::star::uno::UNO_QUERY; using ::com::sun::star::uno::UNO_QUERY_THROW; +using ::com::sun::star::uno::UNO_SET_THROW; using ::com::sun::star::uno::TypeClass_BOOLEAN; using ::com::sun::star::uno::XInterface; using ::com::sun::star::beans::XPropertySet; using ::com::sun::star::beans::XPropertyState; using ::com::sun::star::lang::XServiceName; using ::com::sun::star::lang::XMultiServiceFactory; -using ::com::sun::star::task::XInteractionHandler; -using ::com::sun::star::task::XInteractionRequest; +using ::com::sun::star::task::PasswordRequestMode_PASSWORD_ENTER; // Static helper functions ==================================================== @@ -141,40 +139,25 @@ Reference< XInterface > ScfApiHelper::CreateInstanceWithArgs( return CreateInstanceWithArgs( ::comphelper::getProcessServiceFactory(), rServiceName, rArgs ); } -String ScfApiHelper::QueryPasswordForMedium( SfxMedium& rMedium ) +String ScfApiHelper::QueryPasswordForMedium( SfxMedium& rMedium, + ::comphelper::IDocPasswordVerifier& rVerifier, const ::std::vector< OUString >* pDefaultPasswords ) { - String aPassw; - const SfxItemSet* pSet = rMedium.GetItemSet(); + OUString aMediaPassword; + SfxItemSet* pItemSet = rMedium.GetItemSet(); const SfxPoolItem *pPasswordItem; + if( pItemSet && (SFX_ITEM_SET == pItemSet->GetItemState( SID_PASSWORD, TRUE, &pPasswordItem )) ) + aMediaPassword = static_cast< const SfxStringItem* >( pPasswordItem )->GetValue(); + OUString aDocName = INetURLObject( rMedium.GetOrigURL() ).GetName( INetURLObject::DECODE_WITH_CHARSET ); - if( pSet && (SFX_ITEM_SET == pSet->GetItemState( SID_PASSWORD, TRUE, &pPasswordItem )) ) - { - aPassw = static_cast< const SfxStringItem* >( pPasswordItem )->GetValue(); - } - else - { - try - { - Reference< XInteractionHandler > xHandler( rMedium.GetInteractionHandler() ); - if( xHandler.is() ) - { - RequestDocumentPassword* pRequest = new RequestDocumentPassword( - ::com::sun::star::task::PasswordRequestMode_PASSWORD_ENTER, - INetURLObject( rMedium.GetOrigURL() ).GetName( INetURLObject::DECODE_WITH_CHARSET ) ); - Reference< XInteractionRequest > xRequest( pRequest ); - - xHandler->handle( xRequest ); - - if( pRequest->isPassword() ) - aPassw = pRequest->getPassword(); - } - } - catch( Exception& ) - { - } - } + bool bIsDefaultPassword = false; + OUString aPassword = ::comphelper::DocPasswordHelper::requestAndVerifyDocPassword( + rVerifier, aMediaPassword, rMedium.GetInteractionHandler(), aDocName, + ::comphelper::DocPasswordRequestType_MS, pDefaultPasswords, &bIsDefaultPassword ); + + if( !bIsDefaultPassword && (aPassword.getLength() > 0) && pItemSet ) + pItemSet->Put( SfxStringItem( SID_PASSWORD, aPassword ) ); - return aPassw; + return aPassword; } // Property sets ============================================================== diff --git a/sc/source/filter/inc/fapihelper.hxx b/sc/source/filter/inc/fapihelper.hxx index d8881889e7fa..f3cdc782ee9c 100644 --- a/sc/source/filter/inc/fapihelper.hxx +++ b/sc/source/filter/inc/fapihelper.hxx @@ -45,6 +45,8 @@ namespace com { namespace sun { namespace star { namespace lang { class XMultiServiceFactory; } } } } +namespace comphelper { class IDocPasswordVerifier; } + // Static helper functions ==================================================== class SfxMedium; @@ -109,7 +111,9 @@ public: /** Opens a password dialog and returns the entered password. @return The entered password or an empty string on 'Cancel' or any error. */ - static String QueryPasswordForMedium( SfxMedium& rMedium ); + static String QueryPasswordForMedium( SfxMedium& rMedium, + ::comphelper::IDocPasswordVerifier& rVerifier, + const ::std::vector< ::rtl::OUString >* pDefaultPasswords = 0 ); }; template< typename Type > diff --git a/sc/source/filter/inc/fdumper.hxx b/sc/source/filter/inc/fdumper.hxx deleted file mode 100644 index ea4aabf69009..000000000000 --- a/sc/source/filter/inc/fdumper.hxx +++ /dev/null @@ -1,1520 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: fdumper.hxx,v $ - * $Revision: 1.8.28.2 $ - * - * 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 SC_FDUMPER_HXX -#define SC_FDUMPER_HXX - -#define SCF_INCL_DUMPER (OSL_DEBUG_LEVEL > 0) && 0 - -#include <map> -// #include <math.h> -#include "ftools.hxx" - -#if SCF_INCL_DUMPER - -class SvStream; -class SfxMedium; -class SfxObjectShell; -class Color; -class DateTime; - -namespace scf { -namespace dump { - -#define SCF_DUMP_UNUSED "unused" -#define SCF_DUMP_UNKNOWN "?unknown" - -#define SCF_DUMP_ERRASCII( ascii ) "?err:" ascii -#define SCF_DUMP_ERRSTRING( ascii ) CREATE_STRING( SCF_DUMP_ERRASCII( ascii ) ) - -#define SCF_DUMP_ERR_NOMAP SCF_DUMP_ERRSTRING( "no-map" ) -#define SCF_DUMP_ERR_NONAME SCF_DUMP_ERRSTRING( "no-name" ) -#define SCF_DUMP_ERR_STREAM SCF_DUMP_ERRSTRING( "stream-error" ) - -// ============================================================================ -// ============================================================================ - -/** Specifiers for atomic data types. */ -enum DataType -{ - DATATYPE_VOID, /// No data type. - DATATYPE_INT8, /// Signed 8-bit integer. - DATATYPE_UINT8, /// Unsigned 8-bit integer. - DATATYPE_INT16, /// Signed 16-bit integer. - DATATYPE_UINT16, /// Unsigned 16-bit integer. - DATATYPE_INT32, /// Signed 32-bit integer. - DATATYPE_UINT32, /// Unsigned 32-bit integer. - DATATYPE_INT64, /// Signed 64-bit integer. - DATATYPE_UINT64, /// Unsigned 64-bit integer. - DATATYPE_FLOAT, /// Floating-point, single precision. - DATATYPE_DOUBLE /// Floating-point, double precision. -}; - -// ---------------------------------------------------------------------------- - -/** Specifiers for the output format of values. */ -enum FormatType -{ - FORMATTYPE_NONE, /// No numeric format (e.g. show name only). - FORMATTYPE_DEC, /// Decimal. - FORMATTYPE_HEX, /// Hexadecimal. - FORMATTYPE_BIN, /// Binary. - FORMATTYPE_FIX, /// Fixed-point. - FORMATTYPE_BOOL /// Boolean ('true' or 'false'). -}; - -// ---------------------------------------------------------------------------- - -/** Describes the output format of a data item. - - Data items are written in the following format: - - <NAME>=<VALUE>=<NAME-FROM-LIST> - - NAME is the name of the data item. The name is contained in the members - maItemName and maItemNameUtf8. If the name is empty, only the value is - written (without a leading equality sign). - - VALUE is the numeric value of the data item. Its format is dependent on the - output format given in the member meFmtType. If the format type is - FORMATTYPE_NONE, no value is written. - - NAME-FROM-LIST is a symbolic name for the current value of the data item. - Various types of name lists produce different names for values, which can - be used for enumerations or names for single bits in bitfields (see class - NameListBase and derived classes). The name of the list is given in the - member maListName. If it is empty, no name is written for the value. - */ -struct ItemFormat -{ - DataType meDataType; /// Data type of the item. - FormatType meFmtType; /// Output format for the value. - String maItemName; /// Name of the item. - ByteString maItemNameUtf8; /// Name of the item, converted to UTF-8. - String maListName; /// Name of a name list to be used for this item. - - explicit ItemFormat(); - - void Set( DataType eDataType, FormatType eFmtType, const String& rItemName ); - void Set( DataType eDataType, FormatType eFmtType, const String& rItemName, const String& rListName ); - - /** Initializes the struct from a vector of strings containing the item format. - - The vector must contain at least 2 strings. The struct is filled from - the strings in the vector in the following order: - 1) Data type (one of: [u]int8, [u]int16, [u]int32, [u]int64, float, double). - 2) Format type (one of: dec, hex, bin, fix, bool, unused, unknown). - 3) Item name (optional). - 4) Name list name (optional). - - @return Iterator pointing to the first unhandled string. - */ - ScfStringVec::const_iterator Parse( const ScfStringVec& rFormatVec ); - - /** Initializes the struct from a string containing the item format. - - The string must have the following format: - DATATYPE,FORMATTYPE[,ITEMNAME[,LISTNAME]] - - DATATYPE is the data type of the item (see above for possible values). - FORMATTYPE is the format type of the item (see above for possible values). - ITEMNAME is the name of the item (optional). - LISTNAME is the name of a name list (optional). - - @return List containing remaining unhandled format strings. - */ - ScfStringVec Parse( const String& rFormatStr ); -}; - -// ============================================================================ -// ============================================================================ - -/** Static helper functions for formatted output to strings. */ -class StringHelper -{ -public: - // append string to string ------------------------------------------------ - - static void AppendString( String& rStr, const String& rData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' ); - - // append decimal --------------------------------------------------------- - - static void AppendDec( String& rStr, sal_uInt8 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' ); - static void AppendDec( String& rStr, sal_Int8 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' ); - static void AppendDec( String& rStr, sal_uInt16 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' ); - static void AppendDec( String& rStr, sal_Int16 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' ); - static void AppendDec( String& rStr, sal_uInt32 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' ); - static void AppendDec( String& rStr, sal_Int32 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' ); - static void AppendDec( String& rStr, sal_uInt64 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' ); - static void AppendDec( String& rStr, sal_Int64 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' ); - static void AppendDec( String& rStr, double fData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' ); - - // append hexadecimal ----------------------------------------------------- - - static void AppendHex( String& rStr, sal_uInt8 nData, bool bPrefix = true ); - static void AppendHex( String& rStr, sal_Int8 nData, bool bPrefix = true ); - static void AppendHex( String& rStr, sal_uInt16 nData, bool bPrefix = true ); - static void AppendHex( String& rStr, sal_Int16 nData, bool bPrefix = true ); - static void AppendHex( String& rStr, sal_uInt32 nData, bool bPrefix = true ); - static void AppendHex( String& rStr, sal_Int32 nData, bool bPrefix = true ); - static void AppendHex( String& rStr, sal_uInt64 nData, bool bPrefix = true ); - static void AppendHex( String& rStr, sal_Int64 nData, bool bPrefix = true ); - static void AppendHex( String& rStr, double fData, bool bPrefix = true ); - - // append shortened hexadecimal ------------------------------------------- - - static void AppendShortHex( String& rStr, sal_uInt8 nData, bool bPrefix = true ); - static void AppendShortHex( String& rStr, sal_Int8 nData, bool bPrefix = true ); - static void AppendShortHex( String& rStr, sal_uInt16 nData, bool bPrefix = true ); - static void AppendShortHex( String& rStr, sal_Int16 nData, bool bPrefix = true ); - static void AppendShortHex( String& rStr, sal_uInt32 nData, bool bPrefix = true ); - static void AppendShortHex( String& rStr, sal_Int32 nData, bool bPrefix = true ); - static void AppendShortHex( String& rStr, sal_uInt64 nData, bool bPrefix = true ); - static void AppendShortHex( String& rStr, sal_Int64 nData, bool bPrefix = true ); - - // append binary ---------------------------------------------------------- - - static void AppendBin( String& rStr, sal_uInt8 nData, bool bDots = true ); - static void AppendBin( String& rStr, sal_Int8 nData, bool bDots = true ); - static void AppendBin( String& rStr, sal_uInt16 nData, bool bDots = true ); - static void AppendBin( String& rStr, sal_Int16 nData, bool bDots = true ); - static void AppendBin( String& rStr, sal_uInt32 nData, bool bDots = true ); - static void AppendBin( String& rStr, sal_Int32 nData, bool bDots = true ); - static void AppendBin( String& rStr, sal_uInt64 nData, bool bDots = true ); - static void AppendBin( String& rStr, sal_Int64 nData, bool bDots = true ); - static void AppendBin( String& rStr, double fData, bool bDots = true ); - - // append fixed-point decimal --------------------------------------------- - - template< typename Type > - static void AppendFix( String& rStr, Type nData, xub_StrLen nWidth = 0 ); - - // append formatted value ------------------------------------------------- - - static void AppendBool( String& rStr, bool bData ); - template< typename Type > - static void AppendValue( String& rStr, Type nData, FormatType eFmtType ); - - // encoded text output ---------------------------------------------------- - - static void AppendCChar( String& rStr, sal_Unicode cChar, bool bPrefix = true ); - static void AppendEncChar( String& rStr, sal_Unicode cChar, xub_StrLen nCount = 1, bool bPrefix = true ); - static void AppendEncString( String& rStr, const String& rData, bool bPrefix = true ); - - // token list ------------------------------------------------------------- - - static void AppendToken( String& rStr, const String& rToken, sal_Unicode cSep = ',' ); - static void AppendToken( String& rStr, sal_Int64 nToken, sal_Unicode cSep = ',' ); - static void PrependToken( String& rStr, const String& rToken, sal_Unicode cSep = ',' ); - static void PrependToken( String& rStr, sal_Int64 nToken, sal_Unicode cSep = ',' ); - - static void AppendIndex( String& rStr, const String& rIdx ); - static void AppendIndex( String& rStr, sal_Int64 nIdx ); - static void AppendIndexedText( String& rStr, const String& rData, const String& rIdx ); - static void AppendIndexedText( String& rStr, const String& rData, sal_Int64 nIdx ); - - static String GetToken( const String& rData, xub_StrLen& rnPos, sal_Unicode cSep = ',' ); - - // quoting and trimming --------------------------------------------------- - - /** Encloses the passed string with the passed characters. Uses cOpen, if cClose is NUL. */ - static void Enclose( String& rStr, sal_Unicode cOpen, sal_Unicode cClose = '\0' ); - - static void TrimSpaces( String& rStr ); - static void TrimQuotes( String& rStr ); - - // string conversion ------------------------------------------------------ - - static ByteString ConvertToUtf8( const String& rStr ); - static DataType ConvertToDataType( const String& rStr ); - static FormatType ConvertToFormatType( const String& rStr ); - - static bool ConvertFromDec( sal_Int64& rnData, const String& rData ); - static bool ConvertFromHex( sal_Int64& rnData, const String& rData ); - - static bool ConvertStringToInt( sal_Int64& rnData, const String& rData ); - static bool ConvertStringToDouble( double& rfData, const String& rData ); - static bool ConvertStringToBool( const String& rData ); - - // string to list conversion ---------------------------------------------- - - static void ConvertStringToStringList( ScfStringVec& rVec, const String& rData, bool bIgnoreEmpty ); - static void ConvertStringToIntList( ScfInt64Vec& rVec, const String& rData, bool bIgnoreEmpty ); - - // file names ------------------------------------------------------------- - - static String ConvertFileNameToUrl( const String& rFileName ); - static xub_StrLen GetFileNamePos( const String& rFileUrl ); -}; - -// ---------------------------------------------------------------------------- - -template< typename Type > -void StringHelper::AppendFix( String& rStr, Type nData, xub_StrLen nWidth ) -{ - AppendDec( rStr, static_cast< double >( nData ) / pow( 2.0, 4.0 * sizeof( Type ) ), nWidth ); -} - -template< typename Type > -void StringHelper::AppendValue( String& rStr, Type nData, FormatType eFmtType ) -{ - switch( eFmtType ) - { - case FORMATTYPE_DEC: AppendDec( rStr, nData ); break; - case FORMATTYPE_HEX: AppendHex( rStr, nData ); break; - case FORMATTYPE_BIN: AppendBin( rStr, nData ); break; - case FORMATTYPE_FIX: AppendFix( rStr, nData ); break; - case FORMATTYPE_BOOL: AppendBool( rStr, nData ); break; - default:; - } -} - -// ============================================================================ - -class StringWrapper -{ -public: - inline StringWrapper() {} - inline /*implicit*/ StringWrapper( const String& rStr ) : maStr( rStr ) {} - inline /*implicit*/ StringWrapper( const sal_Char* pcStr ) : maStr( String::CreateFromAscii( pcStr ? pcStr : "" ) ) {} - inline /*implicit*/ StringWrapper( sal_Unicode cChar ) : maStr( cChar ) {} - - inline bool Empty() const { return maStr.Len() == 0; } - inline const String& GetString() const { return maStr; } - -private: - String maStr; -}; - -// ============================================================================ -// ============================================================================ - -class Base; -typedef ScfRef< Base > BaseRef; - -/** Base class for all dumper classes. - - Derived classes implement the virtual function ImplIsValid(). It should - check all members the other functions rely on. If the function - ImplIsValid() returns true, all references and pointers can be used without - further checking. - - Overview of all classes in this header file based on this Base class: - - Base - | - +----> NameListBase - | | - | +----> ConstList ------> MultiList - | +----> FlagsList ------> CombiList - | +----> UnitConverter - | - +----> ConfigCoreData - +----> Config - +----> CoreData - | - +----> Input ------> SvStreamInput - +----> Output - | - +----> ObjectBase - | - +----> InputObjectBase - | | - | +----> StreamObjectBase - | | | - | | +----> SvStreamObject - | | +----> OleStreamObject - | | +----> WrappedStreamObject - | | - | +----> RecordHeaderBase - | - +----> OleStorageObject - +----> DumperBase - */ -class Base -{ -public: - virtual ~Base(); - - inline bool IsValid() const { return ImplIsValid(); } - inline static bool IsValid( BaseRef xBase ) { return xBase.is() && xBase->IsValid(); } - -protected: - inline explicit Base() {} - - virtual bool ImplIsValid() const = 0; -}; - -// ============================================================================ -// ============================================================================ - -class ConfigItemBase -{ -public: - virtual ~ConfigItemBase(); - void ReadConfigBlock( SvStream& rStrm ); - -protected: - inline explicit ConfigItemBase() {} - - virtual void ImplProcessConfigItemStr( SvStream& rStrm, const String& rKey, const String& rData ); - virtual void ImplProcessConfigItemInt( SvStream& rStrm, sal_Int64 nKey, const String& rData ); - - void ReadConfigBlockContents( SvStream& rStrm ); - void IgnoreConfigBlockContents( SvStream& rStrm ); - -private: - enum LineType { LINETYPE_DATA, LINETYPE_BEGIN, LINETYPE_END }; - - LineType ReadConfigLine( SvStream& rStrm, String& rKey, String& rData ) const; - LineType ReadConfigLine( SvStream& rStrm ) const; - void ProcessConfigItem( SvStream& rStrm, const String& rKey, const String& rData ); -}; - -// ============================================================================ - -class ConfigCoreData; -class Config; - -class NameListBase; -typedef ScfRef< NameListBase > NameListRef; - -/** Base class of all classes providing names for specific values (name lists). - - The idea is to provide a unique interfase for all different methods to - write specific names for any values. This can be enumerations (dedicated - names for a subset of values), or names for bits in bit fields. Classes - derived from this base class implement the specific behaviour for the - desired purpose. - */ -class NameListBase : public Base, public ConfigItemBase -{ -public: - typedef ::std::map< sal_Int64, String > StringMap; - typedef StringMap::const_iterator const_iterator; - - virtual ~NameListBase(); - - /** Sets a name for the specified key. */ - void SetName( sal_Int64 nKey, const StringWrapper& rNameWrp ); - /** Include all names of the passed list. */ - void IncludeList( NameListRef xList ); - - /** Returns true, if the map contains an entry for the passed key. */ - template< typename Type > - inline bool HasName( Type nKey ) const - { return maMap.count( static_cast< sal_Int64 >( nKey ) ) != 0; } - /** Returns the name for the passed key. */ - template< typename Type > - inline String GetName( const Config& rCfg, Type nKey ) const - { return ImplGetName( rCfg, static_cast< sal_Int64 >( nKey ) ); } - /** Returns a display name for the passed double value. */ - inline String GetName( const Config& rCfg, double fValue ) const - { return ImplGetNameDbl( rCfg, fValue ); } - - /** Returns a map iterator pointing to the first contained name. */ - inline const_iterator begin() const { return maMap.begin(); } - /** Returns a map iterator pointing one past the last contained name. */ - inline const_iterator end() const { return maMap.end(); } - -protected: - inline explicit NameListBase( const ConfigCoreData& rCoreData ) : mrCoreData( rCoreData ) {} - - virtual bool ImplIsValid() const; - virtual void ImplProcessConfigItemStr( SvStream& rStrm, const String& rKey, const String& rData ); - virtual void ImplProcessConfigItemInt( SvStream& rStrm, sal_Int64 nKey, const String& rData ); - - /** Derived classes set the name for the passed key. */ - virtual void ImplSetName( sal_Int64 nKey, const String& rName ) = 0; - /** Derived classes generate and return the name for the passed key. */ - virtual String ImplGetName( const Config& rCfg, sal_Int64 nKey ) const = 0; - /** Derived classes generate and return the name for the passed double value. */ - virtual String ImplGetNameDbl( const Config& rCfg, double fValue ) const = 0; - /** Derived classes insert all names and other settings from the passed list. */ - virtual void ImplIncludeList( const NameListBase& rList ) = 0; - - /** Returns the configuration core data, which can be used to access other name lists. */ - inline const ConfigCoreData& GetCoreData() const { return mrCoreData; } - /** Inserts the passed name into the internal map. */ - void InsertRawName( sal_Int64 nKey, const String& rName ); - /** Returns the name for the passed key, or 0, if nothing found. */ - const String* FindRawName( sal_Int64 nKey ) const; - -private: - /** Includes name lists, given in a comma separated list of names of the lists. */ - void Include( const String& rListKeys ); - /** Excludes names from the list, given by a comma separated list of their keys. */ - void Exclude( const String& rKeys ); - -private: - StringMap maMap; - const ConfigCoreData& mrCoreData; -}; - -// ============================================================================ - -class ConstList : public NameListBase -{ -public: - explicit ConstList( const ConfigCoreData& rCoreData ); - - /** Sets a default name for unknown keys. */ - inline void SetDefaultName( const StringWrapper& rDefName ) { maDefName = rDefName.GetString(); } - /** Enables or disables automatic quotation of returned names. */ - inline void SetQuoteNames( bool bQuoteNames ) { mbQuoteNames = bQuoteNames; } - -protected: - virtual void ImplProcessConfigItemStr( SvStream& rStrm, const String& rKey, const String& rData ); - - /** Sets the name for the passed key. */ - virtual void ImplSetName( sal_Int64 nKey, const String& rName ); - /** Returns the name for the passed key, or the default name, if key is not contained. */ - virtual String ImplGetName( const Config& rCfg, sal_Int64 nKey ) const; - /** Returns the name for the passed double value. */ - virtual String ImplGetNameDbl( const Config& rCfg, double fValue ) const; - /** Inserts all names from the passed list. */ - virtual void ImplIncludeList( const NameListBase& rList ); - -private: - String maDefName; - bool mbQuoteNames; -}; - -// ============================================================================ - -class MultiList : public ConstList -{ -public: - explicit MultiList( const ConfigCoreData& rCoreData ); - - void SetNamesFromVec( sal_Int64 nStartKey, const ScfStringVec& rNames ); - -protected: - virtual void ImplProcessConfigItemStr( SvStream& rStrm, const String& rKey, const String& rData ); - virtual void ImplSetName( sal_Int64 nKey, const String& rName ); - -private: - void InsertNames( sal_Int64 nStartKey, const String& rData ); - -private: - bool mbIgnoreEmpty; -}; - -// ============================================================================ - -class FlagsList : public NameListBase -{ -public: - explicit FlagsList( const ConfigCoreData& rCoreData ); - - /** Sets flags to be ignored on output. */ - template< typename Type > - inline void SetIgnoreFlags( Type nIgnore ) - { mnIgnore = static_cast< sal_Int64 >( nIgnore ); } - -protected: - virtual void ImplProcessConfigItemStr( SvStream& rStrm, const String& rKey, const String& rData ); - - /** Sets the name for the passed key. */ - virtual void ImplSetName( sal_Int64 nKey, const String& rName ); - /** Returns the name for the passed key. */ - virtual String ImplGetName( const Config& rCfg, sal_Int64 nKey ) const; - /** Returns the name for the passed double value. */ - virtual String ImplGetNameDbl( const Config& rCfg, double fValue ) const; - /** Inserts all flags from the passed list. */ - virtual void ImplIncludeList( const NameListBase& rList ); - -private: - sal_Int64 mnIgnore; -}; - -// ============================================================================ - -class CombiList : public FlagsList -{ -public: - explicit CombiList( const ConfigCoreData& rCoreData ); - -protected: - /** Sets the name for the passed key. */ - virtual void ImplSetName( sal_Int64 nKey, const String& rName ); - /** Returns the name for the passed key. */ - virtual String ImplGetName( const Config& rCfg, sal_Int64 nKey ) const; - /** Inserts all flags from the passed list. */ - virtual void ImplIncludeList( const NameListBase& rList ); - -private: - struct ExtItemFormat : public ItemFormat - { - bool mbShiftValue; - inline explicit ExtItemFormat() : mbShiftValue( true ) {} - }; - typedef ::std::map< sal_Int64, ExtItemFormat > ExtItemFormatMap; - ExtItemFormatMap maFmtMap; -}; - -// ============================================================================ - -class UnitConverter : public NameListBase -{ -public: - explicit UnitConverter( const ConfigCoreData& rCoreData ); - - inline void SetUnitName( const StringWrapper& rUnitName ) { maUnitName = rUnitName.GetString(); } - inline void SetFactor( double fFactor ) { mfFactor = fFactor; } - -protected: - /** Sets the name for the passed key. */ - virtual void ImplSetName( sal_Int64 nKey, const String& rName ); - /** Returns the converted value with appended unit name. */ - virtual String ImplGetName( const Config& rCfg, sal_Int64 nKey ) const; - /** Returns the converted value with appended unit name. */ - virtual String ImplGetNameDbl( const Config& rCfg, double fValue ) const; - /** Empty implementation. */ - virtual void ImplIncludeList( const NameListBase& rList ); - -private: - String maUnitName; - double mfFactor; -}; - -// ============================================================================ - -class NameListWrapper -{ -public: - inline NameListWrapper() {} - inline /*implicit*/ NameListWrapper( const String& rListName ) : maNameWrp( rListName ) {} - inline /*implicit*/ NameListWrapper( const sal_Char* pcListName ) : maNameWrp( pcListName ) {} - inline /*implicit*/ NameListWrapper( NameListRef xList ) : mxList( xList ) {} - - inline bool Empty() const { return !mxList && maNameWrp.Empty(); } - NameListRef GetNameList( const Config& rCfg ) const; - -private: - StringWrapper maNameWrp; - mutable NameListRef mxList; -}; - -static const NameListWrapper NO_LIST; - -// ============================================================================ -// ============================================================================ - -class ConfigCoreData : public Base, public ConfigItemBase -{ -public: - explicit ConfigCoreData( const String& rFileName ); - virtual ~ConfigCoreData(); - - void SetOption( const String& rKey, const String& rData ); - const String* GetOption( const String& rKey ) const; - - template< typename ListType > - ScfRef< ListType > CreateNameList( const String& rListName ); - void SetNameList( const String& rListName, NameListRef xList ); - void EraseNameList( const String& rListName ); - NameListRef GetNameList( const String& rListName ) const; - -protected: - inline explicit ConfigCoreData() : mbLoaded( false ) {} - void Construct( const String& rFileName ); - - virtual bool ImplIsValid() const; - virtual void ImplProcessConfigItemStr( SvStream& rStrm, const String& rKey, const String& rData ); - -private: - void ConstructCfgCoreData(); - - bool ReadConfigFile( const String& rFileUrl ); - template< typename ListType > - void ReadNameList( SvStream& rStrm, const String& rListName ); - void CreateShortList( const String& rData ); - void CreateUnitConverter( const String& rData ); - -private: - typedef ::std::map< String, String > ConfigDataMap; - typedef ::std::map< String, NameListRef > NameListMap; - - ConfigDataMap maConfigData; - NameListMap maNameLists; - String maConfigPath; - bool mbLoaded; -}; - -// ---------------------------------------------------------------------------- - -template< typename ListType > -ScfRef< ListType > ConfigCoreData::CreateNameList( const String& rListName ) -{ - ScfRef< ListType > xList; - if( rListName.Len() > 0 ) - { - xList.reset( new ListType( *this ) ); - SetNameList( rListName, xList ); - } - return xList; -} - -template< typename ListType > -void ConfigCoreData::ReadNameList( SvStream& rStrm, const String& rListName ) -{ - NameListRef xList = CreateNameList< ListType >( rListName ); - if( xList.is() ) - xList->ReadConfigBlock( rStrm ); -} - -// ============================================================================ - -class Config : public Base -{ -public: - explicit Config( const Config& rParent ); - explicit Config( const String& rFileName ); - explicit Config( const sal_Char* pcEnvVar ); - virtual ~Config(); - - void SetStringOption( const StringWrapper& rKey, const StringWrapper& rData ); - - const String& GetStringOption( const StringWrapper& rKey, const String& rDefault ) const; - bool GetBoolOption( const StringWrapper& rKey, bool bDefault ) const; - template< typename Type > - Type GetIntOption( const StringWrapper& rKey, Type nDefault ) const; - - bool IsDumperEnabled() const; - bool IsImportEnabled() const; - - template< typename ListType > - ScfRef< ListType > CreateNameList( const StringWrapper& rListName ); - void SetNameList( const StringWrapper& rListName, NameListRef xList ); - void EraseNameList( const StringWrapper& rListName ); - NameListRef GetNameList( const StringWrapper& rListName ) const; - - /** Returns the name for the passed key from the passed name list. */ - template< typename Type > - String GetName( const NameListWrapper& rListWrp, Type nKey ) const; - /** Returns true, if the passed name list contains an entry for the passed key. */ - template< typename Type > - bool HasName( const NameListWrapper& rList, Type nKey ) const; - -protected: - inline explicit Config() {} - void Construct( const Config& rParent ); - void Construct( const String& rFileName ); - void Construct( const sal_Char* pcEnvVar ); - - virtual bool ImplIsValid() const; - virtual const String* ImplGetOption( const String& rKey ) const; - virtual NameListRef ImplGetNameList( const String& rListName ) const; - -private: - typedef ScfRef< ConfigCoreData > ConfigCoreDataRef; - ConfigCoreDataRef mxCoreData; -}; - -typedef ScfRef< Config > ConfigRef; - -// ---------------------------------------------------------------------------- - -template< typename Type > -Type Config::GetIntOption( const StringWrapper& rKey, Type nDefault ) const -{ - sal_Int64 nRawData; - const String* pData = ImplGetOption( rKey.GetString() ); - return (pData && StringHelper::ConvertStringToInt( nRawData, *pData )) ? - static_cast< Type >( nRawData ) : nDefault; -} - -template< typename ListType > -ScfRef< ListType > Config::CreateNameList( const StringWrapper& rListName ) -{ - return mxCoreData->CreateNameList< ListType >( rListName.GetString() ); -} - -template< typename Type > -String Config::GetName( const NameListWrapper& rListWrp, Type nKey ) const -{ - NameListRef xList = rListWrp.GetNameList( *this ); - return xList.is() ? xList->GetName( *this, nKey ) : SCF_DUMP_ERR_NOMAP; -} - -template< typename Type > -bool Config::HasName( const NameListWrapper& rListWrp, Type nKey ) const -{ - NameListRef xList = rListWrp.GetNameList( *this ); - return xList.is() && xList->HasName( nKey ); -} - -// ============================================================================ -// ============================================================================ - -class CoreData : public Base -{ -public: - explicit CoreData( SfxMedium& rMedium, SfxObjectShell* pDocShell ); - - inline SfxMedium& GetMedium() { return mrMedium; } - inline SfxObjectShell* GetDocShell() { return mpDocShell; } - SvStream& GetCoreStream(); - -protected: - virtual bool ImplIsValid() const; - -private: - SfxMedium& mrMedium; - SfxObjectShell* mpDocShell; -}; - -typedef ScfRef< CoreData > CoreDataRef; - -// ============================================================================ -// ============================================================================ - -class Input : public Base -{ -public: - virtual sal_Size GetSize() const = 0; - virtual sal_Size Tell() const = 0; - virtual void Seek( sal_Size nPos ) = 0; - virtual void SeekRel( sal_sSize nRelPos ) = 0; - virtual sal_Size Read( void* pBuffer, sal_Size nSize ) = 0; - virtual void ReadLine( String& rLine, rtl_TextEncoding eEnc ) = 0; - - virtual Input& operator>>( sal_Int8& rnData ) = 0; - virtual Input& operator>>( sal_uInt8& rnData ) = 0; - virtual Input& operator>>( sal_Int16& rnData ) = 0; - virtual Input& operator>>( sal_uInt16& rnData ) = 0; - virtual Input& operator>>( sal_Int32& rnData ) = 0; - virtual Input& operator>>( sal_uInt32& rnData ) = 0; - virtual Input& operator>>( float& rfData ) = 0; - virtual Input& operator>>( double& rfData ) = 0; - - inline bool IsValidPos() const { return Tell() < GetSize(); } - template< typename Type > - inline Type ReadValue() { Type nValue; *this >> nValue; return nValue; } - -protected: - virtual bool ImplIsValid() const; -}; - -typedef ScfRef< Input > InputRef; - -Input& operator>>( Input& rIn, sal_Int64& rnData ); -Input& operator>>( Input& rIn, sal_uInt64& rnData ); - -// ============================================================================ - -class SvStreamInput : public Input -{ -public: - explicit SvStreamInput( SvStream& rStrm ); - virtual ~SvStreamInput(); - - virtual sal_Size GetSize() const; - virtual sal_Size Tell() const; - virtual void Seek( sal_Size nPos ); - virtual void SeekRel( sal_sSize nRelPos ); - virtual sal_Size Read( void* pBuffer, sal_Size nSize ); - virtual void ReadLine( String& rLine, rtl_TextEncoding eEnc ); - - virtual SvStreamInput& operator>>( sal_Int8& rnData ); - virtual SvStreamInput& operator>>( sal_uInt8& rnData ); - virtual SvStreamInput& operator>>( sal_Int16& rnData ); - virtual SvStreamInput& operator>>( sal_uInt16& rnData ); - virtual SvStreamInput& operator>>( sal_Int32& rnData ); - virtual SvStreamInput& operator>>( sal_uInt32& rnData ); - virtual SvStreamInput& operator>>( float& rfData ); - virtual SvStreamInput& operator>>( double& rfData ); - -private: - SvStream& mrStrm; -}; - -// ============================================================================ -// ============================================================================ - -class Output : public Base -{ -public: - explicit Output( SvStream& rStrm ); - - // ------------------------------------------------------------------------ - - void NewLine(); - void EmptyLine( size_t nCount = 1 ); - inline String& GetLine() { return maLine; } - - void SetPrefix( const String& rPrefix ); - inline const String& GetPrefix() const { return maPrefix; } - - void IncIndent(); - void DecIndent(); - void ResetIndent(); - - void StartTable( xub_StrLen nW1 ); - void StartTable( xub_StrLen nW1, xub_StrLen nW2 ); - void StartTable( xub_StrLen nW1, xub_StrLen nW2, xub_StrLen nW3 ); - void StartTable( xub_StrLen nW1, xub_StrLen nW2, xub_StrLen nW3, xub_StrLen nW4 ); - void StartTable( size_t nColCount, const xub_StrLen* pnColWidths ); - void Tab(); - void Tab( size_t nCol ); - void EndTable(); - - void ResetItemIndex( sal_Int64 nIdx = 0 ); - void StartItem( const sal_Char* pcName = 0 ); - void ContItem(); - void EndItem(); - inline const String& GetLastItemValue() const { return maLastItem; } - - void StartMultiItems(); - void EndMultiItems(); - - // ------------------------------------------------------------------------ - - void WriteChar( sal_Unicode cChar, xub_StrLen nCount = 1 ); - void WriteAscii( const sal_Char* pcStr ); - void WriteString( const String& rStr ); - void WriteArray( const sal_uInt8* pnData, sal_Size nSize, sal_Unicode cSep = ',' ); - void WriteBool( bool bData ); - void WriteColor( const Color& rColor ); - void WriteDateTime( const DateTime& rDateTime ); - - - template< typename Type > - inline void WriteDec( Type nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' ) - { StringHelper::AppendDec( maLine, nData, nWidth, cFill ); } - template< typename Type > - inline void WriteHex( Type nData, bool bPrefix = true ) - { StringHelper::AppendHex( maLine, nData, bPrefix ); } - template< typename Type > - inline void WriteBin( Type nData, bool bDots = true ) - { StringHelper::AppendBin( maLine, nData, bDots ); } - template< typename Type > - inline void WriteFix( Type nData, xub_StrLen nWidth = 0 ) - { StringHelper::AppendFix( maLine, nData, nWidth ); } - template< typename Type > - inline void WriteValue( Type nData, FormatType eFmtType ) - { StringHelper::AppendValue( maLine, nData, eFmtType ); } - template< typename Type > - inline void WriteName( const Config& rCfg, Type nData, const NameListWrapper& rListWrp ) - { WriteString( rCfg.GetName( rListWrp, nData ) ); } - - // ------------------------------------------------------------------------ -protected: - virtual bool ImplIsValid() const; - -private: - void WriteItemName( const sal_Char* pcName ); - -private: - typedef ::std::vector< xub_StrLen > StringLenVec; - - SvStream& mrStrm; - String maPrefix; - ByteString maPrefixUtf8; - ByteString maIndent; - String maLine; - String maLastItem; - StringLenVec maColPos; - size_t mnCol; - size_t mnItemLevel; - size_t mnMultiLevel; - sal_Int64 mnItemIdx; - xub_StrLen mnLastItem; -}; - -typedef ScfRef< Output > OutputRef; - -// ============================================================================ - -class PrefixGuard : private ScfNoCopy -{ -public: - inline explicit PrefixGuard( Output& rOut, const String& rPrefix ) : - mrOut( rOut ), maOldPrefix( rOut.GetPrefix() ) { mrOut.SetPrefix( rPrefix ); } - inline ~PrefixGuard() { mrOut.SetPrefix( maOldPrefix ); } -private: - Output& mrOut; - String maOldPrefix; -}; - -// ---------------------------------------------------------------------------- - -class IndentGuard : private ScfNoCopy -{ -public: - inline explicit IndentGuard( Output& rOut ) : mrOut( rOut ) { mrOut.IncIndent(); } - inline ~IndentGuard() { mrOut.DecIndent(); } -private: - Output& mrOut; -}; - -// ---------------------------------------------------------------------------- - -class TableGuard : private ScfNoCopy -{ -public: - inline explicit TableGuard( Output& rOut, xub_StrLen nW1 ) : - mrOut( rOut ) { mrOut.StartTable( nW1 ); } - inline explicit TableGuard( Output& rOut, xub_StrLen nW1, xub_StrLen nW2 ) : - mrOut( rOut ) { mrOut.StartTable( nW1, nW2 ); } - inline explicit TableGuard( Output& rOut, xub_StrLen nW1, xub_StrLen nW2, xub_StrLen nW3 ) : - mrOut( rOut ) { mrOut.StartTable( nW1, nW2, nW3 ); } - inline explicit TableGuard( Output& rOut, xub_StrLen nW1, xub_StrLen nW2, xub_StrLen nW3, xub_StrLen nW4 ) : - mrOut( rOut ) { mrOut.StartTable( nW1, nW2, nW3, nW4 ); } - inline explicit TableGuard( Output& rOut, size_t nColCount, - const xub_StrLen* pnColWidths ) : - mrOut( rOut ) { mrOut.StartTable( nColCount, pnColWidths ); } - inline ~TableGuard() { mrOut.EndTable(); } - inline void Tab() { mrOut.Tab(); } - inline void Tab( size_t nCol ) { mrOut.Tab( nCol ); } -private: - Output& mrOut; -}; - -// ---------------------------------------------------------------------------- - -class ItemGuard : private ScfNoCopy -{ -public: - inline explicit ItemGuard( Output& rOut, const sal_Char* pcName = 0 ) : - mrOut( rOut ) { mrOut.StartItem( pcName ); } - inline ~ItemGuard() { mrOut.EndItem(); } - inline void Cont() { mrOut.ContItem(); } -private: - Output& mrOut; -}; - -// ---------------------------------------------------------------------------- - -class MultiItemsGuard : private ScfNoCopy -{ -public: - inline explicit MultiItemsGuard( Output& rOut ) : mrOut( rOut ) { mrOut.StartMultiItems(); } - inline ~MultiItemsGuard() { mrOut.EndMultiItems(); } -private: - Output& mrOut; -}; - -// ============================================================================ -// ============================================================================ - -class ObjectBase : public Base -{ -public: - virtual ~ObjectBase(); - - SfxMedium& GetCoreMedium() const; - SvStream& GetCoreStream() const; - - void Dump(); - - // ------------------------------------------------------------------------ -protected: - inline explicit ObjectBase() {} - void Construct( ConfigRef xConfig, CoreDataRef xCore, OutputRef xOut ); - void Construct( const ObjectBase& rParent ); - - virtual bool ImplIsValid() const; - virtual ConfigRef ImplReconstructConfig(); - virtual OutputRef ImplReconstructOutput(); - virtual void ImplDumpHeader(); - virtual void ImplDumpBody(); - virtual void ImplDumpFooter(); - - // ------------------------------------------------------------------------ - - void ReconstructConfig(); - void ReconstructOutput(); - - inline Config& Cfg() const { return *mxConfig; } - inline CoreData& Core() const { return *mxCore; } - inline Output& Out() const { return *mxOut; } - - // ------------------------------------------------------------------------ - - void WriteEmptyItem( const sal_Char* pcName ); - void WriteInfoItem( const sal_Char* pcName, const StringWrapper& rData ); - void WriteStringItem( const sal_Char* pcName, const String& rData ); - void WriteArrayItem( const sal_Char* pcName, const sal_uInt8* pnData, sal_Size nSize, sal_Unicode cSep = ',' ); - void WriteBoolItem( const sal_Char* pcName, bool bData ); - void WriteColorItem( const sal_Char* pcName, const Color& rColor ); - void WriteDateTimeItem( const sal_Char* pcName, const DateTime& rDateTime ); - void WriteGuidItem( const sal_Char* pcName, const String& rGuid ); - - template< typename Type > - void AddNameToItem( Type nData, const NameListWrapper& rListWrp ); - - template< typename Type > - void WriteNameItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp ); - template< typename Type > - void WriteDecItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type > - void WriteHexItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type > - void WriteBinItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type > - void WriteFixItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type > - void WriteDecBoolItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type > - void WriteValueItem( const sal_Char* pcName, Type nData, FormatType eFmtType, const NameListWrapper& rListWrp = NO_LIST ); - - template< typename Type > - void WriteValueItem( const ItemFormat& rItemFmt, Type nData ); - -private: - ConfigRef mxConfig; - CoreDataRef mxCore; - OutputRef mxOut; -}; - -typedef ScfRef< ObjectBase > ObjectRef; - -// ---------------------------------------------------------------------------- - -template< typename Type > -void ObjectBase::AddNameToItem( Type nData, const NameListWrapper& rListWrp ) -{ - if( !rListWrp.Empty() ) - { - mxOut->ContItem(); - mxOut->WriteName( *mxConfig, nData, rListWrp ); - } -} - -template< typename Type > -void ObjectBase::WriteNameItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp ) -{ - ItemGuard aItem( *mxOut, pcName ); - mxOut->WriteName( *mxConfig, nData, rListWrp ); -} - -template< typename Type > -void ObjectBase::WriteDecItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp ) -{ - ItemGuard aItem( *mxOut, pcName ); - mxOut->WriteDec( nData ); - AddNameToItem( nData, rListWrp ); -} - -template< typename Type > -void ObjectBase::WriteHexItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp ) -{ - ItemGuard aItem( *mxOut, pcName ); - mxOut->WriteHex( nData ); - AddNameToItem( nData, rListWrp ); -} - -template< typename Type > -void ObjectBase::WriteBinItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp ) -{ - ItemGuard aItem( *mxOut, pcName ); - mxOut->WriteBin( nData ); - AddNameToItem( nData, rListWrp ); -} - -template< typename Type > -void ObjectBase::WriteFixItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp ) -{ - ItemGuard aItem( *mxOut, pcName ); - mxOut->WriteFix( nData ); - AddNameToItem( nData, rListWrp ); -} - -template< typename Type > -void ObjectBase::WriteDecBoolItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp ) -{ - ItemGuard aItem( *mxOut, pcName ); - mxOut->WriteDec( nData ); - aItem.Cont(); - mxOut->WriteBool( nData != 0 ); - AddNameToItem( nData, rListWrp ); -} - -template< typename Type > -void ObjectBase::WriteValueItem( const sal_Char* pcName, Type nData, FormatType eFmtType, const NameListWrapper& rListWrp ) -{ - if( eFmtType == FORMATTYPE_BOOL ) - WriteDecBoolItem( pcName, nData, rListWrp ); - else - { - ItemGuard aItem( *mxOut, pcName ); - mxOut->WriteValue( nData, eFmtType ); - AddNameToItem( nData, rListWrp ); - } -} - -template< typename Type > -void ObjectBase::WriteValueItem( const ItemFormat& rItemFmt, Type nData ) -{ - WriteValueItem( rItemFmt.maItemNameUtf8.GetBuffer(), - nData, rItemFmt.meFmtType, rItemFmt.maListName ); -} - -// ============================================================================ - -class InputObjectBase : public ObjectBase -{ -public: - virtual ~InputObjectBase(); - - // ------------------------------------------------------------------------ -protected: - inline explicit InputObjectBase() {} - void Construct( const ObjectBase& rParent, InputRef xIn ); - void Construct( const InputObjectBase& rParent ); - - virtual bool ImplIsValid() const; - virtual InputRef ImplReconstructInput(); - virtual void ImplDumpBody(); - - // ------------------------------------------------------------------------ - - void ReconstructInput(); - - inline Input& In() const { return *mxIn; } - - // ------------------------------------------------------------------------ - - void SkipBlock( sal_Size nSize, bool bShowSize = true ); - void DumpRawBinary( sal_Size nSize, bool bShowOffset = true, bool bStream = false ); - - void DumpBinary( const sal_Char* pcName, sal_Size nSize, bool bShowOffset = true ); - void DumpArray( const sal_Char* pcName, sal_Size nSize, sal_Unicode cSep = ',' ); - void DumpRemaining( sal_Size nSize ); - inline void DumpUnused( sal_Size nSize ) { DumpArray( SCF_DUMP_UNUSED, nSize ); } - inline void DumpUnknown( sal_Size nSize ) { DumpArray( SCF_DUMP_UNKNOWN, nSize ); } - - void DumpBinaryStream( bool bShowOffset = true ); - void DumpTextStream( rtl_TextEncoding eEnc, bool bShowLines = true ); - - String DumpGuid( const sal_Char* pcName ); - void DumpItem( const ItemFormat& rItemFmt ); - - template< typename Type > - Type DumpName( const sal_Char* pcName, const NameListWrapper& rListWrp ); - template< typename Type > - Type DumpDec( const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type > - Type DumpHex( const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type > - Type DumpBin( const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type > - Type DumpFix( const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type > - Type DumpBool( const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type > - Type DumpValue( const ItemFormat& rItemFmt ); - - template< typename Type1, typename Type2 > - Type1 DumpName( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type1, typename Type2 > - Type1 DumpDec( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type1, typename Type2 > - Type1 DumpHex( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type1, typename Type2 > - Type1 DumpBin( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type1, typename Type2 > - Type1 DumpFix( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type1, typename Type2 > - Type1 DumpBool( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST ); - template< typename Type1, typename Type2 > - Type1 DumpValue( bool bType1, const ItemFormat& rItemFmt ); - - // ------------------------------------------------------------------------ - - using ObjectBase::Construct; - -private: - InputRef mxIn; -}; - -typedef ScfRef< InputObjectBase > InputObjectRef; - -// ---------------------------------------------------------------------------- - -template< typename Type > -Type InputObjectBase::DumpName( const sal_Char* pcName, const NameListWrapper& rListWrp ) -{ - Type nData; - *mxIn >> nData; - WriteNameItem( pcName, nData, rListWrp ); - return nData; -} - -template< typename Type > -Type InputObjectBase::DumpDec( const sal_Char* pcName, const NameListWrapper& rListWrp ) -{ - Type nData; - *mxIn >> nData; - WriteDecItem( pcName, nData, rListWrp ); - return nData; -} - -template< typename Type > -Type InputObjectBase::DumpHex( const sal_Char* pcName, const NameListWrapper& rListWrp ) -{ - Type nData; - *mxIn >> nData; - WriteHexItem( pcName, nData, rListWrp ); - return nData; -} - -template< typename Type > -Type InputObjectBase::DumpBin( const sal_Char* pcName, const NameListWrapper& rListWrp ) -{ - Type nData; - *mxIn >> nData; - WriteBinItem( pcName, nData, rListWrp ); - return nData; -} - -template< typename Type > -Type InputObjectBase::DumpFix( const sal_Char* pcName, const NameListWrapper& rListWrp ) -{ - Type nData; - *mxIn >> nData; - WriteFixItem( pcName, nData, rListWrp ); - return nData; -} - -template< typename Type > -Type InputObjectBase::DumpBool( const sal_Char* pcName, const NameListWrapper& rListWrp ) -{ - Type nData; - *mxIn >> nData; - WriteDecBoolItem( pcName, nData, rListWrp ); - return nData; -} - -template< typename Type > -Type InputObjectBase::DumpValue( const ItemFormat& rItemFmt ) -{ - Type nData; - *mxIn >> nData; - WriteValueItem( rItemFmt, nData ); - return nData; -} - -template< typename Type1, typename Type2 > -Type1 InputObjectBase::DumpName( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp ) -{ - return bType1 ? DumpName< Type1 >( pcName, rListWrp ) : static_cast< Type1 >( DumpName< Type2 >( pcName, rListWrp ) ); -} - -template< typename Type1, typename Type2 > -Type1 InputObjectBase::DumpDec( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp ) -{ - return bType1 ? DumpDec< Type1 >( pcName, rListWrp ) : static_cast< Type1 >( DumpDec< Type2 >( pcName, rListWrp ) ); -} - -template< typename Type1, typename Type2 > -Type1 InputObjectBase::DumpHex( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp ) -{ - return bType1 ? DumpHex< Type1 >( pcName, rListWrp ) : static_cast< Type1 >( DumpHex< Type2 >( pcName, rListWrp ) ); -} - -template< typename Type1, typename Type2 > -Type1 InputObjectBase::DumpBin( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp ) -{ - return bType1 ? DumpBin< Type1 >( pcName, rListWrp ) : static_cast< Type1 >( DumpBin< Type2 >( pcName, rListWrp ) ); -} - -template< typename Type1, typename Type2 > -Type1 InputObjectBase::DumpFix( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp ) -{ - return bType1 ? DumpFix< Type1 >( pcName, rListWrp ) : static_cast< Type1 >( DumpFix< Type2 >( pcName, rListWrp ) ); -} - -template< typename Type1, typename Type2 > -Type1 InputObjectBase::DumpBool( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp ) -{ - return bType1 ? DumpBool< Type1 >( pcName, rListWrp ) : static_cast< Type1 >( DumpBool< Type2 >( pcName, rListWrp ) ); -} - -template< typename Type1, typename Type2 > -Type1 InputObjectBase::DumpValue( bool bType1, const ItemFormat& rItemFmt ) -{ - return bType1 ? DumpValue< Type1 >( rItemFmt ) : static_cast< Type1 >( DumpValue< Type2 >( rItemFmt ) ); -} - -// ============================================================================ -// ============================================================================ - -class StreamObjectBase : public InputObjectBase -{ -public: - virtual ~StreamObjectBase(); - - inline SvStream& GetStream() { return *mpStrm; } - inline const String& GetStreamName() const { return maName; } - inline const String& GetStreamPath() const { return maPath; } - String GetFullName() const; - sal_Size GetStreamSize() const; - -protected: - inline explicit StreamObjectBase() : mpStrm( 0 ) {} - void Construct( const ObjectBase& rParent, SvStream& rStrm, - const String& rPath, const String& rStrmName, InputRef xIn ); - void Construct( const ObjectBase& rParent, SvStream& rStrm, - const String& rPath, const String& rStrmName ); - void Construct( const ObjectBase& rParent, SvStream& rStrm ); - - virtual bool ImplIsValid() const; - virtual void ImplDumpHeader(); - virtual void ImplDumpFooter(); - virtual void ImplDumpExtendedHeader(); - - using InputObjectBase::Construct; - -private: - void DumpStreamInfo( bool bExtended ); - -private: - SvStream* mpStrm; - String maPath; - String maName; -}; - -typedef ScfRef< StreamObjectBase > StreamObjectRef; - -// ============================================================================ - -class SvStreamObject : public StreamObjectBase -{ -public: - explicit SvStreamObject( const ObjectBase& rParent, SvStream& rStrm ); - virtual ~SvStreamObject(); - -protected: - inline explicit SvStreamObject() {} - void Construct( const ObjectBase& rParent, SvStream& rStrm ); - - using StreamObjectBase::Construct; -}; - -typedef ScfRef< SvStreamObject > SvStreamObjectRef; - -// ============================================================================ - -class WrappedStreamObject : public StreamObjectBase -{ -public: - explicit WrappedStreamObject( const ObjectBase& rParent, StreamObjectRef xStrmObj ); - virtual ~WrappedStreamObject(); - -protected: - inline explicit WrappedStreamObject() {} - void Construct( const ObjectBase& rParent, StreamObjectRef xStrmObj ); - - virtual bool ImplIsValid() const; - - using StreamObjectBase::Construct; - -private: - StreamObjectRef mxStrmObj; -}; - -// ============================================================================ -// ============================================================================ - -struct RecordHeaderConfigInfo -{ - const sal_Char* mpcRecNames; - const sal_Char* mpcShowRecPos; - const sal_Char* mpcShowRecSize; - const sal_Char* mpcShowRecId; - const sal_Char* mpcShowRecName; - const sal_Char* mpcShowRecBody; -}; - -// ---------------------------------------------------------------------------- - -class RecordHeaderBase : public InputObjectBase -{ -public: - virtual ~RecordHeaderBase(); - - inline NameListRef GetRecNames() const { return mxRecNames; } - inline bool IsShowRecPos() const { return mbShowRecPos; } - inline bool IsShowRecSize() const { return mbShowRecSize; } - inline bool IsShowRecId() const { return mbShowRecId; } - inline bool IsShowRecName() const { return mbShowRecName; } - inline bool IsShowRecBody() const { return mbShowRecBody; } - -protected: - inline explicit RecordHeaderBase() {} - void Construct( const InputObjectBase& rParent, const RecordHeaderConfigInfo& rCfgInfo ); - - virtual bool ImplIsValid() const; - - using InputObjectBase::Construct; - -private: - NameListRef mxRecNames; - bool mbShowRecPos; - bool mbShowRecSize; - bool mbShowRecId; - bool mbShowRecName; - bool mbShowRecBody; -}; - -// ============================================================================ -// ============================================================================ - -class DumperBase : public ObjectBase -{ -public: - virtual ~DumperBase(); - - bool IsImportEnabled() const; - -protected: - inline explicit DumperBase() {} - void Construct( ConfigRef xConfig, CoreDataRef xCore ); - void Construct( ConfigRef xConfig, SfxMedium& rMedium, SfxObjectShell* pDocShell ); - - using ObjectBase::Construct; - -private: - typedef ScfRef< SvStream > SvStreamRef; - SvStreamRef mxOutStrm; -}; - -// ============================================================================ -// ============================================================================ - -} // namespace dump -} // namespace scf - -#endif -#endif - diff --git a/sc/source/filter/inc/fdumperole.hxx b/sc/source/filter/inc/fdumperole.hxx deleted file mode 100644 index ad6d1b0dedd9..000000000000 --- a/sc/source/filter/inc/fdumperole.hxx +++ /dev/null @@ -1,186 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: fdumperole.hxx,v $ - * $Revision: 1.7 $ - * - * 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 SC_FDUMPEROLE_HXX -#define SC_FDUMPEROLE_HXX - -#include <sot/storage.hxx> -#include <sot/storinfo.hxx> -#include "fdumper.hxx" - -#if SCF_INCL_DUMPER - -namespace scf { -namespace dump { - -// ============================================================================ -// ============================================================================ - -class OleStorageObject : public ObjectBase -{ -public: - explicit OleStorageObject( const OleStorageObject& rParentStrg, const String& rStrgName ); - explicit OleStorageObject( const ObjectBase& rParent, SotStorageRef xRootStrg ); - explicit OleStorageObject( const ObjectBase& rParent, SvStream& rRootStrm ); - explicit OleStorageObject( const ObjectBase& rParent ); - virtual ~OleStorageObject(); - - inline SotStorageRef GetStorage() const { return mxStrg; } - inline const String& GetStoragePath() const { return maPath; } - inline const String& GetStorageName() const { return maName; } - String GetFullName() const; - - void ExtractStorageToFileSystem(); - -protected: - inline explicit OleStorageObject() {} - void Construct( const ObjectBase& rParent, SotStorageRef xStrg, const String& rPath ); - void Construct( const OleStorageObject& rParentStrg, const String& rStrgName ); - void Construct( const ObjectBase& rParent, SvStream& rRootStrm ); - void Construct( const ObjectBase& rParent ); - - virtual bool ImplIsValid() const; - virtual void ImplDumpHeader(); - virtual void ImplDumpFooter(); - - using ObjectBase::Construct; - -private: - void DumpStorageInfo( bool bExtended ); - -private: - SotStorageRef mxStrg; - String maPath; - String maName; -}; - -typedef ScfRef< OleStorageObject > OleStorageObjectRef; - -// ============================================================================ - -class OleStorageIterator : public Base -{ -public: - explicit OleStorageIterator( const OleStorageObject& rStrg ); - explicit OleStorageIterator( SotStorageRef xStrg ); - ~OleStorageIterator(); - - ULONG GetSize() const; - - OleStorageIterator& operator++(); - const SvStorageInfo* operator->() const; - -protected: - void Construct( SotStorageRef xStrg ); - -private: - virtual bool ImplIsValid() const; - -private: - typedef ScfRef< SvStorageInfoList > SvStorageInfoListRef; - SvStorageInfoListRef mxInfoList; - ULONG mnIndex; -}; - -// ============================================================================ -// ============================================================================ - -class OleStreamObject : public StreamObjectBase -{ -public: - explicit OleStreamObject( const OleStorageObject& rParentStrg, const String& rStrmName ); - virtual ~OleStreamObject(); - -protected: - inline explicit OleStreamObject() {} - void Construct( const OleStorageObject& rParentStrg, const String& rStrmName ); - - virtual bool ImplIsValid() const; - - using StreamObjectBase::Construct; - -private: - SotStorageStreamRef mxStrm; -}; - -typedef ScfRef< OleStreamObject > OleStreamObjectRef; - -// ============================================================================ - -class OlePropertyStreamObject : public OleStreamObject -{ -public: - explicit OlePropertyStreamObject( const OleStorageObject& rParentStrg, const String& rStrmName ); - -protected: - inline explicit OlePropertyStreamObject() {} - void Construct( const OleStorageObject& rParentStrg, const String& rStrmName ); - - virtual void ImplDumpBody(); - - using OleStreamObject::Construct; - -private: - void DumpSection( const String& rGuid, sal_uInt32 nStartPos ); - - void DumpProperty( sal_Int32 nPropId, sal_uInt32 nStartPos ); - void DumpCodePageProperty( sal_uInt32 nStartPos ); - void DumpDictionaryProperty( sal_uInt32 nStartPos ); - - void DumpPropertyContents( sal_Int32 nPropId ); - void DumpPropertyValue( sal_Int32 nPropId, sal_Int32 nBaseType ); - - sal_Int32 DumpPropertyType(); - void DumpBlob( const sal_Char* pcName ); - String DumpString8( const sal_Char* pcName ); - String DumpCharArray8( const sal_Char* pcName, sal_Int32 nCharCount ); - String DumpString16( const sal_Char* pcName ); - String DumpCharArray16( const sal_Char* pcName, sal_Int32 nCharCount ); - DateTime DumpFileTime( const sal_Char* pcName ); - - bool StartElement( sal_uInt32 nStartPos ); - void WriteSectionHeader( const String& rGuid, sal_uInt32 nStartPos ); - void WritePropertyHeader( sal_Int32 nPropId, sal_uInt32 nStartPos ); - -private: - NameListRef mxPropIds; - rtl_TextEncoding meTextEnc; - bool mbIsUnicode; -}; - -// ============================================================================ -// ============================================================================ - -} // namespace dump -} // namespace scf - -#endif -#endif - diff --git a/sc/source/filter/inc/imp_op.hxx b/sc/source/filter/inc/imp_op.hxx index f8dad9a45c48..ab5513ead1ed 100644 --- a/sc/source/filter/inc/imp_op.hxx +++ b/sc/source/filter/inc/imp_op.hxx @@ -119,6 +119,8 @@ protected: // Abschneiden von Zellen fuehrt // Record-Funktionen + void ReadFileSharing(); + sal_uInt16 ReadXFIndex( bool bBiff2 ); void ReadDimensions(); diff --git a/sc/source/filter/inc/xestream.hxx b/sc/source/filter/inc/xestream.hxx index 676b0d550875..44e02d075317 100644 --- a/sc/source/filter/inc/xestream.hxx +++ b/sc/source/filter/inc/xestream.hxx @@ -211,9 +211,6 @@ private: bool mbInRec; /// true = currently writing inside of a record. }; -// ---------------------------------------------------------------------------- - - // ============================================================================ class XclExpBiff8Encrypter diff --git a/sc/source/filter/inc/xiroot.hxx b/sc/source/filter/inc/xiroot.hxx index 915f9610a1f3..f331683988ab 100644 --- a/sc/source/filter/inc/xiroot.hxx +++ b/sc/source/filter/inc/xiroot.hxx @@ -117,9 +117,6 @@ struct XclImpRootData : public XclRootData XclImpTabProtectRef mxTabProtect; /// Sheet protection options for current sheet. XclImpDocProtectRef mxDocProtect; /// Document protection options. - String maPassw; /// Entered password for stream decryption. - bool mbPassQueried; /// true = Password already querried. - bool mbHasCodePage; /// true = CODEPAGE record exists. explicit XclImpRootData( XclBiff eBiff, SfxMedium& rMedium, @@ -205,9 +202,6 @@ public: /** Returns the Calc add-in function name for an Excel function name. */ String GetScAddInName( const String& rXclName ) const; - /** Queries a password from the user and returns it (empty string -> input cancelled). */ - const String& QueryPassword() const; - private: mutable XclImpRootData& mrImpData; /// Reference to the global import data struct. }; diff --git a/sc/source/filter/inc/xistream.hxx b/sc/source/filter/inc/xistream.hxx index ccaaccdc0357..3ee461f163fe 100644 --- a/sc/source/filter/inc/xistream.hxx +++ b/sc/source/filter/inc/xistream.hxx @@ -31,6 +31,7 @@ #ifndef SC_XISTREAM_HXX #define SC_XISTREAM_HXX +#include <comphelper/docpasswordhelper.hxx> #include <svx/mscodec.hxx> #include "xlstream.hxx" #include "xlconst.hxx" @@ -52,7 +53,7 @@ class XclImpDecrypter; typedef ScfRef< XclImpDecrypter > XclImpDecrypterRef; /** Base class for BIFF stream decryption. */ -class XclImpDecrypter +class XclImpDecrypter : public ::comphelper::IDocPasswordVerifier { public: explicit XclImpDecrypter(); @@ -60,40 +61,39 @@ public: /** Returns the current error code of the decrypter. */ inline ErrCode GetError() const { return mnError; } - /** Returns true, if the decrypter has been constructed successfully. - This means especially that construction happened with a valid password. */ + /** Returns true, if the decoder has been initialized correctly. */ inline bool IsValid() const { return mnError == ERRCODE_NONE; } /** Creates a (ref-counted) copy of this decrypter object. */ XclImpDecrypterRef Clone() const; + /** Implementation of the ::comphelper::IDocPasswordVerifier interface, + calls the new virtual function implVerify(). */ + virtual ::comphelper::DocPasswordVerifierResult + verifyPassword( const ::rtl::OUString& rPassword ); + /** Updates the decrypter on start of a new record or after seeking stream. */ void Update( SvStream& rStrm, sal_uInt16 nRecSize ); /** Reads and decrypts nBytes bytes and stores data into the existing(!) buffer pData. @return Count of bytes really read. */ sal_uInt16 Read( SvStream& rStrm, void* pData, sal_uInt16 nBytes ); - const String GetPassword() const; - protected: /** Protected copy c'tor for OnClone(). */ explicit XclImpDecrypter( const XclImpDecrypter& rSrc ); - /** Sets the decrypter to a state showing whether the password was correct. */ - void SetHasValidPassword( bool bValid ); - - void SetPassword( const String& rPass ); - private: /** Implementation of cloning this object. */ virtual XclImpDecrypter* OnClone() const = 0; + /** Derived classes implement password verification and initialization of + the decoder. */ + virtual bool OnVerify( const ::rtl::OUString& rPassword ) = 0; /** Implementation of updating the decrypter. */ virtual void OnUpdate( sal_Size nOldStrmPos, sal_Size nNewStrmPos, sal_uInt16 nRecSize ) = 0; /** Implementation of the decryption. */ virtual sal_uInt16 OnRead( SvStream& rStrm, sal_uInt8* pnData, sal_uInt16 nBytes ) = 0; private: - String maPass; /// Stored password (needed for export) ErrCode mnError; /// Decrypter error code. sal_Size mnOldPos; /// Last known stream position. sal_uInt16 mnRecSize; /// Current record size. @@ -105,12 +105,7 @@ private: class XclImpBiff5Decrypter : public XclImpDecrypter { public: - /** Constructs the decrypter. - @descr Checks if the passed key and hash specify workbook protection. - Asks for a password otherwise. - @param nKey Password key from FILEPASS record to verify password. - @param nHash Password hash value from FILEPASS record to verify password. */ - explicit XclImpBiff5Decrypter( const XclImpRoot& rRoot, sal_uInt16 nKey, sal_uInt16 nHash ); + explicit XclImpBiff5Decrypter( sal_uInt16 nKey, sal_uInt16 nHash ); private: /** Private copy c'tor for OnClone(). */ @@ -118,18 +113,18 @@ private: /** Implementation of cloning this object. */ virtual XclImpBiff5Decrypter* OnClone() const; + /** Implements password verification and initialization of the decoder. */ + virtual bool OnVerify( const ::rtl::OUString& rPassword ); /** Implementation of updating the decrypter. */ virtual void OnUpdate( sal_Size nOldStrmPos, sal_Size nNewStrmPos, sal_uInt16 nRecSize ); /** Implementation of the decryption. */ virtual sal_uInt16 OnRead( SvStream& rStrm, sal_uInt8* pnData, sal_uInt16 nBytes ); - /** Initializes the members. - @postcond Internal status is set and can be querried with IsValid(). */ - void Init( const ByteString& rPass, sal_uInt16 nKey, sal_uInt16 nHash ); - private: ::svx::MSCodec_XorXLS95 maCodec; /// Crypto algorithm implementation. - sal_uInt8 mpnPassw[ 16 ]; /// Cached password data for copy construction. + ::std::vector< sal_uInt8 > maPassword; + sal_uInt16 mnKey; + sal_uInt16 mnHash; }; // ---------------------------------------------------------------------------- @@ -138,14 +133,8 @@ private: class XclImpBiff8Decrypter : public XclImpDecrypter { public: - /** Constructs the decrypter. - @descr Checks if the passed salt data specifies workbook protection. - Asks for a password otherwise. - @param pnDocId Unique document identifier from FILEPASS record. - @param pnSaltData Salt data from FILEPASS record. - @param pnSaltHash Salt hash value from FILEPASS record. */ - explicit XclImpBiff8Decrypter( const XclImpRoot& rRoot, sal_uInt8 pnDocId[ 16 ], - sal_uInt8 pnSaltData[ 16 ], sal_uInt8 pnSaltHash[ 16 ] ); + explicit XclImpBiff8Decrypter( sal_uInt8 pnSalt[ 16 ], + sal_uInt8 pnVerifier[ 16 ], sal_uInt8 pnVerifierHash[ 16 ] ); private: /** Private copy c'tor for OnClone(). */ @@ -153,16 +142,13 @@ private: /** Implementation of cloning this object. */ virtual XclImpBiff8Decrypter* OnClone() const; + /** Implements password verification and initialization of the decoder. */ + virtual bool OnVerify( const ::rtl::OUString& rPassword ); /** Implementation of updating the decrypter. */ virtual void OnUpdate( sal_Size nOldStrmPos, sal_Size nNewStrmPos, sal_uInt16 nRecSize ); /** Implementation of the decryption. */ virtual sal_uInt16 OnRead( SvStream& rStrm, sal_uInt8* pnData, sal_uInt16 nBytes ); - /** Initializes the internal codec. - @postcond Internal status is set and can be querried with IsValid(). */ - void Init( const String& rPass, sal_uInt8 pnDocId[ 16 ], - sal_uInt8 pnSaltData[ 16 ], sal_uInt8 pnSaltHash[ 16 ] ); - /** Returns the block number corresponding to the passed stream position. */ sal_uInt32 GetBlock( sal_Size nStrmPos ) const; /** Returns the block offset corresponding to the passed stream position. */ @@ -170,8 +156,10 @@ private: private: ::svx::MSCodec_Std97 maCodec; /// Crypto algorithm implementation. - sal_uInt16 mpnPassw[ 16 ]; /// Cached password data for copy construction. - sal_uInt8 mpnDocId[ 16 ]; /// Cached document ID for copy construction. + ::std::vector< sal_uInt16 > maPassword; + ::std::vector< sal_uInt8 > maSalt; + ::std::vector< sal_uInt8 > maVerifier; + ::std::vector< sal_uInt8 > maVerifierHash; }; // ============================================================================ diff --git a/sc/source/filter/inc/xlcontent.hxx b/sc/source/filter/inc/xlcontent.hxx index 32803987f5c4..6c86e0be68b7 100644 --- a/sc/source/filter/inc/xlcontent.hxx +++ b/sc/source/filter/inc/xlcontent.hxx @@ -35,6 +35,10 @@ // Constants ================================================================== +// (0x005B) FILESHARING ------------------------------------------------------- + +const sal_uInt16 EXC_ID_FILESHARING = 0x005B; + // (0x00E5) MERGEDCELLS ------------------------------------------------------- const sal_uInt16 EXC_ID_MERGEDCELLS = 0x00E5; diff --git a/sc/source/filter/inc/xldumper.hxx b/sc/source/filter/inc/xldumper.hxx deleted file mode 100644 index b35482955f71..000000000000 --- a/sc/source/filter/inc/xldumper.hxx +++ /dev/null @@ -1,683 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: xldumper.hxx,v $ - * $Revision: 1.12 $ - * - * 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 SC_XLDUMPER_HXX -#define SC_XLDUMPER_HXX - -#include "fdumper.hxx" - -#include <stack> -#include "fdumperdff.hxx" -#include "fdumperole.hxx" -#include "xlconst.hxx" -#include "xlstring.hxx" -#include "xlstyle.hxx" - -#if SCF_INCL_DUMPER - -class SfxMedium; -class SfxObjectShell; -class ScDocument; -struct XclImpRootData; -class XclImpRoot; -class XclImpStream; -class XclFunctionProvider; - -namespace scf { -namespace dump { -namespace xls { - -// ============================================================================ -// ============================================================================ - -struct Address -{ - sal_Int32 mnCol; - sal_Int32 mnRow; - inline explicit Address() : mnCol( 0 ), mnRow( 0 ) {} - void Read( XclImpStream& rStrm, bool bCol16Bit = true, bool bRow32Bit = false ); -}; - -// ---------------------------------------------------------------------------- - -struct Range -{ - Address maFirst; - Address maLast; - inline explicit Range() {} - void Read( XclImpStream& rStrm, bool bCol16Bit = true, bool bRow32Bit = false ); -}; - -// ---------------------------------------------------------------------------- - -struct RangeList : public ::std::vector< Range > -{ - inline explicit RangeList() {} - void Read( XclImpStream& rStrm, bool bCol16Bit = true, bool bRow32Bit = false ); -}; - -// ============================================================================ - -struct FormulaAddress : public Address -{ - bool mbRelCol; - bool mbRelRow; - inline explicit FormulaAddress() : mbRelCol( false ), mbRelRow( false ) {} -}; - -// ---------------------------------------------------------------------------- - -struct FormulaRange -{ - FormulaAddress maFirst; - FormulaAddress maLast; - inline explicit FormulaRange() {} -}; - -// ============================================================================ - -class StringHelper : public ::scf::dump::StringHelper -{ -public: - static void AppendAddrCol( String& rStr, sal_Int32 nCol, bool bRel ); - static void AppendAddrRow( String& rStr, sal_Int32 nRow, bool bRel ); - static void AppendAddrName( String& rStr, sal_Unicode cPrefix, sal_Int32 nColRow, bool bRel ); - - static void AppendAddress( String& rStr, const Address& rPos ); - static void AppendRange( String& rStr, const Range& rRange ); - static void AppendRangeList( String& rStr, const RangeList& rRanges ); - - static void AppendAddress( String& rStr, const FormulaAddress& rPos, bool bNameMode ); - static void AppendRange( String& rStr, const FormulaRange& rRange, bool bNameMode ); -}; - -// ============================================================================ -// ============================================================================ - -class RecordHeaderObject : public RecordHeaderBase -{ -public: - explicit RecordHeaderObject( const InputObjectBase& rParent ); - - inline bool IsMergeContRec() const { return mbMergeContRec; } - inline bool HasRecName( sal_uInt16 nRecId ) const { return GetRecNames()->HasName( nRecId ); } - - void DumpRecordHeader( XclImpStream& rStrm ); - -protected: - virtual bool ImplIsValid() const; - -private: - bool mbMergeContRec; -}; - -typedef ScfRef< RecordHeaderObject > RecHeaderObjectRef; - -// ============================================================================ -// ============================================================================ - -class BiffConfig : public Config -{ -public: - explicit BiffConfig( const Config& rParent, XclBiff eBiff ); - -protected: - virtual bool ImplIsValid() const; - virtual NameListRef ImplGetNameList( const String& rKey ) const; - -private: - XclBiff meBiff; -}; - -typedef ScfRef< BiffConfig > BiffConfigRef; - -// ============================================================================ - -class RootData : public Base -{ -public: - explicit RootData( SfxMedium& rMedium, XclBiff eBiff ); - virtual ~RootData(); - - inline const XclImpRoot& GetRoot() const { return *mxRoot; } - - rtl_TextEncoding GetTextEncoding() const; - void SetTextEncoding( rtl_TextEncoding eTextEnc ); - -protected: - virtual bool ImplIsValid() const; - -private: - typedef ScfRef< ScDocument > ScDocumentRef; - typedef ScfRef< XclImpRootData > XclImpRootDataRef; - typedef ScfRef< XclImpRoot > XclImpRootRef; - - ScDocumentRef mxDoc; - XclImpRootDataRef mxRootData; - XclImpRootRef mxRoot; -}; - -typedef ScfRef< RootData > RootDataRef; - -// ============================================================================ - -class RootObjectBase : public WrappedStreamObject -{ -public: - virtual ~RootObjectBase(); - - inline RootData& Root() const { return *mxRootData; } - inline const XclImpRoot& GetXclRoot() const { return mxRootData->GetRoot(); } - inline XclImpStream& GetXclStream() const { return *mxStrm; } - inline XclBiff GetBiff() const { return meBiff; } - -protected: - explicit RootObjectBase(); - void Construct( const ObjectBase& rParent, SvStream& rStrm, XclBiff eBiff ); - void Construct( const OleStorageObject& rParentStrg, const String& rStrmName, XclBiff eBiff ); - void Construct( const RootObjectBase& rParent ); - - virtual bool ImplIsValid() const; - virtual void ImplDumpExtendedHeader(); - virtual ConfigRef ImplReconstructConfig(); - virtual InputRef ImplReconstructInput(); - - String GetErrorName( sal_uInt8 nErrCode ) const; - - // ------------------------------------------------------------------------ - - double WriteRkItem( const sal_Char* pcName, sal_Int32 nRk ); - void WriteBooleanItem( const sal_Char* pcName, sal_uInt8 nBool ); - void WriteErrorCodeItem( const sal_Char* pcName, sal_uInt8 nErrCode ); - - void WriteColIndexItem( const sal_Char* pcName, sal_Int32 nCol ); - void WriteColRangeItem( const sal_Char* pcName, sal_Int32 nCol1, sal_Int32 nCol2 ); - void WriteRowIndexItem( const sal_Char* pcName, sal_Int32 nRow ); - void WriteRowRangeItem( const sal_Char* pcName, sal_Int32 nRow1, sal_Int32 nRow2 ); - - void WriteAddressItem( const sal_Char* pcName, const Address& rPos ); - void WriteRangeItem( const sal_Char* pcName, const Range& rRange ); - void WriteRangeListItem( const sal_Char* pcName, const RangeList& rRanges ); - - template< typename Type > - void WriteRectItem( const sal_Char* pcName, - Type nLeft, Type nTop, Type nWidth, Type nHeight, - const NameListWrapper& rListWrp = NO_LIST, - FormatType eFmtType = FORMATTYPE_DEC ); - - // ------------------------------------------------------------------------ - - String DumpString( const sal_Char* pcName = 0, XclStrFlags nFlags = EXC_STR_DEFAULT ); - double DumpRk( const sal_Char* pcName = 0 ); - sal_uInt8 DumpBoolean( const sal_Char* pcName = 0 ); - sal_uInt8 DumpErrorCode( const sal_Char* pcName = 0 ); - - Color DumpRgbColor( const sal_Char* pcName = 0 ); - rtl_TextEncoding DumpCodePage( const sal_Char* pcName = 0 ); - void DumpFormulaResult( const sal_Char* pcName = 0 ); - - sal_Int32 DumpColIndex( const sal_Char* pcName = 0, bool bCol16Bit = true ); - sal_Int32 DumpColRange( const sal_Char* pcName = 0, bool bCol16Bit = true ); - sal_Int32 DumpRowIndex( const sal_Char* pcName = 0, bool bRow32Bit = false ); - sal_Int32 DumpRowRange( const sal_Char* pcName = 0, bool bRow32Bit = false ); - - Address DumpAddress( const sal_Char* pcName = 0, bool bCol16Bit = true, bool bRow32Bit = false ); - Range DumpRange( const sal_Char* pcName = 0, bool bCol16Bit = true, bool bRow32Bit = false ); - void DumpRangeList( const sal_Char* pcName = 0, bool bCol16Bit = true, bool bRow32Bit = false ); - - void DumpConstArrayHeader( sal_uInt32& rnCols, sal_uInt32& rnRows ); - String DumpConstValue(); - - template< typename Type > - void DumpRect( const sal_Char* pcName, - const NameListWrapper& rListWrp = NO_LIST, - FormatType eFmtType = FORMATTYPE_DEC ); - - // ------------------------------------------------------------------------ - - using WrappedStreamObject::Construct; - -private: - void ConstructRootObjBase( XclBiff eBiff ); - -private: - typedef ScfRef< XclImpStream > XclImpStreamRef; - - RootDataRef mxRootData; - BiffConfigRef mxBiffCfg; - XclImpStreamRef mxStrm; - XclBiff meBiff; - NameListRef mxBoolean; - NameListRef mxErrCodes; - NameListRef mxConstType; - NameListRef mxResultType; -}; - -// ---------------------------------------------------------------------------- - -template< typename Type > -void RootObjectBase::WriteRectItem( const sal_Char* pcName, - Type nLeft, Type nTop, Type nWidth, Type nHeight, - const NameListWrapper& rListWrp, FormatType eFmtType ) -{ - MultiItemsGuard aMultiGuard( Out() ); - WriteEmptyItem( pcName ); - 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 RootObjectBase::DumpRect( const sal_Char* pcName, - const NameListWrapper& rListWrp, FormatType eFmtType ) -{ - Type nLeft, nTop, nWidth, nHeight; - *mxStrm >> nLeft >> nTop >> nWidth >> nHeight; - WriteRectItem( pcName, nLeft, nTop, nWidth, nHeight, rListWrp, eFmtType ); -} - -// ============================================================================ -// ============================================================================ - -class SimpleObjectBase : public RootObjectBase -{ -public: - virtual ~SimpleObjectBase(); - -protected: - inline explicit SimpleObjectBase() {} - void Construct( const RootObjectBase& rParent ); - - virtual void ImplDumpHeader(); - virtual void ImplDumpFooter(); - - using RootObjectBase::Construct; -}; - -// ============================================================================ -// ============================================================================ - -/** Stack to create a human readable formula string from a UPN token array. */ -class FormulaStack -{ -public: - explicit FormulaStack(); - - inline const String& GetFormulaString() const { return GetString( maFmlaStack ); } - inline const String& GetClassesString() const { return GetString( maClassStack ); } - - void PushOperand( const StringWrapper& rOp, const String& rTokClass ); - void PushOperand( const StringWrapper& rOp ); - void PushUnaryOp( const StringWrapper& rLOp, const StringWrapper& rROp ); - void PushBinaryOp( const StringWrapper& rOp ); - void PushFuncOp( const StringWrapper& rFunc, const String& rTokClass, sal_uInt8 nParamCount ); - - inline void SetError() { mbError = true; } - void ReplaceOnTop( const String& rOld, const String& rNew ); - -private: - typedef ::std::stack< String > StringStack; - - inline bool Check( bool bCond ) { return (mbError |= !bCond) == false; } - - const String& GetString( const StringStack& rStack ) const; - void PushUnaryOp( StringStack& rStack, const String& rLOp, const String& rROp ); - void PushBinaryOp( StringStack& rStack, const String& rOp ); - void PushFuncOp( StringStack& rStack, const String& rOp, sal_uInt8 nParamCount ); - -private: - StringStack maFmlaStack; - StringStack maClassStack; - bool mbError; -}; - -// ============================================================================ - -class FormulaObject : public SimpleObjectBase -{ -public: - explicit FormulaObject( const RootObjectBase& rParent ); - virtual ~FormulaObject(); - - sal_uInt16 ReadFormulaSize(); - sal_uInt16 DumpFormulaSize( const sal_Char* pcName = 0 ); - - void DumpCellFormula( const sal_Char* pcName, sal_uInt16 nSize ); - void DumpCellFormula( const sal_Char* pcName = 0 ); - void DumpNameFormula( const sal_Char* pcName, sal_uInt16 nSize ); - void DumpNameFormula( const sal_Char* pcName = 0 ); - -protected: - virtual void ImplDumpHeader(); - virtual void ImplDumpBody(); - -private: - void ConstructFmlaObj(); - - void DumpFormula( const sal_Char* pcName, sal_uInt16 nSize, bool bNameMode ); - void DumpFormula( const sal_Char* pcName, bool bNameMode ); - - FormulaAddress CreateTokenAddress( sal_uInt16 nCol, sal_uInt16 nRow, bool bRelC, bool bRelR, bool bNameMode ) const; - String CreateFunc( sal_uInt16 nFuncIdx ) const; - String CreateRef( const String& rData ) const; - String CreateName( sal_uInt16 nNameIdx ) const; - String CreatePlaceHolder( size_t nIdx ) const; - String CreatePlaceHolder() const; - - void WriteTokenAddressItem( const sal_Char* pcName, const FormulaAddress& rPos, bool bNameMode ); - void WriteTokenAddress3dItem( const sal_Char* pcName, const String& rRef, const FormulaAddress& rPos, bool bNameMode ); - void WriteTokenRangeItem( const sal_Char* pcName, const FormulaRange& rRange, bool bNameMode ); - void WriteTokenRange3dItem( const sal_Char* pcName, const String& rRef, const FormulaRange& rRange, bool bNameMode ); - - sal_uInt16 DumpTokenFuncIdx(); - sal_uInt16 DumpTokenCol( const sal_Char* pcName, bool& rbRelC, bool& rbRelR ); - sal_uInt16 DumpTokenRow( const sal_Char* pcName, bool& rbRelC, bool& rbRelR ); - FormulaAddress DumpTokenAddress( bool bNameMode ); - FormulaRange DumpTokenRange( bool bNameMode ); - String DumpTokenRefIdx(); - void DumpTokenRefTabIdxs(); - - void DumpIntToken(); - void DumpDoubleToken(); - void DumpStringToken(); - void DumpBoolToken(); - void DumpErrorToken(); - void DumpMissArgToken(); - - void DumpArrayToken( const String& rTokClass ); - void DumpNameToken( const String& rTokClass ); - void DumpNameXToken( const String& rTokClass ); - void DumpRefToken( const String& rTokClass, bool bNameMode ); - void DumpAreaToken( const String& rTokClass, bool bNameMode ); - void DumpRefErrToken( const String& rTokClass, bool bArea ); - void DumpRef3dToken( const String& rTokClass, bool bNameMode ); - void DumpArea3dToken( const String& rTokClass, bool bNameMode ); - void DumpRefErr3dToken( const String& rTokClass, bool bArea ); - void DumpMemFuncToken( const String& rTokClass ); - void DumpMemAreaToken( const String& rTokClass, bool bAddData ); - - void DumpExpToken( const StringWrapper& rName ); - void DumpUnaryOpToken( const StringWrapper& rLOp, const StringWrapper& rROp ); - void DumpBinaryOpToken( const StringWrapper& rOp ); - void DumpFuncToken( const String& rTokClass ); - void DumpFuncVarToken( const String& rTokClass ); - void DumpCmdToken( const String& rTokClass ); - - void DumpSheetToken(); - void DumpEndSheetToken(); - bool DumpAttrToken(); - - bool DumpNlrToken(); - void DumpNlrErrToken(); - void DumpNlrColRowToken( const String& rTokClass, bool bAddData ); - void DumpNlrRangeToken( const String& 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 ScfRef< FormulaStack > FormulaStackRef; - typedef ScfRef< XclFunctionProvider > XclFuncProvRef; - typedef ::std::vector< AddDataType > AddDataTypeVec; - - NameListRef mxTokens; - NameListRef mxClasses; - NameListRef mxFuncNames; - NameListRef mxParamCnt; - NameListRef mxRelFlags; - NameListRef mxNlrTypes; - NameListRef mxAttrTypes; - NameListRef mxSpTypes; - - FormulaStackRef mxStack; - XclFuncProvRef mxFuncProv; - AddDataTypeVec maAddData; - String maRefPrefix; - const sal_Char* mpcName; - sal_uInt16 mnSize; - bool mbNameMode; -}; - -typedef ScfRef< FormulaObject > FormulaObjectRef; - -// ============================================================================ -// ============================================================================ - -class RecordStreamObject : public RootObjectBase -{ -public: - explicit RecordStreamObject( const ObjectBase& rParent, SvStream& rStrm, XclBiff eBiff = EXC_BIFF_UNKNOWN ); - explicit RecordStreamObject( const OleStorageObject& rParentStrg, const String& rStrmName, XclBiff eBiff = EXC_BIFF_UNKNOWN ); - virtual ~RecordStreamObject(); - -protected: - inline explicit RecordStreamObject() {} - void Construct( const ObjectBase& rParent, SvStream& rStrm, XclBiff eBiff ); - void Construct( const OleStorageObject& rParentStrg, const String& rStrmName, XclBiff eBiff ); - - virtual bool ImplIsValid() const; - virtual void ImplDumpBody(); - - virtual void ImplPreProcessRecord(); - virtual void ImplDumpRecord(); - virtual void ImplPostProcessRecord(); - - inline RecordHeaderObject& GetRecordHeader() const { return *mxHdrObj; } - inline FormulaObject& GetFormulaDumper() const { return *mxFmlaObj; } - inline DffDumpObject& GetDffDumper() const { return *mxDffObj; } - - void DumpRepeatedRecordId(); - - using RootObjectBase::Construct; - -private: - void ConstructRecStrmObj(); - - void DumpRecordBody(); - void DumpSimpleRecord( const String& rRecData ); - -private: - String maProgressName; - RecHeaderObjectRef mxHdrObj; - FormulaObjectRef mxFmlaObj; - DffDumpObjectRef mxDffObj; - NameListRef mxSimpleRecs; -}; - -// ============================================================================ - -class WorkbookStreamObject : public RecordStreamObject -{ -public: - explicit WorkbookStreamObject( const ObjectBase& rParent, SvStream& rStrm ); - explicit WorkbookStreamObject( const OleStorageObject& rParentStrg, const String& rStrmName ); - virtual ~WorkbookStreamObject(); - -protected: - virtual void ImplPreProcessRecord(); - virtual void ImplDumpRecord(); - virtual void ImplPostProcessRecord(); - -private: - void ConstructWbStrmObj(); - - const XclFontData* GetFontData( sal_uInt16 nFontIdx ) const; - sal_uInt16 GetXfData( sal_uInt16 nXfIdx ) const; - rtl_TextEncoding GetFontEncoding( sal_uInt16 nXfIdx ) const; - String CreateFontName( const XclFontData& rFontData ) const; - - template< typename Type > - Type DumpPatternIdx( const sal_Char* pcName = 0 ); - template< typename Type > - Type DumpColorIdx( const sal_Char* pcName = 0 ); - - sal_uInt16 DumpFontIdx( const sal_Char* pcName = 0 ); - sal_uInt16 DumpFormatIdx( const sal_Char* pcName = 0 ); - sal_uInt16 DumpXfIdx( const sal_Char* pcName = 0, bool bBiff2Style = false ); - - sal_uInt16 DumpCellHeader( bool bBiff2Style = false ); - void DumpBoolErr(); - - void DumpFontRec(); - void DumpFormatRec(); - void DumpXfRec(); - - void DumpObjRec(); - void DumpObjRec5(); - void DumpObjRec8(); - -private: - typedef ::std::vector< XclFontData > XclFontDataVec; - - NameListRef mxColors; - NameListRef mxBorderStyles; - NameListRef mxFillPatterns; - NameListRef mxFontNames; - NameListRef mxFormats; - XclFontDataVec maFontDatas; - ScfUInt16Vec maXfDatas; - sal_uInt16 mnFormatIdx; - sal_uInt16 mnPTRowFields; - sal_uInt16 mnPTColFields; - sal_uInt16 mnPTSxliIdx; - bool mbHasCodePage; -}; - -// ---------------------------------------------------------------------------- - -template< typename Type > -Type WorkbookStreamObject::DumpPatternIdx( const sal_Char* pcName ) -{ - return DumpDec< Type >( pcName ? pcName : "fill-pattern", mxFillPatterns ); -} - -template< typename Type > -Type WorkbookStreamObject::DumpColorIdx( const sal_Char* pcName ) -{ - return DumpDec< Type >( pcName ? pcName : "color-idx", mxColors ); -} - -// ============================================================================ - -class PivotCacheStreamObject : public RecordStreamObject -{ -public: - explicit PivotCacheStreamObject( const ObjectBase& rParent, SvStream& rStrm ); - explicit PivotCacheStreamObject( const OleStorageObject& rParentStrg, const String& rStrmName ); - virtual ~PivotCacheStreamObject(); - -protected: - virtual void ImplDumpRecord(); -}; - -// ============================================================================ - -class VbaProjectStreamObject : public OleStreamObject -{ -public: - explicit VbaProjectStreamObject( const OleStorageObject& rParentStrg ); - -protected: - virtual void ImplDumpBody(); -}; - -// ============================================================================ -// ============================================================================ - -class PivotCacheStorageObject : public OleStorageObject -{ -public: - explicit PivotCacheStorageObject( const OleStorageObject& rParentStrg ); - -protected: - virtual void ImplDumpBody(); -}; - -// ============================================================================ - -class VbaProjectStorageObject : public OleStorageObject -{ -public: - explicit VbaProjectStorageObject( const OleStorageObject& rParentStrg ); - -protected: - virtual void ImplDumpBody(); -}; - -// ============================================================================ - -class VbaStorageObject : public OleStorageObject -{ -public: - explicit VbaStorageObject( const OleStorageObject& rParentStrg ); - -protected: - virtual void ImplDumpBody(); -}; - -// ============================================================================ - -class RootStorageObject : public OleStorageObject -{ -public: - explicit RootStorageObject( const ObjectBase& rParent ); - -protected: - virtual void ImplDumpBody(); -}; - -// ============================================================================ -// ============================================================================ - -class Dumper : public DumperBase -{ -public: - explicit Dumper( SfxMedium& rMedium, SfxObjectShell* pDocShell ); - -protected: - virtual void ImplDumpBody(); -}; - -// ============================================================================ -// ============================================================================ - -} // namespace xls -} // namespace dump -} // namespace scf - -#endif -#endif - diff --git a/sc/source/filter/inc/xlroot.hxx b/sc/source/filter/inc/xlroot.hxx index 36056ead2fe2..8571dafcbc74 100644 --- a/sc/source/filter/inc/xlroot.hxx +++ b/sc/source/filter/inc/xlroot.hxx @@ -36,6 +36,8 @@ #include "xlconst.hxx" #include "xltools.hxx" +namespace comphelper { class IDocPasswordVerifier; } + // Forward declarations of objects in public use ============================== class DateTime; @@ -92,6 +94,7 @@ struct XclRootData ScDocument& mrDoc; /// The source or destination document. String maDocUrl; /// Document URL of imported/exported file. String maBasePath; /// Base path of imported/exported file (path of maDocUrl). + const String maDefPassword; /// The default password used for stream encryption. rtl_TextEncoding meTextEnc; /// Text encoding to import/export byte strings. LanguageType meSysLang; /// System language. LanguageType meDocLang; /// Document language (import: from file, export: from system). @@ -183,6 +186,11 @@ public: /** Returns the base path of the imported/exported file. */ inline const String& GetBasePath() const { return mrData.maBasePath; } + /** Returns the default password used for stream encryption. */ + inline const String& GetDefaultPassword() const { return mrData.maDefPassword; } + /** Requests and verifies a password from the medium or the user. */ + String RequestPassword( ::comphelper::IDocPasswordVerifier& rVerifier ) const; + /** Returns the OLE2 root storage of the imported/exported file. @return Pointer to root storage or 0, if the file is a simple stream. */ inline SotStorageRef GetRootStorage() const { return mrData.mxRootStrg; } diff --git a/sc/source/filter/inc/xlstream.hxx b/sc/source/filter/inc/xlstream.hxx index ffdd74d5f218..603a4cfab3fc 100644 --- a/sc/source/filter/inc/xlstream.hxx +++ b/sc/source/filter/inc/xlstream.hxx @@ -50,19 +50,6 @@ const sal_uInt16 EXC_ENCR_BLOCKSIZE = 1024; const sal_uInt16 EXC_ID_UNKNOWN = SAL_MAX_UINT16; const sal_uInt16 EXC_ID_CONT = 0x003C; -// Encryption/decryption ====================================================== - -/** Helper class for BIFF stream en-/decryption. */ -class XclCryptoHelper : ScfNoInstance -{ -public: - /** Returns the fixed password for workbook protection. */ - static const ByteString GetBiff5WbProtPassword(); - - /** Returns the fixed password for workbook protection. */ - static const String GetBiff8WbProtPassword(); -}; - // ============================================================================ #endif diff --git a/sc/source/ui/dbgui/fieldwnd.cxx b/sc/source/ui/dbgui/fieldwnd.cxx index e20542bfedf6..4d3c478d9068 100644 --- a/sc/source/ui/dbgui/fieldwnd.cxx +++ b/sc/source/ui/dbgui/fieldwnd.cxx @@ -31,12 +31,11 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" - - #include <vcl/virdev.hxx> #include <vcl/decoview.hxx> #include <vcl/svapp.hxx> - +#include <vcl/mnemonic.hxx> +#include <vcl/help.hxx> #include <tools/debug.hxx> #include "fieldwnd.hxx" @@ -44,10 +43,7 @@ #include "pvglob.hxx" #include "AccessibleDataPilotControl.hxx" #include "scresid.hxx" -#ifndef SC_SC_HRC #include "sc.hrc" -#endif -#include <vcl/mnemonic.hxx> const size_t INVALID_INDEX = static_cast< size_t >( -1 ); @@ -238,27 +234,44 @@ void ScDPFieldWindow::DrawBackground( OutputDevice& rDev ) } void ScDPFieldWindow::DrawField( - OutputDevice& rDev, const Rectangle& rRect, const String& rText, bool bFocus ) + OutputDevice& rDev, const Rectangle& rRect, FieldString& rText, bool bFocus ) { VirtualDevice aVirDev( rDev ); // #i97623# VirtualDevice is always LTR while other windows derive direction from parent aVirDev.EnableRTL( IsRTLEnabled() ); + String aText = rText.first; Size aDevSize( rRect.GetSize() ); long nWidth = aDevSize.Width(); long nHeight = aDevSize.Height(); - long nLabelWidth = rDev.GetTextWidth( rText ); + long nLabelWidth = rDev.GetTextWidth( aText ); long nLabelHeight = rDev.GetTextHeight(); - Point aLabelPos( - ((nWidth > nLabelWidth + 6) ? (nWidth - nLabelWidth) / 2 : 3), - ((nHeight > nLabelHeight + 6) ? (nHeight - nLabelHeight) / 2 : 3) ); + + // #i31600# if text is too long, cut and add ellipsis + rText.second = nLabelWidth + 6 <= nWidth; + if( !rText.second ) + { + xub_StrLen nMinLen = 0; + xub_StrLen nMaxLen = aText.Len(); + bool bFits = false; + do + { + xub_StrLen nCurrLen = (nMinLen + nMaxLen) / 2; + aText = String( rText.first, 0, nCurrLen ).AppendAscii( "..." ); + nLabelWidth = rDev.GetTextWidth( aText ); + bFits = nLabelWidth + 6 <= nWidth; + (bFits ? nMinLen : nMaxLen) = nCurrLen; + } + while( !bFits || (nMinLen + 1 < nMaxLen) ); + } + Point aLabelPos( (nWidth - nLabelWidth) / 2, ::std::max< long >( (nHeight - nLabelHeight) / 2, 3 ) ); aVirDev.SetOutputSizePixel( aDevSize ); aVirDev.SetFont( rDev.GetFont() ); DecorationView aDecoView( &aVirDev ); aDecoView.DrawButton( Rectangle( Point( 0, 0 ), aDevSize ), bFocus ? BUTTON_DRAW_DEFAULT : 0 ); aVirDev.SetTextColor( aTextColor ); - aVirDev.DrawText( aLabelPos, rText ); + aVirDev.DrawText( aLabelPos, aText ); rDev.DrawBitmap( rRect.TopLeft(), aVirDev.GetBitmap( Point( 0, 0 ), aDevSize ) ); } @@ -292,7 +305,7 @@ void ScDPFieldWindow::Redraw() if( HasFocus() && (nFieldSelected < aFieldArr.size()) ) { long nFieldWidth = aFieldRect.GetWidth(); - long nSelectionWidth = Min( GetTextWidth( aFieldArr[ nFieldSelected ] ) + 4, nFieldWidth - 6 ); + long nSelectionWidth = Min( GetTextWidth( aFieldArr[ nFieldSelected ].first ) + 4, nFieldWidth - 6 ); Rectangle aSelection( GetFieldPosition( nFieldSelected ) + Point( (nFieldWidth - nSelectionWidth) / 2, 3 ), Size( nSelectionWidth, aFieldRect.GetHeight() - 6 ) ); @@ -320,6 +333,11 @@ bool ScDPFieldWindow::IsExistingIndex( size_t nIndex ) const return nIndex < aFieldArr.size(); } +bool ScDPFieldWindow::IsShortenedText( size_t nIndex ) const +{ + return (nIndex < aFieldArr.size()) && !aFieldArr[ nIndex ].second; +} + size_t ScDPFieldWindow::CalcNewFieldIndex( SCsCOL nDX, SCsROW nDY ) const { size_t nNewField = nFieldSelected; @@ -513,6 +531,14 @@ void __EXPORT ScDPFieldWindow::MouseMove( const MouseEvent& rMEvt ) PointerStyle ePtr = pDlg->NotifyMouseMove( OutputToScreenPixel( rMEvt.GetPosPixel() ) ); SetPointer( Pointer( ePtr ) ); } + size_t nIndex = 0; + if( GetFieldIndex( rMEvt.GetPosPixel(), nIndex ) && IsShortenedText( nIndex ) ) + { + Point aPos = OutputToScreenPixel( rMEvt.GetPosPixel() ); + Rectangle aRect( aPos, GetSizePixel() ); + String aHelpText = GetFieldText(nIndex); + Help::ShowQuickHelp( this, aRect, aHelpText ); + } } void __EXPORT ScDPFieldWindow::KeyInput( const KeyEvent& rKEvt ) @@ -598,7 +624,7 @@ void ScDPFieldWindow::AddField( const String& rText, size_t nNewIndex ) DBG_ASSERT( nNewIndex == aFieldArr.size(), "ScDPFieldWindow::AddField - invalid index" ); if( IsValidIndex( nNewIndex ) ) { - aFieldArr.push_back( rText ); + aFieldArr.push_back( FieldString( rText, true ) ); if (pAccessible) { com::sun::star::uno::Reference < com::sun::star::accessibility::XAccessible > xTempAcc = xAccessible; @@ -646,7 +672,7 @@ void ScDPFieldWindow::SetFieldText( const String& rText, size_t nIndex ) { if( IsExistingIndex( nIndex ) ) { - aFieldArr[ nIndex ] = rText; + aFieldArr[ nIndex ] = FieldString( rText, true ); Redraw(); if (pAccessible) @@ -663,7 +689,7 @@ void ScDPFieldWindow::SetFieldText( const String& rText, size_t nIndex ) const String& ScDPFieldWindow::GetFieldText( size_t nIndex ) const { if( IsExistingIndex( nIndex ) ) - return aFieldArr[ nIndex ]; + return aFieldArr[ nIndex ].first; return EMPTY_STRING; } @@ -680,7 +706,7 @@ bool ScDPFieldWindow::AddField( const String& rText, const Point& rPos, size_t& if( nNewIndex > aFieldArr.size() ) nNewIndex = aFieldArr.size(); - aFieldArr.insert( aFieldArr.begin() + nNewIndex, rText ); + aFieldArr.insert( aFieldArr.begin() + nNewIndex, FieldString( rText, true ) ); nFieldSelected = nNewIndex; Redraw(); rnIndex = nNewIndex; diff --git a/sc/source/ui/inc/fieldwnd.hxx b/sc/source/ui/inc/fieldwnd.hxx index 5b24b5fea3df..ae2dbf1ffb52 100644 --- a/sc/source/ui/inc/fieldwnd.hxx +++ b/sc/source/ui/inc/fieldwnd.hxx @@ -68,12 +68,14 @@ enum ScDPFieldType class ScDPFieldWindow : public Control { private: + typedef ::std::pair< String, bool > FieldString; // true = text fits into button + String aName; /// name of the control, used in Accessibility ScDPLayoutDlg* pDlg; /// Parent dialog. Rectangle aWndRect; /// Area rectangle in pixels. FixedText* pFtCaption; /// FixedText containing the name of the control. Point aTextPos; /// Position of the caption text. - std::vector< String > aFieldArr; /// Pointer to string array of the field names. + std::vector< FieldString > aFieldArr; /// String array of the field names and flags, if text fits into button. ScDPFieldType eType; /// Type of this area. Color aFaceColor; /// Color for dialog background. Color aWinColor; /// Color for window background. @@ -97,13 +99,16 @@ private: void DrawField( OutputDevice& rDev, const Rectangle& rRect, - const String& rText, + FieldString& rText, bool bFocus ); /** @return TRUE, if the field index is inside of the control area. */ bool IsValidIndex( size_t nIndex ) const; /** @return TRUE, if the field with the given index exists. */ bool IsExistingIndex( size_t nIndex ) const; + /** @return TRUE, if the field with the given index exists and the text is + too long for the button control. */ + bool IsShortenedText( size_t nIndex ) const; /** @return The new selection index after moving to the given direction. */ size_t CalcNewFieldIndex( SCsCOL nDX, SCsROW nDY ) const; diff --git a/sc/source/ui/view/output2.cxx b/sc/source/ui/view/output2.cxx index e41bd4941d9c..dd76058756a1 100644 --- a/sc/source/ui/view/output2.cxx +++ b/sc/source/ui/view/output2.cxx @@ -1358,11 +1358,13 @@ void ScOutputData::DrawStrings( BOOL bPixelToLogic ) } if (bDoCell && !bNeedEdit) { - if ( pCell->GetCellType() == CELLTYPE_FORMULA ) + BOOL bFormulaCell = (pCell->GetCellType() == CELLTYPE_FORMULA ); + if ( bFormulaCell ) lcl_CreateInterpretProgress( bProgress, pDoc, (ScFormulaCell*)pCell ); if ( aVars.SetText(pCell) ) pOldPattern = NULL; - bNeedEdit = aVars.HasEditCharacters(); + bNeedEdit = aVars.HasEditCharacters() || + (bFormulaCell && ((ScFormulaCell*)pCell)->IsMultilineResult()); } if (bDoCell && !bNeedEdit) { |