summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorIvo Hinkelmann <ihi@openoffice.org>2009-06-12 09:36:34 +0000
committerIvo Hinkelmann <ihi@openoffice.org>2009-06-12 09:36:34 +0000
commit0ad5ec8be0fc7edf6785a3831f1c67d060847a04 (patch)
tree7a9936658eb75a704b2bb15db200341ba9fc1c93 /sc
parent8424c9658143b744d991fdb3c28f9b569526dcd7 (diff)
CWS-TOOLING: integrate CWS unifypaper01
2009-05-27 17:14:41 +0200 cmc r272362 : #i92819#, psprint moved into vcl 2009-05-19 15:45:46 +0200 cmc r272083 : #i92819# having difficultly in getting this right under windows 2009-05-18 18:04:22 +0200 cmc r272043 : #i92819# missing some export magic somewhere 2009-05-18 15:34:18 +0200 cmc r272028 : #i92819# get depends right 2009-05-18 11:50:43 +0200 cmc r272010 : ##i92819# fix import/export stuff 2009-05-18 10:07:00 +0200 cmc r272000 : #i92819# fix window imp name 2009-05-16 15:17:23 +0200 cmc r271975 : #i92819# fix win paper names 2009-05-16 11:11:29 +0200 cmc r271974 : #i92819# std::abs prolematic for msvc 2009-05-15 15:36:56 +0200 cmc r271941 : #i92819# handle missing setting, at least on mac 2009-05-15 10:13:44 +0200 cmc r271927 : #i92819# adjust for moved page dialog 2009-05-14 13:47:14 +0200 cmc r271887 : remove dead files that reappeared 2009-05-14 09:57:17 +0200 cmc r271872 : CWS-TOOLING: rebase CWS unifypaper01 to trunk@271830 (milestone: DEV300:m48) 2009-05-11 12:27:18 +0200 cmc r271763 : #i92819# check return value 2009-05-06 17:28:25 +0200 cmc r271602 : #i92819# these B4/B5s are the JIS ones according to their dimensions 2009-05-06 17:17:03 +0200 cmc r271601 : #i92819# micro-optimization 2009-05-03 18:20:48 +0200 cmc r271434 : #i92819# paper libs 2009-05-03 16:08:32 +0200 cmc r271433 : CWS-TOOLING: rebase CWS unifypaper01 to trunk@271427 (milestone: DEV300:m47) 2009-04-06 15:33:37 +0200 cmc r270556 : CWS-TOOLING: rebase CWS unifypaper01 to trunk@270033 (milestone: DEV300:m45) 2009-03-12 14:36:35 +0100 cmc r269415 : #i92819# merge paper utilities 2009-03-11 13:44:27 +0100 cmc r269328 : CWS-TOOLING: rebase CWS unifypaper01 to trunk@269297 (milestone: DEV300:m43) 2009-03-09 14:42:07 +0100 cmc r269190 : remove config_office from synced version 2009-03-09 14:34:50 +0100 cmc r269187 : CWS-TOOLING: rebase CWS unifypaper01 to trunk@268395 (milestone: DEV300:m42) 2009-03-09 12:11:29 +0100 cmc r269077 : CWS-TOOLING: rebase CWS unifypaper01 to trunk@265758 (milestone: DEV300:m38) 2009-03-06 17:17:39 +0100 cmc r269027 : #i92819# paper goo 2008-12-04 11:29:30 +0100 cmc r264826 : CWS-TOOLING: rebase CWS unifypaper01 to trunk@264807 (milestone: DEV300:m37) 2008-11-26 10:33:06 +0100 cmc r264357 : CWS-TOOLING: rebase CWS unifypaper01 to trunk@264325 (milestone: DEV300:m36) 2008-11-21 14:09:36 +0100 cmc r264138 : #i92819# paper consolidation
Diffstat (limited to 'sc')
-rw-r--r--sc/source/core/data/stlsheet.cxx8
-rw-r--r--sc/source/filter/excel/biffdump.cxx9864
-rw-r--r--sc/source/filter/excel/xlpage.cxx206
-rw-r--r--sc/source/filter/html/htmlimp.cxx4
-rw-r--r--sc/source/ui/app/transobj.cxx2
-rw-r--r--sc/source/ui/inc/printfun.hxx2
-rw-r--r--sc/source/ui/view/printfun.cxx4
7 files changed, 9982 insertions, 108 deletions
diff --git a/sc/source/core/data/stlsheet.cxx b/sc/source/core/data/stlsheet.cxx
index 37dce231cbaf..bad2c664cc4d 100644
--- a/sc/source/core/data/stlsheet.cxx
+++ b/sc/source/core/data/stlsheet.cxx
@@ -176,14 +176,8 @@ SfxItemSet& __EXPORT ScStyleSheet::GetItemSet()
if ( pDoc && pDoc->IsLoadingDone() )
{
// Setzen von sinnvollen Default-Werten:
- // SfxPrinter* pPrinter = pDoc->GetPrinter();
SvxPageItem aPageItem( ATTR_PAGE );
- // #50536# PaperBin auf Default lassen,
- // nicht auf aktuelle Drucker-Einstellung umsetzen
- // SvxSizeItem aPaperSizeItem(ATTR_PAGE_SIZE,SvxPaperInfo::GetPaperSize(pPrinter) );
-
- SvxPaper aDefaultPaper = SvxPaperInfo::GetDefaultSvxPaper( Application::GetSettings().GetLanguage() );
- SvxSizeItem aPaperSizeItem( ATTR_PAGE_SIZE, SvxPaperInfo::GetPaperSize(aDefaultPaper) );
+ SvxSizeItem aPaperSizeItem( ATTR_PAGE_SIZE, SvxPaperInfo::GetDefaultPaperSize() );
SvxSetItem aHFSetItem(
(const SvxSetItem&)
diff --git a/sc/source/filter/excel/biffdump.cxx b/sc/source/filter/excel/biffdump.cxx
new file mode 100644
index 000000000000..c3478cf8cb50
--- /dev/null
+++ b/sc/source/filter/excel/biffdump.cxx
@@ -0,0 +1,9864 @@
+/*************************************************************************
+ *
+ * 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/xlpage.cxx b/sc/source/filter/excel/xlpage.cxx
index 56ef285228b2..d1bea1addcec 100644
--- a/sc/source/filter/excel/xlpage.cxx
+++ b/sc/source/filter/excel/xlpage.cxx
@@ -44,7 +44,7 @@
struct XclPaperSize
{
- SvxPaper mePaper; /// SVX paper size identifier.
+ Paper mePaper; /// SVX paper size identifier.
long mnWidth; /// Paper width in twips.
long mnHeight; /// Paper height in twips.
};
@@ -54,97 +54,114 @@ struct XclPaperSize
static const XclPaperSize pPaperSizeTable[] =
{
-/* 0*/ { SVX_PAPER_USER, 0, 0 }, // undefined
- { SVX_PAPER_LETTER, IN2TWIPS( 8.5 ), IN2TWIPS( 11 ) }, // Letter
- { SVX_PAPER_USER, IN2TWIPS( 8.5 ), IN2TWIPS( 11 ) }, // Letter Small
- { SVX_PAPER_TABLOID, IN2TWIPS( 11 ), IN2TWIPS( 17 ) }, // Tabloid
- { SVX_PAPER_USER, IN2TWIPS( 17 ), IN2TWIPS( 11 ) }, // Ledger
-/* 5*/ { SVX_PAPER_LEGAL, IN2TWIPS( 8.5 ), IN2TWIPS( 14 ) }, // Legal
- { SVX_PAPER_USER, IN2TWIPS( 5.5 ), IN2TWIPS( 8.5 ) }, // Statement
- { SVX_PAPER_USER, IN2TWIPS( 7.25 ), IN2TWIPS( 10.5 ) }, // Executive
- { SVX_PAPER_A3, MM2TWIPS( 297 ), MM2TWIPS( 420 ) }, // A3
- { SVX_PAPER_A4, MM2TWIPS( 210 ), MM2TWIPS( 297 ) }, // A4
-/* 10*/ { SVX_PAPER_USER, MM2TWIPS( 210 ), MM2TWIPS( 297 ) }, // A4 Small
- { SVX_PAPER_A5, MM2TWIPS( 148 ), MM2TWIPS( 210 ) }, // A5
- { SVX_PAPER_B4_JIS, MM2TWIPS( 257 ), MM2TWIPS( 364 ) }, // B4 (JIS)
- { SVX_PAPER_B5_JIS, MM2TWIPS( 182 ), MM2TWIPS( 257 ) }, // B5 (JIS)
- { SVX_PAPER_USER, IN2TWIPS( 8.5 ), IN2TWIPS( 13 ) }, // Folio
-/* 15*/ { SVX_PAPER_USER, MM2TWIPS( 215 ), MM2TWIPS( 275 ) }, // Quarto
- { SVX_PAPER_USER, IN2TWIPS( 10 ), IN2TWIPS( 14 ) }, // 10x14
- { SVX_PAPER_USER, IN2TWIPS( 11 ), IN2TWIPS( 17 ) }, // 11x17
- { SVX_PAPER_USER, IN2TWIPS( 8.5 ), IN2TWIPS( 11 ) }, // Note
- { SVX_PAPER_COM9, IN2TWIPS( 3.875 ), IN2TWIPS( 8.875 ) }, // Envelope #9
-/* 20*/ { SVX_PAPER_COM10, IN2TWIPS( 4.125 ), IN2TWIPS( 9.5 ) }, // Envelope #10
- { SVX_PAPER_COM11, IN2TWIPS( 4.5 ), IN2TWIPS( 10.375 ) }, // Envelope #11
- { SVX_PAPER_COM12, IN2TWIPS( 4.75 ), IN2TWIPS( 11 ) }, // Envelope #12
- { SVX_PAPER_USER, IN2TWIPS( 5 ), IN2TWIPS( 11.5 ) }, // Envelope #14
- { SVX_PAPER_C, IN2TWIPS( 17 ), IN2TWIPS( 22 ) }, // ANSI-C
-/* 25*/ { SVX_PAPER_D, IN2TWIPS( 22 ), IN2TWIPS( 34 ) }, // ANSI-D
- { SVX_PAPER_E, IN2TWIPS( 34 ), IN2TWIPS( 44 ) }, // ANSI-E
- { SVX_PAPER_DL, MM2TWIPS( 110 ), MM2TWIPS( 220 ) }, // Envelope DL
- { SVX_PAPER_C5, MM2TWIPS( 162 ), MM2TWIPS( 229 ) }, // Envelope C5
- { SVX_PAPER_USER, MM2TWIPS( 324 ), MM2TWIPS( 458 ) }, // Envelope C3
-/* 30*/ { SVX_PAPER_C4, MM2TWIPS( 229 ), MM2TWIPS( 324 ) }, // Envelope C4
- { SVX_PAPER_C6, MM2TWIPS( 114 ), MM2TWIPS( 162 ) }, // Envelope C6
- { SVX_PAPER_C65, MM2TWIPS( 114 ), MM2TWIPS( 229 ) }, // Envelope C65
- { SVX_PAPER_B4, MM2TWIPS( 250 ), MM2TWIPS( 353 ) }, // B4 (ISO)
- { SVX_PAPER_B5, MM2TWIPS( 176 ), MM2TWIPS( 250 ) }, // B5 (ISO)
-/* 35*/ { SVX_PAPER_B6, MM2TWIPS( 125 ), MM2TWIPS( 176 ) }, // B6 (ISO)
- { SVX_PAPER_USER, MM2TWIPS( 110 ), MM2TWIPS( 230 ) }, // Envelope Italy
- { SVX_PAPER_MONARCH, IN2TWIPS( 3.875 ), IN2TWIPS( 7.5 ) }, // Envelope Monarch
- { SVX_PAPER_COM675, IN2TWIPS( 3.625 ), IN2TWIPS( 6.5 ) }, // 6 3/4 Envelope
- { SVX_PAPER_USER, IN2TWIPS( 14.875 ), IN2TWIPS( 11 ) }, // US Std Fanfold
-/* 40*/ { SVX_PAPER_USER, IN2TWIPS( 8.5 ), IN2TWIPS( 12 ) }, // German Std Fanfold
- { SVX_PAPER_USER, IN2TWIPS( 8.5 ), IN2TWIPS( 13 ) }, // German Legal Fanfold
- { SVX_PAPER_B4, MM2TWIPS( 250 ), MM2TWIPS( 353 ) }, // B4 (ISO)
- { SVX_PAPER_USER, MM2TWIPS( 100 ), MM2TWIPS( 148 ) }, // Japanese Postcard
- { SVX_PAPER_USER, IN2TWIPS( 9 ), IN2TWIPS( 11 ) }, // 9x11
-/* 45*/ { SVX_PAPER_USER, IN2TWIPS( 10 ), IN2TWIPS( 11 ) }, // 10x11
- { SVX_PAPER_USER, IN2TWIPS( 15 ), IN2TWIPS( 11 ) }, // 15x11
- { SVX_PAPER_USER, MM2TWIPS( 220 ), MM2TWIPS( 220 ) }, // Envelope Invite
- { SVX_PAPER_USER, 0, 0 }, // undefined
- { SVX_PAPER_USER, 0, 0 }, // undefined
-/* 50*/ { SVX_PAPER_USER, IN2TWIPS( 9.5 ), IN2TWIPS( 12 ) }, // Letter Extra
- { SVX_PAPER_USER, IN2TWIPS( 9.5 ), IN2TWIPS( 15 ) }, // Legal Extra
- { SVX_PAPER_USER, IN2TWIPS( 11.69 ), IN2TWIPS( 18 ) }, // Tabloid Extra
- { SVX_PAPER_USER, MM2TWIPS( 235 ), MM2TWIPS( 322 ) }, // A4 Extra
- { SVX_PAPER_USER, IN2TWIPS( 8.5 ), IN2TWIPS( 11 ) }, // Letter Transverse
-/* 55*/ { SVX_PAPER_USER, MM2TWIPS( 210 ), MM2TWIPS( 297 ) }, // A4 Transverse
- { SVX_PAPER_USER, IN2TWIPS( 9.5 ), IN2TWIPS( 12 ) }, // Letter Extra Transverse
- { SVX_PAPER_USER, MM2TWIPS( 227 ), MM2TWIPS( 356 ) }, // Super A/A4
- { SVX_PAPER_USER, MM2TWIPS( 305 ), MM2TWIPS( 487 ) }, // Super B/A3
- { SVX_PAPER_USER, IN2TWIPS( 8.5 ), IN2TWIPS( 12.69 ) }, // Letter Plus
-/* 60*/ { SVX_PAPER_USER, MM2TWIPS( 210 ), MM2TWIPS( 330 ) }, // A4 Plus
- { SVX_PAPER_USER, MM2TWIPS( 148 ), MM2TWIPS( 210 ) }, // A5 Transverse
- { SVX_PAPER_USER, MM2TWIPS( 182 ), MM2TWIPS( 257 ) }, // B5 (JIS) Transverse
- { SVX_PAPER_USER, MM2TWIPS( 322 ), MM2TWIPS( 445 ) }, // A3 Extra
- { SVX_PAPER_USER, MM2TWIPS( 174 ), MM2TWIPS( 235 ) }, // A5 Extra
-/* 65*/ { SVX_PAPER_USER, MM2TWIPS( 201 ), MM2TWIPS( 276 ) }, // B5 (ISO) Extra
- { SVX_PAPER_A2, MM2TWIPS( 420 ), MM2TWIPS( 594 ) }, // A2
- { SVX_PAPER_USER, MM2TWIPS( 297 ), MM2TWIPS( 420 ) }, // A3 Transverse
- { SVX_PAPER_USER, MM2TWIPS( 322 ), MM2TWIPS( 445 ) }, // A3 Extra Transverse
- { SVX_PAPER_USER, MM2TWIPS( 200 ), MM2TWIPS( 148 ) }, // Double Japanese Postcard
-/* 70*/ { SVX_PAPER_USER, MM2TWIPS( 105 ), MM2TWIPS( 148 ) }, // A6
- { SVX_PAPER_USER, 0, 0 }, // undefined
- { SVX_PAPER_USER, 0, 0 }, // undefined
- { SVX_PAPER_USER, 0, 0 }, // undefined
- { SVX_PAPER_USER, 0, 0 }, // undefined
-/* 75*/ { SVX_PAPER_USER, IN2TWIPS( 11 ), IN2TWIPS( 8.5 ) }, // Letter Rotated
- { SVX_PAPER_USER, MM2TWIPS( 420 ), MM2TWIPS( 297 ) }, // A3 Rotated
- { SVX_PAPER_USER, MM2TWIPS( 297 ), MM2TWIPS( 210 ) }, // A4 Rotated
- { SVX_PAPER_USER, MM2TWIPS( 210 ), MM2TWIPS( 148 ) }, // A5 Rotated
- { SVX_PAPER_USER, MM2TWIPS( 364 ), MM2TWIPS( 257 ) }, // B4 (JIS) Rotated
-/* 80*/ { SVX_PAPER_USER, MM2TWIPS( 257 ), MM2TWIPS( 182 ) }, // B5 (JIS) Rotated
- { SVX_PAPER_USER, MM2TWIPS( 148 ), MM2TWIPS( 100 ) }, // Japanese Postcard Rotated
- { SVX_PAPER_USER, MM2TWIPS( 148 ), MM2TWIPS( 200 ) }, // Double Japanese Postcard Rotated
- { SVX_PAPER_USER, MM2TWIPS( 148 ), MM2TWIPS( 105 ) }, // A6 Rotated
- { SVX_PAPER_USER, 0, 0 }, // undefined
-/* 85*/ { SVX_PAPER_USER, 0, 0 }, // undefined
- { SVX_PAPER_USER, 0, 0 }, // undefined
- { SVX_PAPER_USER, 0, 0 }, // undefined
- { SVX_PAPER_B6_JIS, MM2TWIPS( 128 ), MM2TWIPS( 182 ) }, // B6 (JIS)
- { SVX_PAPER_USER, MM2TWIPS( 182 ), MM2TWIPS( 128 ) }, // B6 (JIS) Rotated
-/* 90*/ { SVX_PAPER_USER, IN2TWIPS( 12 ), IN2TWIPS( 11 ) } // 12x11
+/* 0*/ { PAPER_USER, 0, 0 }, // undefined
+ { PAPER_LETTER, IN2TWIPS( 8.5 ), IN2TWIPS( 11 ) }, // Letter
+ { PAPER_USER, IN2TWIPS( 8.5 ), IN2TWIPS( 11 ) }, // Letter Small
+ { PAPER_TABLOID, IN2TWIPS( 11 ), IN2TWIPS( 17 ) }, // Tabloid
+ { PAPER_LEDGER, IN2TWIPS( 17 ), IN2TWIPS( 11 ) }, // Ledger
+/* 5*/ { PAPER_LEGAL, IN2TWIPS( 8.5 ), IN2TWIPS( 14 ) }, // Legal
+ { PAPER_STATEMENT, IN2TWIPS( 5.5 ), IN2TWIPS( 8.5 ) }, // Statement
+ { PAPER_EXECUTIVE, IN2TWIPS( 7.25 ), IN2TWIPS( 10.5 ) }, // Executive
+ { PAPER_A3, MM2TWIPS( 297 ), MM2TWIPS( 420 ) }, // A3
+ { PAPER_A4, MM2TWIPS( 210 ), MM2TWIPS( 297 ) }, // A4
+/* 10*/ { PAPER_USER, MM2TWIPS( 210 ), MM2TWIPS( 297 ) }, // A4 Small
+ { PAPER_A5, MM2TWIPS( 148 ), MM2TWIPS( 210 ) }, // A5
+ //See: http://wiki.services.openoffice.org/wiki/DefaultPaperSize comments
+ //near DMPAPER_B4 in vcl
+ //i.e.
+ //http://msdn.microsoft.com/en-us/library/bb241398.aspx makes the claim:
+ //xlPaperB4 12 B4 (250 mm x 354 mm)
+ //xlPaperB5 13 A5 (148 mm x 210 mm)
+ //but, a paper enum called B5 is surely not actually "A5", and furthermore
+ //the XlPaperSize enumeration otherwise follows the DMPAPER values
+ //http://msdn.microsoft.com/en-us/library/ms776398(VS.85).aspx
+ //which has
+ //DMPAPER_B4 12 B4 (JIS) 250 x 354
+ //DMPAPER_B5 13 B5 (JIS) 182 x 257 mm
+ //which claim them to be the JIS sizes. Though that document then gives
+ //"B4 (JIS)" an *ISO* B4 size in the text, but
+ //http://partners.adobe.com/public/developer/en/ps/5003.PPD_Spec_v4.3.pdf
+ //claims that the MS DMPAPER_B4 and DMPAPER_B5 truly are the JIS sizes
+ //which at least makes some sort of sense. (cmc)
+ { PAPER_B4_JIS, MM2TWIPS( 257 ), MM2TWIPS( 364 ) }, // B4 (JIS)
+ { PAPER_B5_JIS, MM2TWIPS( 182 ), MM2TWIPS( 257 ) }, // B5 (JIS)
+ { PAPER_USER, IN2TWIPS( 8.5 ), IN2TWIPS( 13 ) }, // Folio
+/* 15*/ { PAPER_QUARTO, MM2TWIPS( 215 ), MM2TWIPS( 275 ) }, // Quarto
+ { PAPER_10x14, IN2TWIPS( 10 ), IN2TWIPS( 14 ) }, // 10x14
+ { PAPER_USER, IN2TWIPS( 11 ), IN2TWIPS( 17 ) }, // 11x17
+ { PAPER_USER, IN2TWIPS( 8.5 ), IN2TWIPS( 11 ) }, // Note
+ { PAPER_ENV_9, IN2TWIPS( 3.875 ), IN2TWIPS( 8.875 ) }, // Envelope #9
+/* 20*/ { PAPER_ENV_10, IN2TWIPS( 4.125 ), IN2TWIPS( 9.5 ) }, // Envelope #10
+ { PAPER_ENV_11, IN2TWIPS( 4.5 ), IN2TWIPS( 10.375 ) }, // Envelope #11
+ { PAPER_ENV_12, IN2TWIPS( 4.75 ), IN2TWIPS( 11 ) }, // Envelope #12
+ { PAPER_ENV_14, IN2TWIPS( 5 ), IN2TWIPS( 11.5 ) }, // Envelope #14
+ { PAPER_C, IN2TWIPS( 17 ), IN2TWIPS( 22 ) }, // ANSI-C
+/* 25*/ { PAPER_D, IN2TWIPS( 22 ), IN2TWIPS( 34 ) }, // ANSI-D
+ { PAPER_E, IN2TWIPS( 34 ), IN2TWIPS( 44 ) }, // ANSI-E
+ { PAPER_ENV_DL, MM2TWIPS( 110 ), MM2TWIPS( 220 ) }, // Envelope DL
+ { PAPER_ENV_C5, MM2TWIPS( 162 ), MM2TWIPS( 229 ) }, // Envelope C5
+ { PAPER_ENV_C3, MM2TWIPS( 324 ), MM2TWIPS( 458 ) }, // Envelope C3
+/* 30*/ { PAPER_ENV_C4, MM2TWIPS( 229 ), MM2TWIPS( 324 ) }, // Envelope C4
+ { PAPER_ENV_C6, MM2TWIPS( 114 ), MM2TWIPS( 162 ) }, // Envelope C6
+ { PAPER_ENV_C65, MM2TWIPS( 114 ), MM2TWIPS( 229 ) }, // Envelope C65
+ { PAPER_B4_ISO, MM2TWIPS( 250 ), MM2TWIPS( 353 ) }, // B4 (ISO)
+ { PAPER_B5_ISO, MM2TWIPS( 176 ), MM2TWIPS( 250 ) }, // B5 (ISO)
+/* 35*/ { PAPER_B6_ISO, MM2TWIPS( 125 ), MM2TWIPS( 176 ) }, // B6 (ISO)
+ { PAPER_ENV_ITALY, MM2TWIPS( 110 ), MM2TWIPS( 230 ) }, // Envelope Italy
+ { PAPER_ENV_MONARCH, IN2TWIPS( 3.875 ), IN2TWIPS( 7.5 ) }, // Envelope Monarch
+ { PAPER_ENV_PERSONAL, IN2TWIPS( 3.625 ), IN2TWIPS( 6.5 ) }, // 6 3/4 Envelope
+ { PAPER_FANFOLD_US, IN2TWIPS( 14.875 ), IN2TWIPS( 11 ) }, // US Std Fanfold
+/* 40*/ { PAPER_FANFOLD_DE, IN2TWIPS( 8.5 ), IN2TWIPS( 12 ) }, // German Std Fanfold
+ { PAPER_FANFOLD_LEGAL_DE, IN2TWIPS( 8.5 ), IN2TWIPS( 13 ) }, // German Legal Fanfold
+ { PAPER_B4_ISO, MM2TWIPS( 250 ), MM2TWIPS( 353 ) }, // B4 (ISO)
+ { PAPER_POSTCARD_JP,MM2TWIPS( 100 ), MM2TWIPS( 148 ) }, // Japanese Postcard
+ { PAPER_9x11, IN2TWIPS( 9 ), IN2TWIPS( 11 ) }, // 9x11
+/* 45*/ { PAPER_10x11, IN2TWIPS( 10 ), IN2TWIPS( 11 ) }, // 10x11
+ { PAPER_15x11, IN2TWIPS( 15 ), IN2TWIPS( 11 ) }, // 15x11
+ { PAPER_ENV_INVITE, MM2TWIPS( 220 ), MM2TWIPS( 220 ) }, // Envelope Invite
+ { PAPER_USER, 0, 0 }, // undefined
+ { PAPER_USER, 0, 0 }, // undefined
+/* 50*/ { PAPER_USER, IN2TWIPS( 9.5 ), IN2TWIPS( 12 ) }, // Letter Extra
+ { PAPER_USER, IN2TWIPS( 9.5 ), IN2TWIPS( 15 ) }, // Legal Extra
+ { PAPER_USER, IN2TWIPS( 11.69 ), IN2TWIPS( 18 ) }, // Tabloid Extra
+ { PAPER_USER, MM2TWIPS( 235 ), MM2TWIPS( 322 ) }, // A4 Extra
+ { PAPER_USER, IN2TWIPS( 8.5 ), IN2TWIPS( 11 ) }, // Letter Transverse
+/* 55*/ { PAPER_USER, MM2TWIPS( 210 ), MM2TWIPS( 297 ) }, // A4 Transverse
+ { PAPER_USER, IN2TWIPS( 9.5 ), IN2TWIPS( 12 ) }, // Letter Extra Transverse
+ { PAPER_A_PLUS, MM2TWIPS( 227 ), MM2TWIPS( 356 ) }, // Super A/A4
+ { PAPER_B_PLUS, MM2TWIPS( 305 ), MM2TWIPS( 487 ) }, // Super B/A3
+ { PAPER_LETTER_PLUS,IN2TWIPS( 8.5 ), IN2TWIPS( 12.69 ) }, // Letter Plus
+/* 60*/ { PAPER_A4_PLUS, MM2TWIPS( 210 ), MM2TWIPS( 330 ) }, // A4 Plus
+ { PAPER_USER, MM2TWIPS( 148 ), MM2TWIPS( 210 ) }, // A5 Transverse
+ { PAPER_USER, MM2TWIPS( 182 ), MM2TWIPS( 257 ) }, // B5 (JIS) Transverse
+ { PAPER_USER, MM2TWIPS( 322 ), MM2TWIPS( 445 ) }, // A3 Extra
+ { PAPER_USER, MM2TWIPS( 174 ), MM2TWIPS( 235 ) }, // A5 Extra
+/* 65*/ { PAPER_USER, MM2TWIPS( 201 ), MM2TWIPS( 276 ) }, // B5 (ISO) Extra
+ { PAPER_A2, MM2TWIPS( 420 ), MM2TWIPS( 594 ) }, // A2
+ { PAPER_USER, MM2TWIPS( 297 ), MM2TWIPS( 420 ) }, // A3 Transverse
+ { PAPER_USER, MM2TWIPS( 322 ), MM2TWIPS( 445 ) }, // A3 Extra Transverse
+ { PAPER_DOUBLEPOSTCARD_JP, MM2TWIPS( 200 ), MM2TWIPS( 148 ) }, // Double Japanese Postcard
+/* 70*/ { PAPER_A6, MM2TWIPS( 105 ), MM2TWIPS( 148 ) }, // A6
+ { PAPER_USER, 0, 0 }, // undefined
+ { PAPER_USER, 0, 0 }, // undefined
+ { PAPER_USER, 0, 0 }, // undefined
+ { PAPER_USER, 0, 0 }, // undefined
+/* 75*/ { PAPER_USER, IN2TWIPS( 11 ), IN2TWIPS( 8.5 ) }, // Letter Rotated
+ { PAPER_USER, MM2TWIPS( 420 ), MM2TWIPS( 297 ) }, // A3 Rotated
+ { PAPER_USER, MM2TWIPS( 297 ), MM2TWIPS( 210 ) }, // A4 Rotated
+ { PAPER_USER, MM2TWIPS( 210 ), MM2TWIPS( 148 ) }, // A5 Rotated
+ { PAPER_USER, MM2TWIPS( 364 ), MM2TWIPS( 257 ) }, // B4 (JIS) Rotated
+/* 80*/ { PAPER_USER, MM2TWIPS( 257 ), MM2TWIPS( 182 ) }, // B5 (JIS) Rotated
+ { PAPER_USER, MM2TWIPS( 148 ), MM2TWIPS( 100 ) }, // Japanese Postcard Rotated
+ { PAPER_USER, MM2TWIPS( 148 ), MM2TWIPS( 200 ) }, // Double Japanese Postcard Rotated
+ { PAPER_USER, MM2TWIPS( 148 ), MM2TWIPS( 105 ) }, // A6 Rotated
+ { PAPER_USER, 0, 0 }, // undefined
+/* 85*/ { PAPER_USER, 0, 0 }, // undefined
+ { PAPER_USER, 0, 0 }, // undefined
+ { PAPER_USER, 0, 0 }, // undefined
+ { PAPER_B6_JIS, MM2TWIPS( 128 ), MM2TWIPS( 182 ) }, // B6 (JIS)
+ { PAPER_USER, MM2TWIPS( 182 ), MM2TWIPS( 128 ) }, // B6 (JIS) Rotated
+/* 90*/ { PAPER_12x11, IN2TWIPS( 12 ), IN2TWIPS( 11 ) } // 12x11
};
#undef IN2TWIPS
@@ -193,15 +210,14 @@ Size XclPageData::GetScPaperSize() const
pEntry += mnPaperSize;
Size aSize;
- if( pEntry->mePaper == SVX_PAPER_USER )
+ if( pEntry->mePaper == PAPER_USER )
aSize = Size( pEntry->mnWidth, pEntry->mnHeight );
else
aSize = SvxPaperInfo::GetPaperSize( pEntry->mePaper );
// invalid size -> back to default
if( !aSize.Width() || !aSize.Height() )
- aSize = SvxPaperInfo::GetPaperSize( SvxPaperInfo::GetDefaultSvxPaper(
- Application::GetSettings().GetLanguage() ) );
+ aSize = SvxPaperInfo::GetDefaultPaperSize();
if( !mbPortrait )
::std::swap( aSize.Width(), aSize.Height() );
diff --git a/sc/source/filter/html/htmlimp.cxx b/sc/source/filter/html/htmlimp.cxx
index abc7d2b21392..5591e8ec993e 100644
--- a/sc/source/filter/html/htmlimp.cxx
+++ b/sc/source/filter/html/htmlimp.cxx
@@ -99,7 +99,7 @@ ScHTMLImport::ScHTMLImport( ScDocument* pDocP, const String& rBaseURL, const ScR
if ( !aPageSize.Width() || !aPageSize.Height() )
{
DBG_ERRORFILE("PageSize Null ?!?!?");
- aPageSize = SvxPaperInfo::GetPaperSize( SVX_PAPER_A4 );
+ aPageSize = SvxPaperInfo::GetPaperSize( PAPER_A4 );
}
aPageSize.Width() -= nLeftMargin + nRightMargin;
aPageSize.Height() -= nTopMargin + nBottomMargin;
@@ -109,7 +109,7 @@ ScHTMLImport::ScHTMLImport( ScDocument* pDocP, const String& rBaseURL, const ScR
{
DBG_ERRORFILE("kein StyleSheet?!?");
aPageSize = pDefaultDev->LogicToPixel(
- SvxPaperInfo::GetPaperSize( SVX_PAPER_A4 ), MapMode( MAP_TWIP ) );
+ SvxPaperInfo::GetPaperSize( PAPER_A4 ), MapMode( MAP_TWIP ) );
}
if( bCalcWidthHeight )
mpParser = new ScHTMLLayoutParser( mpEngine, rBaseURL, aPageSize, pDocP );
diff --git a/sc/source/ui/app/transobj.cxx b/sc/source/ui/app/transobj.cxx
index 076cd3581d26..94a2cdfc3324 100644
--- a/sc/source/ui/app/transobj.cxx
+++ b/sc/source/ui/app/transobj.cxx
@@ -658,7 +658,7 @@ void ScTransferObj::InitDocShell()
// page format (grid etc) and page size (maximum size for ole object)
- Size aPaperSize = SvxPaperInfo::GetPaperSize( SVX_PAPER_A4 ); // Twips
+ Size aPaperSize = SvxPaperInfo::GetPaperSize( PAPER_A4 ); // Twips
ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
String aStyleName = pDoc->GetPageStyle( aBlock.aStart.Tab() );
SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStyleName, SFX_STYLE_FAMILY_PAGE );
diff --git a/sc/source/ui/inc/printfun.hxx b/sc/source/ui/inc/printfun.hxx
index 6a8e43fb2e7c..fd607975ff47 100644
--- a/sc/source/ui/inc/printfun.hxx
+++ b/sc/source/ui/inc/printfun.hxx
@@ -92,7 +92,7 @@ public:
Size aUserSize;
MapMode aUserMapMode;
- Paper ePaper;
+ Paper ePaper;
Orientation eOrientation;
USHORT nPaperBin;
};
diff --git a/sc/source/ui/view/printfun.cxx b/sc/source/ui/view/printfun.cxx
index 4324b610dd0b..d14a87ffe783 100644
--- a/sc/source/ui/view/printfun.cxx
+++ b/sc/source/ui/view/printfun.cxx
@@ -886,7 +886,7 @@ void ScPrintFunc::InitParam( const ScPrintOptions* pOptions )
if ( !aPageSize.Width() || !aPageSize.Height() )
{
DBG_ERROR("PageSize Null ?!?!?");
- aPageSize = SvxPaperInfo::GetPaperSize( SVX_PAPER_A4 );
+ aPageSize = SvxPaperInfo::GetPaperSize( PAPER_A4 );
}
pBorderItem = (const SvxBoxItem*) &pParamSet->Get(ATTR_BORDER);
@@ -2677,7 +2677,7 @@ void ScPrintFunc::ApplyPrintSettings()
aEnumSize.Width() = aEnumSize.Height();
aEnumSize.Height() = nTemp;
}
- Paper ePaper = SvxPaperInfo::GetSvPaper( aEnumSize, MAP_TWIP, TRUE );
+ Paper ePaper = SvxPaperInfo::GetSvxPaper( aEnumSize, MAP_TWIP, TRUE );
USHORT nPaperBin = ((const SvxPaperBinItem&)pParamSet->Get(ATTR_PAGE_PAPERBIN)).GetValue();
pPrinter->SetPaper( ePaper );