summaryrefslogtreecommitdiff
path: root/sc/source/filter
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2010-01-28 19:15:06 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2010-01-28 19:15:06 +0000
commit926e8449b3a50bf790e1e8049c6466e097421444 (patch)
tree66242aa1d76730f9e8e1b5ad0b3ea5b5cad658c6 /sc/source/filter
parent23f300a0f3b66df0dee0bca7e26d38d60cb8b5a2 (diff)
parentc4c825af22a19fa4aeb17c86df03256a081cb83a (diff)
koheidatapilot03: merge with DEV300_m60
Diffstat (limited to 'sc/source/filter')
-rw-r--r--sc/source/filter/excel/biffdump.cxx9864
-rw-r--r--sc/source/filter/excel/excel.cxx36
-rw-r--r--sc/source/filter/excel/impop.cxx11
-rw-r--r--sc/source/filter/excel/makefile.mk2
-rw-r--r--sc/source/filter/excel/read.cxx5
-rw-r--r--sc/source/filter/excel/xeformula.cxx2032
-rw-r--r--sc/source/filter/excel/xelink.cxx2
-rw-r--r--sc/source/filter/excel/xepivot.cxx3
-rw-r--r--sc/source/filter/excel/xestream.cxx7
-rw-r--r--sc/source/filter/excel/xicontent.cxx53
-rw-r--r--sc/source/filter/excel/xiroot.cxx12
-rw-r--r--sc/source/filter/excel/xistream.cxx164
-rw-r--r--sc/source/filter/excel/xistyle.cxx114
-rw-r--r--sc/source/filter/excel/xlformula.cxx569
-rw-r--r--sc/source/filter/excel/xlroot.cxx8
-rw-r--r--sc/source/filter/excel/xlstream.cxx52
-rw-r--r--sc/source/filter/excel/xltools.cxx42
-rw-r--r--sc/source/filter/ftools/fapihelper.cxx53
-rw-r--r--sc/source/filter/ftools/ftools.cxx6
-rw-r--r--sc/source/filter/inc/fapihelper.hxx6
-rw-r--r--sc/source/filter/inc/fdumper.hxx1520
-rw-r--r--sc/source/filter/inc/fdumperole.hxx186
-rw-r--r--sc/source/filter/inc/imp_op.hxx2
-rw-r--r--sc/source/filter/inc/xestream.hxx4
-rw-r--r--sc/source/filter/inc/xiroot.hxx6
-rw-r--r--sc/source/filter/inc/xistream.hxx62
-rw-r--r--sc/source/filter/inc/xistyle.hxx22
-rw-r--r--sc/source/filter/inc/xlcontent.hxx4
-rw-r--r--sc/source/filter/inc/xldumper.hxx683
-rw-r--r--sc/source/filter/inc/xlformula.hxx173
-rw-r--r--sc/source/filter/inc/xlroot.hxx8
-rw-r--r--sc/source/filter/inc/xlstream.hxx13
-rw-r--r--sc/source/filter/inc/xlstyle.hxx6
-rw-r--r--sc/source/filter/inc/xltools.hxx8
-rw-r--r--sc/source/filter/xml/XMLDDELinksContext.cxx15
-rw-r--r--sc/source/filter/xml/XMLExportIterator.cxx70
-rw-r--r--sc/source/filter/xml/XMLExportIterator.hxx8
-rw-r--r--sc/source/filter/xml/XMLStylesExportHelper.cxx4
-rw-r--r--sc/source/filter/xml/XMLTableShapeImportHelper.cxx39
-rw-r--r--sc/source/filter/xml/XMLTableShapeImportHelper.hxx2
-rw-r--r--sc/source/filter/xml/XMLTableShapeResizer.cxx6
-rw-r--r--sc/source/filter/xml/makefile.mk51
-rw-r--r--sc/source/filter/xml/sheetdata.cxx275
-rw-r--r--sc/source/filter/xml/xmlannoi.cxx10
-rw-r--r--sc/source/filter/xml/xmlannoi.hxx23
-rw-r--r--sc/source/filter/xml/xmlbodyi.cxx38
-rw-r--r--sc/source/filter/xml/xmlbodyi.hxx1
-rw-r--r--sc/source/filter/xml/xmlcelli.cxx18
-rw-r--r--sc/source/filter/xml/xmlcoli.cxx12
-rw-r--r--sc/source/filter/xml/xmlexprt.cxx844
-rw-r--r--sc/source/filter/xml/xmlexprt.hxx25
-rw-r--r--sc/source/filter/xml/xmlexternaltabi.cxx28
-rw-r--r--sc/source/filter/xml/xmlimprt.cxx50
-rw-r--r--sc/source/filter/xml/xmlimprt.hxx2
-rw-r--r--sc/source/filter/xml/xmlrowi.cxx11
-rw-r--r--sc/source/filter/xml/xmlstyli.cxx72
-rw-r--r--sc/source/filter/xml/xmlstyli.hxx30
-rw-r--r--sc/source/filter/xml/xmlsubti.cxx10
-rw-r--r--sc/source/filter/xml/xmltabi.cxx17
-rw-r--r--sc/source/filter/xml/xmltabi.hxx1
-rw-r--r--sc/source/filter/xml/xmlwrap.cxx87
61 files changed, 3380 insertions, 14107 deletions
diff --git a/sc/source/filter/excel/biffdump.cxx b/sc/source/filter/excel/biffdump.cxx
deleted file mode 100644
index c3478cf8cb50..000000000000
--- a/sc/source/filter/excel/biffdump.cxx
+++ /dev/null
@@ -1,9864 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: biffdump.cxx,v $
- * $Revision: 1.91 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_sc.hxx"
-#include "biffdump.hxx"
-
-#if EXC_INCL_DUMPER
-#include <tools/stream.hxx>
-#include <sfx2/docfile.hxx>
-#include <sfx2/objsh.hxx>
-#include <sot/storinfo.hxx>
-
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#include <rtl/math.hxx>
-#include "document.hxx"
-#include "global.hxx"
-#include "fprogressbar.hxx"
-#include "xlpivot.hxx"
-#include "xicontent.hxx"
-#include "imp_op.hxx"
-
-#define GETSTR(s) ByteString( s, RTL_TEXTENCODING_MS_1252 )
-
-static const sal_Char* __pHexPrefix = "0x";
-static const sal_Char* __pBinPrefix = "0b";
-static const sal_Char* pU = "UNKNOWN ";
-
-const sal_Char* Biff8RecDumper::pLevelPreString = " ";
-const sal_Char* Biff8RecDumper::pLevelPreStringNT = pLevelPreString + strlen( pLevelPreString );
-UINT32 Biff8RecDumper::nInstances = 0;
-sal_Char* Biff8RecDumper::pBlankLine = NULL;
-const UINT16 Biff8RecDumper::nLenBlankLine = 255;
-const UINT16 Biff8RecDumper::nRecCnt = 0x2020;
-UINT8* Biff8RecDumper::pCharType = NULL;
-UINT8* Biff8RecDumper::pCharVal = NULL;
-
-static const UINT16 nLevelInc = 1;
-
-static UINT16 nXFCount = 0;
-
-static UINT16 nSXLISize[2] = {0, 0}; // array size for SXLI records [rows/cols]
-static UINT16 nSXLIIndex = 0; // current index for SXLI records
-
-// ============================================================================
-
-namespace {
-
-// decimal --------------------------------------------------------------------
-
-inline void lclAppendDec( ByteString& rStr, sal_uInt8 nData )
-{
- rStr.Append( ByteString::CreateFromInt32( nData ) );
-}
-
-inline void lclAppendDec( ByteString& rStr, sal_Int8 nData )
-{
- rStr.Append( ByteString::CreateFromInt32( nData ) );
-}
-
-inline void lclAppendDec( ByteString& rStr, sal_uInt16 nData )
-{
- rStr.Append( ByteString::CreateFromInt32( nData ) );
-}
-
-inline void lclAppendDec( ByteString& rStr, sal_Int16 nData )
-{
- rStr.Append( ByteString::CreateFromInt32( nData ) );
-}
-
-inline void lclAppendDec( ByteString& rStr, sal_uInt32 nData )
-{
- rStr.Append( ByteString::CreateFromInt64( nData ) );
-}
-
-inline void lclAppendDec( ByteString& rStr, sal_Int32 nData )
-{
- rStr.Append( ByteString::CreateFromInt32( nData ) );
-}
-
-inline void lclAppendDec( ByteString& rStr, float fData )
-{
- rStr.Append( ByteString( ::rtl::math::doubleToString( fData, rtl_math_StringFormat_G, 15, '.', true ) ) );
-}
-
-inline void lclAppendDec( ByteString& rStr, double fData )
-{
- rStr.Append( ByteString( ::rtl::math::doubleToString( fData, rtl_math_StringFormat_G, 15, '.', true ) ) );
-}
-
-// hexadecimal ----------------------------------------------------------------
-
-void lclAppendHex( ByteString& rStr, sal_uInt8 nData, bool bPrefix = true )
-{
- static const sal_Char spcHexDigits[] = "0123456789ABCDEF";
- static const ByteString saPrefix( "0x" );
-
- if( bPrefix )
- rStr.Append( saPrefix );
- rStr.Append( spcHexDigits[ (nData >> 4) & 0x0F ] ).Append( spcHexDigits[ nData & 0x0F ] );
-}
-
-inline void lclAppendHex( ByteString& rStr, sal_Int8 nData, bool bPrefix = true )
-{
- lclAppendHex( rStr, static_cast< sal_uInt8 >( nData ), bPrefix );
-}
-
-void lclAppendHex( ByteString& rStr, sal_uInt16 nData, bool bPrefix = true )
-{
- lclAppendHex( rStr, static_cast< sal_uInt8 >( nData >> 8 ), bPrefix );
- lclAppendHex( rStr, static_cast< sal_uInt8 >( nData ), false );
-}
-
-inline void lclAppendHex( ByteString& rStr, sal_Int16 nData, bool bPrefix = true )
-{
- lclAppendHex( rStr, static_cast< sal_uInt16 >( nData ), bPrefix );
-}
-
-void lclAppendHex( ByteString& rStr, sal_uInt32 nData, bool bPrefix = true )
-{
- lclAppendHex( rStr, static_cast< sal_uInt16 >( nData >> 16 ), bPrefix );
- lclAppendHex( rStr, static_cast< sal_uInt16 >( nData ), false );
-}
-
-inline void lclAppendHex( ByteString& rStr, sal_Int32 nData, bool bPrefix = true )
-{
- lclAppendHex( rStr, static_cast< sal_uInt32 >( nData ), bPrefix );
-}
-
-inline void lclAppendHex( ByteString& rStr, double fData, bool bPrefix = true )
-{
- const sal_uInt32* pnData = reinterpret_cast< const sal_uInt32* >( &fData );
- lclAppendHex( rStr, pnData[ 0 ], bPrefix );
- lclAppendHex( rStr, pnData[ 1 ], false );
-}
-
-// others ---------------------------------------------------------------------
-
-void lclAppendGuid( ByteString& rStr, const XclGuid& rGuid )
-{
- lclAppendHex( rStr, SVBT32ToUInt32( rGuid.mpnData ), false );
- rStr.Append( '-' );
- lclAppendHex( rStr, SVBT16ToShort( rGuid.mpnData + 4 ), false );
- rStr.Append( '-' );
- lclAppendHex( rStr, SVBT16ToShort( rGuid.mpnData + 6 ), false );
- rStr.Append( '-' );
- lclAppendHex( rStr, rGuid.mpnData[ 8 ], false );
- lclAppendHex( rStr, rGuid.mpnData[ 9 ], false );
- rStr.Append( '-' );
- lclAppendHex( rStr, rGuid.mpnData[ 10 ], false );
- lclAppendHex( rStr, rGuid.mpnData[ 11 ], false );
- lclAppendHex( rStr, rGuid.mpnData[ 12 ], false );
- lclAppendHex( rStr, rGuid.mpnData[ 13 ], false );
- lclAppendHex( rStr, rGuid.mpnData[ 14 ], false );
- lclAppendHex( rStr, rGuid.mpnData[ 15 ], false );
-}
-
-} // namespace
-
-// ============================================================================
-
-static void __AddHexNibble( ByteString& r, UINT8 nVal )
-{
- const sal_Char pH[] = "0123456789ABCDEF";
-
- nVal &= 0x0F;
-
- r += pH[ nVal ];
-}
-
-
-static void __AddPureHex( ByteString& r, UINT8 nVal )
-{
- __AddHexNibble( r, nVal >> 4 );
- __AddHexNibble( r, nVal );
-}
-
-
-static void __AddHex( ByteString& r, UINT8 nVal )
-{
- r += __pHexPrefix;
- __AddHexNibble( r, nVal >> 4 );
- __AddHexNibble( r, nVal );
-}
-
-
-static void __AddPureHex( ByteString& r, UINT16 nVal )
-{
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 12 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 8 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 4 ) );
- __AddHexNibble( r, ( UINT8 ) nVal );
-}
-
-
-static void __AddHex( ByteString& r, UINT16 nVal )
-{
- r += __pHexPrefix;
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 12 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 8 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 4 ) );
- __AddHexNibble( r, ( UINT8 ) nVal );
-}
-
-
-static void __AddPureHex( ByteString& r, UINT32 nVal )
-{
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 28 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 24 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 20 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 16 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 12 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 8 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 4 ) );
- __AddHexNibble( r, ( UINT8 ) nVal );
-}
-
-
-static void __AddHex( ByteString& r, UINT32 nVal )
-{
- r += __pHexPrefix;
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 28 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 24 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 20 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 16 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 12 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 8 ) );
- __AddHexNibble( r, ( UINT8 ) ( nVal >> 4 ) );
- __AddHexNibble( r, ( UINT8 ) nVal );
-}
-
-
-static void __AddHex( ByteString& r, INT32 nVal )
-{
- __AddHex( r, (UINT32) nVal );
-}
-
-
-static void __AddPureBinNibble( ByteString& r, UINT8 nVal )
-{
- nVal <<= 4;
- for( int n = 4 ; n ; n-- )
- {
- r += ( nVal & 0x80 )? "1" : "0";
- nVal <<= 1;
- }
-}
-
-
-static void __AddPureBin( ByteString& r, UINT8 nVal )
-{
- __AddPureBinNibble( r, nVal >> 4 );
- r += " ";
- __AddPureBinNibble( r, nVal );
-}
-
-
-static void __AddPureBin( ByteString& r, UINT16 nVal )
-{
- const sal_Char* pIn = " ";
- __AddPureBin( r, ( UINT8 ) ( nVal >> 8 ) );
- r += pIn;
- __AddPureBin( r, ( UINT8 ) nVal );
-}
-
-
-static void __AddPureBin( ByteString& r, UINT32 nVal )
-{
- const sal_Char* pIn = " ";
- __AddPureBin( r, ( UINT8 ) ( nVal >> 24 ) );
- r += pIn;
- __AddPureBin( r, ( UINT8 ) ( nVal >> 16 ) );
- r += pIn;
- __AddPureBin( r, ( UINT8 ) ( nVal >> 8 ) );
- r += pIn;
- __AddPureBin( r, ( UINT8 ) nVal );
-}
-
-
-inline static void __AddDec( ByteString& r, UINT32 n )
-{
- sal_Char p[ 32 ];
- sprintf( p, "%u", n ); // #100211# - checked
- r += p;
-}
-
-
-inline static void __AddDec( ByteString& r, UINT16 n )
-{
- __AddDec( r, ( UINT32 ) n );
-}
-
-
-inline static void __AddDec( ByteString& r, UINT8 n )
-{
- __AddDec( r, ( UINT32 ) n );
-}
-
-
-inline static void __AddDec( ByteString& r, INT32 n )
-{
- sal_Char p[ 32 ];
- sprintf( p, "%d", n ); // #100211# - checked
- r += p;
-}
-
-
-inline static void __AddDec( ByteString& r, INT16 n )
-{
- __AddDec( r, ( INT32 ) n );
-}
-
-inline static void __AddDec( ByteString& r, sal_Int8 n )
-{
- __AddDec( r, ( INT32 ) n );
-}
-
-
-static void __AddDec( ByteString& r, UINT32 nVal, UINT16 nNumOfDig, sal_Char c = ' ' )
-{
- ByteString t;
- ByteString aVal;
- __AddDec( aVal, nVal );
- if( nNumOfDig > (UINT16) aVal.Len() )
- t.Fill( nNumOfDig - (UINT16) aVal.Len(), c );
- r += t;
- r += aVal;
-}
-
-
-inline static void __AddDec1616( ByteString& r, UINT32 n )
-{
- __AddDec( r, (UINT16)(n >> 16) );
- r += '.';
- __AddDec( r, (UINT16)(n & 0xFFFF) );
-}
-
-
-static void __AddDouble( ByteString& r, const double f )
-{
- r += ByteString( ::rtl::math::doubleToString( f, rtl_math_StringFormat_G, 15, '.', TRUE ) );
-}
-
-
-static inline void __AddRK( ByteString& rString, sal_Int32 nRKValue )
-{
- __AddDouble( rString, XclTools::GetDoubleFromRK( nRKValue ) );
-}
-
-
-inline static void __Add16p16( ByteString& r, UINT32 n )
-{
- __AddDouble( r, double(n) / 65536.0 );
-}
-
-
-static void lcl_AddRef( ByteString& rStr, sal_uInt16 nCol, sal_uInt16 nRow )
-{
- ScAddress aRef( static_cast< SCCOL >( nCol ), static_cast< SCROW >( nRow ), 0 );
- rStr.Append( GETSTR( aRef.GetColRowString() ) );
-}
-
-
-static void lcl_AddRangeRef( ByteString& rStr, sal_uInt16 nCol1, sal_uInt16 nRow1, sal_uInt16 nCol2, sal_uInt16 nRow2 )
-{
- lcl_AddRef( rStr, nCol1, nRow1 );
- if( (nCol1 != nCol2) || (nRow1 != nRow2) )
- {
- rStr.Append( ':' );
- lcl_AddRef( rStr, nCol2, nRow2 );
- }
-}
-
-
-static void __AddCellHead( ByteString& r, const UINT16 nC, const UINT16 nR, const UINT16 nXF )
-{
- lcl_AddRef( r, (UINT8) nC, nR );
- r += " (XF=";
- __AddDec( r, nXF );
- r += ')';
-}
-
-
-inline static void lcl_AddFlag(
- ByteString& rString, bool bFlag, const sal_Char* pcTrue = "true", const sal_Char* pcFalse = "false" )
-{
- rString += (bFlag ? pcTrue : pcFalse);
-}
-
-inline static void lcl_AddOnOff( ByteString& rString, bool bFlag )
-{
- lcl_AddFlag( rString, bFlag, "on", "off" );
-}
-
-
-static void lcl_AddEnum(
- ByteString& rString, long nValue, const sal_Char* const ppcEnums[], long nSize,
- const sal_Char* pcDefault = 0, long nOffset = 0 )
-{
- nValue -= nOffset;
- const sal_Char* pcText = "!unknown!";
- if( (0 <= nValue) && (nValue < nSize) && ppcEnums[ nValue ] )
- pcText = ppcEnums[ nValue ];
- else if( pcDefault )
- pcText = pcDefault;
- if( *pcText ) // nonempty string
- rString.Append( " (" ).Append( pcText ).Append( ')' );
-}
-
-
-namespace {
-
-void lclDumpString( SvStream& rOutStrm, const ByteString& rData )
-{
- ByteString aOutStr;
- xub_StrLen nIdx = 0;
- for( ; (nIdx < rData.Len()) && (aOutStr.Len() < 80); ++nIdx )
- {
- sal_Char cChar = rData.GetChar( nIdx );
- if( 32 <= cChar )
- aOutStr.Append( cChar );
- else
- {
- aOutStr.Append( '<' );
- __AddHex( aOutStr, static_cast< sal_uInt8 >( cChar ) );
- aOutStr.Append( '>' );
- }
- }
- rOutStrm << aOutStr.GetBuffer();
- if( nIdx < rData.Len() )
- rOutStrm << "<...>";
-}
-
-void lclDumpStringValue( SvStream& rOutStrm, const ByteString& rName, const ByteString& rData )
-{
- rOutStrm << rName.GetBuffer() << "='";
- lclDumpString( rOutStrm, rData );
- rOutStrm << '\'';
-}
-
-void lclDumpString( SvStream& rOutStrm, const String& rData )
-{
- ByteString aOutStr;
- xub_StrLen nIdx = 0;
- for( ; (nIdx < rData.Len()) && (aOutStr.Len() < 80); ++nIdx )
- {
- sal_Unicode cChar = rData.GetChar( nIdx );
- if( (32 <= cChar) && (cChar <= 255) )
- aOutStr.Append( static_cast< sal_Char >( cChar ) );
- else
- {
- aOutStr.Append( '<' );
- if( cChar < 256 )
- __AddHex( aOutStr, static_cast< sal_uInt8 >( cChar ) );
- else
- __AddHex( aOutStr, static_cast< sal_uInt16 >( cChar ) );
- aOutStr.Append( '>' );
- }
- }
- rOutStrm << aOutStr.GetBuffer();
- if( nIdx < rData.Len() )
- rOutStrm << "<...>";
-}
-
-void lclDumpStringValue( SvStream& rOutStrm, const ByteString& rName, const String& rData )
-{
- rOutStrm << rName.GetBuffer() << "='";
- lclDumpString( rOutStrm, rData );
- rOutStrm << '\'';
-}
-
-} // namespace
-
-
-IdRangeList::~IdRangeList()
-{
- Clear();
-}
-
-
-void IdRangeList::Clear( void )
-{
- IdRange* p = ( IdRange* ) First();
-
- while( p )
- {
- delete p;
- p = ( IdRange* ) Next();
- }
-
- List::Clear();
-}
-
-// ============================================================================
-//
-// H E L P E R O B J E C T S
-//
-// ============================================================================
-
-namespace {
-
-// ----------------------------------------------------------------------------
-
-class XclDumpStreamHeader
-{
-public:
- explicit XclDumpStreamHeader( SvStream& rInStrm, SvStream& rOutStrm, const String& rStrmName, const String& rStrmPath );
- ~XclDumpStreamHeader();
- inline ULONG GetStreamLen() const { return mnStrmLen; }
-
-private:
- SvStream& mrOutStrm;
- String maStrmName;
- String maStrmPath;
- ByteString maSeparator;
- ULONG mnStrmLen;
-};
-
-XclDumpStreamHeader::XclDumpStreamHeader( SvStream& rInStrm, SvStream& rOutStrm, const String& rStrmName, const String& rStrmPath ) :
- mrOutStrm( rOutStrm ),
- maStrmName( rStrmName ),
- maStrmPath( rStrmPath ),
- mnStrmLen( 0 )
-{
- maSeparator.Assign( '+' ).Expand( 78, '-' );
-
- rInStrm.Seek( STREAM_SEEK_TO_END );
- mnStrmLen = rInStrm.Tell();
- rInStrm.Seek( STREAM_SEEK_TO_BEGIN );
-
- ByteString aLine;
- lclAppendDec( aLine, mnStrmLen );
-
- mrOutStrm << maSeparator.GetBuffer() << "\n";
- mrOutStrm << "| STREAM-BEGIN\n";
- mrOutStrm << "| ";
- lclDumpStringValue( mrOutStrm, "stream-name", maStrmName );
- mrOutStrm << "\n| ";
- lclDumpStringValue( mrOutStrm, "stream-path", maStrmPath );
- mrOutStrm << "\n| stream-len=" << aLine.GetBuffer() << "\n";
- mrOutStrm << "|\n\n";
-}
-
-XclDumpStreamHeader::~XclDumpStreamHeader()
-{
- mrOutStrm << "|\n";
- mrOutStrm << "| ";
- lclDumpStringValue( mrOutStrm, "stream-name", maStrmName );
- mrOutStrm << "\n| ";
- lclDumpStringValue( mrOutStrm, "stream-path", maStrmPath );
- mrOutStrm << "\n";
- mrOutStrm << "| STREAM-END\n";
- mrOutStrm << maSeparator.GetBuffer() << "\n\n";
-}
-
-// ----------------------------------------------------------------------------
-
-class XclDumpStorageHeader
-{
-public:
- explicit XclDumpStorageHeader( SotStorage& rInStrg, SvStream& rOutStrm, const String& rStrgPath );
- ~XclDumpStorageHeader();
-
-private:
- SvStream& mrOutStrm;
- String maStrgName;
- String maStrgPath;
- ByteString maSeparator;
-};
-
-XclDumpStorageHeader::XclDumpStorageHeader( SotStorage& rInStrg, SvStream& rOutStrm, const String& rStrgPath ) :
- mrOutStrm( rOutStrm ),
- maStrgName( rInStrg.GetName() ),
- maStrgPath( rStrgPath )
-{
- maSeparator.Assign( "++" ).Expand( 78, '=' );
-
- mrOutStrm << maSeparator.GetBuffer() << "\n";
- mrOutStrm << "|| STORAGE-BEGIN\n";
- mrOutStrm << "|| ";
- lclDumpStringValue( mrOutStrm, "storage-name", maStrgName );
- mrOutStrm << "\n|| ";
- lclDumpStringValue( mrOutStrm, "storage-path", maStrgPath );
- mrOutStrm << "\n";
-
- SvStorageInfoList aInfoList;
- rInStrg.FillInfoList( &aInfoList );
- ByteString aLine;
- lclAppendDec( aLine, aInfoList.Count() );
- mrOutStrm << "|| directory-size=" << aLine.GetBuffer() << "\n";
-
- for( ULONG nInfo = 0; nInfo < aInfoList.Count(); ++nInfo )
- {
- SvStorageInfo& rInfo = aInfoList.GetObject( nInfo );
- mrOutStrm << "|| type=";
- if( rInfo.IsStream() )
- mrOutStrm << "stream ";
- else if( rInfo.IsStorage() )
- mrOutStrm << "storage ";
- else
- mrOutStrm << "unknown ";
- lclDumpStringValue( mrOutStrm, "name", rInfo.GetName() );
- mrOutStrm << "\n";
- }
-
- mrOutStrm << "||\n\n";
-}
-
-XclDumpStorageHeader::~XclDumpStorageHeader()
-{
- mrOutStrm << "||\n";
- mrOutStrm << "|| ";
- lclDumpStringValue( mrOutStrm, "storage-name", maStrgName );
- mrOutStrm << "\n|| ";
- lclDumpStringValue( mrOutStrm, "storage-path", maStrgPath );
- mrOutStrm << "\n";
- mrOutStrm << "|| STORAGE-END\n";
- mrOutStrm << maSeparator.GetBuffer() << "\n\n";
-}
-
-// ----------------------------------------------------------------------------
-
-}
-
-// ============================================================================
-//
-// ============================================================================
-
-void Biff8RecDumper::Print( const ByteString& r )
-{
- DBG_ASSERT( pDumpStream, "-Biff8RecDumper::Print(): Stream is wech!" );
- *pDumpStream << '\n' << pLevelPre;
- pDumpStream->Write( r.GetBuffer(), r.Len() );
-}
-
-
-void Biff8RecDumper::Print( const sal_Char* p )
-{
- DBG_ASSERT( pDumpStream, "-Biff8RecDumper::Print(): Stream is wech!" );
- DBG_ASSERT( p, "-Biff8RecDumper::Print(): ByteString is wech!" );
-
- *pDumpStream << '\n' << pLevelPre << p;
-}
-
-
-static const sal_Char* GetSeriesType( const UINT16 n )
-{
- const sal_Char* p;
-
- switch( n )
- {
- case 0: p = "(date) "; break;
- case 1: p = "(numeric) "; break;
- case 2: p = "(sequence)"; break;
- case 3: p = "(text) "; break;
- default: p = "(unknown) ";
- }
-
- return p;
-}
-
-
-static const sal_Char* GetLineType( const UINT16 n )
-{
- const sal_Char* p;
-
- switch( n )
- {
- case 0: p = "solid"; break;
- case 1: p = "dash"; break;
- case 2: p = "dot"; break;
- case 3: p = "dash-dot"; break;
- case 4: p = "dash-dot-dot"; break;
- case 5: p = "none"; break;
- case 6: p = "dark gray pattern"; break;
- case 7: p = "medium gray pattern"; break;
- case 8: p = "light gray pattern"; break;
- default: p = pU;
- }
-
- return p;
-}
-
-
-static ByteString GetRGB( const UINT32 n )
-{
- ByteString s;
-
- s += "R";
- __AddDec( s, ( UINT8 ) n );
- s += " G";
- __AddDec( s, ( UINT8 ) ( n >> 8 ) );
- s += " B";
- __AddDec( s, ( UINT8 ) ( n >> 16 ) );
-
- return s;
-}
-
-
-static void AddRef( ByteString& t, UINT16 nRow, UINT16 nC, BOOL bName, UINT16 nTab = 0xFFFF )
-{
- BOOL bColRel = ( nC & 0x4000 ) != 0;
- BOOL bRowRel = ( nC & 0x8000 ) != 0;
- UINT8 nCol = (UINT8) nC;
- INT8 nRelCol = (INT8) nCol;
- INT16 nRelRow = (INT16) nRow;
-
- if( nTab < 0xFFFF )
- {
- t += "XTI(";
- __AddDec( t, nTab );
- t += ")!";
- }
-
- if( bName )
- {
- // dump relative: [Column|Row]
- // [C-1,R-1] = one column left, one row up
- // [C+1,R+1] = one column right, one row down
- // [C,R] = same column/row
- // [C=B,R=2] = absolute column B/row 2
- t += "[C";
- if( bColRel )
- {
- if( nRelCol > 0 )
- t += '+';
- if( nRelCol != 0 )
- __AddDec( t, (INT16)nRelCol );
- }
- else
- {
- t += '=';
- t += GETSTR( ::ScScColToAlpha( nCol ) );
- }
-
- t += ",R";
- if( bRowRel )
- {
- if( nRelRow > 0 )
- t += "+";
- if( nRelRow != 0 )
- __AddDec( t, nRelRow );
- }
- else
- {
- t += '=';
- __AddDec( t, (INT32)nRow + 1 );
- }
- t += ']';
- }
- else
- {
- if( !bColRel )
- t += '$';
- t += GETSTR( ::ScColToAlpha( nCol ) );
- if( !bRowRel )
- t += '$';
- __AddDec( t, (UINT16)(nRow + 1) );
- }
-}
-
-static void AddRangeRef( ByteString& t, UINT16 nRow1, UINT16 nC1, UINT16 nRow2, UINT16 nC2, BOOL bName, UINT16 nTab = 0xFFFF )
-{
- AddRef( t, nRow1, nC1, bName, nTab );
- if( (nRow1 != nRow2) || (nC1 != nC2) )
- {
- t += ':';
- AddRef( t, nRow2, nC2, bName );
- }
-}
-
-
-
-static BOOL AddUNICODEString( ByteString& rStr, XclImpStream& rStrm, const BOOL b16BitLen = TRUE, UINT16 nLen = 0, ByteString* pRawName = 0 )
-{
- BOOL bRet = TRUE;
-
- if( !nLen )
- nLen = b16BitLen ? rStrm.ReaduInt16() : rStrm.ReaduInt8();
- UINT8 nGrbit = rStrm.ReaduInt8();
-
- UINT32 nExtLen;
- UINT16 nCrun;
- bool b16Bit, bFarEast, bRichString;
- rStrm.ReadUniStringExtHeader( b16Bit, bRichString, bFarEast, nCrun, nExtLen, nGrbit );
-
- rStr += "(l=";
- __AddDec( rStr, nLen );
- rStr += " f=";
- __AddHex( rStr, nGrbit );
- rStr += " ";
- rStr += b16Bit ? "16-Bit" : "8-Bit";
-
- if( bRichString && bFarEast )
- rStr += " rich far-east";
- else if( bRichString && !bFarEast )
- rStr += " rich";
- else if ( !bRichString && bFarEast )
- rStr += " far-east";
- rStr += ") '";
-
- ByteString aData( rStrm.ReadRawUniString( nLen, b16Bit ), RTL_TEXTENCODING_MS_1252 );
- if( pRawName ) *pRawName = aData;
-
- xub_StrLen nIndex = 0;
- while( (nIndex < aData.Len()) && (nIndex < 255) )
- {
- UINT8 nChar = (UINT8)aData.GetChar( nIndex );
- if( nChar < ' ' )
- {
- ByteString aIns( '<' );
- __AddHex( aIns, nChar );
- aIns += '>';
- aData.Erase( nIndex, 1 ).Insert( aIns, nIndex );
- nIndex += 5;
- }
- nIndex++;
- }
-
- rStr += aData.Copy( 0, 255 );
- rStr += '\'';
- if( aData.Len() > 255 )
- rStr += "...";
-
- if( nCrun )
- {
- rStr += " + ";
- __AddDec( rStr, nCrun );
- rStr += " format blocks (";
- nCrun *= 4;
- __AddDec( rStr, nCrun );
- rStr += " bytes)";
- rStrm.Ignore( nCrun );
- }
- if( nExtLen )
- {
- rStr += " + ";
- __AddDec( rStr, nExtLen );
- rStr += " byte extended:";
- for( sal_uInt32 nIdx = 0; rStrm.IsValid() && (nIdx < nExtLen); ++nIdx )
- {
- rStr.Append( ' ' );
- __AddPureHex( rStr, rStrm.ReaduInt8() );
- }
- }
-
- return bRet;
-}
-
-
-DUMP_ERR::~DUMP_ERR()
-{
- if( pHint )
- delete pHint;
-}
-
-
-
-
-#define Read1(rIn) (rIn).ReaduInt8()
-#define Read2(rIn) (rIn).ReaduInt16()
-#define Read4(rIn) (rIn).ReaduInt32()
-#define Read8(rIn) (rIn).ReadDouble()
-#define LINESTART() {t.Erase();t+=pPre;}
-#define IGNORE(n) rIn.Ignore(n)
-#define ADDBIN(n) __AddBin( t, Read##n( rIn ) )
-#define ADDHEX(n) __AddHex( t, Read##n( rIn ) )
-#define ADDDEC(n) __AddDec( t, Read##n( rIn ) )
-#define ADDDOUBLE() __AddDouble( t, rIn.ReadDouble() )
-#define ADD16P16() __Add16p16( t, Read4( rIn ) )
-#define ADDTEXT(T) t += T
-#define PRINT() Print( t )
-#define PreDump(LEN) {rIn.PushPosition();ContDump(LEN);rIn.PopPosition();}
-#define ADDCELLHEAD() {UINT16 nR,nC,nX;rIn>>nR>>nC>>nX;__AddCellHead(t,nC,nR,nX);}
-#define STARTFLAG() {ADDTEXT( "flags=" ); __AddHex( t, __nFlags ); ADDTEXT( " " );}
-#define ADDFLAG(mask,text) {if( __nFlags & mask ) t.Append( ' ' ).Append( text );}
-#define ADDRESERVED(mask) ADDFLAG(mask,"!RESERVED!")
-
-
-UINT16 Biff8RecDumper::DumpXF( XclImpStream& rStrm, const sal_Char* pPre )
-{
- ByteString t; // "t" needed by macros
-
- sal_uInt32 nBorder1, nBorder2;
- sal_uInt16 nFont, nNumFmt, nTypeProt, nAlign, nMiscAttrib, nArea, __nFlags, nTmp;
- rStrm >> nFont >> nNumFmt >> nTypeProt >> nAlign >> nMiscAttrib >> nBorder1 >> nBorder2 >> nArea;
- bool bCell = !::get_flag( nTypeProt, EXC_XF_STYLE );
-
- // XF type/parent
- LINESTART();
- ::extract_value( nTmp, nTypeProt, 4, 12 );
- ADDTEXT( "index=#" ); __AddDec( t, nXFCount++ );
- ADDTEXT( " type=" ); lcl_AddFlag( t, bCell, "cell", "style" );
- ADDTEXT( " parent-xf=#" ); __AddDec( t, nTmp );
- PRINT();
-
- // attribute used flags
- LINESTART();
- ::extract_value( __nFlags, nMiscAttrib, 10, 6 );
- if( !bCell ) __nFlags ^= 0x3F; // in style XFs a 0 means used
- ADDTEXT( "used " ); STARTFLAG();
- ADDFLAG( EXC_XF_DIFF_VALFMT, "numfmt" );
- ADDFLAG( EXC_XF_DIFF_FONT, "font" );
- ADDFLAG( EXC_XF_DIFF_ALIGN, "align" );
- ADDFLAG( EXC_XF_DIFF_BORDER, "border" );
- ADDFLAG( EXC_XF_DIFF_AREA, "area" );
- ADDFLAG( EXC_XF_DIFF_PROT, "prot" );
- PRINT();
-
- // cell protection/font/number format
- LINESTART();
- ADDTEXT( "cell-lock=" ); lcl_AddOnOff( t, ::get_flag( nTypeProt, EXC_XF_LOCKED ) );
- ADDTEXT( " hidden=" ); lcl_AddOnOff( t, ::get_flag( nTypeProt, EXC_XF_HIDDEN ) );
- ADDTEXT( " font=" ); __AddDec( t, nFont );
- ADDTEXT( " num-fmt=" ); __AddDec( t, nNumFmt );
- PRINT();
-
- // alignment
- LINESTART();
- ::extract_value( nTmp, nAlign, 0, 3 );
- ADDTEXT( "hor-align=" ); __AddDec( t, nTmp );
- ADDTEXT( " (" );
- switch( nTmp )
- {
- case EXC_XF_HOR_GENERAL: ADDTEXT( "general" ); break;
- case EXC_XF_HOR_LEFT: ADDTEXT( "left" ); break;
- case EXC_XF_HOR_CENTER: ADDTEXT( "center" ); break;
- case EXC_XF_HOR_RIGHT: ADDTEXT( "right" ); break;
- case EXC_XF_HOR_FILL: ADDTEXT( "fill" ); break;
- case EXC_XF_HOR_JUSTIFY: ADDTEXT( "justify" ); break;
- case EXC_XF_HOR_CENTER_AS: ADDTEXT( "center-as" ); break;
- case EXC_XF_HOR_DISTRIB: ADDTEXT( "distrib" ); break;
- default: ADDTEXT( "!unknown!" );
- };
- ::extract_value( nTmp, nAlign, 4, 3 );
- ADDTEXT( ") ver-align=" ); __AddDec( t, nTmp );
- ADDTEXT( " (" );
- switch( nTmp )
- {
- case EXC_XF_VER_TOP: ADDTEXT( "top" ); break;
- case EXC_XF_VER_CENTER: ADDTEXT( "center" ); break;
- case EXC_XF_VER_BOTTOM: ADDTEXT( "bottom" ); break;
- case EXC_XF_VER_JUSTIFY: ADDTEXT( "justify" ); break;
- case EXC_XF_VER_DISTRIB: ADDTEXT( "distrib" ); break;
- default: ADDTEXT( "!unknown!" );
- };
- ADDTEXT( ") text-wrap=" ); lcl_AddOnOff( t, ::get_flag( nAlign, EXC_XF_LINEBREAK ) );
- PRINT();
-
- LINESTART();
- ::extract_value( nTmp, nAlign, 8, 8 );
- ADDTEXT( "rotation=" ); __AddDec( t, nTmp );
- ADDTEXT( " (" );
- if( nTmp < 91 )
- { __AddDec( t, nTmp ); ADDTEXT( "\xB0" ); }
- else if( nTmp < 181 )
- { __AddDec( t, static_cast< sal_Int32 >( 90 - nTmp ) ); ADDTEXT( "\xB0" ); }
- else if( nTmp == EXC_ROT_STACKED )
- { ADDTEXT( "stacked" ); }
- else
- { ADDTEXT( "!unknown!" ); }
- ::extract_value( nTmp, nMiscAttrib, 0, 4 );
- ADDTEXT( ") indent=" ); __AddDec( t, nTmp );
- ADDTEXT( " shrink=" ); lcl_AddOnOff( t, ::get_flag( nMiscAttrib, EXC_XF8_SHRINK ) );
- ::extract_value( nTmp, nMiscAttrib, 6, 2 );
- ADDTEXT( " text-dir=" ); __AddDec( t, nTmp );
- ADDTEXT( " (" );
- switch( nTmp )
- {
- case EXC_XF_TEXTDIR_CONTEXT: ADDTEXT( "context" ); break;
- case EXC_XF_TEXTDIR_LTR: ADDTEXT( "ltr" ); break;
- case EXC_XF_TEXTDIR_RTL: ADDTEXT( "rtl" ); break;
- default: ADDTEXT( "!unknown!" );
- };
- ADDTEXT( ")" );
- PRINT();
-
- // border/area
- LINESTART();
- ::extract_value( nTmp, nBorder1, 0, 4 );
- ADDTEXT( "left-line=" ); __AddDec( t, nTmp );
- ::extract_value( nTmp, nBorder1, 16, 7 );
- ADDTEXT( " color=" ); __AddDec( t, nTmp );
- ::extract_value( nTmp, nBorder1, 4, 4 );
- ADDTEXT( " right-line =" ); __AddDec( t, nTmp );
- ::extract_value( nTmp, nBorder1, 23, 7 );
- ADDTEXT( " color=" ); __AddDec( t, nTmp );
- PRINT();
- LINESTART();
- ::extract_value( nTmp, nBorder1, 8, 4 );
- ADDTEXT( "top-line =" ); __AddDec( t, nTmp );
- ::extract_value( nTmp, nBorder2, 0, 7 );
- ADDTEXT( " color=" ); __AddDec( t, nTmp );
- ::extract_value( nTmp, nBorder1, 12, 4 );
- ADDTEXT( " bottom-line=" ); __AddDec( t, nTmp );
- ::extract_value( nTmp, nBorder2, 7, 7 );
- ADDTEXT( " color=" ); __AddDec( t, nTmp );
- PRINT();
- LINESTART();
- ::extract_value( nTmp, nBorder2, 21, 4 );
- ADDTEXT( "diag-line=" ); __AddDec( t, nTmp );
- ::extract_value( nTmp, nBorder2, 14, 7 );
- ADDTEXT( " color=" ); __AddDec( t, nTmp );
- ADDTEXT( " diag-tl-to-br=" ); lcl_AddOnOff( t, ::get_flag( nBorder1, 0x40000000UL ) );
- ADDTEXT( " diag-bl-to-tr=" ); lcl_AddOnOff( t, ::get_flag( nBorder1, 0x80000000UL ) );
- PRINT();
- LINESTART();
- ::extract_value( nTmp, nBorder2, 26, 6 );
- ADDTEXT( "area-pattern=" ); __AddDec( t, nTmp );
- ::extract_value( nTmp, nArea, 0, 7 );
- ADDTEXT( " fore-color=" ); __AddDec( t, nTmp );
- ::extract_value( nTmp, nArea, 7, 7 );
- ADDTEXT( " back-color=" ); __AddDec( t, nTmp );
- PRINT();
-
- return 0;
-}
-
-void Biff8RecDumper::DumpValidPassword( XclImpStream& rIn, const sal_Char* pPre )
-{
- ByteString t;
- UINT16 nHash;
- rIn >> nHash;
- LINESTART();
- ADDTEXT( "hash=" );
- __AddHex( t, nHash );
- if( nHash )
- {
- ByteString sPasswd;
- ByteString sDummy;
- UINT16 nLen = 9;
- UINT16 nDummy;
- UINT16 nNewChar;
-
- nHash ^= 0xCE4B;
- nDummy = nHash;
- ADDTEXT( " without-mask=" );
- __AddHex( t, nHash );
- while( !(nDummy & 0x8000) && nLen )
- {
- nLen--;
- nDummy <<= 1;
- }
- if( !nLen ) nLen = 2;
- if( (nLen ^ nHash) & 0x0001 ) nLen++;
- if( nLen == 9 )
- {
- nLen = 10;
- nHash ^= 0x8001;
- }
- nHash ^= nLen;
- if( nLen < 9 ) nHash <<= (8 - nLen);
- for( UINT16 iChar = nLen; iChar > 0; iChar-- )
- {
- switch( iChar )
- {
- case 10:
- nNewChar = (nHash & 0xC000) | 0x0400;
- nHash ^= nNewChar;
- nNewChar >>= 2;
- break;
- case 9:
- nNewChar = 0x4200;
- nHash ^= nNewChar;
- nNewChar >>= 1;
- break;
- case 1:
- nNewChar = nHash & 0xFF00;
- break;
- default:
- nNewChar = (nHash & 0xE000) ^ 0x2000;
- if( !nNewChar ) nNewChar = (nHash & 0xF000) ^ 0x1800;
- if( nNewChar == 0x6000 ) nNewChar = 0x6100;
- nHash ^= nNewChar;
- nHash <<= 1;
- break;
- }
- nNewChar >>= 8;
- nNewChar &= 0x00FF;
- sDummy = sPasswd;
- sPasswd = (sal_Char) nNewChar;
- sPasswd += sDummy;
- }
- ADDTEXT( " valid-password='" );
- t += sPasswd;
- ADDTEXT( "'" );
- }
- PRINT();
-}
-
-
-void __AddGUID( ByteString& rStr, XclImpStream& rIn )
-{
- UINT16 nIndex;
- __AddPureHex( rStr, Read4( rIn ) );
- rStr += "-";
- __AddPureHex( rStr, Read2( rIn ) );
- rStr += "-";
- __AddPureHex( rStr, Read2( rIn ) );
- rStr += "-";
- // last 2 parts byte for byte
- for( nIndex = 0; nIndex < 2; nIndex++ )
- __AddPureHex( rStr, Read1( rIn ) );
- rStr += "-";
- for( nIndex = 0; nIndex < 6; nIndex++ )
- __AddPureHex( rStr, Read1( rIn ) );
-}
-
-
-void Biff8RecDumper::PreDumpDecrypted( ULONG nL )
-{
- if( !nL ) return;
-
- ByteString t;
- const sal_Char* pPre = (pLevelPre > pLevelPreString) ? pLevelPre - 1 : pLevelPre;
-
- LINESTART();
- ADDTEXT( "*** encrypted ***" );
- PRINT();
- pIn->DisableDecryption();
- pIn->Seek( EXC_REC_SEEK_TO_BEGIN );
- ContDump( nL );
-
- if( pIn->HasValidDecrypter() )
- {
- LINESTART();
- ADDTEXT( "*** decrypted ***" );
- PRINT();
- pIn->EnableDecryption();
- pIn->Seek( EXC_REC_SEEK_TO_BEGIN );
- ContDump( nL );
- }
-}
-
-
-void Biff8RecDumper::RecDump( BOOL bSubStream )
-{
- const sal_Char* p;
- BOOL bDec = FALSE;
- ByteString aTmp;
- UINT16 __nFlags;
- const UINT16 nR = pIn->GetRecId();
- const ByteString* pName = GetName( nR );
-
- // set CONTINUE handling mode
- switch( nR )
- {
- case 0x000A: // EOF
- case 0x003C: // CONT
- case 0x005D: // OBJ
- case 0x00EC: // MSODRAWING
- case 0x01B6: // TXO
- pIn->ResetRecord( false );
- break;
- case 0x1066: // CHGELFRAME
- pIn->ResetRecord( bReadContRecs, 0x1066 );
- break;
- default:
- pIn->ResetRecord( bReadContRecs );
- }
- const ULONG nL = pIn->GetRecSize();
-
- switch( nR )
- {
- case 0x0009:
- case 0x0209:
- case 0x0409:
- case 0x0809:
- nLevelCnt = 0;
- break;
- case 0x1033:
- if( pName )
- aTmp = *pName;
- else
- aTmp = "BEGIN ";
- bDec = ( pLevelPre + nLevelInc ) >= pLevelPreString;
- nLevelCnt++;
- aTmp.Append( ByteString::CreateFromInt32( nLevelCnt ) );
- pName = &aTmp;
- break;
- case 0x1034:
- if( pName )
- aTmp = *pName;
- else
- aTmp = "END ";
- if( ( pLevelPre + nLevelInc ) <= pLevelPreStringNT )
- pLevelPre += nLevelInc;
- if( nLevelCnt )
- {
- aTmp.Append( ByteString::CreateFromInt32( nLevelCnt ) );
- nLevelCnt--;
- }
- else
- aTmp += "#LEVEL ERROR#";
- pName = &aTmp;
- break;
- }
-
- ByteString aT;
- ByteString& t = aT;
- const sal_Char* pPre = (pLevelPre > pLevelPreString) ? pLevelPre - 1 : pLevelPre;
-
- if( nR || nL ) // skip dummy-zero DIMENSIONS at eof
- {
- if( bBlankLine )
- *pDumpStream << '\n';
-
- aT += pLevelPre;
- __AddHex( aT, nR );
-
- if( pName )
- {
- aT += " (";
- aT += *pName;
- aT += ") [";
- }
- else
- aT += " [";
-
- if( bReadContRecs )
- __AddHex( aT, nL );
- else
- __AddHex( aT, (UINT16)nL );
- aT += "]";
- if( !bSkipOffset )
- {
- aT += " :";
- __AddHex( aT, UINT32(pIn->GetSvStreamPos() - 2 * sizeof(UINT16)) );
- aT += ':';
- }
-
- Print( aT );
- }
-
- if( HasModeNameOnly( nR ) )
- ;
- else if( HasModeHex( nR ) || !bBIFF8 )
- {
- if( bEncrypted )
- PreDumpDecrypted( nL );
- else
- ContDump( nL );
- }
- else if( nMaxBodyLines && nL )
- {
- XclImpStream& rIn = *pIn;
-
- if( bEncrypted )
- {
- PreDumpDecrypted( nL );
- LINESTART();
- ADDTEXT( "*** contents ***" );
- PRINT();
- pIn->Seek( EXC_REC_SEEK_TO_BEGIN );
- }
-
- LINESTART();
-
- switch( nR )
- {
- case 0x0000: // DIMENSIONS - used area
- case 0x0200:
- {
- LINESTART();
- UINT32 nR1, nR2;
- UINT16 nC1, nC2;
- rIn >> nR1 >> nR2 >> nC1 >> nC2;
- ADDTEXT( "first row: " ); __AddHex( t, nR1 );
- ADDTEXT( " last row+1: " ); __AddHex( t, nR2 );
- ADDTEXT( " first col: " ); __AddHex( t, nC1 );
- ADDTEXT( " last col+1: " ); __AddHex( t, nC2 );
- ADDTEXT( " (" ); lcl_AddRangeRef( t, nC1, (UINT16)nR1, nC2-1, (UINT16)nR2-1 );
- ADDTEXT( ")" );
- PRINT();
- }
- break;
- case 0x06:
- {
- ADDCELLHEAD();
- PRINT();
- LINESTART();
- ADDTEXT( "val = " );
- ADDDOUBLE();
- rIn >> __nFlags;
- if( __nFlags )
- {
- ADDTEXT( " " );
- STARTFLAG();
- ADDFLAG( 0x01, "fAlwaysCalc" );
- ADDFLAG( 0x02, "fCalcOnLoad" );
- ADDFLAG( 0x08, "fShrFmla" );
- }
- PRINT();
- LINESTART();
- UINT16 n;
- ADDTEXT( "chn = " );
- ADDHEX( 4 );
- rIn >> n;
- ADDTEXT( " cce = " );
- __AddDec( t, n );
- PRINT();
- FormulaDump( n, FT_CellFormula );
- if( rIn.GetRecLeft() > 0 )
- {
- LINESTART();
- ADDTEXT( "additional formula data" );
- PRINT();
- ContDump( rIn.GetRecLeft() );
- }
- }
- break;
- case 0x0013: // PASSWORD
- DumpValidPassword( rIn, pPre );
- break;
- case 0x0014: // HEADER
- case 0x0015: // FOOTER
- if( rIn.GetRecLeft() )
- AddUNICODEString( t, rIn );
- PRINT();
- break;
- case 0x17:
- {
- if( mnSubstream == EXC_BOF_WORKSPACE )
- {
- ADDTEXT( "filename=" );
- AddUNICODEString( t, rIn );
- PRINT();
- }
- else
- {
- UINT16 n;
- rIn >> n;
- ADDTEXT( "# of XTI: " );
- __AddDec( t, n );
- PRINT();
- UINT16 nSB, nF, nL;
- while( n && rIn.IsValid() )
- {
- LINESTART();
- rIn >> nSB >> nF >> nL;
- ADDTEXT( "Supbook = " );
- __AddDec( t, nSB );
- ADDTEXT( " Tab = " );
- __AddDec( t, nF );
- ADDTEXT( " ... " );
- __AddDec( t, nL );
- PRINT();
- n--;
- }
- }
- }
- break;
- case 0x0018:
- case 0x0218: // NAME
- {
- sal_uInt8 nKey, nNameLen, nMenuLen, nDescrLen, nHelpLen, nStatusLen;
- sal_uInt16 nFmlaSize, nRes, nTab;
-
- rIn >> __nFlags >> nKey >> nNameLen >> nFmlaSize >> nRes >> nTab >> nMenuLen >> nDescrLen >> nHelpLen >> nStatusLen;
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fHidden" );
- ADDFLAG( 0x0002, "fFunc" );
- ADDFLAG( 0x0004, "fVBProc" );
- ADDFLAG( 0x0008, "fProc" );
- ADDFLAG( 0x0010, "fCalcExp" );
- ADDFLAG( 0x0020, "fBuiltIn" );
- ADDFLAG( 0x1000, "fBig" );
- ADDRESERVED( 0xE000 );
- ADDTEXT( " func-group-idx=" );
- __AddDec( t, (UINT16)((__nFlags & 0x0FC0) >> 6) );
- ADDTEXT( " shortcut=" ); __AddHex( t, nKey );
- PRINT();
-
- LINESTART();
- ADDTEXT( "fmla-size=" ); __AddDec( t, nFmlaSize );
- ADDTEXT( " reserved=" ); __AddHex( t, nRes );
- ADDTEXT( " tab=" ); __AddDec( t, nTab );
- if( !nTab ) ADDTEXT( " (global)" );
- PRINT();
-
- LINESTART();
- sal_uInt16 nBuiltIn = 0;
- bool bBuiltIn = (nNameLen == 1) && (__nFlags & 0x0020);
- if( bBuiltIn )
- {
- rIn.PushPosition();
- sal_uInt8 nStrFlags;
- rIn >> nStrFlags;
- nBuiltIn = (nStrFlags & 1) ? rIn.ReaduInt16() : rIn.ReaduInt8();
- rIn.PopPosition();
- }
- ADDTEXT( "name=" );
- ByteString aName;
- AddUNICODEString( t, rIn, false, nNameLen, &aName );
- if( bBuiltIn )
- {
- static const sal_Char* const ppcNames[] = {
- "Consolidate_Area", "Auto_Open", "Auto_Close", "Extract", "Database",
- "Criteria", "Print_Area", "Print_Titles", "Recorder", "Data_Form",
- "Auto_Activate", "Auto_Deactivate", "Sheet_Title", "_FilterDatabase" };
- lcl_AddEnum( t, nBuiltIn, ppcNames, STATIC_TABLE_SIZE( ppcNames ) );
- if( (0 <= nBuiltIn) && (nBuiltIn < STATIC_TABLE_SIZE( ppcNames )) )
- aName.Assign( ppcNames[ nBuiltIn ] );
- }
- maNames.push_back( aName );
- PRINT();
-
- if( nFmlaSize && (rIn.GetRecLeft() > 0) )
- {
- LINESTART();
- ADDTEXT( "name-definition=" );
- PRINT();
- FormulaDump( nFmlaSize, FT_RangeName );
- }
- if( nMenuLen )
- {
- LINESTART();
- ADDTEXT( "menu-text=" );
- AddUNICODEString( t, rIn, false, nMenuLen );
- PRINT();
- }
- if( nDescrLen )
- {
- LINESTART();
- ADDTEXT( "descr-text=" );
- AddUNICODEString( t, rIn, false, nDescrLen );
- PRINT();
- }
- if( nHelpLen )
- {
- LINESTART();
- ADDTEXT( "help-text=" );
- AddUNICODEString( t, rIn, false, nHelpLen );
- PRINT();
- }
- if( nStatusLen )
- {
- LINESTART();
- ADDTEXT( "status-text=" );
- AddUNICODEString( t, rIn, false, nStatusLen );
- PRINT();
- }
- }
- break;
- case 0x001D: // SELECTION - list of selections
- {
- ADDTEXT( "pane: " ); ADDDEC( 1 );
- ADDTEXT( " active cell: " );
- UINT16 nR, nC;
- rIn >> nR >> nC;
- lcl_AddRef( t, nC, nR );
- ADDTEXT( " active index: " ); ADDDEC( 2 );
- ADDTEXT( " ref count: " );
- UINT16 nCount;
- rIn >> nCount;
- __AddDec( t, nCount );
- PRINT();
- for( UINT16 nIndex = 0; nIndex < nCount && rIn.IsValid(); nIndex++ )
- {
- LINESTART();
- UINT16 nR1, nR2;
- UINT8 nC1, nC2;
- rIn >> nR1 >> nR2 >> nC1 >> nC2;
- ADDTEXT( "ref#" ); __AddDec( t, nIndex, 3 );
- ADDTEXT( ": " ); lcl_AddRangeRef( t, nC1, nR1, nC2, nR2 );
- PRINT();
- }
- }
- break;
- case 0x0023: // EXTERNNAME
- {
- PreDump( rIn.GetRecSize() );
- rIn >> __nFlags;
- STARTFLAG();
- ADDFLAG( 0x0001, "builtin" );
- ADDFLAG( 0x0002, "automatic" );
- ADDFLAG( 0x0004, "wantcliprepr" );
- ADDFLAG( 0x0008, "DDEstddocname" );
- ADDFLAG( 0x0010, "OLE" );
- ADDRESERVED( 0x8000 );
- sal_uInt16 nClip = (__nFlags & 0x7FE0) >> 5;
- ADDTEXT( " clip-format=" ); __AddHex( t, nClip );
- PRINT(); LINESTART();
- bool bFormula = false, bArray = false;
- if( (__nFlags & 0x0001) || !(__nFlags & 0x7FFE) )
- {
- ADDTEXT( "type=external name" );
- ADDTEXT( " table=" ); ADDDEC( 2 );
- ADDTEXT( " reserved=" ); ADDHEX( 2 );
- bFormula = true;
- }
- else if( __nFlags & 0x0010 )
- {
- ADDTEXT( "type=OLE" );
- ADDTEXT( " stream-id=" ); ADDHEX( 4 );
- }
- else
- {
- ADDTEXT( "type=DDE" );
- ADDTEXT( " reserved=" ); ADDHEX( 4 );
- bArray = true;
- }
- PRINT(); LINESTART();
- ADDTEXT( "name=" ); AddUNICODEString( t, rIn, FALSE );
- PRINT();
- if( rIn.GetRecLeft() > 0 )
- {
- LINESTART();
- if( bFormula )
- {
- sal_uInt16 nSize = rIn.ReaduInt16();
- ADDTEXT( "formula (size=" ); __AddDec( t, nSize );
- ADDTEXT( "):" );
- PRINT();
- FormulaDump( nSize, FT_RangeName );
- }
- else if( bArray && (rIn.GetRecLeft() >= 3) )
- {
- LINESTART();
- ADDTEXT( "constant array width=" ); ADDDEC( 1 );
- ADDTEXT( " height=" ); ADDDEC( 2 );
- PRINT();
- while( rIn.GetRecLeft() > 0 )
- {
- sal_uInt8 nType = rIn.ReaduInt8();
- LINESTART();
- ADDTEXT( "type=" ); __AddHex( t, nType );
- ADDTEXT( " (" );
- switch( nType )
- {
- case 0x00:
- ADDTEXT( "empty) reserved=" ); ADDHEX( 4 );
- ADDTEXT( " " ); ADDHEX( 4 );
- break;
- case 0x01:
- ADDTEXT( "double) value=" ); ADDDOUBLE();
- break;
- case 0x02:
- ADDTEXT( "string) text=" ); AddUNICODEString( t, rIn );
- break;
- case 0x04:
- ADDTEXT( "bool) value=" ); lcl_AddFlag( t, rIn.ReaduInt8() );
- ADDTEXT( " reserved=" ); ADDHEX( 1 );
- ADDTEXT( " " ); ADDHEX( 2 );
- ADDTEXT( " " ); ADDHEX( 4 );
- break;
- case 0x10:
- ADDTEXT( "error) code=" ); ADDHEX( 1 );
- ADDTEXT( " reserved=" ); ADDHEX( 1 );
- ADDTEXT( " " ); ADDHEX( 2 );
- ADDTEXT( " " ); ADDHEX( 4 );
- break;
- default:
- ADDTEXT( "!unknown!)" );
- rIn.Ignore( 8 );
- }
- PRINT();
- }
- }
- if( rIn.GetRecLeft() > 0 )
- {
- LINESTART();
- ADDTEXT( "additional data:" );
- PRINT();
- ContDump( rIn.GetRecLeft() );
- }
- }
- }
- break;
- case 0x0026:
- case 0x0027:
- case 0x0028:
- case 0x0029:
- LINESTART();
- ADDDOUBLE();
- PRINT();
- break;
- case 0x002F: // FILEPASS
- {
- LINESTART();
- sal_uInt16 nType;
- rIn >> nType;
- ADDTEXT( "encrypt-type=" ); __AddHex( t, nType );
- ADDTEXT( " (" );
- switch( nType )
- {
- case 0x0000:
- {
- ADDTEXT( "BIFF2-BIFF7 XOR) key=" );
- ADDHEX( 2 );
- ADDTEXT( " hash=" );
- ADDHEX( 2 );
- PRINT();
- }
- break;
-
- case 0x0001:
- {
- ADDTEXT( "BIFF8 standard/strong)" );
- PRINT();
- LINESTART();
- ADDTEXT( "reserved=" ); ADDHEX( 2 );
- sal_uInt16 nMode;
- rIn >> nMode;
- ADDTEXT( " mode=" ); __AddHex( t, nMode );
- ADDTEXT( " (" );
- switch( nMode )
- {
- case 0x0001:
- {
- ADDTEXT( "BIFF8 standard)" );
- PRINT();
- LINESTART();
- ADDTEXT( "document-id=..." );
- PRINT();
- ContDump( 16 );
- LINESTART();
- ADDTEXT( "salt-data=..." );
- PRINT();
- ContDump( 16 );
- LINESTART();
- ADDTEXT( "salt-hash=..." );
- PRINT();
- ContDump( 16 );
- }
- break;
- case 0x0002:
- {
- ADDTEXT( "BIFF8X strong) flags=" );
- ADDHEX( 4 );
- PRINT();
- LINESTART();
- ADDTEXT( "info-size=" ); ADDHEX( 4 );
- ADDTEXT( " flags=" ); ADDHEX( 4 );
- ADDTEXT( " unknown=" ); ADDHEX( 4 );
- PRINT();
- LINESTART();
- ADDTEXT( "stream-crypt-id=" ); ADDHEX( 4 );
- ADDTEXT( " hash-algo-id=" ); ADDHEX( 4 );
- ADDTEXT( " hash-key-len=" ); ADDDEC( 4 );
- PRINT();
- LINESTART();
- ADDTEXT( "crypt-prov-type=" ); ADDHEX( 4 );
- ADDTEXT( " unknown=" ); ADDHEX( 4 );
- ADDTEXT( " unknown=" ); ADDHEX( 4 );
- PRINT();
- LINESTART();
- ADDTEXT( "crypt-provider-name='" );
- sal_uInt16 nChar;
- do
- {
- rIn >> nChar;
- if( nChar )
- t += (sal_Char)(((32 <= nChar) && (nChar <=127)) ? nChar : '.');
- }
- while( nChar );
- ADDTEXT( "'" );
- PRINT();
- LINESTART();
- sal_uInt32 nLen;
- rIn >> nLen;
- ADDTEXT( "*** document-id *** len=" ); __AddHex( t, nLen );
- PRINT();
- ContDump( nLen );
- LINESTART();
- ADDTEXT( "*** salt-data *** len=" ); __AddHex( t, nLen );
- PRINT();
- ContDump( nLen );
- LINESTART();
- rIn >> nLen;
- ADDTEXT( "*** salt-hash *** len=" ); __AddHex( t, nLen );
- PRINT();
- ContDump( nLen );
- }
- break;
- default:
- {
- ADDTEXT( "!unknown!)" );
- PRINT();
- ContDump( rIn.GetRecLeft() );
- }
- }
- }
- break;
-
- default:
- {
- ADDTEXT( "!unknown!)" );
- PRINT();
- ContDump( rIn.GetRecLeft() );
- }
- }
- }
- break;
- case 0x0031: // FONT
- case 0x0231:
- {
- LINESTART();
- ADDTEXT( "(index=" ); __AddDec( t, nFontIndex );
- ADDTEXT( ") " );
- nFontIndex++; if( nFontIndex == 4 ) nFontIndex++;
- ADDTEXT( "height: " ); ADDDEC( 2 );
- ADDTEXT( "/20pt " );
- rIn >> __nFlags;
- STARTFLAG();
- ADDFLAG( 0x0002, "fItalic" );
- ADDFLAG( 0x0008, "fStrikeout" );
- ADDFLAG( 0x0010, "fOutline" );
- ADDFLAG( 0x0020, "fShadow" );
- ADDRESERVED( 0xFFC5 );
- PRINT();
- LINESTART();
- ADDTEXT( "color: " ); ADDDEC( 2 );
- ADDTEXT( " boldness: " ); ADDDEC( 2 );
- ADDTEXT( " sub/sup: " ); ADDDEC( 2 );
- ADDTEXT( " underline: " ); ADDHEX( 1 );
- PRINT();
- LINESTART();
- ADDTEXT( "family: " ); ADDDEC( 1 );
- ADDTEXT( " charset: " ); ADDDEC( 1 );
-// ADDTEXT( " reserved: " ); ADDHEX( 1 );
- rIn.Ignore( 1 );
- ADDTEXT( " " );
- AddUNICODEString( t, rIn, FALSE );
- PRINT();
- }
- break;
- case 0x003D: // WINDOW1
- {
- LINESTART();
- ADDTEXT( "pos-x=" ); ADDDEC( 2 );
- ADDTEXT( " pos-y=" ); ADDDEC( 2 );
- ADDTEXT( " width=" ); ADDDEC( 2 );
- ADDTEXT( " height=" ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- rIn >> __nFlags;
- STARTFLAG();
- ADDFLAG( 0x0001, "hide-window" );
- ADDFLAG( 0x0002, "min-window" );
- ADDFLAG( 0x0008, "show-hscroll" );
- ADDFLAG( 0x0010, "show-vscroll" );
- ADDFLAG( 0x0020, "show-tabbar" );
- ADDRESERVED( 0xFFC4 );
- PRINT();
- LINESTART();
- ADDTEXT( "active-tab=" ); ADDDEC( 2 );
- ADDTEXT( " first-vis-tab=" ); ADDDEC( 2 );
- ADDTEXT( " selected-tabs=" ); ADDDEC( 2 );
- ADDTEXT( " tabbar-width=" ); ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x0041: // PANE
- {
- LINESTART();
- ADDTEXT( "vert-split-pos=" ); ADDDEC( 2 );
- ADDTEXT( " hor-split-pos=" ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "first-row=" ); ADDDEC( 2 );
- ADDTEXT( " first-col=" ); ADDDEC( 2 );
- ADDTEXT( " active-pane=" ); ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x0042: // CODEPAGE
- {
- LINESTART();
- sal_uInt16 nCodePage = rIn.ReaduInt16();
- ADDTEXT( "codepage=" ); __AddHex( t, nCodePage );
- ADDTEXT( " (" ); __AddDec( t, nCodePage );
- ADDTEXT( ")" );
- PRINT();
- }
- break;
- case 0x004D: // PLS
- {
- LINESTART();
- static const sal_Char* const ppcTypes[] = { "Win", "Mac" };
- sal_uInt16 nType = rIn.ReaduInt16();
- ADDTEXT( "environment=" );
- lcl_AddEnum( t, nType, ppcTypes, STATIC_TABLE_SIZE( ppcTypes ) );
- PRINT();
- if( nType == 0 )
- {
- String aData;
- sal_uInt32 __nFlags;
- LINESTART();
- rIn.SetNulSubstChar( '\0' );
- aData = rIn.ReadRawUniString( 32, true );
- ADDTEXT( "device-name='" ); ADDTEXT( GETSTR( aData ) );
- ADDTEXT( "'" );
- PRINT(); LINESTART();
- ADDTEXT( "spec-version=" ); ADDDEC( 2 );
- ADDTEXT( " driver-version=" ); ADDDEC( 2 );
- sal_uInt16 nOwnSize, nPrvSize;
- rIn >> nOwnSize >> nPrvSize;
- ADDTEXT( " own-size=" ); __AddDec( t, nOwnSize );
- ADDTEXT( " prv-size=" ); __AddDec( t, nPrvSize );
- PRINT(); LINESTART();
- rIn >> __nFlags;
- STARTFLAG();
- ADDFLAG( 0x00000001, "orient" );
- ADDFLAG( 0x00000002, "paper-size" );
- ADDFLAG( 0x00000004, "paper-height" );
- ADDFLAG( 0x00000008, "paper-width" );
- ADDFLAG( 0x00000010, "scale" );
- ADDFLAG( 0x00000100, "copies" );
- ADDRESERVED( 0xE0000080 );
- PRINT(); LINESTART();
- static const sal_Char* const ppcOrient[] = { 0, "portrait", "landsc" };
- sal_uInt16 nOrient = rIn.ReaduInt16();
- ADDTEXT( "orientation=" );
- lcl_AddEnum( t, nOrient, ppcOrient, STATIC_TABLE_SIZE( ppcOrient ) );
- ADDTEXT( " paper-size=" ); ADDDEC( 2 );
- ADDTEXT( " paper-width=" ); ADDDEC( 2 );
- ADDTEXT( " paper-height=" ); ADDDEC( 2 );
- PRINT(); LINESTART();
- ADDTEXT( "scale=" ); ADDDEC( 2 );
- ADDTEXT( " copies=" ); ADDDEC( 2 );
- PRINT();
- if( nOwnSize > 88 )
- {
- LINESTART(); ADDTEXT( "additional data:" ); PRINT();
- ContDump( nOwnSize - 88 );
- }
- if( nPrvSize > 0 )
- {
- LINESTART(); ADDTEXT( "private data:" ); PRINT();
- ContDump( nPrvSize );
- }
- }
- if( rIn.GetRecLeft() > 0 )
- {
- LINESTART(); ADDTEXT( "unknown data:" ); PRINT();
- ContDump( rIn.GetRecLeft() );
- }
- }
- break;
- case 0x51:
- {
- UINT16 nR1, nR2;
- UINT8 nC1, nC2;
- rIn >> nR1 >> nR2 >> nC1 >> nC2;
- lcl_AddRangeRef( t, nC1, nR1, nC2, nR2 );
- PRINT();
- LINESTART();
- ADDTEXT( "workbook: " );
- AddUNICODEString( t, rIn, TRUE );
- PRINT();
- }
- break;
- case 0x0052: // DCONNAME
- {
- ADDTEXT( "name=" );
- AddUNICODEString( t, rIn, TRUE );
- PRINT();
- LINESTART();
- ADDTEXT( "sheet=" );
- AddUNICODEString( t, rIn, TRUE );
- PRINT();
- }
- break;
- case 0x5B: // FILESHARING
- {
- PreDump( nL );
- rIn >> __nFlags;
- if( __nFlags )
- {
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fReadOnlyRec" );
- PRINT();
- }
- DumpValidPassword( rIn, pPre );
- }
- break;
- case 0x5D:
- ObjDump( nL );
- break;
- case 0x007D: // COLINFO - col range info
- {
- LINESTART();
- ADDTEXT( "col range: " );
- ADDDEC( 2 );
- ADDTEXT( "-" );
- ADDDEC( 2 );
- ADDTEXT( " width: " );
- ADDDEC( 2 );
- ADDTEXT( "/256 charwidth ix to XF: " );
- ADDDEC( 2 );
- PRINT();
- rIn >> __nFlags;
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fHidden" );
- ADDTEXT( " outlnlev=" );
- __AddDec( t, (UINT16)((__nFlags & 0x0700) >> 8) );
- ADDFLAG( 0x1000, "fCollapsed" );
- ADDRESERVED( 0xE8FE );
- PRINT();
- LINESTART();
- ADDTEXT( "reserved: " );
- ADDHEX( 1 );
- PRINT();
- }
- break;
- case 0x7E:
- {
-// LINESTART();
- ADDCELLHEAD();
- ADDTEXT( " val = " );
- __AddRK( t, rIn.ReadInt32() );
- PRINT();
- }
- break;
- case 0x0080: // GUTS - row & col gutters for outlines
- {
- LINESTART();
- ADDTEXT( "size row gutter: " );
- __AddDec( t, Read2( rIn ), 5 );
- ADDTEXT( " | size col gutter: " );
- __AddDec( t, Read2( rIn ), 5 );
- PRINT();
- LINESTART();
- ADDTEXT( "max outline lev: " );
- __AddDec( t, Read2( rIn ), 5 );
- ADDTEXT( " | max outline lev: " );
- __AddDec( t, Read2( rIn ), 5 );
- PRINT();
- }
- break;
- case 0x0081: // WSBOOL - additional workspace info
- {
- rIn >> __nFlags;
- LINESTART();
- STARTFLAG();
- if( __nFlags & 0x00F1 )
- {
- ADDFLAG( 0x0001, "fShowAutoBreaks" );
- ADDFLAG( 0x0010, "fDialog" );
- ADDFLAG( 0x0020, "fApplyStyles" );
- ADDFLAG( 0x0040, "fRowSumsBelow" );
- ADDFLAG( 0x0080, "fColSumsBelow" );
- PRINT();
- LINESTART();
- }
- if( __nFlags & (0xCD00 | 0x320E) )
- {
- ADDTEXT( " " );
- ADDFLAG( 0x0100, "fFitToPage" );
- ADDFLAG( 0x0400, "fDispRowGuts" );
- ADDFLAG( 0x0800, "fDispColGuts" );
- ADDFLAG( 0x4000, "fAee" );
- ADDFLAG( 0x8000, "fAfe" );
- ADDRESERVED( 0x320E );
- PRINT();
- }
- if( !__nFlags )
- PRINT();
- }
- break;
- case 0x008C: // COUNTRY
- {
- LINESTART();
- ADDTEXT( "ui-country=" ); ADDDEC( 2 );
- ADDTEXT( " doc-country=" ); ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x92: // PALETTE
- {
- UINT16 nColCnt;
- rIn >> nColCnt;
- LINESTART();
- ADDTEXT( "count: " );
- __AddDec( t, nColCnt );
- PRINT();
- LINESTART();
- for( UINT16 nCol = 0; nCol < nColCnt; nCol++ )
- {
- __AddDec( t, nCol, 2 );
- ADDTEXT( "=" );
- ADDHEX( 4 );
- ADDTEXT( " " );
- if( (nCol % 5 == 4) || (nCol == nColCnt - 1) )
- {
- PRINT();
- LINESTART();
- }
- }
- }
- break;
- case 0x9D: // AUTOFILTERINFO -- count of drop-down arrows
- {
- LINESTART();
- ADDTEXT( "count of drop-down arrows: " );
- ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x9E: // AUTOFILTER -- autofilter settings
- {
- UINT8 nType;
- UINT8 nCompare;
- ByteString sTemp[ 2 ];
- UINT16 nLen[ 2 ] = { 0, 0 };
- UINT8 nF;
- LINESTART();
- ADDTEXT( "count: " );
- ADDDEC( 2 );
- rIn >> __nFlags;
- STARTFLAG();
- ADDFLAG( 0x0003, "fJoin" );
- ADDFLAG( 0x0004, "fSimpleEq1" );
- ADDFLAG( 0x0008, "fSimpleEq2" );
- ADDFLAG( 0x0010, "fTop10" );
- ADDFLAG( 0x0020, "fTop" );
- ADDFLAG( 0x0040, "fPercent" );
- PRINT();
- LINESTART();
- if( __nFlags & 0x0003 )
- ADDTEXT( "(custom conditions are OR-ed" );
- else
- ADDTEXT( "(custom conditions are AND-ed" );
- if( __nFlags & 0x0010 )
- {
- if( __nFlags & 0x0020 )
- ADDTEXT( "; show top " );
- else
- ADDTEXT( "; show bottom " );
- __AddDec( t, (UINT16)(__nFlags >> 7) );
- if( __nFlags & 0x0040 )
- ADDTEXT( " percent" );
- else
- ADDTEXT( " items" );
- }
- ADDTEXT( ")" );
- PRINT();
- for( nF = 0; nF < 2; nF++ )
- {
- LINESTART();
- __AddDec( t, (UINT16)(nF + 1) );
- ADDTEXT( ". Filter: " );
- rIn >> nType >> nCompare;
- switch( nType )
- {
- case 0x00: ADDTEXT( "not used " ); break;
- case 0x02: ADDTEXT( "RK " ); break;
- case 0x04: ADDTEXT( "double " ); break;
- case 0x06: ADDTEXT( "string " ); break;
- case 0x08: ADDTEXT( "bool/err " ); break;
- case 0x0A: ADDTEXT( "show nothing " ); break;
- case 0x0C: ADDTEXT( "all blanks " ); break;
- case 0x0E: ADDTEXT( "all non-blanks " ); break;
- default:
- ADDTEXT( "unknown (" );
- __AddHex( t, nType );
- ADDTEXT( ") " );
- }
- switch( nCompare )
- {
- case 0x01: ADDTEXT( "< " ); break;
- case 0x02: ADDTEXT( "= " ); break;
- case 0x03: ADDTEXT( "<= " ); break;
- case 0x04: ADDTEXT( "> " ); break;
- case 0x05: ADDTEXT( "<> " ); break;
- case 0x06: ADDTEXT( ">= " ); break;
- default: if( nCompare ) __AddHex( t, nCompare );
- }
- sTemp[ nF ] = t;
- switch( nType )
- {
- case 0x02:
- __AddRK( sTemp[ nF ], rIn.ReadInt32() );
- IGNORE( 4 );
- break;
- case 0x04:
- __AddDouble( sTemp[ nF ], Read8( rIn ) );
- break;
- case 0x06:
- IGNORE( 4 );
- nLen[ nF ] = Read1( rIn );
- IGNORE( 3 );
- break;
- case 0x08:
- __AddHex( sTemp[ nF ], Read1( rIn ) );
- sTemp[ nF ] += " ";
- __AddHex( sTemp[ nF ], Read1( rIn ) );
- IGNORE( 6 );
- break;
- default:
- IGNORE( 8 );
- }
- }
- for( nF = 0; nF < 2; nF++ )
- {
- t = sTemp[ nF ];
- if( nLen[ nF ] )
- AddUNICODEString( t, rIn, TRUE, nLen[ nF ] );
- PRINT();
- }
- }
- break;
- case 0xA0:
- {
- UINT16 nN, nD;
- rIn >> nN >> nD;
- LINESTART();
- ADDTEXT( "Window Zoom Magnification = " );
- __AddDec( t, nN );
- ADDTEXT( "/" );
- __AddDec( t, nD );
- PRINT();
- }
- break;
- case 0x00A1: // SETUP
- {
- LINESTART();
- ADDTEXT( "paper size: " ); ADDDEC( 2 );
- ADDTEXT( " scaling: " ); ADDDEC( 2 );
- ADDTEXT( " start page: " ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "fit to width: " ); ADDDEC( 2 );
- ADDTEXT( " fit to height: " ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- rIn >> __nFlags;
- STARTFLAG();
- ADDFLAG( 0x0001, "fLeftRight" );
- ADDFLAG( 0x0002, "fPortrait" );
- ADDFLAG( 0x0004, "fNoPrintSettings" );
- ADDFLAG( 0x0008, "fMonochrom" );
- ADDFLAG( 0x0010, "fDraft" );
- ADDFLAG( 0x0020, "fNotes" );
- ADDFLAG( 0x0040, "fNoOrientation" );
- ADDFLAG( 0x0080, "fCustomNumber" );
- PRINT();
- LINESTART();
- ADDTEXT( "Print res: " ); ADDDEC( 2 );
- ADDTEXT( " vert print res: " ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "header margin: " ); ADDDOUBLE();
- ADDTEXT( " footer margin: " ); ADDDOUBLE();
- ADDTEXT( " copies: " ); ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0xAF:
- {
- UINT16 nCref;
- UINT8 nLocked, nHidden, nName, nComment, nNameUser;
- rIn >> nCref >> nLocked >> nHidden >> nName >> nComment >> nNameUser;
- LINESTART();
- ADDTEXT( "Changing Cells = " );
- __AddDec( t, nCref );
- if( nLocked )
- ADDTEXT( " fLocked" );
- if( nHidden )
- ADDTEXT( " fHidden" );
- PRINT();
- LINESTART();
- ADDTEXT( "Name = " );
- __AddDec( t, nName );
- ADDTEXT( " Comment = " );
- __AddDec( t, nComment );
- ADDTEXT( " Name User = " );
- __AddDec( t, nNameUser );
- PRINT();
- ContDump( rIn.GetRecLeft() );
- }
- break;
- case 0xB0: // SXVIEW
- {
- UINT16 nColFirst, nColLast, nRowFirst, nRowLast;
- rIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast;
- nSXLIIndex = 0; // new pivot table
- LINESTART();
- ADDTEXT( "PivotTable: " ); __AddDec( t, nColFirst );
- ADDTEXT( " / " ); __AddDec( t, nRowFirst );
- ADDTEXT( " - " ); __AddDec( t, nColLast );
- ADDTEXT( " / " ); __AddDec( t, nRowLast );
- PRINT();
- LINESTART();
- ADDTEXT( "1st Head: " ); ADDDEC( 2 );
- rIn >> nRowFirst;
- ADDTEXT( " First Data: " ); ADDDEC( 2 );
- ADDTEXT( " / " ); __AddDec( t, nRowFirst );
- PRINT();
- LINESTART();
- ADDTEXT( "Cache index: " ); ADDDEC( 2 );
- ADDTEXT( " reserved: " ); ADDHEX( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "axis 4 data: " ); ADDDEC( 2 );
- ADDTEXT( " pos 4 Data: " ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "num of fields: " ); ADDDEC( 2 );
- rIn >> nSXLISize[0] >> nSXLISize[1];
- ADDTEXT( " ...row fields: " ); __AddDec( t, nSXLISize[0] );
- ADDTEXT( " ...col fields: " ); __AddDec( t, nSXLISize[1] );
- PRINT();
- LINESTART();
- ADDTEXT( "num of page fields: " ); ADDDEC( 2 );
- ADDTEXT( " ...data fields: " ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "data rows: " ); ADDDEC( 2 );
- ADDTEXT( " data cols: " ); ADDDEC( 2 );
- rIn >> __nFlags;
- PRINT();
- if( __nFlags )
- {
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fRowGrand" );
- ADDFLAG( 0x0002, "fColGrand" );
- ADDFLAG( 0x0008, "fAutoFormat" );
- ADDFLAG( 0x0010, "fWidthHeightAuto" );
- ADDFLAG( 0x0020, "fFontAuto" );
- ADDFLAG( 0x0040, "fAlignAuto" );
- ADDFLAG( 0x0080, "fBorderAuto" );
- ADDFLAG( 0x0100, "fPatternAuto" );
- ADDFLAG( 0x0200, "fNumberAuto" );
- PRINT();
- }
- LINESTART();
- ADDTEXT( "index 2 PivotTable autoform: " );
- ADDDEC( 2 );
- PRINT();
- LINESTART();
- UINT16 nTableLen = Read2( rIn );
- UINT16 nDataLen = Read2( rIn );
- ADDTEXT( "PivotTable name: " );
- if( nTableLen )
- AddUNICODEString( t, rIn, TRUE, nTableLen );
- else
- ADDTEXT( "-/-" );
- PRINT();
- LINESTART();
- ADDTEXT( "data field name: " );
- if( nDataLen )
- AddUNICODEString( t, rIn, TRUE, nDataLen );
- else
- ADDTEXT( "-/-" );
- PRINT();
- }
- break;
- case 0xB1: // SXVD
- {
- rIn >> __nFlags;
- LINESTART();
- ADDTEXT( "Axis (" );
- __AddHex( t, __nFlags );
- ADDTEXT( "):" );
- if( __nFlags )
- {
- ADDFLAG( 0x0001, "row" );
- ADDFLAG( 0x0002, "col" );
- ADDFLAG( 0x0004, "page" );
- ADDFLAG( 0x0008, "data" );
- }
- else
- ADDTEXT( " no axis" );
- ADDTEXT( " num of att. subtotals: " );
- ADDDEC( 2 );
- PRINT();
- rIn >> __nFlags;
- LINESTART();
- ADDTEXT( "subtotal type(" );
- __AddHex( t, __nFlags );
- ADDTEXT( "):" );
- if( __nFlags )
- {
- ADDFLAG( 0x0001, "Default" );
- ADDFLAG( 0x0002, "Sum" );
- ADDFLAG( 0x0004, "Counta" );
- ADDFLAG( 0x0008, "Average" );
- ADDFLAG( 0x0010, "Max" );
- ADDFLAG( 0x0020, "Min" );
- ADDFLAG( 0x0040, "Product" );
- ADDFLAG( 0x0080, "Count" );
- ADDFLAG( 0x0100, "Stdev" );
- ADDFLAG( 0x0200, "Stddevp" );
- ADDFLAG( 0x0400, "Var" );
- ADDFLAG( 0x0800, "Varp" );
- }
- else
- ADDTEXT( " none" );
- PRINT();
- LINESTART();
- ADDTEXT( "num of items: " );
- ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "Name: " );
- UINT16 nLen = Read2( rIn );
- if( nLen == 0xFFFF )
- ADDTEXT( "<name in cache>" );
- else if( nLen )
- AddUNICODEString( t, rIn, TRUE, nLen );
- PRINT();
- }
- break;
- case 0xB2: // SXVI
- {
- UINT16 nType, nCache;
- rIn >> nType >> __nFlags >> nCache;
- LINESTART();
- switch( nType )
- {
- case 0xFE: p = "Page"; break;
- case 0xFF: p = "Null"; break;
- case 0x00: p = "Data"; break;
- case 0x01: p = "Default"; break;
- case 0x02: p = "SUM"; break;
- case 0x03: p = "COUNT"; break;
- case 0x04: p = "AVERAGE"; break;
- case 0x05: p = "MAX"; break;
- case 0x06: p = "MIN"; break;
- case 0x07: p = "PRODUCT"; break;
- case 0x08: p = "COUNTA"; break;
- case 0x09: p = "STDEV"; break;
- case 0x0A: p = "STDEVP"; break;
- case 0x0B: p = "VAR"; break;
- case 0x0C: p = "VARP"; break;
- case 0x0D: p = "Grand total"; break;
- default: p = pU;
- }
- ADDTEXT( "Type (" );
- __AddHex( t, nType );
- ADDTEXT( "): " );
- ADDTEXT( p );
- ADDTEXT( " iCache: " );
- __AddDec( t, nCache );
- PRINT();
- if( __nFlags )
- {
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x01, "fHidden" );
- ADDFLAG( 0x02, "fHideDetail" );
- ADDFLAG( 0x04, "fFormula" );
- ADDFLAG( 0x08, "fMissing" );
- PRINT();
- }
- LINESTART();
- ADDTEXT( "Name: " );
- UINT16 nCch = Read2( rIn );
- if( nCch == 0xFFFF )
- ADDTEXT( "<name in cache>" );
- else if( nCch )
- AddUNICODEString( t, rIn, TRUE, nCch );
- else
- ADDTEXT( "<empty string>" );
- PRINT();
- }
- break;
- case 0xB4: // SXIVD
- {
- const UINT16 nBrkNum = 5;
- UINT16 nBrk = nBrkNum;
- UINT16 nSize = (UINT16)(nL / 2);
- LINESTART();
- for( UINT16 i = 0; i < nSize; i++ )
- {
- ADDHEX( 2 );
- nBrk--;
- if( nBrk )
- ADDTEXT( " " );
- else
- {
- PRINT();
- LINESTART();
- nBrk = nBrkNum;
- }
- }
- if( nBrk < nBrkNum ) PRINT();
- }
- break;
- case 0xB5: // SXLI - pivot table line item array
- {
- UINT16 nIdent;
- UINT16 nType;
- UINT16 nMaxInd;
- const sal_Char* pInd = " ";
- const sal_Char* pType[] = {
- "Data", "Default", "SUM", "COUNT","AVERAGE",
- "MAX", "MIN", "PRODUCT", "COUNTA", "STDEV",
- "STDEVP", "VAR", "VARP", "Grand total",
- "Blank line" }; // undocumented
- while( rIn.GetRecLeft() > 0 )
- {
- rIn >> nIdent >> nType >> nMaxInd >> __nFlags;
- LINESTART();
- ADDTEXT( "# of ident. items: " );
- __AddDec( t, nIdent );
- ADDTEXT( " Type (" );
- __AddHex( t, nType );
- ADDTEXT( "): " );
- if( nType > 0x0E )
- p = pU;
- else
- p = pType[ nType ];
- ADDTEXT( p );
- ADDTEXT( " relevant indexes: " );
- __AddDec( t, nMaxInd );
- PRINT();
- LINESTART();
- ADDTEXT( pInd );
- STARTFLAG();
- ADDFLAG( 0x0001, "fMultiDataName" );
- ADDFLAG( 0x0200, "fSub" );
- ADDFLAG( 0x0400, "fBlock" );
- ADDFLAG( 0x0800, "fGrand" );
- ADDFLAG( 0x1000, "fMultiDataOnAxis" );
- ADDFLAG( 0x2000, "fBlankLine" ); // undocumented
- ADDFLAG( 0x4000, "fHideDetail" ); // undocumented
- ADDRESERVED( 0x8000 );
- PRINT();
- LINESTART();
- ADDTEXT( pInd );
- ADDTEXT( "index to data field: " );
- __AddDec( t, (UINT16) ( (__nFlags & 0x01FE) >> 1 ) );
- PRINT();
- LINESTART();
- ADDTEXT( pInd );
- ADDTEXT( "array of " );
- __AddDec( t, nSXLISize[nSXLIIndex] );
- ADDTEXT( " indexes (^ are ident., * are irrelevant):" );
- PRINT();
- LINESTART();
- ADDTEXT( pInd );
- ADDTEXT( " " );
- const UINT16 nBrkNum = 5;
- UINT16 nBrk = nBrkNum;
- for( UINT16 i = 0; i < nSXLISize[nSXLIIndex]; i++ )
- {
- __AddDec( t, Read2( rIn ), 7 );
- if( i < nIdent )
- ADDTEXT( "^" );
- else if( i < nMaxInd )
- ADDTEXT( " " );
- else
- ADDTEXT( "*" );
- nBrk--;
- if( !nBrk )
- {
- PRINT();
- LINESTART();
- ADDTEXT( pInd );
- ADDTEXT( " " );
- nBrk = nBrkNum;
- }
- }
- if( nBrk < nBrkNum )
- PRINT();
- }
- nSXLIIndex = 1 - nSXLIIndex;
- }
- break;
- case 0xB6: // SXPI - pivot table page item(s)
- {
- UINT16 nArrayCnt = (UINT16)(nL / 6);
- LINESTART();
- __AddDec( t, nArrayCnt );
- ADDTEXT( " page items:" );
- PRINT();
- for( UINT16 iArray = 0; iArray < nArrayCnt; iArray++ )
- {
- LINESTART();
- ADDTEXT( "index SXVD: " );
- __AddDec( t, Read2( rIn ), 3 );
- ADDTEXT( " index SXVI: " );
- UINT16 nSXVIInd;
- rIn >> nSXVIInd;
- __AddDec( t, nSXVIInd, 5 );
- if( nSXVIInd == 32765 )
- ADDTEXT( " (All items) Obj ID: " );
- else
- ADDTEXT( " Obj ID: " );
- ADDHEX( 2 );
- PRINT();
- }
- }
- break;
- case 0xBD:
- {
- UINT16 nC, nR, nXF;
- INT32 nRK;
- UINT16 n = (UINT16)((nL - 4) / 6);
-
- rIn >> nR >> nC;
- while( n )
- {
- rIn >> nXF >> nRK;
- LINESTART();
- __AddCellHead( t, nC, nR, nXF );
- ADDTEXT( " val = " );
- __AddRK( t, nRK );
- PRINT();
- nC++;
- n--;
- }
- }
- break;
- case 0xBE:
- {
- LINESTART();
- ADDCELLHEAD();
- PRINT();
- LINESTART();
- ADDTEXT( "next XFs: " );
- UINT16 n = (UINT16)((nL - 6) / 2);
- while( n )
- {
- __AddDec( t, Read2( rIn ) );
- n--;
- if( n )
- ADDTEXT( ' ' );
- }
- PRINT();
- }
- break;
- case 0x00C5: // SXDI
- {
- LINESTART();
- ADDTEXT( "Field: " );
- ADDDEC( 2 );
- UINT16 nFunc = Read2( rIn );
- ADDTEXT( " aggregation func (" );
- __AddHex( t, nFunc );
- ADDTEXT( "): " );
- const sal_Char* pFunc[] = { "Sum", "Count", "Average", "Max", "Min",
- "Product", "Count Nums", "StdDev", "StdDevp", "Var",
- "Varp" };
- p = (nFunc > 0x0A) ? pU : pFunc[ nFunc ];
- ADDTEXT( p );
- ADDTEXT( " display format (" );
- const sal_Char* pDispl[] = {
- "Normal", "Difference", "Percentage of", "Percentage difference from", "Running total in",
- "Percentage of row", "Percentage of column", "Percentage of total", "Index" };
- UINT16 nDispl = Read2( rIn );
- __AddHex( t, nDispl );
- ADDTEXT( "): " );
- p = (nDispl > 0x08) ? pU : pDispl[ nDispl ];
- ADDTEXT( p );
- PRINT();
- LINESTART();
- ADDTEXT( "ind. to SXVD: " ); ADDDEC( 2 );
- ADDTEXT( " ind. to SXVI: " ); ADDDEC( 2 );
- ADDTEXT( " num format: " ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "name: " );
- UINT16 nCch = Read2( rIn );
- if( nCch == 0xFFFF )
- ADDTEXT( "<name in cache>" );
- else if( nCch )
- AddUNICODEString( t, rIn, TRUE, nCch );
- else
- ADDTEXT( "<empty string>" );
- PRINT();
- }
- break;
- case 0x00C6: // SXDB - cache info
- {
- ADDTEXT( "number of recs: " ); ADDDEC( 4 );
- ADDTEXT( " stream id: " ); ADDHEX( 2 );
- ADDTEXT( " flags: " ); ADDHEX( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "DB block recs: " ); ADDDEC( 2 );
- ADDTEXT( " base fields: " ); ADDDEC( 2 );
- ADDTEXT( " all fields: " ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "reserved: " ); ADDHEX( 2 );
- ADDTEXT( " type: " ); ADDHEX( 2 );
- ADDTEXT( " changed by:" );
- PRINT();
- LINESTART();
- AddUNICODEString( t, rIn );
- PRINT();
- }
- break;
- case 0x00C7: // SXFIELD - Pivot Field
- {
- nItemCnt = 0;
-
- ADDTEXT( "#" );
- __AddDec( t, nFieldCnt, 3 );
- nFieldCnt++;
- ADDTEXT( " (pivot field): " );
- if( rIn.GetRecLeft() < 14 )
- {
- ADDTEXT( "<break in pivot field start>" );
- PRINT();
- }
- else
- {
- PRINT();
- LINESTART();
- ADDTEXT( pPre );
- rIn >> __nFlags;
- STARTFLAG();
- ADDFLAG( 0x0001, "fOrigItems" );
- ADDFLAG( 0x0002, "fPostponed" );
- ADDFLAG( 0x0004, "fCalculated" );
- ADDFLAG( 0x0008, "fGroupChild" );
- ADDFLAG( 0x0010, "fNumGroup" );
- ADDFLAG( 0x0200, "fLongIndex" );
- ADDFLAG( 0x1000, "f1000?" );
- ADDFLAG( 0x8000, "f8000?" );
- ADDRESERVED( 0x6000 );
- ADDTEXT( " data-type=" );
- __AddHex( t, static_cast< sal_uInt16 >( __nFlags & 0x0DE0 ) );
- ADDTEXT( "=" );
- switch( __nFlags & 0x0DE0 )
- {
- case 0x0000: ADDTEXT( "spc" ); break;
- case 0x0480: ADDTEXT( "str" ); break;
- case 0x0520: ADDTEXT( "int[+dbl]" ); break;
- case 0x0560: ADDTEXT( "dbl" ); break;
- case 0x05A0: ADDTEXT( "str+int[+dbl]" ); break;
- case 0x05E0: ADDTEXT( "str+dbl" ); break;
- case 0x0900: ADDTEXT( "dat" ); break;
- case 0x0D00: ADDTEXT( "dat+int/dbl" ); break;
- case 0x0D80: ADDTEXT( "dat+str[+int/dbl]" ); break;
- default: ADDTEXT( pU );
- }
- PRINT();
- LINESTART();
- ADDTEXT( pPre );
- ADDTEXT( "group-subfield=" ); ADDDEC( 2 );
- ADDTEXT( " group-basefield=" ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( pPre );
- ADDTEXT( "item-count=" ); ADDDEC( 2 );
- ADDTEXT( " group-item-count=" ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( pPre );
- ADDTEXT( "base-item-count=" ); ADDDEC( 2 );
- ADDTEXT( " source-item-count=" ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( pPre );
- if( rIn.GetRecLeft() < 3 )
- {
- ADDTEXT( "<break in pivot field name>" );
- PRINT();
- }
- else
- {
- ADDTEXT( "name=" );
- AddUNICODEString( t, rIn );
- PRINT();
- }
- }
- }
- break;
- case 0x00C8: // SXINDEXLIST - indexes to source data
- {
- ADDTEXT( "#" );
- __AddDec( t, nTabIndexCnt, 3 );
- nTabIndexCnt++;
- ADDTEXT( " (index list):" );
- for( UINT16 iIndex = 0; iIndex < rIn.GetRecSize(); iIndex++ )
- {
- ADDTEXT( " " );
- ADDHEX( 1 );
- }
- PRINT();
- }
- break;
- case 0x00C9: // SXDOUBLE - cache entry: double value
- {
- ADDTEXT( "#" );
- __AddDec( t, nItemCnt, 3 );
- ADDTEXT( " (double): " );
- nItemCnt++;
- ADDTEXT( " " );
- ADDDOUBLE();
- PRINT();
- }
- break;
- case 0x00CA: // SXBOOLEAN - cache entry: boolean value
- {
- ADDTEXT( "#" );
- __AddDec( t, nItemCnt, 3 );
- ADDTEXT( " (boolean): " );
- nItemCnt++;
- ADDTEXT( " " );
- lcl_AddFlag( t, rIn.ReaduInt16() != 0 );
- PRINT();
- }
- break;
- case 0x00CB: // SXERROR - cache entry: error code
- {
- ADDTEXT( "#" );
- __AddDec( t, nItemCnt, 3 );
- ADDTEXT( " (error): " );
- nItemCnt++;
- ADDTEXT( " " );
- ADDHEX( 2 );
- PRINT();
- }
- break;
- case 0x00CC: // SXINTEGER - signed 16bit integer
- {
- ADDTEXT( "#" );
- __AddDec( t, nItemCnt, 3 );
- ADDTEXT( " (integer): " );
- nItemCnt++;
- ADDTEXT( " " );
- ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x00CD: // SXSTRING - String
- {
- if( bSubStream )
- {
- ADDTEXT( "#" );
- __AddDec( t, nItemCnt, 3 );
- ADDTEXT( " (string): " );
- nItemCnt++;
- }
- AddUNICODEString( t, rIn );
- PRINT();
- }
- break;
- case 0x00CE: // SXDATETIME - date & time special format
- {
- ADDTEXT( "#" );
- __AddDec( t, nItemCnt, 3 );
- ADDTEXT( " (date/time): " );
- nItemCnt++;
- UINT8 nDay, nHour, nMin, nSec;
- UINT16 nYear, nMonth;
- rIn >> nYear >> nMonth >> nDay >> nHour >> nMin >> nSec;
- if( nDay )
- {
- __AddDec( t, nDay );
- ADDTEXT( "." );
- __AddDec( t, nMonth );
- ADDTEXT( "." );
- __AddDec( t, nYear );
- ADDTEXT( " " );
- }
- __AddDec( t, nHour, 2, '0' );
- ADDTEXT( ":" );
- __AddDec( t, nMin, 2, '0' );
- ADDTEXT( ":" );
- __AddDec( t, nSec, 2, '0' );
- PRINT();
- }
- break;
- case 0x00CF: // SXEMPTY - cache entry: empty
- {
- ADDTEXT( "#" );
- __AddDec( t, nItemCnt, 3 );
- ADDTEXT( " (empty): " );
- nItemCnt++;
- PRINT();
- }
- break;
- case 0x00D5: // SXIDSTM - pivot table cache stream id
- {
- LINESTART();
- UINT16 nStrId = Read2( rIn );
- ADDTEXT( "Stream ID: " );
- __AddHex( t, nStrId );
- PRINT();
- DumpRecordStream( OpenStorage( EXC_STORAGE_PTCACHE ), ScfTools::GetHexStr( nStrId ), EMPTY_STRING );
- }
- break;
- case 0x00D8: // SXNUMGROUP - numerical grouping in pivot cache field
- {
- LINESTART();
- rIn >> __nFlags;
- STARTFLAG();
- ADDFLAG( 0x0001, "fAutoMin" );
- ADDFLAG( 0x0002, "fAutoMax" );
- ADDTEXT( " data-type=" );
- switch( (__nFlags & 0x003C) >> 2 )
- {
- case 0x0001: ADDTEXT( "seconds" ); break;
- case 0x0002: ADDTEXT( "minutes" ); break;
- case 0x0003: ADDTEXT( "hours" ); break;
- case 0x0004: ADDTEXT( "days" ); break;
- case 0x0005: ADDTEXT( "months" ); break;
- case 0x0006: ADDTEXT( "quarters" ); break;
- case 0x0007: ADDTEXT( "years" ); break;
- case 0x0008: ADDTEXT( "numeric" ); break;
- default: ADDTEXT( pU );
- }
- (__nFlags &= 0xFFC0) >>= 6;
- ADDTEXT( " remaining=" ); __AddHex( t, __nFlags );
- ADDTEXT( "=" ); __AddDec( t, __nFlags );
- PRINT();
- }
- break;
- case 0xE0:
- DumpXF( rIn, pPre );
- break;
- case 0xE3:
- {
- LINESTART();
- ADDTEXT( "view source (" );
- UINT16 n = Read2( rIn );
- __AddHex( t, n );
- ADDTEXT( "): " );
- switch( n )
- {
- case 0x01: p = "M$ Excel list or database"; break;
- case 0x02: p = "external data source"; break;
- case 0x04: p = "multiple consolidation ranges"; break;
- case 0x08: p = "pivot table"; break;
- case 0x10: p = "scenario manager summary report"; break;
- default: p = pU;
- }
- ADDTEXT( p );
- PRINT();
- }
- break;
- case 0x00E5: // CELLMERGING
- {
- UINT16 nCount, nInd;
- UINT16 nRow1, nRow2, nCol1, nCol2;
- rIn >> nCount;
- LINESTART();
- ADDTEXT( "Count: " );
- __AddDec( t, nCount );
- PRINT();
- LINESTART();
- for( nInd = 0; nInd < 3; nInd++ )
- ADDTEXT( " row - row / col-col | " );
- PRINT();
- LINESTART();
- if( (ULONG)(nCount * 8 + 2) == nL )
- {
- for( nInd = 0; nInd < nCount; nInd++ )
- {
- rIn >> nRow1 >> nRow2 >> nCol1 >> nCol2;
- __AddDec( t, nRow1, 5 );
- ADDTEXT( "-" );
- __AddDec( t, nRow2, 5 );
- ADDTEXT( " / " );
- __AddDec( t, nCol1, 3 );
- ADDTEXT( "-" );
- __AddDec( t, nCol2, 3 );
- ADDTEXT( " | " );
- if( (nInd % 3 == 2) || (nInd == nCount - 1) )
- {
- PRINT();
- LINESTART();
- }
- }
- }
- else
- {
- LINESTART();
- ADDTEXT( "<Wrong record length!>" );
- PRINT();
- }
- }
- break;
- case 0xEB:
- case 0xEC:
- case 0xED:
- EscherDump( nL, true );
- break;
- case 0x00F6: // SXNAME
- {
- LINESTART();
- rIn >> __nFlags;
- STARTFLAG();
- ADDFLAG( 0x0002, "fNameErr" );
- ADDRESERVED( 0xFFFD );
- ADDTEXT( " field=" ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- sal_Int16 nFunc;
- rIn >> nFunc;
- ADDTEXT( "function=" ); __AddHex( t, (INT32)nFunc );
- static const sal_Char* const ppcFuncs[] = {
- "none", 0, "sum", "counta", "count", "average", "max", "min",
- "product", "stdev", "stdevp", "var", "varp" };
- lcl_AddEnum( t, nFunc, ppcFuncs, STATIC_TABLE_SIZE( ppcFuncs ), 0, -1 );
- ADDTEXT( " SXPAIR-count=" ); ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x00F9: // SXFMLA
- {
- LINESTART();
- sal_uInt16 nSize;
- rIn >> nSize;
- ADDTEXT( "formula-size=" ); __AddDec( t, nSize );
- ADDTEXT( " SXNAME-count=" ); ADDDEC( 2 );
- PRINT();
- FormulaDump( nSize, FT_RangeName );
- }
- break;
- case 0xFC:
- {
- UINT16 nCnt = 0;
- BOOL bOK = TRUE;
- ContDump( 8 );
-
- while( bOK && (rIn.GetRecLeft() > 0) )
- {
- LINESTART();
- __AddDec( t, nCnt );
- ADDTEXT( ": " );
- bOK = AddUNICODEString( t, rIn );
- PRINT();
- nCnt++;
- }
- }
- break;
- case 0xFD:
- {
- LINESTART();
- ADDCELLHEAD();
- ADDTEXT( " sst = " );
- ADDDEC(4);
- PRINT();
- }
- break;
- case 0x0100: // SXVDEX
- {
- LINESTART();
- sal_uInt32 __nFlags = Read4( rIn );
- STARTFLAG();
- if( __nFlags & 0x0000009F )
- {
- ADDFLAG( 0x00000001, "fShowAllItems" );
- ADDFLAG( 0x00000002, "fDragToRow" );
- ADDFLAG( 0x00000004, "fDragToColumn" );
- ADDFLAG( 0x00000008, "fDragToPage" );
- ADDFLAG( 0x00000010, "fDragToHide" );
- ADDFLAG( 0x00000080, "fServerBased" );
- PRINT();
- LINESTART();
- }
- if( __nFlags & 0x00007E00 )
- {
- ADDTEXT( " " );
- ADDFLAG( 0x00000200, "fAutoSort" );
- ADDFLAG( 0x00000400, "fAscendSort" );
- ADDFLAG( 0x00000800, "fAutoShow" );
- ADDFLAG( 0x00001000, "fAscendShow" );
- ADDFLAG( 0x00002000, "fCalculatedField" );
- ADDFLAG( 0x00004000, "fLONewPage" ); // undocumented
- PRINT();
- LINESTART();
- }
- if( __nFlags & 0xFFE00000 )
- {
- ADDTEXT( " " ); // Layout flags:
- ADDFLAG( 0x00200000, "fLOReport" ); // undocumented
- ADDFLAG( 0x00400000, "fLOBlankLine" ); // undocumented
- ADDFLAG( 0x00800000, "fLOSubTotalTop" ); // undocumented
- ADDTEXT( " show-items=" ); __AddDec( t, sal_uInt32( __nFlags >> 24 ) );
- PRINT();
- LINESTART();
- }
- if( __nFlags & 0x001F8160 )
- {
- ADDTEXT( " !RESERVED!" );
- PRINT();
- }
- if( !__nFlags )
- PRINT();
- LINESTART();
- ADDTEXT( " sort-field=" );
- ADDDEC( 2 );
- ADDTEXT( " show-field=" );
- ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "format=" );
- UINT16 n = Read2( rIn );
- if( n )
- __AddDec( t, n );
- else
- ADDTEXT( "none" );
- PRINT();
- }
- break;
- case 0x0122: // SXDBEX - ext. cache info
- {
- ADDTEXT( "last changed: " ); ADDDOUBLE();
- ADDTEXT( " SXFORMULA recs: " ); ADDDEC( 4 );
- PRINT();
- }
- break;
- case 0x0138: // CHTRINFO - change tracking info
- {
- rIn.DisableDecryption();
- ADDTEXT( "14 bytes of unknown data..." );
- PRINT();
- ContDump( 14 );
- LINESTART();
- ADDTEXT( "16 bytes unknown identification:" );
- PRINT();
- ContDump( 16 );
- LINESTART();
- ADDTEXT( "unknown: " ); ADDHEX( 2 );
- ADDTEXT( " user: " );
- if( rIn.GetRecLeft() > 3 )
- AddUNICODEString( t, rIn );
- PRINT();
- LINESTART();
- __AddDec( t, (UINT16)(rIn.GetRecLeft() - 10) );
- ADDTEXT( " bytes of unknown data..." );
- PRINT();
- ContDump( rIn.GetRecLeft() - 10 );
- LINESTART();
- ADDTEXT( "date/time: " ); ADDDEC( 2 );
- ADDTEXT( "-" ); ADDDEC( 1 );
- ADDTEXT( "-" ); ADDDEC( 1 );
- ADDTEXT( " " ); ADDDEC( 1 );
- ADDTEXT( ":" ); ADDDEC( 1 );
- ADDTEXT( ":" ); ADDDEC( 1 );
- ADDTEXT( " unknown: " ); ADDHEX( 1 );
- ADDTEXT( " " ); ADDHEX( 2 );
- PRINT();
- }
- break;
- case 0x0137: // CHTRINSERT - change tracking: insert/remove
- {
- ADDTEXT( "len: " ); ADDDEC( 4 );
- ADDTEXT( " index: " ); ADDDEC( 4 );
- ADDTEXT( " op: " );
- UINT16 nOp;
- rIn >> nOp;
- switch( nOp )
- {
- case 0x0000: ADDTEXT( "insert row" ); break;
- case 0x0001: ADDTEXT( "insert column" ); break;
- case 0x0002: ADDTEXT( "delete row" ); break;
- case 0x0003: ADDTEXT( "delete column" ); break;
- default:
- __AddHex( t, nOp );
- ADDTEXT( " *UNKNOWN*" );
- }
- ADDTEXT( " accept: " ); ADDHEX( 2 );
- ADDTEXT( " tab: " ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- UINT16 __nFlags = Read2( rIn );
- STARTFLAG();
- ADDFLAG( 0x0001, "fAuto" );
- ADDRESERVED( 0xFFFE );
- UINT16 nCol1, nRow1, nCol2, nRow2;
- rIn >> nRow1 >> nRow2 >> nCol1 >> nCol2;
- ADDTEXT( " range: " ); lcl_AddRangeRef( t, nCol1, nRow1, nCol2, nRow2 );
- ADDTEXT( " unknown: " ); ADDHEX( 4 );
- PRINT();
- }
- break;
- case 0x013B: // CHTRCELLCONTENT: change tracking: changed cell
- {
- PreDump( nL );
- ADDTEXT( "len: " ); ADDDEC( 4 );
- ADDTEXT( " index: " ); ADDDEC( 4 );
- ADDTEXT( " opcode: " ); ADDHEX( 2 );
- ADDTEXT( " accept: " ); ADDHEX( 2 );
- ADDTEXT( " tab: " ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- UINT16 nChg, nOldType, nNewType;
- rIn >> nChg;
- nOldType = (nChg & 0x0038) >> 3;
- nNewType = nChg & 0x0007;
- ADDTEXT( "change (" ); __AddHex( t, nChg );
- ADDTEXT( "): " );
- switch( nOldType )
- {
- case 0x0000: ADDTEXT( "empty->" ); break;
- case 0x0001: ADDTEXT( "RK->" ); break;
- case 0x0002: ADDTEXT( "double->" ); break;
- case 0x0003: ADDTEXT( "string->" ); break;
- case 0x0004: ADDTEXT( "bool->" ); break;
- case 0x0005: ADDTEXT( "formula->" ); break;
- default: ADDTEXT( "*UNKNOWN*->" );
- }
- switch( nNewType )
- {
- case 0x0000: ADDTEXT( "empty" ); break;
- case 0x0001: ADDTEXT( "RK" ); break;
- case 0x0002: ADDTEXT( "double" ); break;
- case 0x0003: ADDTEXT( "string" ); break;
- case 0x0004: ADDTEXT( "bool" ); break;
- case 0x0005: ADDTEXT( "formula" ); break;
- default: ADDTEXT( "*UNKNOWN*" );
- }
- UINT16 nFormatData = (nChg & 0xFF00);
- if( (nFormatData == 0x1100) || (nFormatData == 0x1300) )
- ADDTEXT( "; contains add. data" );
- ADDTEXT( " format: " ); ADDHEX( 2 );
- UINT16 nCol, nRow;
- rIn >> nRow >> nCol;
- ADDTEXT( " address: " ); lcl_AddRef( t, nCol, nRow );
- PRINT();
- LINESTART();
- UINT16 nOldLen;
- rIn >> nOldLen;
- ADDTEXT( "old value len: " ); __AddHex( t, nOldLen );
- if( nOldType == 0x0003 )
- nOldLen >>= 1;
- ADDTEXT( " unknown: " ); ADDHEX( 4 );
- PRINT();
- UINT16 nCount = 0;
- switch( nFormatData )
- {
- case 0x1100: nCount = 8; break;
- case 0x1300: nCount = 4; break;
- }
- if( nCount )
- {
- LINESTART();
- ADDTEXT( "additional format data:" );
- for( UINT16 nIndex = 0; nIndex < nCount; nIndex ++ )
- {
- ADDTEXT( " " );
- ADDHEX( 2 );
- }
- PRINT();
- }
- if( nOldType )
- {
- LINESTART();
- ADDTEXT( "old value: " );
- switch( nOldType )
- {
- case 0x0001:
- __AddRK( t, rIn.ReadInt32() );
- PRINT();
- break;
- case 0x0002:
- ADDDOUBLE();
- PRINT();
- break;
- case 0x0003:
- AddUNICODEString( t, rIn );
- PRINT();
- break;
- case 0x0004:
- if( Read2( rIn ) )
- ADDTEXT( "true" );
- else
- ADDTEXT( "false" );
- PRINT();
- break;
- case 0x0005:
- {
- PRINT();
- UINT16 nLen;
- rIn >> nLen;
- FormulaDump( nLen, FT_CellFormula );
- IGNORE( 1 );
- }
- break;
- }
- }
- if( nNewType )
- {
- LINESTART();
- ADDTEXT( "new value: " );
- switch( nNewType )
- {
- case 0x0001:
- __AddRK( t, rIn.ReadInt32() );
- PRINT();
- break;
- case 0x0002:
- ADDDOUBLE();
- PRINT();
- break;
- case 0x0003:
- AddUNICODEString( t, rIn );
- PRINT();
- break;
- case 0x0004:
- if( Read2( rIn ) )
- ADDTEXT( "true" );
- else
- ADDTEXT( "false" );
- PRINT();
- break;
- case 0x0005:
- {
- PRINT();
- UINT16 nLen;
- rIn >> nLen;
- FormulaDump( nLen, FT_CellFormula );
- IGNORE( 1 );
- }
- break;
- }
- }
- if( rIn.GetRecLeft() > 0 )
- {
- LINESTART();
- ADDTEXT( "*UNKNOWN* data:" );
- PRINT();
- PreDump( rIn.GetRecLeft() );
- }
- }
- break;
- case 0x013D: // TABID
- {
- ADDTEXT( "tab ids:" );
- while( rIn.GetRecLeft() )
- {
- ADDTEXT( " " );
- ADDDEC( 2 );
- }
- PRINT();
- }
- break;
- case 0x0140: // CHTRMOVE - change tracking: moved range
- {
- ADDTEXT( "len: " ); ADDDEC( 4 );
- ADDTEXT( " index: " ); ADDDEC( 4 );
- ADDTEXT( " opcode: " ); ADDHEX( 2 );
- ADDTEXT( " accept: " ); ADDHEX( 2 );
- PRINT();
- UINT16 nTab1, nTab2;
- UINT16 nCol11, nCol12, nCol21, nCol22;
- UINT16 nRow11, nRow12, nRow21, nRow22;
- rIn >> nTab2 >> nRow11 >> nRow12 >> nCol11 >> nCol12 >> nRow21 >> nRow22 >> nCol21 >> nCol22 >> nTab1;
- LINESTART();
- ADDTEXT( "move range from: tab=" ); __AddDec( t, nTab1 );
- ADDTEXT( " " ); lcl_AddRangeRef( t, nCol11, nRow11, nCol12, nRow12 );
- ADDTEXT( " to: tab=" ); __AddDec( t, nTab2 );
- ADDTEXT( " " ); lcl_AddRangeRef( t, nCol21, nRow21, nCol22, nRow22 );
- ADDTEXT( " unknown: " ); ADDHEX( 4 );
- PRINT();
- }
- break;
- case 0x014D: // CHTRINSERTTAB - change tracking: insert tab
- {
- ADDTEXT( "len: " ); ADDDEC( 4 );
- ADDTEXT( " index: " ); ADDDEC( 4 );
- ADDTEXT( " opcode: " ); ADDHEX( 2 );
- ADDTEXT( " accept: " ); ADDHEX( 2 );
- ADDTEXT( " tab: " ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "unknown: " ); ADDHEX( 4 );
- ADDTEXT( " table name: " );
- AddUNICODEString( t, rIn );
- PRINT();
- LINESTART();
- __AddDec( t, (sal_uInt32)rIn.GetRecLeft() );
- ADDTEXT( " bytes of unknown data:" );
- PRINT();
- ContDump( rIn.GetRecLeft() );
- }
- break;
- case 0x015F: // LABELRANGES
- {
- UINT16 nCnt, nR1, nR2, nC1, nC2;
- rIn >> nCnt;
- ADDTEXT( "row headers: " ); __AddDec( t, nCnt );
- PRINT();
- while( nCnt-- )
- {
- rIn >> nR1 >> nR2 >> nC1 >> nC2;
- LINESTART();
- AddRangeRef( t, nR1, nC1 | 0xC000, nR2, nC2 | 0xC000, FALSE );
- PRINT();
- }
- rIn >> nCnt;
- LINESTART();
- ADDTEXT( "column headers: " ); __AddDec( t, nCnt );
- PRINT();
- while( nCnt-- )
- {
- rIn >> nR1 >> nR2 >> nC1 >> nC2;
- LINESTART();
- AddRangeRef( t, nR1, nC1 | 0xC000, nR2, nC2 | 0xC000, FALSE );
- PRINT();
- }
- }
- break;
- case 0x0193:
- {
- ADDTEXT( "unknown: " ); ADDHEX( 4 );
- PRINT();
- LINESTART();
- ADDTEXT( "16 bytes unknown identification:" );
- PRINT();
- ContDump( 16 );
- LINESTART();
- ADDTEXT( "date/time: " ); ADDDEC( 2 );
- ADDTEXT( "-" ); ADDDEC( 1 );
- ADDTEXT( "-" ); ADDDEC( 1 );
- ADDTEXT( " " ); ADDDEC( 1 );
- ADDTEXT( ":" ); ADDDEC( 1 );
- ADDTEXT( ":" ); ADDDEC( 1 );
- ADDTEXT( " unknown: " ); ADDHEX( 1 );
- PRINT();
- LINESTART();
- ADDTEXT( "user: " );
- if( rIn.GetRecLeft() > 3 )
- AddUNICODEString( t, rIn );
- PRINT();
- }
- break;
- case 0x0194:
- {
- rIn.DisableDecryption();
- ADDTEXT( "unknown: " ); ADDHEX( 4 );
- ADDTEXT( " date/time: " ); ADDDEC( 2 );
- ADDTEXT( "-" ); ADDDEC( 1 );
- ADDTEXT( "-" ); ADDDEC( 1 );
- ADDTEXT( " " ); ADDDEC( 1 );
- ADDTEXT( ":" ); ADDDEC( 1 );
- ADDTEXT( ":" ); ADDDEC( 1 );
- ADDTEXT( " unknown: " ); ADDHEX( 1 );
- PRINT();
- LINESTART();
- ADDTEXT( "user: " );
- if( rIn.GetRecLeft() > 3 )
- AddUNICODEString( t, rIn );
- PRINT();
- LINESTART();
- __AddDec( t, (sal_uInt32)rIn.GetRecLeft() );
- ADDTEXT( " bytes of unknown data:" );
- PRINT();
- ContDump( rIn.GetRecLeft() );
- }
- break;
- case 0x0195:
- rIn.DisableDecryption();
- ContDump( nL );
- break;
- case 0x0196:
- {
- rIn.DisableDecryption();
- ADDTEXT( "unknown: " ); ADDHEX( 2 );
- ADDTEXT( " " ); ADDHEX( 2 );
- ADDTEXT( " " ); ADDHEX( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "16 bytes unknown identification:" );
- PRINT();
- ContDump( 16 );
- LINESTART();
- ADDTEXT( "16 bytes unknown identification:" );
- PRINT();
- ContDump( 16 );
- LINESTART();
- ADDTEXT( "count of changes: " ); ADDDEC( 2 );
- ADDTEXT( " " );
- __AddDec( t, (sal_uInt32)rIn.GetRecLeft() );
- ADDTEXT( " bytes of unknown data:" );
- PRINT();
- ContDump( rIn.GetRecLeft() );
- }
- break;
- case 0x01A9: // USERBVIEW
- {
- LINESTART();
- ADDTEXT( "view id: " ); ADDHEX( 4 );
- ADDTEXT( " tab id: " ); ADDDEC( 4 );
- ADDTEXT( " guid: " ); __AddGUID( t, rIn );
- PRINT();
- LINESTART();
- ADDTEXT( "window x: " ); ADDDEC( 4 );
- ADDTEXT( " y: " ); ADDDEC( 4 );
- ADDTEXT( " width: " ); ADDDEC( 4 );
- ADDTEXT( " height: " ); ADDDEC( 4 );
- ADDTEXT( " ratio: " ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- UINT16 __nFlags = Read2( rIn );
- STARTFLAG();
- ADDFLAG( 0x0001, "fDsplFormulaBar" );
- ADDFLAG( 0x0002, "fDsplStatus" );
- ADDFLAG( 0x0004, "fNoteOff" );
- ADDFLAG( 0x0008, "fDsplHScroll" );
- ADDFLAG( 0x0010, "fDsplVScroll" );
- ADDFLAG( 0x0020, "fBotAdornment" );
- ADDFLAG( 0x0040, "fZoom" );
- ADDFLAG( 0x0080, "fShowPlaceHld" );
- ADDFLAG( 0x0100, "fHideAll" );
- if( !(__nFlags & 0x0180) )
- ADDTEXT( " fShowAll" );
- PRINT();
- LINESTART();
- ADDTEXT( "flags2: " ); ADDHEX( 2 );
- ADDTEXT( " merge int: " ); ADDDEC( 2 );
- ADDTEXT( " reserved: " ); ADDHEX( 2 );
- PRINT();
- if( rIn.GetRecLeft() > 3 )
- {
- LINESTART();
- ADDTEXT( "name: " );
- AddUNICODEString( t, rIn );
- PRINT();
- }
- }
- break;
- case 0x01AA: // USERSVIEWBEGIN
- {
- LINESTART();
- ADDTEXT( "guid: " ); __AddGUID( t, rIn );
- ADDTEXT( " tab id: " ); ADDDEC( 4 );
- PRINT();
- LINESTART();
- ADDTEXT( "wscale: " ); ADDDEC( 4 );
- ADDTEXT( " icolor: " ); ADDDEC( 4 );
- ADDTEXT( " pane: " ); ADDDEC( 4 );
- PRINT();
- LINESTART();
- UINT32 __nFlags = Read4( rIn );
- STARTFLAG();
- if( __nFlags & 0x000000FF )
- {
- ADDFLAG( 0x00000001, "fShowPgBrk" );
- ADDFLAG( 0x00000002, "fDsplForml" );
- ADDFLAG( 0x00000004, "fDsplGrid" );
- ADDFLAG( 0x00000008, "fDsplRCHead" );
- ADDFLAG( 0x00000010, "fDsplGuts" );
- ADDFLAG( 0x00000020, "fDsplZeros" );
- ADDFLAG( 0x00000040, "fPrintHorC" );
- ADDFLAG( 0x00000080, "fPrintVerC" );
- PRINT();
- LINESTART();
- }
- if( __nFlags & 0x00007F00 )
- {
- ADDTEXT( " " );
- ADDFLAG( 0x00000100, "fPrintRCHead" );
- ADDFLAG( 0x00000200, "fPrintGrid" );
- ADDFLAG( 0x00000400, "fFitToPage" );
- ADDFLAG( 0x00000800, "fPrintArea" );
- ADDFLAG( 0x00001000, "fOnePrintArea" );
- ADDFLAG( 0x00002000, "fFilter" );
- ADDFLAG( 0x00004000, "fAutoFilter" );
- PRINT();
- LINESTART();
- }
- if( __nFlags & 0xFFF80000 )
- {
- ADDTEXT( " " );
- ADDFLAG( 0x00020000, "fSplitV" );
- ADDFLAG( 0x00040000, "fSplitH" );
- ADDFLAG( 0x00180000, "fHiddenRow" );
- ADDFLAG( 0x00200000, "fHiddenCol" );
- ADDFLAG( 0x01000000, "fChartSize" );
- ADDFLAG( 0x02000000, "fFilterUnique" );
- ADDFLAG( 0x04000000, "fLayoutView" );
- ADDRESERVED( 0xF8C18000 );
- PRINT();
- LINESTART();
- }
- if( !__nFlags )
- PRINT();
- ADDTEXT( "visible: " ); ADDHEX( 2 );
- ADDTEXT( " " ); ADDHEX( 2 );
- ADDTEXT( " " ); ADDHEX( 2 );
- ADDTEXT( " " ); ADDHEX( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "pane pos vert: " ); ADDDOUBLE();
- ADDTEXT( " hor: " ); ADDDOUBLE();
- ADDTEXT( " 1st vis right: " ); ADDDEC( 2 );
- ADDTEXT( " bott: " ); ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x01AB: // USERSVIEWEND
- {
- LINESTART();
- ADDTEXT( "settings are valid: " ); ADDHEX( 2 );
- PRINT();
- }
- break;
- case 0x01AD: // QSI - web query range
- {
- LINESTART();
- rIn >> __nFlags;
- STARTFLAG();
- ADDFLAG( 0x0001, "fTitles" );
- ADDFLAG( 0x0002, "fRowNums" );
- ADDFLAG( 0x0004, "fDisRefr" );
- ADDFLAG( 0x0080, "fFill" );
- ADDFLAG( 0x0100, "fAutoFmt" );
- ADDFLAG( 0x0400, "fDisEdit" );
- ADDRESERVED( 0xFA78 );
- PRINT();
- LINESTART();
- ADDTEXT( "AutoFmt: " ); ADDDEC( 2 );
- ADDTEXT( " AutoFmtAttr: " ); ADDHEX( 2 );
- ADDTEXT( " reserved: " ); ADDHEX( 4 );
- PRINT();
- LINESTART();
- ADDTEXT( "name: " );
- AddUNICODEString( t, rIn );
- PRINT();
- }
- break;
- case 0x01AE:
- {
- LINESTART();
- ADDTEXT( "# of tabs: " );
- UINT16 nTabs;
- rIn >> nTabs;
- __AddDec( t, nTabs );
- rIn.PushPosition();
- PRINT();
- LINESTART();
- if( nL <= (ULONG)(2 + 2 * nTabs) )
- {
- ADDTEXT( "----- shortened record -----" );
- PRINT();
-
- rIn.PopPosition();
- ContDump( nL - 2 );
- }
- else
- {
- rIn.RejectPosition();
- ADDTEXT( "file name: " );
- AddUNICODEString( t, rIn );
- PRINT();
- while( nTabs )
- {
- LINESTART();
- ADDTEXT( " " );
- AddUNICODEString( t, rIn );
- PRINT();
- nTabs--;
- }
- }
-
- }
- break;
- case 0x01B0: // CONDFMT
- {
- LINESTART();
- ADDTEXT( "cf-count=" ); ADDDEC( 2 );
- rIn >> __nFlags;
- ADDTEXT( " " );
- STARTFLAG();
- ADDFLAG( 0x0001, "tough-recalc" );
- ADDRESERVED( 0xFFFE );
- PRINT();
- LINESTART();
- sal_uInt16 nR1, nR2, nC1, nC2, nCount;
- rIn >> nR1 >> nR2 >> nC1 >> nC2 >> nCount;
- ADDTEXT( "max-range=" ); lcl_AddRangeRef( t, nC1, nR1, nC2, nR2 );
- ADDTEXT( " range-count=" ); __AddDec( t, nCount );
- PRINT();
-
- for( sal_uInt16 nRange = 0; rIn.IsValid() && (nRange < nCount); ++nRange )
- {
- if( !(nRange % 4) )
- {
- LINESTART();
- ADDTEXT( pPre );
- }
- rIn >> nR1 >> nR2 >> nC1 >> nC2;
- ByteString aRef;
- lcl_AddRangeRef( aRef, nC1, nR1, nC2, nR2 );
- aRef.Expand( 16, ' ' );
- ADDTEXT( aRef );
- if( (nRange % 4 == 3) || (nRange + 1 == nCount) )
- PRINT();
- }
- }
- break;
- case 0x01B1: // CF - conditional format
- {
- sal_uInt8 nType, nOp;
- sal_uInt16 nSize1, nSize2;
- sal_uInt32 nFlags;
- rIn >> nType >> nOp >> nSize1 >> nSize2 >> nFlags;
- LINESTART();
- ADDTEXT( "type=" ); __AddHex( t, nType );
- ADDTEXT( " (" );
- switch( nType )
- {
- case 0x01: ADDTEXT( "compare" ); break;
- case 0x02: ADDTEXT( "formula" ); break;
- default: ADDTEXT( "!unknown!" );
- }
- ADDTEXT( ") operator=" ); __AddHex( t, nOp );
- ADDTEXT( " (" );
- switch( nOp )
- {
- case 0x00: ADDTEXT( "none" ); break;
- case 0x01: ADDTEXT( "between" ); break;
- case 0x02: ADDTEXT( "not-between" ); break;
- case 0x03: ADDTEXT( "equal" ); break;
- case 0x04: ADDTEXT( "not-equal" ); break;
- case 0x05: ADDTEXT( "greater" ); break;
- case 0x06: ADDTEXT( "less" ); break;
- case 0x07: ADDTEXT( "greater-eq" ); break;
- case 0x08: ADDTEXT( "less-eq" ); break;
- default: ADDTEXT( "!unknown!" );
- }
- ADDTEXT( ")" );
- PRINT();
- LINESTART();
- ADDTEXT( "formula-size-1=" ); __AddDec( t, nSize1 );
- ADDTEXT( " formula-size-2=" ); __AddDec( t, nSize2 );
- PRINT();
- LINESTART();
- sal_uInt32 __nFlags = nFlags;
- STARTFLAG();
- __nFlags = ~__nFlags;
- ADDFLAG( 0x00000400, "bord-lft" );
- ADDFLAG( 0x00000800, "bord-rgt" );
- ADDFLAG( 0x00001000, "bord-top" );
- ADDFLAG( 0x00002000, "bord-bot" );
- ADDFLAG( 0x00010000, "patt-style" );
- ADDFLAG( 0x00020000, "patt-fgcol" );
- ADDFLAG( 0x00040000, "patt-bgcol" );
- __nFlags = ~__nFlags;
- ADDFLAG( 0x04000000, "font" );
- ADDFLAG( 0x10000000, "bord" );
- ADDFLAG( 0x20000000, "patt" );
- ADDRESERVED( 0xCBC00000 );
- PRINT();
- LINESTART();
- ADDTEXT( "unknown=" ); ADDHEX( 2 );
- PRINT();
- if( nFlags & 0x04000000 )
- {
- LINESTART(); ADDTEXT( "*** FONT ***" ); PRINT();
- ContDump( 64 );
- LINESTART();
- ADDTEXT( "height=" ); ADDHEX( 4 );
- rIn >> __nFlags;
- ADDTEXT( " style-" );
- STARTFLAG();
- ADDFLAG( 0x00000002, "italic" );
- ADDFLAG( 0x00000080, "strikeout" );
- ADDRESERVED( 0xFFFFFF7D );
- ADDTEXT( " weight=" ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- sal_uInt16 nEsc;
- rIn >> nEsc;
- ADDTEXT( "escapement=" ); __AddDec( t, nEsc );
- ADDTEXT( " (" );
- switch( nEsc )
- {
- case 0x0000: ADDTEXT( "none" ); break;
- case 0x0001: ADDTEXT( "super" ); break;
- case 0x0002: ADDTEXT( "sub" ); break;
- default: ADDTEXT( "!unknown!" );
- }
- sal_uInt8 nUnd;
- rIn >> nUnd;
- ADDTEXT( ") underline=" ); __AddDec( t, nUnd );
- ADDTEXT( " (" );
- switch( nUnd )
- {
- case 0x00: ADDTEXT( "none" ); break;
- case 0x01: ADDTEXT( "single" ); break;
- case 0x02: ADDTEXT( "double" ); break;
- default: ADDTEXT( "!unknown!" );
- }
- ADDTEXT( ") unknown=" ); ADDHEX( 1 );
- ADDTEXT( " " ); ADDHEX( 1 );
- ADDTEXT( " " ); ADDHEX( 1 );
- PRINT();
- LINESTART();
- ADDTEXT( "color=" ); ADDHEX( 4 );
- ADDTEXT( " unknown=" ); ADDHEX( 4 );
- rIn >> __nFlags;
- ADDTEXT( " used-" );
- STARTFLAG();
- __nFlags = ~__nFlags;
- ADDFLAG( 0x00000002, "italic" );
- ADDFLAG( 0x00000080, "strikeout" );
- __nFlags = ~__nFlags;
- ADDRESERVED( 0xFFFFFF65 );
- PRINT();
- LINESTART();
- ADDTEXT( "escape-def=" ); ADDHEX( 4 );
- ADDTEXT( " underl-def=" ); ADDHEX( 4 );
- PRINT();
- ContDump( 18 );
- }
- if( nFlags & 0x10000000 )
- {
- LINESTART(); ADDTEXT( "*** BORDER ***" ); PRINT();
- sal_uInt16 nLine;
- sal_uInt32 nColor;
- rIn >> nLine >> nColor;
- LINESTART();
- ADDTEXT( "line-style=" ); __AddHex( t, nLine );
- ADDTEXT( " (lft=" ); __AddDec( t, (sal_uInt16)(nLine & 0x000F) );
- ADDTEXT( " rgt=" ); __AddDec( t, (sal_uInt16)((nLine & 0x00F0) >> 4) );
- ADDTEXT( " top=" ); __AddDec( t, (sal_uInt16)((nLine & 0x0F00) >> 8) );
- ADDTEXT( " bot=" ); __AddDec( t, (sal_uInt16)((nLine & 0xF000) >> 12) );
- ADDTEXT( ")" );
- PRINT();
- LINESTART();
- ADDTEXT( "line-color=" ); __AddHex( t, nColor );
- ADDTEXT( " (lft=" ); __AddDec( t, (sal_uInt16)(nColor & 0x0000007F) );
- ADDTEXT( " rgt=" ); __AddDec( t, (sal_uInt16)((nColor & 0x00003F80) >> 7) );
- ADDTEXT( " top=" ); __AddDec( t, (sal_uInt16)((nColor & 0x007F0000) >> 16) );
- ADDTEXT( " bot=" ); __AddDec( t, (sal_uInt16)((nColor & 0x3F800000) >> 23) );
- ADDTEXT( ") unknown=" ); ADDHEX( 2 );
- PRINT();
- }
- if( nFlags & 0x20000000 )
- {
- LINESTART(); ADDTEXT( "*** AREA ***" ); PRINT();
- sal_uInt16 nPatt, nColor;
- rIn >> nPatt >> nColor;
- LINESTART();
- ADDTEXT( "pattern=" ); __AddHex( t, nPatt );
- ADDTEXT( " (" ); __AddDec( t, (sal_uInt16)((nPatt & 0xFC00) >> 10) );
- ADDTEXT( ") color=" ); __AddHex( t, nColor );
- ADDTEXT( " (fg=" ); __AddDec( t, (sal_uInt16)(nColor & 0x007F) );
- ADDTEXT( " bg=" ); __AddDec( t, (sal_uInt16)((nColor & 0x3F80) >> 7) );
- ADDTEXT( ")" );
- PRINT();
- }
- if( rIn.IsValid() && nSize1 && (rIn.GetRecLeft() >= nSize1) )
- {
- LINESTART(); ADDTEXT( "*** FORMULA 1 ***" ); PRINT();
- FormulaDump( nSize1, FT_RangeName );
- }
- if( rIn.IsValid() && nSize2 && (rIn.GetRecLeft() >= nSize2) )
- {
- LINESTART(); ADDTEXT( "*** FORMULA 2 ***" ); PRINT();
- FormulaDump( nSize2, FT_RangeName );
- }
- }
- break;
- case 0x01B2: // DVAL - header of DV recs
- {
- rIn >> __nFlags;
- LINESTART();
- STARTFLAG();
- ADDTEXT( " (" );
- __AddPureBin( t, __nFlags );
- ADDTEXT( ")" );
- ADDTEXT( "):" );
- ADDFLAG( 0x0001, "fWnClosed" );
- ADDFLAG( 0x0002, "fWnPinned" );
- ADDFLAG( 0x0004, "fCached" );
- PRINT();
- LINESTART();
- ADDTEXT( "input window: " );
- ADDHEX( 4 );
- ADDTEXT( " / " );
- ADDHEX( 4 );
- PRINT();
- LINESTART();
- ADDTEXT( "object id: " );
- ADDHEX( 4 );
- PRINT();
- LINESTART();
- ADDTEXT( "num of DV recs: " );
- ADDDEC( 4 );
- PRINT();
- }
- break;
- case 0x01B6: // TXO - text box
- {
- LINESTART();
- rIn >> __nFlags;
- STARTFLAG();
- switch( __nFlags & 0x000E )
- {
- case 0x0002: ADDTEXT( " h-left" ); break;
- case 0x0004: ADDTEXT( " h-center" ); break;
- case 0x0006: ADDTEXT( " h-right" ); break;
- case 0x0008: ADDTEXT( " h-block" ); break;
- default: ADDTEXT( " *h-unknown*" );
- }
- switch( __nFlags & 0x0070 )
- {
- case 0x0010: ADDTEXT( " v-top" ); break;
- case 0x0020: ADDTEXT( " v-center" ); break;
- case 0x0030: ADDTEXT( " v-bottom" ); break;
- case 0x0040: ADDTEXT( " v-block" ); break;
- default: ADDTEXT( " *v-unknown*" );
- }
- ADDFLAG( 0x0200, "lock-text" );
- ADDRESERVED( 0xFD81 );
- ADDTEXT( " orient=" );
- sal_uInt16 nOrient = rIn.ReaduInt16();
- __AddDec( t, nOrient );
- ADDTEXT( " (" );
- switch( nOrient )
- {
- case 0: ADDTEXT( "no-rot" ); break;
- case 1: ADDTEXT( "stacked" ); break;
- case 2: ADDTEXT( "90\xB0 ccw" ); break;
- case 3: ADDTEXT( "90\xB0 cw" ); break;
- default: ADDTEXT( "!unknown!" );
- }
- ADDTEXT( ")" );
- PRINT();
- LINESTART();
- ADDTEXT( "reserved=" );
- ADDHEX( 2 ); ADDTEXT( " " ); ADDHEX( 2 ); ADDTEXT( " " ); ADDHEX( 2 );
- ADDTEXT( " text-len=" ); ADDDEC( 2 );
- ADDTEXT( " format-size=" ); ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "reserved=" ); ADDHEX( 2 );
- sal_uInt16 nLinkSize = rIn.ReaduInt16();
- ADDTEXT( " link-size=" ); __AddDec( t, nLinkSize );
- PRINT();
- if( nLinkSize > 0 )
- {
- LINESTART();
- sal_uInt16 nFmlaSize = rIn.ReaduInt16();
- ADDTEXT( "fmla-size=" ); __AddDec( t, nFmlaSize );
- ADDTEXT( " reserved=" ); ADDHEX( 4 );
- PRINT();
- FormulaDump( nFmlaSize, FT_CellFormula );
- }
- }
- break;
- case 0x01BE: // DV - data validation record
- {
- UINT32 __nFlags;
- rIn >> __nFlags;
- LINESTART();
- STARTFLAG();
- ADDTEXT( " (" );
- __AddPureBin( t, __nFlags );
- ADDTEXT( ")" );
- PRINT();
- LINESTART();
- if( __nFlags )
- {
- ADDTEXT( " " );
- ADDFLAG( 0x00000080, "fStrLookup" );
- ADDFLAG( 0x00000100, "fAllowBlank" );
- ADDFLAG( 0x00000200, "fSuppressCombo" );
- ADDFLAG( 0x00040000, "fShowInputMsg" );
- ADDFLAG( 0x00080000, "fShowErrorMsg" );
- }
- PRINT();
- LINESTART();
- ADDTEXT( "error style: " );
- const char* pErrStyle[] = { "stop", "warning", "info", "4" };
- ADDTEXT( pErrStyle[ ( __nFlags >> 4 ) & 0x03 ] );
- PRINT();
- LINESTART();
- const char* pValType[] =
- {
- "all", "integer", "decimal", "list", "date", "time", "text len", "user",
- "8", "9", "A", "B", "C", "D", "E", "F"
- };
- LINESTART();
- ADDTEXT( "validation type: " );
- ADDTEXT( pValType[ __nFlags & 0x0000000F ] );
- PRINT();
-
- const char* pOpType[] =
- {
- "between", "not between", "equal", "not equal",
- "greater", "less", "greater or equal", "less or equal",
- "8", "9", "A", "B", "C", "D", "E", "F"
- };
- LINESTART();
- ADDTEXT( "operator type: " );
- ADDTEXT( pOpType[ ( __nFlags >> 20 ) & 0x0000000F ] );
- PRINT();
-
- LINESTART();
- ADDTEXT( "Prompt Title: " );
- AddUNICODEString( t, rIn );
- PRINT();
- LINESTART();
- ADDTEXT( "Error Title: " );
- AddUNICODEString( t, rIn );
- PRINT();
- LINESTART();
- ADDTEXT( "Prompt Message: " );
- AddUNICODEString( t, rIn );
- PRINT();
- LINESTART();
- ADDTEXT( "Error Message: " );
- AddUNICODEString( t, rIn );
- PRINT();
- if( rIn.GetRecLeft() > 8 )
- {
- UINT16 nLen;
- rIn >> nLen;
- LINESTART();
- ADDTEXT( "Len1: " );
- __AddDec( t, nLen );
- ADDTEXT( " (unknown1: " );
- ADDHEX( 2 );
- ADDTEXT( ")" );
- PRINT();
- FormulaDump( nLen, FT_RangeName );
-
- rIn >> nLen;
- LINESTART();
- ADDTEXT( "Len2: " );
- __AddDec( t, nLen );
- ADDTEXT( " (unknown2: " );
- ADDHEX( 2 );
- ADDTEXT( ")" );
- PRINT();
- FormulaDump( nLen, FT_RangeName );
-
- LINESTART();
- ADDTEXT( "range count: " );
- ADDHEX( 2 );
- PRINT();
- }
-
- while( rIn.GetRecLeft() >= 8 )
- {
- // Row-Row / Col-Col
- UINT16 nR1, nR2, nC1, nC2;
- rIn >> nR1 >> nR2 >> nC1 >> nC2;
- LINESTART();
- AddRangeRef( t, nR1, nC1 | 0xC000, nR2, nC2 | 0xC000, FALSE );
- PRINT();
- }
- }
- break;
- case 0x01B8: // HLINK
- {
- PreDump( nL );
-
- UINT32 n1, n2;
- LINESTART();
- PRINT();
- UINT16 nR1, nR2, nC1, nC2;
- rIn >> nR1 >> nR2 >> nC1 >> nC2;
- ADDTEXT( "Cellrange=" );
- lcl_AddRangeRef( t, nC1, nR1, nC2, nR2 );
- PRINT();
- LINESTART();
- ADDTEXT( "GUID StdLink=" ); __AddGUID( t, rIn );
- PRINT();
- LINESTART();
- ADDTEXT( " must=79EAC9D0-BAF9-11CE-8C82-00AA004BA90B" );
- PRINT();
- LINESTART();
- ADDTEXT( "unknown=" ); ADDHEX( 4 );
- PRINT();
- UINT32 __nFlags = Read4( rIn );
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x00000001, "fBody" );
- ADDFLAG( 0x00000002, "fAbs" );
- ADDFLAG( 0x00000014, "fDescr" );
- ADDFLAG( 0x00000008, "fMark" );
- ADDFLAG( 0x00000080, "fFrame" );
- ADDFLAG( 0x00000100, "fUNC" );
- ADDRESERVED( 0xFFFFFE60 );
- PRINT();
-
- //description
- String aData;
- if( __nFlags & 0x00000014 )
- {
- LINESTART();
- rIn >> n1;
- ADDTEXT( "## Description ## [l=" );
- __AddDec( t, n1 );
- ADDTEXT( "]: '" );
- aData = rIn.ReadRawUniString( (USHORT)(n1 - 1), TRUE );
- t += GETSTR( aData );
- ADDTEXT( "<" ); ADDHEX( 2 ); ADDTEXT( ">'" ); // trailing zero
- PRINT();
- }
-
- // frame name
- if( __nFlags & 0x00000080 )
- {
- LINESTART();
- rIn >> n1;
- ADDTEXT( "## Frame ## [l=" );
- __AddDec( t, n1 );
- ADDTEXT( "]: '" );
- aData = rIn.ReadRawUniString( (USHORT)(n1 - 1), TRUE );
- t += GETSTR( aData );
- ADDTEXT( "<" ); ADDHEX( 2 ); ADDTEXT( ">'" ); // trailing zero
- PRINT();
- }
-
- // network path
- if( __nFlags & 0x00000100 )
- {
- LINESTART();
- rIn >> n1;
- ADDTEXT( "## UNC ## [l=" );
- __AddDec( t, n1 );
- ADDTEXT( "]: '" );
- aData = rIn.ReadRawUniString( (USHORT)(n1 - 1), TRUE );
- t += GETSTR( aData );
- ADDTEXT( "<" ); ADDHEX( 2 ); ADDTEXT( ">'" ); // trailing zero
- PRINT();
- }
-
- // file link or URL
- else if( __nFlags & 0x00000001 )
- {
- rIn.PushPosition();
- rIn >> n1;
- rIn.PopPosition();
- LINESTART();
- ADDTEXT( "## Content GUID ## " );
- __AddGUID( t, rIn );
- switch( n1 )
- {
- case 0x00000303: // file
- {
- ADDTEXT( " File Moniker" );
- PRINT();
- LINESTART();
- ADDTEXT( " must=00000303-0000-0000-C000-000000000046" );
- PRINT();
- LINESTART();
- ADDTEXT( "## File link ## up level=" );
- ADDDEC( 2 );
- rIn >> n2;
- ADDTEXT( " [l=" ); __AddDec( t, n2 );
- ADDTEXT( ", 8-Bit]: '" );
- aData = rIn.ReadRawByteString( (USHORT)(n2 - 1) );
- t += GETSTR( aData );
- ADDTEXT( "<" ); ADDHEX( 1 ); ADDTEXT( ">'" ); // trailing zero
- PRINT();
- ContDump( 24 );
- rIn >> n2;
- LINESTART();
- ADDTEXT( "bytes left=" ); __AddDec( t, n2 );
- if( n2 )
- {
- rIn >> n2;
- LINESTART();
- ADDTEXT( " string byte count=" );
- __AddDec( t, n2 );
- ADDTEXT( " unknown=" );
- ADDHEX( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "[l=" );
- __AddDec( t, n2 / 2 );
- ADDTEXT( "]: '" );
- aData = rIn.ReadRawUniString( (USHORT)n2, TRUE );
- t += GETSTR( aData );
- ADDTEXT( "'" );
- }
- PRINT();
- }
- break;
- case 0x79EAC9E0: // URL
- {
- ADDTEXT( " URL Moniker" );
- PRINT();
- LINESTART();
- ADDTEXT( " must=79EAC9E0-BAF9-11CE-8C82-00AA004BA90B" );
- PRINT();
- rIn >> n2;
- LINESTART();
- ADDTEXT( "## URL ## string byte count=" );
- __AddDec( t, n2 );
- PRINT();
- LINESTART();
- ADDTEXT( "[l=" );
- __AddDec( t, n2 / 2 );
- ADDTEXT( "]: '" );
- aData = rIn.ReadRawUniString( (USHORT)(n2 / 2 - 1), TRUE );
- t += GETSTR( aData );
- ADDTEXT( "<" ); ADDHEX( 2 ); ADDTEXT( ">'" ); // trailing zero
- PRINT();
- }
- break;
- default:
- {
- ADDTEXT( " (!!UNKNOWN!!)" );
- PRINT();
- }
- break;
- }
- }
-
- // text mark
- if( __nFlags & 0x00000008 )
- {
- LINESTART();
- rIn >> n1;
- ADDTEXT( "## Text mark ## [l=" );
- __AddDec( t, n1 );
- ADDTEXT( "]: '" );
- aData = rIn.ReadRawUniString( (USHORT)(n1 - 1), TRUE );
- t += GETSTR( aData );
- ADDTEXT( "<" ); ADDHEX( 2 ); ADDTEXT( ">'" ); // trailing zero
- PRINT();
- }
- }
- break;
- case 0x01BB: // SXFDBTYPE - SQL data type
- {
- ADDTEXT( "SQL data type: " ); ADDHEX( 2 );
- PRINT();
- }
- break;
- case 0x0201:
- {
- LINESTART();
- ADDCELLHEAD();
- PRINT();
- }
- break;
- case 0x0203:
- {
- LINESTART();
- ADDCELLHEAD();
- ADDTEXT( " val = " );
- ADDDOUBLE();
- PRINT();
- }
- break;
- case 0x0205:
- {
- LINESTART();
- ADDCELLHEAD();
- ADDTEXT( " val = " ); ADDHEX( 1 );
- ADDTEXT( " type = " ); ADDDEC( 1 );
- PRINT();
- }
- break;
- case 0x0208: // ROW - row info
- {
- LINESTART();
- ADDTEXT( "row #: " ); ADDDEC( 2 );
- ADDTEXT( " def. cols: " ); ADDDEC( 2 );
- ADDTEXT( "-" ); ADDDEC( 2 );
- ADDTEXT( " ht: " ); ADDDEC( 2 );
- ADDTEXT( " reserved: " ); ADDHEX( 4 );
- PRINT();
- rIn >> __nFlags;
- LINESTART();
- STARTFLAG();
- ADDTEXT( " outlnlev=" );
- __AddDec( t, (UINT16)(__nFlags & 0x0007) );
- ADDFLAG( 0x0010, "fCollapsed" );
- ADDFLAG( 0x0020, "fRowHeightZero" );
- ADDFLAG( 0x0040, "fUnsynced" );
- ADDFLAG( 0x0080, "fGhostDirty" );
- ADDRESERVED( 0xFF08 );
- PRINT();
- UINT16 nXF;
- rIn >> nXF;
- LINESTART();
- ADDTEXT( "ix to XF: " ); __AddDec( t, (UINT16)(nXF & 0x0FFF) );
- ADDTEXT( " add. flags(" ); __AddHex( t, nXF );
- ADDTEXT( "):" );
- ADDFLAG( 0x1000, "fExAsc" );
- ADDFLAG( 0x2000, "fExDsc" );
- ADDRESERVED( 0xC000 );
- PRINT();
- }
- break;
- case 0x0021: // ARRAY
- case 0x0221:
- {
- UINT16 nR1, nR2;
- UINT8 nC1, nC2;
- rIn >> nR1 >> nR2 >> nC1 >> nC2 >> __nFlags;
- LINESTART();
- ADDTEXT( "range: " );
- lcl_AddRangeRef( t, nC1, nR1, nC2, nR2 );
- PRINT();
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fAlwaysCalc" );
- ADDFLAG( 0x0002, "fCalcOnLoad" );
- ADDRESERVED( 0xFFFC );
- PRINT();
- LINESTART();
- ADDTEXT( "chn = " );
- ADDHEX( 4 );
- UINT16 n;
- rIn >> n;
- ADDTEXT( " cce = " );
- __AddDec( t, n );
- PRINT();
- FormulaDump( n, FT_SharedFormula );
- }
- break;
- case 0x0225: // DEFAULTROWHEIGHT - height & flags
- {
- rIn >> __nFlags;
- LINESTART();
- ADDTEXT( "default row " );
- STARTFLAG();
- ADDFLAG( 0x0001, "fUnsynced" );
- ADDFLAG( 0x0002, "fRowHtZero" );
- ADDFLAG( 0x0004, "fExAsc" );
- ADDFLAG( 0x0008, "fExDsc" );
- ADDRESERVED( 0xFFF0 );
- PRINT();
- LINESTART();
- ADDTEXT( "default row height: " );
- ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x023E: // WINDOW2
- {
- LINESTART();
- rIn >> __nFlags;
- STARTFLAG();
- ADDFLAG( 0x0001, "show-formulas" );
- ADDFLAG( 0x0002, "show-grid" );
- ADDFLAG( 0x0004, "show-headers" );
- ADDFLAG( 0x0008, "frozen" );
- ADDFLAG( 0x0010, "show-zero" );
- ADDFLAG( 0x0020, "auto-grid-color" );
- ADDFLAG( 0x0040, "right-to-left" );
- ADDFLAG( 0x0080, "show-outline" );
- ADDFLAG( 0x0100, "remove-splits" );
- ADDFLAG( 0x0200, "sheet-selected" );
- ADDFLAG( 0x0400, "sheet-visible" );
- ADDFLAG( 0x0800, "show-pagebreak" );
- ADDRESERVED( 0xF000 );
- PRINT();
- LINESTART();
- ADDTEXT( "first-row=" ); ADDDEC( 2 );
- ADDTEXT( " first-col=" ); ADDDEC( 2 );
- ADDTEXT( " grid-color=" ); ADDDEC( 2 );
- ADDTEXT( " reserved=" ); ADDHEX( 2 );
- PRINT();
- // reallife: WINDOW2 in charts do not have teh following fields
- if( rIn.GetRecLeft() >= 8 )
- {
- LINESTART();
- ADDTEXT( "pagebreak-zoom=" ); ADDDEC( 2 );
- ADDTEXT( "% view-zoom=" ); ADDDEC( 2 );
- ADDTEXT( "% reserved=" ); ADDHEX( 4 );
- PRINT();
- }
- }
- break;
- case 0x027E:
- {
- ADDCELLHEAD();
- ADDTEXT( " val = " );
- __AddRK( t, rIn.ReadInt32() );
- PRINT();
- }
- break;
- case 0x0293: // STYLE
- {
- LINESTART();
- sal_uInt16 nXF;
- rIn >> nXF;
- ADDTEXT( "xf-ref=" ); __AddHex( t, nXF );
- ADDTEXT( " (xf=#" ); __AddDec( t, static_cast< sal_uInt16 >( nXF & EXC_STYLE_XFMASK ) );
- if( ::get_flag( nXF, EXC_STYLE_BUILTIN ) )
- {
- sal_uInt8 nStyleId, nLevel;
- rIn >> nStyleId >> nLevel;
- ADDTEXT( " builtin) style-id=" ); __AddDec( t, nStyleId );
- ADDTEXT( " (" );
- static const sal_Char* ppcStyles[] = {
- "Normal", "RowLevel", "ColLevel", "Comma", "Currency",
- "Percent", "Comma_0", "Currency_0",
- "Hyperlink", "Followed_Hyperlink" };
- if( nStyleId < STATIC_TABLE_SIZE( ppcStyles ) )
- ADDTEXT( ppcStyles[ nStyleId ] );
- else
- ADDTEXT( "!unknown!" );
- ADDTEXT( ") outline-level=" ); __AddDec( t, nLevel );
- }
- else
- {
- ADDTEXT( ") name=" );
- AddUNICODEString( t, rIn );
- }
- PRINT();
- }
- break;
- case 0x041E:
- {
- LINESTART();
- ADDTEXT( "Index: " ); ADDHEX( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "Format: " ); AddUNICODEString( t, rIn );
- PRINT();
- }
- break;
- case 0x04BC:
- {
- UINT16 nR1, nR2;
- UINT8 nC1, nC2;
- LINESTART();
- rIn >> nR1 >> nR2 >> nC1 >> nC2;
- lcl_AddRangeRef( t, nC1, nR1, nC2, nR2 );
- PRINT();
- LINESTART();
- ADDTEXT( "reserved = " );
- __AddPureHex( t, Read2( rIn ) );
- UINT16 n;
- rIn >> n;
- ADDTEXT( " cce = " );
- __AddDec( t, n );
- PRINT();
- FormulaDump( n, FT_SharedFormula );
- }
- break;
- case 0x0803: // WEBQRYSETTINGS - web query: options
- {
- UINT16 nCnt;
- LINESTART();
- ADDTEXT( "repeated recnum: " );
- ADDHEX( 2 );
- ADDTEXT( " unknown:" );
- for( nCnt = 0; nCnt < 3; nCnt++ )
- {
- ADDTEXT( " " );
- ADDHEX( 2 );
- }
- PRINT();
- LINESTART();
- rIn >> __nFlags;
- STARTFLAG();
- ADDFLAG( 0x0001, "fImportPRE" );
- ADDFLAG( 0x0002, "fIgnoreSep" );
- ADDFLAG( 0x0004, "fUseSetting" );
- ADDFLAG( 0x0010, "fIgnoreDate" );
- ADDFLAG( 0x0020, "fWhatIsIt?" );
- ADDRESERVED( 0xFFC8 );
- PRINT();
- LINESTART();
- rIn >> __nFlags;
- STARTFLAG();
- ADDFLAG( 0x0002, "fTables" );
- ADDRESERVED( 0xFFFD );
- PRINT();
- LINESTART();
- ADDTEXT( "unknown: " ); ADDHEX( 2 );
- ADDTEXT( " " ); ADDHEX( 2 );
- ADDTEXT( " " ); ADDHEX( 2 );
- ADDTEXT( " " ); ADDHEX( 2 );
- ADDTEXT( " " ); ADDHEX( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "refresh: " ); ADDDEC( 2 );
- ADDTEXT( " unknown: " ); ADDHEX( 2 );
- ADDTEXT( " " ); ADDHEX( 2 );
- PRINT();
- }
- break;
- case 0x0804: // WEBQRYTABLES - web query: selected tables
- {
- LINESTART();
- ADDTEXT( "repeated recnum: " ); ADDHEX( 2 );
- ADDTEXT( " unknown: " ); ADDHEX( 2 );
- PRINT();
- if( nL > 6 )
- {
- LINESTART();
- ADDTEXT( "text: " );
- AddUNICODEString( t, rIn );
- PRINT();
- }
- }
- break;
- case 0x0809: // BOF
- {
- rIn.DisableDecryption();
- LINESTART();
- ADDTEXT( "version number: " );
- ADDHEX( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "substream type: " );
- rIn >> mnSubstream;
- __AddHex( t, mnSubstream );
- ADDTEXT( " (" );
- switch( mnSubstream )
- {
- case 0x0005: p = "Workbook globals"; break;
- case 0x0006: p = "Visual Basic module"; break;
- case 0x0010: p = "Worksheet or dialog sheet"; break;
- case 0x0020: p = "Chart"; break;
- case 0x0040: p = "MS 4.0 Macro"; break;
- case 0x0100: p = "Workspace file"; break;
- default: p = pU;
- }
- ADDTEXT( p );
- ADDTEXT( ")" );
- PRINT();
- LINESTART();
- UINT16 n;
- rIn >> n;
- ADDTEXT( "build identifier: ");
- __AddHex( t, n );
- ADDTEXT( " (=" );
- __AddDec( t, n );
- ADDTEXT( ")" );
- PRINT();
-
- LINESTART();
- rIn >> n;
- ADDTEXT( "build year: ");
- __AddHex( t, n );
- ADDTEXT( " (=" );
- __AddDec( t, n );
- ADDTEXT( ")" );
- PRINT();
-
- UINT32 __nFlags;
- rIn >> __nFlags;
- LINESTART();
- ADDTEXT( "file history " );
- STARTFLAG();
- if( __nFlags )
- {
- ADDFLAG( 0x00000001, "fWin" );
- ADDFLAG( 0x00000002, "fRisc" );
- ADDFLAG( 0x00000004, "fBeta" );
- ADDFLAG( 0x00000008, "fWinAny" );
- ADDFLAG( 0x00000010, "fMacAny" );
- ADDFLAG( 0x00000020, "fBetaAny" );
- ADDFLAG( 0x00000100, "fRiscAny" );
- ADDRESERVED( 0xFFFFE0C0 );
- }
- PRINT();
-
- LINESTART();
- ADDTEXT( "lowest BIFF version: ");
- ADDHEX( 4 );
- PRINT();
- }
- break;
- case 0x1002: // ChartChart
- {
- LINESTART();
- ADDTEXT( "Pos = " );
- ADD16P16();
- ADDTEXT( " / " );
- ADD16P16();
- ADDTEXT( " Size = " );
- ADD16P16();
- ADDTEXT( " / " );
- ADD16P16();
- PRINT();
- }
- break;
- case 0x1003: // ChartSeries
- {
- sal_uInt16 nCatType, nValType, nCatCnt, nValCnt, nBubType, nBubCnt;
- rIn >> nCatType >> nValType >> nCatCnt >> nValCnt >> nBubType >> nBubCnt;
- LINESTART();
- ADDTEXT( "category-type=" ); __AddDec( t, nCatType );
- ADDTEXT( " " ); ADDTEXT( GetSeriesType( nCatType ) );
- ADDTEXT( " count=" ); __AddDec( t, nCatCnt );
- PRINT();
- LINESTART();
- ADDTEXT( " value-type=" ); __AddDec( t, nValType );
- ADDTEXT( " " ); ADDTEXT( GetSeriesType( nValType ) );
- ADDTEXT( " count=" ); __AddDec( t, nValCnt );
- PRINT();
- LINESTART();
- ADDTEXT( " bubble-type=" ); __AddDec( t, nBubType );
- ADDTEXT( " " ); ADDTEXT( GetSeriesType( nBubType ) );
- ADDTEXT( " count=" ); __AddDec( t, nBubCnt );
- PRINT();
- }
- break;
- case 0x1006: // ChartDataformat
- {
- INT16 n;
- LINESTART();
- rIn >> n;
- ADDTEXT( "Point number = " );
- __AddDec( t, n );
- if( n == -1 )
- ADDTEXT( " (entire series)" );
- PRINT();
- LINESTART();
- ADDTEXT( "Series index = " );
- ADDDEC( 2 );
- ADDTEXT( " Series number = " );
- ADDDEC( 2 );
- if( Read2( rIn ) & 0x01 )
- ADDTEXT( " (fXL4iss)" );
- PRINT();
- }
- break;
- case 0x1007: // ChartLineform
- {
- LINESTART();
- ADDTEXT( "Color = " );
- ADDTEXT( GetRGB( Read4( rIn ) ) );
- ADDTEXT( " Pattern : " );
- ADDTEXT( GetLineType( Read2( rIn ) ) );
- switch( ( INT16 ) Read2( rIn ) )
- {
- case -1: p = "hairline"; break;
- case 0: p = "narrow (single)"; break;
- case 1: p = "medium (double)"; break;
- case 2: p = "wide (triple)"; break;
- default: p = pU;
- }
- ADDTEXT( ", " );
- ADDTEXT( p );
- PRINT();
- rIn >> __nFlags;
- if( __nFlags )
- {
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fAuto" );
- ADDFLAG( 0x0004, "fDrawTick" );
- PRINT();
- }
- LINESTART();
- ADDTEXT( "color index = " );
- ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x1009: // ChartMarkerformat
- {
- UINT16 n;
- LINESTART();
- ADDTEXT( "Fore = " );
- ADDTEXT( GetRGB( Read4( rIn ) ) );
- ADDTEXT( " Back = " );
- ADDTEXT( GetRGB( Read4( rIn ) ) );
- rIn >> n;
- switch( n )
- {
- case 0: p = "no marker"; break;
- case 1: p = "square"; break;
- case 2: p = "diamond"; break;
- case 3: p = "triangle"; break;
- case 4: p = "X"; break;
- case 5: p = "star"; break;
- case 6: p = "Dow-Jones"; break;
- case 7: p = "std deviation"; break;
- case 8: p = "circle"; break;
- case 9: p = "plus sign"; break;
- default: p = pU;
- }
- ADDTEXT( " Type = " );
- ADDTEXT( p );
- PRINT();
- rIn >> __nFlags;
- if( __nFlags )
- {
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fAuto" );
- ADDFLAG( 0x0010, "fNoBackg" );
- ADDFLAG( 0x0020, "fNoFore" );
- ADDRESERVED( 0xFFCE );
- PRINT();
- }
- LINESTART();
- ADDTEXT( "border color = " );
- ADDDEC( 2 );
- ADDTEXT( " fill color = " );
- ADDDEC( 2 );
- ADDTEXT( " size = " );
- ADDDEC(4);
- PRINT();
- }
- break;
- case 0x100A: // ChartAreaformat
- {
- LINESTART();
- ADDTEXT( "Fore = " );
- ADDTEXT( GetRGB( Read4( rIn ) ) );
- ADDTEXT( " Back = " );
- ADDTEXT( GetRGB( Read4( rIn ) ) );
- ADDTEXT( " Pattern = " );
- UINT16 n;
- rIn >> n >> __nFlags;
- __AddDec( t, n );
- ADDTEXT( " (" );
- __AddHex( t, n );
- ADDTEXT( ")" );
- PRINT();
- if( __nFlags )
- {
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x01, "fAuto" );
- ADDFLAG( 0x02, "fInvertNeg" );
- PRINT();
- }
- }
- LINESTART();
- ADDTEXT( "color index fore = " );
- ADDDEC( 2 );
- ADDTEXT( ", back = " );
- ADDDEC( 2 );
- PRINT();
- break;
- case 0x100B: // ChartPieformat
- LINESTART();
- ADDDEC( 2 );
- ADDTEXT( "%" );
- PRINT();
- break;
- case 0x100C: // ChartAttachedlabel
- ContDump( nL );
- break;
- case 0x100D: // ChartSeriestext
- ContDump( nL );
- break;
- case 0x1014: // ChartChartformat
- {
- ContDump( 16 );
- LINESTART();
- rIn >> __nFlags;
- if( __nFlags )
- {
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fVaried" );
- PRINT();
- }
- LINESTART();
- ADDTEXT( "drawing order = " );
- ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x1015: // ChartLegend
- {
- UINT32 nX, nY, nDx, nDy;
- UINT8 nWType, nWSpacing;
- rIn >> nX >> nY >> nDx >> nDy >> nWType >> nWSpacing >> __nFlags;
- LINESTART();
- __AddDec( t, nX );
- ADDTEXT( " / " );
- __AddDec( t, nY );
- ADDTEXT( " [" );
- __AddDec( t, nDx );
- ADDTEXT( " / " );
- __AddDec( t, nDy );
- ADDTEXT( "]" );
- PRINT();
- LINESTART();
- ADDTEXT( " Type: " );
- switch( nWType )
- {
- case 0: p = "bottom"; break;
- case 1: p = "corner"; break;
- case 2: p = "top"; break;
- case 3: p = "right"; break;
- case 4: p = "left"; break;
- case 7: p = "not docked or inside the plot area"; break;
- default: p = pU;
- }
- ADDTEXT( p );
- ADDTEXT( " Spacing: " );
- switch( nWSpacing )
- {
- case 0: p = "close"; break;
- case 1: p = "medium"; break;
- case 2: p = "open"; break;
- default: p = pU;
- }
- ADDTEXT( p );
- PRINT();
- if( __nFlags )
- {
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x01, "fAutoPosition" );
- ADDFLAG( 0x02, "fAutoSeries" );
- ADDFLAG( 0x04, "fAutoPosX" );
- ADDFLAG( 0x08, "fAutoPosY" );
- ADDFLAG( 0x10, "fVert" );
- ADDFLAG( 0x20, "fWasDataTable" );
- PRINT();
- }
- }
- break;
- case 0x1016: // ChartSerieslist
- ContDump( nL );
- break;
- case 0x1017: // ChartBar
- {
- LINESTART();
- ADDTEXT( "space betw. bars = " );
- ADDDEC( 2 );
- ADDTEXT( " space betw. cat = " );
- ADDDEC( 2 );
- PRINT();
- rIn >> __nFlags;
- if( __nFlags )
- {
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fTranspose" );
- ADDFLAG( 0x0002, "fStacked" );
- ADDFLAG( 0x0004, "f100" );
- ADDFLAG( 0x0008, "fHasShadow" );
- PRINT();
- }
- }
- break;
- case 0x1018: // ChartLine
- ContDump( nL );
- break;
- case 0x1019: // ChartPie
- ContDump( nL );
- break;
- case 0x101A: // ChartArea
- ContDump( nL );
- break;
- case 0x101C: // ChartLine
- ContDump( nL );
- break;
- case 0x101D: // ChartAxis
- {
- static const sal_Char* const ppcIds[] = { "x-axis", "y-axis", "z-axis" };
- LINESTART();
- sal_uInt16 nAxisId = rIn.ReaduInt16();
- ADDTEXT( "axis-id=" ); __AddDec( t, nAxisId );
- lcl_AddEnum( t, nAxisId, ppcIds, STATIC_TABLE_SIZE( ppcIds ) );
- PRINT();
- ContDump( 16 );
- }
- break;
- case 0x101E: // CHTICK
- {
- static const sal_Char* const ppcTickMode[] = { "off", "inside", "outside", "cross" };
- static const sal_Char* const ppcTickPos[] = { "off", "low", "high", "next-to-axis" };
- static const sal_Char* const ppcText[] = { "transparent", "opaque" };
- LINESTART();
- sal_uInt8 nMajor, nMinor, nPos, nText;
- rIn >> nMajor >> nMinor >> nPos >> nText;
- ADDTEXT( "major=" ); __AddDec( t, nMajor );
- lcl_AddEnum( t, nMajor, ppcTickMode, STATIC_TABLE_SIZE( ppcTickMode ) );
- ADDTEXT( " minor=" ); __AddDec( t, nMinor );
- lcl_AddEnum( t, nMinor, ppcTickMode, STATIC_TABLE_SIZE( ppcTickMode ) );
- PRINT();
- LINESTART();
- ADDTEXT( "position=" ); __AddDec( t, nPos );
- lcl_AddEnum( t, nPos, ppcTickPos, STATIC_TABLE_SIZE( ppcTickPos ) );
- ADDTEXT( " text-mode=" ); __AddDec( t, nText );
- lcl_AddEnum( t, nText, ppcText, STATIC_TABLE_SIZE( ppcText ) );
- ADDTEXT( " text-color=" );
- ADDTEXT( GetRGB( Read4( rIn ) ) );
- PRINT();
- LINESTART();
- ADDTEXT( "reserved=" ); ADDHEX( 4 );
- ADDTEXT( "," ); ADDHEX( 4 );
- ADDTEXT( "," ); ADDHEX( 4 );
- ADDTEXT( "," ); ADDHEX( 4 );
- PRINT();
- rIn >> __nFlags;
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fAutoCol" );
- ADDFLAG( 0x0002, "fAutoBack" );
- ADDFLAG( 0x0020, "fAutoRot" );
- ADDRESERVED( 0xFFDC );
- PRINT();
- LINESTART();
- ADDTEXT( "color=" ); ADDDEC( 2 );
- ADDTEXT( " rotation=" ); ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x101F: // CHVALUERANGE
- {
- LINESTART();
- ADDTEXT( "min=" ); ADDDOUBLE();
- ADDTEXT( " max=" ); ADDDOUBLE();
- ADDTEXT( " major=" ); ADDDOUBLE();
- ADDTEXT( " minor=" ); ADDDOUBLE();
- ADDTEXT( " axis-cross=" ); ADDDOUBLE();
- PRINT();
- rIn >> __nFlags;
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fAutoMin" );
- ADDFLAG( 0x0002, "fAutoMax" );
- ADDFLAG( 0x0004, "fAutoMajor" );
- ADDFLAG( 0x0008, "fAutoMinor" );
- ADDFLAG( 0x0010, "fAutoCross" );
- ADDFLAG( 0x0020, "fLogScale" );
- ADDFLAG( 0x0040, "fReverse" );
- ADDFLAG( 0x0080, "fMaxCross" );
- ADDRESERVED( 0xFF00 );
- PRINT();
- }
- break;
- case 0x1020: // CHEXTRANGE
- {
- LINESTART();
- ADDTEXT( "axis-cross=" ); ADDDEC( 2 );
- ADDTEXT( " label-freq=" ); ADDDEC( 2 );
- ADDTEXT( " mark-freq=" ); ADDDEC( 2 );
- PRINT();
- rIn >> __nFlags;
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fBetween" );
- ADDFLAG( 0x0002, "fMaxCross" );
- ADDFLAG( 0x0004, "fReverse" );
- ADDRESERVED( 0xFFF8 );
- PRINT();
- }
- break;
- case 0x1021: // ChartAxislineformat
- {
- LINESTART();
- switch( Read2( rIn ) )
- {
- case 0: p = "axis line itself"; break;
- case 1: p = "major grid line"; break;
- case 2: p = "minor grid line"; break;
- case 3: p = "walls or floor"; break;
- default: p = pU;
- }
- ADDTEXT( p );
- PRINT();
- }
- break;
- case 0x1022: // CHARTFORMATLINK
- ContDump( nL );
- break;
- case 0x1024: // ChartDefaulttext
- ContDump( nL );
- break;
- case 0x1025: // ChartText
- {
- LINESTART();
- UINT8 nAt, nVat;
- UINT16 nBkgMode;
- INT32 nX, nY, nDx, nDy;
- UINT16 nGrbit2, nIcvText;
- INT16 nTrot;
- rIn >> nAt >> nVat >> nBkgMode;
- ADDTEXT( "h = " );
- switch( nAt )
- {
- case 1: p = "left"; break;
- case 2: p = "center"; break;
- case 3: p = "right"; break;
- case 4: p = "justify"; break;
- case 5: p = "distribute"; break;
- default: p = pU;
- }
- ADDTEXT( p );
- ADDTEXT( " v = " );
- switch( nVat )
- {
- case 1: p = "top"; break;
- case 2: p = "center"; break;
- case 3: p = "bottom"; break;
- case 4: p = "justify"; break;
- case 5: p = "distribute"; break;
- default: p = pU;
- }
- ADDTEXT( p );
- ADDTEXT( " mode = " );
- if( nBkgMode == 1 )
- ADDTEXT( "transparent" );
- else if( nBkgMode == 2 )
- ADDTEXT( "opaque" );
- else
- ADDTEXT( pU );
- PRINT();
- LINESTART();
- ADDTEXT( "color = " );
- ADDTEXT( GetRGB( Read4( rIn ) ) );
- rIn >> nX >> nY >> nDx >> nDy >> __nFlags >> nIcvText >> nGrbit2 >> nTrot;
- ADDTEXT( " pos[size] = " );
- __AddDec( t, nX );
- ADDTEXT( " / " );
- __AddDec( t, nY );
- ADDTEXT( " [" );
- __AddDec( t, nDx );
- ADDTEXT( " / " );
- __AddDec( t, nDy );
- ADDTEXT( "]" );
- PRINT();
- LINESTART();
- ADDTEXT( " (pos[size] = " );
- __AddHex( t, nX );
- ADDTEXT( " / " );
- __AddHex( t, nY );
- ADDTEXT( " [" );
- __AddHex( t, nDx );
- ADDTEXT( " / " );
- __AddHex( t, nDy );
- ADDTEXT( "])" );
- PRINT();
- if( __nFlags )
- {
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fAutoColor" );
- ADDFLAG( 0x0002, "fShowKey" );
- ADDFLAG( 0x0004, "fShowValue" );
- ADDFLAG( 0x0008, "fVert" );
- ADDFLAG( 0x0010, "fAutoText" );
- ADDFLAG( 0x0020, "fGenerated" );
- ADDFLAG( 0x0040, "fDeleted" );
- ADDFLAG( 0x0080, "fAutoMode" );
- ADDFLAG( 0x0800, "fShLabPct" );
- ADDFLAG( 0x1000, "fShowPct" );
- ADDFLAG( 0x2000, "fShowBubbleSizes" );
- ADDFLAG( 0x4000, "fShowLabel" );
- PRINT();
- }
- LINESTART();
- ADDTEXT( "rot = " );
- switch( __nFlags & 0x0700 )
- {
- case 0x0000: p = "no rotation"; break;
- case 0x0100: p = "top to bottom, upright"; break;
- case 0x0200: p = "90 deg counterclockwise"; break;
- case 0x0300: p = "90 deg clockwise"; break;
- default: p = pU;
- }
- ADDTEXT( p );
- ADDTEXT( " trot = " );
- __AddDec( t, nTrot );
- PRINT();
- LINESTART();
- ADDTEXT( "text color = " );
- __AddDec( t, nIcvText );
- PRINT();
- LINESTART();
- ADDTEXT( "placement: " );
- switch( nGrbit2 & 0x000F )
- {
- case 0: p = "0 default"; break;
- case 1: p = "outside"; break;
- case 2: p = "inside"; break;
- case 3: p = "center"; break;
- case 4: p = "axis"; break;
- case 5: p = "above"; break;
- case 6: p = "below"; break;
- case 7: p = "left"; break;
- case 8: p = "right"; break;
- case 9: p = "auto"; break;
- case 10: p = "moved"; break;
- default: p = pU;
- }
- ADDTEXT( p );
- PRINT();
- }
- break;
- case 0x1026: // ChartFontx
- ContDump( nL );
- break;
- case 0x1027: // CHOBJECTLINK
- {
- static const sal_Char* const ppcObjLink[] = { 0, "title", "y-axis", "x-axis", "data", "legend", "none", "z-axis" };
- LINESTART();
- sal_uInt16 nObjLink;
- rIn >> nObjLink;
- ADDTEXT( "link=" ); __AddDec( t, nObjLink );
- lcl_AddEnum( t, nObjLink, ppcObjLink, STATIC_TABLE_SIZE( ppcObjLink ) );
- ADDTEXT( " series=" ); ADDDEC( 2 );
- ADDTEXT( " point=" ); ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x1032: // ChartFrame
- {
- LINESTART();
- switch( Read2( rIn ) )
- {
- case 0: p = "no border"; break;
- case 1:
- case 2:
- case 3: p = "reserved"; break;
- case 4: p = "with shadow"; break;
- default: p = pU;
- }
- ADDTEXT( "Frame type: " );
- ADDTEXT( p );
- PRINT();
- rIn >> __nFlags;
- if( __nFlags )
- {
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x01, "fAutoSize" );
- ADDFLAG( 0x02, "fAutoPosition" );
- PRINT();
- }
- }
- break;
- case 0x1035: // ChartPlotarea
- ContDump( nL );
- break;
- case 0x103A: // Chart3D
- ContDump( nL );
- break;
- case 0x103C: // ChartPicf
- LINESTART();
- ADDTEXT( "bmp-mode=" ); ADDDEC( 2 );
- ADDTEXT( " format=" ); ADDDEC( 2 );
- ADDTEXT( " flags=" ); ADDHEX( 2 );
- ADDTEXT( " scale=" ); ADDDOUBLE();
- PRINT();
- break;
- case 0x103D: // ChartDropbar
- ContDump( nL );
- break;
- case 0x103E: // ChartRadar
- ContDump( nL );
- break;
- case 0x103F: // ChartSurface
- ContDump( nL );
- break;
- case 0x1040: // ChartRadararea
- ContDump( nL );
- break;
- case 0x1041: // ChartAxisparent
- {
- LINESTART();
- switch( Read2( rIn ) )
- {
- case 0: p = "main"; break;
- case 1: p = "secondary"; break;
- default: p = pU;
- }
- ADDTEXT( "Index: " );
- ADDTEXT( p );
- ADDTEXT( " " );
- ADDDEC(4);
- ADDTEXT( '/' );
- ADDDEC(4);
- ADDTEXT( " [" );
- ADDDEC(4);
- ADDTEXT( '/' );
- ADDDEC(4);
- ADDTEXT( ']' );
- PRINT();
- }
- break;
- case 0x1043: // ChartLegendxn
- ContDump( nL );
- break;
- case 0x1044: // ChartShtprops
- ContDump( nL );
- break;
- case 0x1045: // ChartSertocrt
- ContDump( nL );
- break;
- case 0x1046: // ChartAxesused
- {
- LINESTART();
- ADDTEXT( "Used : " );
- ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x1048: // ChartSbaseref
- ContDump( nL );
- break;
- case 0x104A: // CHSERPARENT
- LINESTART();
- ADDTEXT( "parent-index=" ); ADDDEC( 2 );
- ADDTEXT( " (one-based)" );
- PRINT();
- break;
- case 0x104B: // CHSERTRENDLINE
- {
- static const sal_Char* const ppcType[] =
- { "poynomial", "exponential", "logarithmic", "power", "moving-avg" };
- sal_uInt8 nType;
- rIn >> nType;
- LINESTART();
- ADDTEXT( "line-type=" ); __AddDec( t, nType );
- lcl_AddEnum( t, nType, ppcType, STATIC_TABLE_SIZE( ppcType ) );
- ADDTEXT( " order=" ); ADDDEC( 1 );
- ADDTEXT( " intercept=" ); ADDDOUBLE();
- PRINT();
- LINESTART();
- ADDTEXT( "show-equation=" ); ADDDEC( 1 );
- ADDTEXT( " show-r-sqr=" ); ADDDEC( 1 );
- PRINT();
- LINESTART();
- ADDTEXT( "forecast-for=" ); ADDDOUBLE();
- ADDTEXT( " forecast-back=" ); ADDDOUBLE();
- PRINT();
- }
- break;
- case 0x104E: // ChartIfmt
- ContDump( nL );
- break;
- case 0x104F: // ChartPos
- {
- LINESTART();
- UINT16 nMdTopLt, nMdBotRt;
- INT32 nX, nY, nDx, nDy;
- rIn >> nMdTopLt >> nMdBotRt >> nX >> nY >> nDx >> nDy;
- ADDTEXT( "TopLr = " );
- __AddDec( t, nMdTopLt );
- ADDTEXT( " BotRt = " );
- __AddDec( t, nMdBotRt );
- PRINT();
- LINESTART();
- __AddDec( t, nX );
- ADDTEXT( " / " );
- __AddDec( t, nY );
- ADDTEXT( " [" );
- __AddDec( t, nDx );
- ADDTEXT( " / " );
- __AddDec( t, nDy );
- ADDTEXT( "]" );
- PRINT();
- }
- break;
- case 0x1050: // ChartAlruns
- ContDump( nL );
- break;
- case 0x1051: // AI
- {
- LINESTART();
- UINT8 n8 = Read1( rIn );
- switch( n8 )
- {
- case 0: p = "title or text"; break;
- case 1: p = "values"; break;
- case 2: p = "categories"; break;
- case 3: p = "bubble sizes"; break;
- default: p = pU;
- }
- ADDTEXT( "Link index identifier: " );
- ADDTEXT( p );
- if ( p == pU )
- __AddHex( t, n8 );
- PRINT();
- LINESTART();
- switch( Read1( rIn ) )
- {
- case 0: p = "default categories"; break;
- case 1: p = "text or value"; break;
- case 2: p = "linked to worksheet"; break;
- case 3: p = "not used (HaHaHa...)"; break;
- case 4: p = "error reported"; break;
- default: p = pU;
- }
- ADDTEXT( "Refernce type: " );
- ADDTEXT( p );
- PRINT();
- rIn >> __nFlags;
- if( __nFlags )
- {
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x01, "fCustomIfmt" );
- PRINT();
- }
- LINESTART();
- ADDTEXT( "Numberformat = " );
- ADDDEC( 2 );
- PRINT();
- LINESTART();
- UINT16 n;
- rIn >> n;
- ADDTEXT( "Formula [" );
- __AddDec( t, n );
- ADDTEXT( "]: ---------------- " );
- PRINT();
- FormulaDump( n, FT_CellFormula );
- }
- break;
- case 0x105B: // CHSERERRORBAR
- {
- static const sal_Char* const ppcType[] = { 0, "x-plus", "x-minus", "y-plus", "y-minus" };
- static const sal_Char* const ppcSource[] = { 0, "percent", "fixed", "std-dev", "custom", "std-error" };
- static const sal_Char* const ppcLineEnd[] = { "blank", "t-shape" };
- sal_uInt8 nType, nSource, nLineEnd;
- rIn >> nType >> nSource >> nLineEnd;
- LINESTART();
- ADDTEXT( "bar-type=" ); __AddDec( t, nType );
- lcl_AddEnum( t, nType, ppcType, STATIC_TABLE_SIZE( ppcType ) );
- ADDTEXT( " value-source=" ); __AddDec( t, nSource );
- lcl_AddEnum( t, nSource, ppcSource, STATIC_TABLE_SIZE( ppcSource ) );
- ADDTEXT( " line-end=" ); __AddDec( t, nLineEnd );
- lcl_AddEnum( t, nLineEnd, ppcLineEnd, STATIC_TABLE_SIZE( ppcLineEnd ) );
- PRINT();
- LINESTART();
- ADDTEXT( "reserved=" ); ADDHEX( 1 );
- ADDTEXT( " value=" ); ADDDOUBLE();
- ADDTEXT( " ref-count=" ); ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x105D: // ChartSerfmt
- ContDump( nL );
- break;
- case 0x105F: // Chart3DDataForm
- {
- UINT8 nGround, nTop;
- nGround = Read1( rIn );
- nTop = Read1( rIn );
- UINT16 nStyle = ((UINT16)nGround << 8) | nTop;
- LINESTART();
- ADDTEXT( "3D - format (" );
- __AddHex( t, nGround );
- ADDTEXT( " " );
- __AddHex( t, nTop );
- ADDTEXT( "): " );
- switch( nStyle )
- {
- case 0x0000: ADDTEXT( "bar" ); break;
- case 0x0001: ADDTEXT( "pyramid" ); break;
- case 0x0002: ADDTEXT( "pyramid, cut" ); break;
- case 0x0100: ADDTEXT( "cylinder" ); break;
- case 0x0101: ADDTEXT( "cone" ); break;
- case 0x0102: ADDTEXT( "cone, cut" ); break;
- default: ADDTEXT( pU );
- }
- PRINT();
- }
- break;
- case 0x1060: // ChartFbi
- {
- LINESTART();
- ADDTEXT( "dmixBasis = " );
- ADDDEC( 2 );
- ADDTEXT( " dmiyBasis = " );
- ADDDEC( 2 );
- ADDTEXT( " twpHeightBasis = " );
- ADDDEC( 2 );
- ADDTEXT( " scab = " );
- ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "ifnt = " );
- ADDDEC( 2 );
- PRINT();
- }
- break;
- case 0x1061: // ChartBoppop
- ContDump( nL );
- break;
- case 0x1062: // ChartAxcext
- {
- LINESTART();
- ADDTEXT( "cat on axis: " );
- ADDDEC( 2 );
- ADDTEXT( " ... " );
- ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "major unit: val = " );
- ADDDEC( 2 );
- ADDTEXT( " units = " );
- ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "minor unit: val = " );
- ADDDEC( 2 );
- ADDTEXT( " units = " );
- ADDDEC( 2 );
- PRINT();
- LINESTART();
- ADDTEXT( "base unit = " );
- ADDDEC( 2 );
- ADDTEXT( " crossing point of val axis = " );
- ADDDEC( 2 );
- PRINT();
- rIn >> __nFlags;
- if( __nFlags )
- {
- LINESTART();
- STARTFLAG();
- ADDFLAG( 0x0001, "fAutoMin" );
- ADDFLAG( 0x0002, "fAutoMax" );
- ADDFLAG( 0x0004, "fAutoMajor" );
- ADDFLAG( 0x0008, "fAutoMinor" );
- ADDFLAG( 0x0010, "fDateAxis" );
- ADDFLAG( 0x0020, "fAutoBase" );
- ADDFLAG( 0x0040, "fAutoCross" );
- ADDFLAG( 0x0080, "fAutoDate" );
- PRINT();
- }
- }
- break;
- case 0x1063: // ChartDat
- ContDump( nL );
- break;
- case 0x1064: // ChartPlotgrowth
- {
- UINT32 nDx, nDy;
- rIn >> nDx >> nDy;
- LINESTART();
- ADDTEXT( "dxPlotGrowth = " );
- __Add16p16( t, nDx );
- ADDTEXT( " (" );
- __AddHex( t, nDx );
- ADDTEXT( ") dyPlotGrowth = " );
- __Add16p16( t, nDy );
- ADDTEXT( " (" );
- __AddHex( t, nDy );
- ADDTEXT( ")" );
- PRINT();
- }
- break;
- case 0x1065: // ChartSiindex
- ContDump( nL );
- break;
- case 0x1066: // ChartGelframe
- EscherDump( nL, false );
- break;
- case 0x1067: // ChartBoppcustom
- ContDump( nL );
- break;
- default:
- if( !bEncrypted )
- ContDump( nL );
- }
-
- }
-
- if( nR == EXC_ID_FILEPASS )
- {
- bEncrypted = true;
- pIn->Seek( EXC_REC_SEEK_TO_BEGIN );
- bool bValid = (XclImpDecryptHelper::ReadFilepass( *pIn ) == ERRCODE_NONE);
- LINESTART();
- ADDTEXT( "decrypter=" ); lcl_AddOnOff( t, bValid );
- PRINT();
- bBIFF8 = bBIFF8 && bValid; // dump BIFF8 hex only on invalid decrypter
- }
-
- if( bDec )
- pLevelPre -= nLevelInc;
-}
-
-
-static const sal_Char* GetBlipType( UINT8 n )
-{
- switch ( n )
- {
- case 0 :
- return " ERROR";
- break;
- case 1 :
- return " UNKNOWN";
- break;
- case 2 :
- return " EMF";
- break;
- case 3 :
- return " WMF";
- break;
- case 4 :
- return " PICT";
- break;
- case 5 :
- return " JPEG";
- break;
- case 6 :
- return " PNG";
- break;
- case 7 :
- return " DIB";
- break;
- default:
- if ( n < 32 )
- return " NotKnown";
- else
- return " Client";
- }
-}
-
-void Biff8RecDumper::EscherDump( const ULONG nMaxLen, bool bDumpOffset )
-{
- ULONG n = nMaxLen;
- UINT16 nPre, nR;
- UINT32 nL;
- const sal_Char* p;
- ByteString aT;
- UINT16 nDumpSize;
-
- aT += pLevelPre;
-
- ULONG nStartPos = pIn->GetSvStreamPos();
- while( pIn->IsValid() && (n > 0) )
- {
- ULONG nCurrPos = pIn->GetSvStreamPos();
- *pIn >> nPre >> nR >> nL;
- n -= sizeof( nPre ) + sizeof( nR ) + sizeof( nL );
-
- switch( nR )
- {
- case 0xF000: p = "MsofbtDggContainer"; break;
- case 0xF006: p = "MsofbtDgg"; break;
- case 0xF016: p = "MsofbtCLSID"; break;
- case 0xF00B: p = "MsofbtOPT"; break;
- case 0xF11A: p = "MsofbtColorMRU"; break;
- case 0xF11E: p = "MsofbtSplitMenuColors"; break;
- case 0xF001: p = "MsofbtBstoreContainer"; break;
- case 0xF007: p = "MsofbtBSE"; break;
- case 0xF002: p = "MsofbtDgContainer"; break;
- case 0xF008: p = "MsofbtDg"; break;
- case 0xF118: p = "MsofbtRegroupItem"; break;
- case 0xF120: p = "MsofbtColorScheme"; break;
- case 0xF003: p = "MsofbtSpgrContainer"; break;
- case 0xF004: p = "MsofbtSpContainer"; break;
- case 0xF009: p = "MsofbtSpgr"; break;
- case 0xF00A: p = "MsofbtSp"; break;
- case 0xF00C: p = "MsofbtTextbox"; break;
- case 0xF00D: p = "MsofbtClientTextbox"; break;
- case 0xF00E: p = "MsofbtAnchor"; break;
- case 0xF00F: p = "MsofbtChildAnchor"; break;
- case 0xF010: p = "MsofbtClientAnchor"; break;
- case 0xF011: p = "MsofbtClientData"; break;
- case 0xF11F: p = "MsofbtOleObject"; break;
- case 0xF11D: p = "MsofbtDeletedPspl"; break;
- case 0xF005: p = "MsofbtSolverContainer"; break;
- case 0xF012: p = "MsofbtConnectorRule"; break;
- case 0xF013: p = "MsofbtAlignRule"; break;
- case 0xF014: p = "MsofbtArcRule"; break;
- case 0xF015: p = "MsofbtClientRule"; break;
- case 0xF017: p = "MsofbtCalloutRule"; break;
- case 0xF119: p = "MsofbtSelection"; break;
- case 0xF122: p = "MsofbtUDefProp"; break;
- default:
- if( nR >= 0xF018 && nR <= 0xF117 )
- p = "MsofbtBLIP";
- else if ( ( nPre & 0x000F ) == 0x000F )
- p = "UNKNOWN container";
- else
- p = "UNKNOWN ID";
- }
-
- aT += " ";
- __AddHex( aT, nR );
- ((aT += " ") += p) += " [";
- __AddHex( aT, nPre );
- aT += ',';
- __AddHex( aT, nL );
- aT += "] instance: ";
- __AddDec( aT, (UINT16)(nPre >> 4) );
- if( bDumpOffset )
- {
- aT.Append( " pos=" );
- __AddHex( aT, static_cast< sal_uInt32 >( mnEscherPos + nCurrPos - nStartPos ) );
- }
- Print( aT );
-
- if ( nR == 0xF007 && 36 <= n && 36 <= nL )
- { // BSE, FBSE
- ULONG nP = pIn->GetRecPos();
- UINT8 n8;
- UINT16 n16;
- UINT32 n32;
-
- aT = " btWin32: ";
- *pIn >> n8;
- __AddHex( aT, n8 );
- aT += GetBlipType( n8 );
- aT += " btMacOS: ";
- *pIn >> n8;
- __AddHex( aT, n8 );
- aT += GetBlipType( n8 );
- Print( aT );
-
- aT = " rgbUid:";
- Print( aT );
- ContDump( 16 );
-
- aT = " tag: ";
- *pIn >> n16;
- __AddHex( aT, n16 );
- Print( aT );
-
- aT = " size: ";
- *pIn >> n32;
- __AddHex( aT, n32 );
- Print( aT );
-
- aT = " cRef: ";
- *pIn >> n32;
- __AddHex( aT, n32 );
- Print( aT );
-
- aT = " offs: ";
- *pIn >> n32;
- __AddHex( aT, n32 );
- Print( aT );
-
- aT = " usage: ";
- *pIn >> n8;
- __AddHex( aT, n8 );
- aT += " cbName: ";
- *pIn >> n8;
- __AddHex( aT, n8 );
- aT += " unused2: ";
- *pIn >> n8;
- __AddHex( aT, n8 );
- aT += " unused3: ";
- *pIn >> n8;
- __AddHex( aT, n8 );
- Print( aT );
-
- n -= pIn->GetRecPos() - nP;
- nL = 0; // loop to MsofbtBLIP
- }
- else if ( nR == 0xF00F && 0x10 <= n && 0x10 <= nL )
- { // ChildAnchor
- ULONG nP = pIn->GetRecPos();
- sal_Int32 n32;
-
- aT.Assign( " pos1=" );
- *pIn >> n32; lclAppendDec( aT, n32 );
- aT.Append( " pos2=" );
- *pIn >> n32; lclAppendDec( aT, n32 );
- aT.Append( " pos3=" );
- *pIn >> n32; lclAppendDec( aT, n32 );
- aT.Append( " pos4=" );
- *pIn >> n32; lclAppendDec( aT, n32 );
- Print( aT );
-
- ULONG nC = pIn->GetRecPos() - nP;
- n -= nC;
- nL -= nC;
- }
- else if ( nR == 0xF010 && 0x12 <= n && 0x12 <= nL )
- { // ClientAnchor
- ULONG nP = pIn->GetRecPos();
- UINT16 n16;
-
- aT = " Flag: ";
- *pIn >> n16;
- __AddHex( aT, n16 );
- if( n16 & 0x0001 ) aT += " -fixedpos";
- if( n16 & 0x0002 ) aT += " -fixedsize";
- Print( aT );
-
- aT = " Col1: ";
- *pIn >> n16;
- __AddHex( aT, n16 );
- aT += " dX1: ";
- *pIn >> n16;
- __AddHex( aT, n16 );
- aT += " Row1: ";
- *pIn >> n16;
- __AddHex( aT, n16 );
- aT += " dY1: ";
- *pIn >> n16;
- __AddHex( aT, n16 );
- Print( aT );
-
- aT = " Col2: ";
- *pIn >> n16;
- __AddHex( aT, n16 );
- aT += " dX2: ";
- *pIn >> n16;
- __AddHex( aT, n16 );
- aT += " Row2: ";
- *pIn >> n16;
- __AddHex( aT, n16 );
- aT += " dY2: ";
- *pIn >> n16;
- __AddHex( aT, n16 );
- Print( aT );
-
- ULONG nC = pIn->GetRecPos() - nP;
- n -= nC;
- nL -= nC;
- }
- else if ( nR == 0xF00A )
- {
- sal_uInt32 nId, nFlags;
- *pIn >> nId >> nFlags;
- aT.Assign( " shape-id=" );
- __AddHex( aT, nId );
- aT.Append( " flags=" );
- __AddHex( aT, nFlags );
- Print( aT );
- nL -= 8; n -= 8;
- }
- else if ( nR == 0xF00B || nR == 0xF122 )
- { // OPT
- sal_uInt32 nComplex = 0;
- while ( nL >= 6 + nComplex && n >= 6 + nComplex )
- {
- UINT16 n16;
- UINT32 n32;
- *pIn >> n16 >> n32;
- nL -= 6; n -= 6;
- aT = " ";
- __AddHex( aT, n16 );
- aT += " (";
- __AddDec( aT, n16 & 0x3FFF, 5 );
- if ( (n16 & 0x8000) == 0 )
- {
- if ( n16 & 0x4000 )
- aT += ", fBlipID";
- aT += ") ";
- __AddHex( aT, n32 );
- if ( (n16 & 0x4000) == 0 )
- {
- aT += " (";
- __AddDec1616( aT, n32 );
- aT += ')';
- }
- Print( aT );
- }
- else
- {
- aT += ", fComplex) ";
- __AddHex( aT, n32 );
- Print( aT );
- nComplex += n32;
- }
- }
- // complex property data
- while ( nComplex && n > 0 )
- {
- sal_uInt32 nDumpSize = (nComplex > n) ? n : nComplex;
- ContDump( nDumpSize );
- nComplex -= nDumpSize;
- nL -= nDumpSize;
- n -= nDumpSize;
- }
- }
- else if ( nR == 0xF012 )
- {
- aT = " Connector rule: "; __AddDec( aT, pIn->ReaduInt32() );
- aT += " ShapeID A: "; __AddHex( aT, pIn->ReaduInt32() );
- aT += " ShapeID B: "; __AddHex( aT, pIn->ReaduInt32() );
- Print( aT );
- aT = " ShapeID connector: "; __AddHex( aT, pIn->ReaduInt32() );
- aT += " Connect pt A: "; __AddHex( aT, pIn->ReaduInt32() );
- aT += " Connect pt B: "; __AddHex( aT, pIn->ReaduInt32() );
- Print( aT );
- nL -= 24; n -= 24;
- }
-
- if( ( nPre & 0x000F ) == 0x000F )
- { // Container
- if ( nL <= (UINT32) n )
- Print( " completed within" );
- else
- Print( " continued elsewhere" );
- }
- else
- // -> 0x0000 ... 0x0FFF
- {
- nDumpSize = ( ( UINT32 ) nL > ( UINT32 ) n )? ( UINT16 ) n : ( UINT16 ) nL;
-
- if( nDumpSize )
- {
- ContDump( nDumpSize );
- n -= nDumpSize;
- }
- }
-
- aT.Erase();
- }
- if( bDumpOffset )
- mnEscherPos += nMaxLen;
-}
-
-
-void Biff8RecDumper::ObjDump( const ULONG nMaxLen )
-{
-#if 0
-// if an entire hex block is needed
- pIn->PushPosition();
- ContDump( nMaxLen );
- pIn->PopPosition();
-#endif
-
- ULONG n = nMaxLen;
- UINT16 nR, nL;
- const sal_Char* p;
- ByteString t;
- XclImpStream& rIn = *pIn;
- UINT16 nDumpSize;
- sal_uInt16 nObjFlags = 0;
-
- t += pLevelPre;
-
- while( n > 0 )
- {
- rIn >> nR >> nL;
- n -= sizeof( nR ) + sizeof( nL );
-
- BOOL bDetails = FALSE;
- switch( nR )
- {
- case 0x0000: p = "ftEnd"; break;
- case 0x0001: p = "(Reserved)"; break;
- case 0x0002: p = "(Reserved)"; break;
- case 0x0003: p = "(Reserved)"; break;
- case 0x0004: p = "ftMacro"; break;
- case 0x0005: p = "ftButton"; break;
- case 0x0006: p = "ftGmo"; break;
- case 0x0007: p = "ftCf"; break;
- case 0x0008: p = "ftPioGrbit"; bDetails = TRUE; break;
- case 0x0009: p = "ftPictFmla"; bDetails = TRUE; break;
- case 0x000A: p = "ftCbls"; break;
- case 0x000B: p = "ftRbo"; break;
- case 0x000C: p = "ftSbs"; break;
- case 0x000D: p = "ftNts"; break;
- case 0x000E: p = "ftSbsFmla"; break;
- case 0x000F: p = "ftGboData"; break;
- case 0x0010: p = "ftEdoData"; break;
- case 0x0011: p = "ftRboData"; break;
- case 0x0012: p = "ftCblsData"; break;
- case 0x0013: p = "ftLbsData"; break;
- case 0x0014: p = "ftCblsFmla"; break;
- case 0x0015: p = "ftCmo"; bDetails = TRUE; break;
- default:
- p = "UNKNOWN ID";
- }
-
- t += " ";
- __AddHex( t, nR );
- t += " [";
- __AddHex( t, nL );
- (t += "] ") += p;
- Print( t );
-
- nDumpSize = ( ( UINT32 ) nL > ( UINT32 ) n )? ( UINT16 ) n : ( UINT16 ) nL;
-
- if( nDumpSize )
- {
- ULONG nPos1 = (bDetails ? rIn.GetRecPos() : 0);
- ContDump( nDumpSize );
- n -= nDumpSize;
- if ( bDetails )
- {
- ULONG nPos2 = rIn.GetRecPos();
- rIn.Seek( nPos1 );
- t.Erase();
- switch ( nR )
- {
- case 0x0008 : // ftPioGrbit
- {
- rIn >> nObjFlags;
- UINT16 __nFlags = nObjFlags;
- if ( __nFlags )
- {
- ADDTEXT( " " );
- STARTFLAG();
- ADDFLAG( 0x0001, "man-size" );
- ADDFLAG( 0x0002, "linked" );
- ADDFLAG( 0x0008, "symbol" );
- ADDFLAG( 0x0010, "control" );
- ADDFLAG( 0x0020, "ctls-stream" );
- ADDFLAG( 0x0200, "autoload" );
- ADDRESERVED( 0xFDC4 );
- }
- }
- break;
- case 0x0009 : // ftPictFmla
- {
- ADDTEXT( " Document type " );
- UINT16 nFmlaLen;
- rIn >> nFmlaLen;
- if( nObjFlags & 0x0002 )
- {
- ADDTEXT( "linked\n OLE stream: LNK??? (from EXTERNNAME) " );
- rIn >> nFmlaLen;
- ADDTEXT( " unknown=" ); ADDHEX( 4 );
- PRINT();
- t.Erase();
- FormulaDump( nFmlaLen, FT_CellFormula );
- }
- else
- {
- ADDTEXT( "embedded " );
- const UINT16 nStringOffset = 14; // MAY be right
- rIn.Seek( nPos1 + nStringOffset );
- INT32 nBytesLeft = nL - nStringOffset;
- UINT16 nStrLen = rIn.ReaduInt16();
- ULONG nPos3 = rIn.GetRecPos();
- if( nStrLen )
- AddUNICODEString( t, rIn, TRUE, nStrLen );
- nBytesLeft -= (rIn.GetRecPos() - nPos3);
- ADDTEXT( '\n' );
- if ( nBytesLeft < 4 )
- ADDTEXT( " >> ByteString OVERRUN <<\n" );
-
- rIn.Seek( nPos1 + sizeof(nFmlaLen) + nFmlaLen );
- if( nObjFlags & 0x0020 )
- {
- sal_uInt32 nStrmStart, nStrmLen;
- rIn >> nStrmStart >> nStrmLen;
- ADDTEXT( " 'Ctls' stream start=" );
- __AddHex( t, nStrmStart );
- ADDTEXT( " size=" );
- __AddHex( t, nStrmLen );
- maCtlsPosMap[ nStrmStart ] = nStrmLen;
- }
- else
- {
- ADDTEXT( " OLE storage name: MBD" );
- __AddPureHex( t, rIn.ReaduInt32() );
- }
- }
- }
- break;
- case 0x0015 : // ftCmo
- {
- UINT16 nType, nId;
- rIn >> nType >> nId;
- ADDTEXT( " Object ID " );
- __AddHex( t, nId );
- switch ( nType )
- {
- case 0x0000 : p = "Group"; break;
- case 0x0001 : p = "Line"; break;
- case 0x0002 : p = "Rectangle"; break;
- case 0x0003 : p = "Oval"; break;
- case 0x0004 : p = "Arc"; break;
- case 0x0005 : p = "Chart"; break;
- case 0x0006 : p = "Text"; break;
- case 0x0007 : p = "Button"; break;
- case 0x0008 : p = "Picture"; break;
- case 0x0009 : p = "Polygon"; break;
- case 0x000a : p = "(Reserved)"; break;
- case 0x000b : p = "Check box"; break;
- case 0x000c : p = "Option button";break;
- case 0x000d : p = "Edit box"; break;
- case 0x000e : p = "Label"; break;
- case 0x000f : p = "Dialog box"; break;
- case 0x0010 : p = "Spinner"; break;
- case 0x0011 : p = "Scroll bar"; break;
- case 0x0012 : p = "List box"; break;
- case 0x0013 : p = "Group box"; break;
- case 0x0014 : p = "Combo box"; break;
- case 0x0015 : p = "(Reserved)"; break;
- case 0x0016 : p = "(Reserved)"; break;
- case 0x0017 : p = "(Reserved)"; break;
- case 0x0018 : p = "(Reserved)"; break;
- case 0x0019 : p = "Comment"; break;
- case 0x001a : p = "(Reserved)"; break;
- case 0x001b : p = "(Reserved)"; break;
- case 0x001c : p = "(Reserved)"; break;
- case 0x001d : p = "(Reserved)"; break;
- case 0x001e : p = "Microsoft Office drawing"; break;
- default:
- p = "UNKNOWN";
- }
- ADDTEXT( ", type " );
- __AddHex( t, nType );
- ADDTEXT( ' ' );
- ADDTEXT( p );
- }
- break;
- }
- if ( t.Len() )
- PRINT();
- rIn.Seek( nPos2 );
- }
- }
-
- t.Erase();
- }
-}
-
-
-#undef LINESTART
-#undef IGNORE
-#undef ADDHEX
-#undef ADDDEC
-#undef PRINT
-#undef PreDump
-#undef ADDCELLHEAD
-
-void Biff8RecDumper::ContDump( const ULONG nL )
-{
- UINT32 nC = nMaxBodyLines;
- UINT32 n = nL;
- UINT32 nInL, nTmp;
- UINT8* pB = new UINT8[ nL ];
- UINT8* p;
- const UINT16 nLineLen = 16;
- UINT16 nCharCnt;
- BOOL bPart;
- ByteString aT;
-
- aT += pLevelPre;
-
- while( n && nC )
- {
- bPart = n < nLineLen;
- nInL = bPart? n : nLineLen;
- n -= nInL;
-
- pIn->Read( pB, nInL );
-
- // als Hex-Codes
- nTmp = nInL;
- p = pB;
- nCharCnt = 0;
- while( nTmp )
- {
- if( nCharCnt == nLineLen / 2 )
- aT += ' ';
-
- nCharCnt++;
-
- aT += ' ';
- __AddPureHex( aT, *p );
- p++;
-
- nTmp--;
- }
-
- if( bPart )
- aT += GetBlanks( ( UINT16 ) ( ( nLineLen - nInL ) * 3 ) );
-
- // als chars
-
- aT += " ";
- if( nInL < 9 )
- aT += ' ';
-
- nTmp = nInL;
- p = pB;
- nCharCnt = 0;
- while( nTmp )
- {
- if( nCharCnt == nLineLen / 2 )
- aT += ' ';
-
- nCharCnt++;
-
- if( IsPrintable( *p ) )
- aT += static_cast< sal_Char >( *p );
- else
- aT += '.';
-
- p++;
-
- nTmp--;
- }
-
- Print( aT );
- aT.Erase();
- aT += pLevelPre;
-
- nC--;
- }
-
- delete[] pB;
-}
-
-
-// Formula dumper =============================================================
-
-/** Name and parameter count of an Excel function. */
-struct XclDumpFunc
-{
- const sal_Char* pName; /// Name of the function.
- sal_uInt16 nParam; /// Parameter count for fixed functions.
-};
-
-static const XclDumpFunc pFuncData[] =
-{
-/* 0*/ { "COUNT", 0 },
- { "IF", 0 },
- { "ISNA", 1 },
- { "ISERROR", 1 },
- { "SUM", 0 },
-/* 5*/ { "AVERAGE", 0 },
- { "MIN", 0 },
- { "MAX", 0 },
- { "ROW", 0 },
- { "COLUMN", 0 },
-/* 10*/ { "NA", 0 },
- { "NPV", 0 },
- { "STDEV", 0 },
- { "DOLLAR", 0 },
- { "FIXED", 0 },
-/* 15*/ { "SIN", 1 },
- { "COS", 1 },
- { "TAN", 1 },
- { "ATAN", 1 },
- { "PI", 0 },
-/* 20*/ { "SQRT", 1 },
- { "EXP", 1 },
- { "LN", 1 },
- { "LOG10", 1 },
- { "ABS", 1 },
-/* 25*/ { "INT", 1 },
- { "SIGN", 1 },
- { "ROUND", 2 },
- { "LOOKUP", 0 },
- { "INDEX", 0 },
-/* 30*/ { "REPT", 2 },
- { "MID", 3 },
- { "LEN", 1 },
- { "VALUE", 1 },
- { "TRUE", 0 },
-/* 35*/ { "FALSE", 0 },
- { "AND", 0 },
- { "OR", 0 },
- { "NOT", 1 },
- { "MOD", 2 },
-/* 40*/ { "DCOUNT", 3 },
- { "DSUM", 3 },
- { "DAVERAGE", 3 },
- { "DMIN", 3 },
- { "DMAX", 3 },
-/* 45*/ { "DSTDEV", 3 },
- { "VAR", 0 },
- { "DVAR", 3 },
- { "TEXT", 2 },
- { "LINEST", 0 },
-/* 50*/ { "TREND", 0 },
- { "LOGEST", 0 },
- { "GROWTH", 0 },
- { "GOTO" }, // macro/internal
- { "HALT" }, // macro/internal
-/* 55*/ { "RETURN" }, // macro/internal
- { "PV", 0 },
- { "FV", 0 },
- { "NPER", 0 },
- { "PMT", 0 },
-/* 60*/ { "RATE", 0 },
- { "MIRR", 3 },
- { "IRR", 0 },
- { "RAND", 0 },
- { "MATCH", 0 },
-/* 65*/ { "DATE", 3 },
- { "TIME", 3 },
- { "DAY", 1 },
- { "MONTH", 1 },
- { "YEAR", 1 },
-/* 70*/ { "WEEKDAY", 0 },
- { "HOUR", 1 },
- { "MINUTE", 1 },
- { "SECOND", 1 },
- { "NOW", 0 },
-/* 75*/ { "AREAS", 1 },
- { "ROWS", 1 },
- { "COLUMNS", 1 },
- { "OFFSET", 0 },
- { "ABSREF" }, // macro/internal
-/* 80*/ { "RELREF" }, // macro/internal
- { "ARGUMENT" }, // macro/internal
- { "SEARCH", 0 },
- { "TRANSPOSE", 1 },
- { "ERROR" }, // macro/internal
-/* 85*/ { "STEP" }, // macro/internal
- { "TYPE", 1 },
- { "ECHO" }, // macro/internal
- { "SET.NAME" }, // macro/internal
- { "CALLER" }, // macro/internal
-/* 90*/ { "DEREF" }, // macro/internal
- { "WINDOWS" }, // macro/internal
- { "SERIES" }, // macro/internal
- { "DOCUMENTS" }, // macro/internal
- { "ACTIVE.CELL" }, // macro/internal
-/* 95*/ { "SELECTION" }, // macro/internal
- { "RESULT" }, // macro/internal
- { "ATAN2", 2 },
- { "ASIN", 1 },
- { "ACOS", 1 },
-/*100*/ { "CHOOSE", 0 },
- { "HLOOKUP", 0 },
- { "VLOOKUP", 0 },
- { "LINKS" }, // macro/internal
- { "INPUT" }, // macro/internal
-/*105*/ { "ISREF", 1 },
- { "GET.FORMULA" }, // macro/internal
- { "GET.NAME" }, // macro/internal
- { "SET.VALUE", 2 }, // macro/internal
- { "LOG", 0 },
-/*110*/ { "EXEC" }, // macro/internal
- { "CHAR", 1 },
- { "LOWER", 1 },
- { "UPPER", 1 },
- { "PROPER", 1 },
-/*115*/ { "LEFT", 0 },
- { "RIGHT", 0 },
- { "EXACT", 2 },
- { "TRIM", 1 },
- { "REPLACE", 4 },
-/*120*/ { "SUBSTITUTE", 0 },
- { "CODE", 1 },
- { "NAMES" }, // macro/internal
- { "DIRECTORY" }, // macro/internal
- { "FIND", 0 },
-/*125*/ { "CELL", 0 },
- { "ISERR", 1 },
- { "ISTEXT", 1 },
- { "ISNUMBER", 1 },
- { "ISBLANK", 1 },
-/*130*/ { "T", 1 },
- { "N", 1 },
- { "FOPEN" }, // macro/internal
- { "FCLOSE" }, // macro/internal
- { "FSIZE" }, // macro/internal
-/*135*/ { "FREADLN" }, // macro/internal
- { "FREAD" }, // macro/internal
- { "FWRITELN" }, // macro/internal
- { "FWRITE" }, // macro/internal
- { "FPOS" }, // macro/internal
-/*140*/ { "DATEVALUE", 1 },
- { "TIMEVALUE", 1 },
- { "SLN", 3 },
- { "SYD", 4 },
- { "DDB", 0 },
-/*145*/ { "GET.DEF" }, // macro/internal
- { "REFTEXT" }, // macro/internal
- { "TEXTREF" }, // macro/internal
- { "INDIRECT", 0 },
- { "REGISTER" }, // macro/internal
-/*150*/ { "CALL" },
- { "ADD.BAR" }, // macro/internal
- { "ADD.MENU" }, // macro/internal
- { "ADD.COMMAND" }, // macro/internal
- { "ENABLE.COMMAND" }, // macro/internal
-/*155*/ { "CHECK.COMMAND" }, // macro/internal
- { "RENAME.COMMAND" }, // macro/internal
- { "SHOW.BAR" }, // macro/internal
- { "DELETE.MENU" }, // macro/internal
- { "DELETE.COMMAND" }, // macro/internal
-/*160*/ { "GET.CHART.ITEM" }, // macro/internal
- { "DIALOG.BOX" }, // macro/internal
- { "CLEAN", 1 },
- { "MDETERM", 1 },
- { "MINVERSE", 1 },
-/*165*/ { "MMULT", 2 },
- { "FILES" }, // macro/internal
- { "IPMT", 0 },
- { "PPMT", 0 },
- { "COUNTA", 0 },
-/*170*/ { "CANCEL.KEY" }, // macro/internal
- { "FOR" }, // macro/internal
- { "WHILE" }, // macro/internal
- { "BREAK" }, // macro/internal
- { "NEXT" }, // macro/internal
-/*175*/ { "INITIATE" }, // macro/internal
- { "REQUEST" }, // macro/internal
- { "POKE" }, // macro/internal
- { "EXECUTE" }, // macro/internal
- { "TERMINATE" }, // macro/internal
-/*180*/ { "RESTART" }, // macro/internal
- { "HELP" }, // macro/internal
- { "GET.BAR" }, // macro/internal
- { "PRODUCT", 0 },
- { "FACT", 1 },
-/*185*/ { "GET.CELL" }, // macro/internal
- { "GET.WORKSPACE" }, // macro/internal
- { "GET.WINDOW" }, // macro/internal
- { "GET.DOCUMENT" }, // macro/internal
- { "DPRODUCT", 3 },
-/*190*/ { "ISNONTEXT", 1 },
- { "GET.NOTE" }, // macro/internal
- { "NOTE" }, // macro/internal
- { "STDEVP", 0 },
- { "VARP", 0 },
-/*195*/ { "DSTDDEVP", 3 },
- { "DVARP", 3 },
- { "TRUNC", 0 },
- { "ISLOGICAL", 1 },
- { "DBCOUNTA", 3 },
-/*200*/ { "DELETE.BAR" }, // macro/internal
- { "UNREGISTER" }, // macro/internal
- { "202" }, // not used
- { "203" }, // not used
- { "USDOLLAR" },
-/*205*/ { "FINDB" },
- { "SEARCHB" },
- { "REPLACEB", 4 },
- { "LEFTB" },
- { "RIGHTB" },
-/*210*/ { "MIDB", 3 },
- { "LENB", 1 },
- { "ROUNDUP", 2 },
- { "ROUNDDOWN", 2 },
- { "ASC", 1 },
-/*215*/ { "DBSC", 1 },
- { "RANK", 0 },
- { "217" }, // not used
- { "218" }, // not used
- { "ADDRESS", 0 },
-/*220*/ { "DAYS360", 0 },
- { "TODAY", 0 },
- { "VDB", 0 },
- { "ELSE" }, // macro/internal
- { "ELSE.IF" }, // macro/internal
-/*225*/ { "END.IF" }, // macro/internal
- { "FOR.CELL" }, // macro/internal
- { "MEDIAN", 0 },
- { "SUMPRODUCT", 0 },
- { "SINH", 1 },
-/*230*/ { "COSH", 1 },
- { "TANH", 1 },
- { "ASINH", 1 },
- { "ACOSH", 1 },
- { "ATANH", 1 },
-/*235*/ { "DGET", 3 },
- { "CREATE.OBJECT" }, // macro/internal
- { "VOLATILE" }, // macro/internal
- { "LAST.ERROR" }, // macro/internal
- { "CUSTOM.UNDO" }, // macro/internal
-/*240*/ { "CUSTOM.REPEAT" }, // macro/internal
- { "FORMULA.CONVERT" }, // macro/internal
- { "GET.LINK.INFO" }, // macro/internal
- { "TEXT.BOX" }, // macro/internal
- { "INFO", 1 },
-/*245*/ { "GROUP" }, // macro/internal
- { "GET.OBJECT" }, // macro/internal
- { "DB", 0 },
- { "PAUSE" }, // macro/internal
- { "249" }, // not used
-/*250*/ { "250" }, // not used
- { "RESUME" }, // macro/internal
- { "FREQUENCY", 2 },
- { "ADD.TOOLBAR" }, // macro/internal
- { "DELETE.TOOLBAR" }, // macro/internal
-/*255*/ { "EXTERN.CALL" }, // macro/internal
- { "RESET.TOOLBAR" }, // macro/internal
- { "EVALUATE" }, // macro/internal
- { "GET.TOOLBAR" }, // macro/internal
- { "GET.TOOL" }, // macro/internal
-/*260*/ { "SPELLING.CHECK" }, // macro/internal
- { "ERROR.TYPE", 1 },
- { "APP.TITLE" }, // macro/internal
- { "WINDOW.TITLE" }, // macro/internal
- { "SAVE.TOOLBAR" }, // macro/internal
-/*265*/ { "ENABLE.TOOL" }, // macro/internal
- { "PRESS.TOOL" }, // macro/internal
- { "REGISTER.ID" }, // macro/internal
- { "GET.WORKBOOK" }, // macro/internal
- { "AVEDEV", 0 },
-/*270*/ { "BETADIST", 0 },
- { "GAMMALN", 1 },
- { "BETAINV", 0 },
- { "BINOMDIST", 4 },
- { "CHIDIST", 2 },
-/*275*/ { "CHIINV", 2 },
- { "COMBIN", 2 },
- { "CONFIDENCE", 3 },
- { "CRITBINOM", 3 },
- { "EVEN", 1 },
-/*280*/ { "EXPONDIST", 3 },
- { "FDIST", 3 },
- { "FINV", 3 },
- { "FISHER", 1 },
- { "FISHERINV", 1 },
-/*285*/ { "FLOOR", 2 },
- { "GAMMADIST", 4 },
- { "GAMMAINV", 3 },
- { "CEILING", 2 },
- { "HYPGEOMDIST", 4 },
-/*290*/ { "LOGNORMDIST", 3 },
- { "LOGINV", 3 },
- { "NEGBINOMDIST", 3 },
- { "NORMDIST", 4 },
- { "NORMSDIST", 1 },
-/*295*/ { "NORMINV", 3 },
- { "NORMSINV", 1 },
- { "STANDARDIZE", 3 },
- { "ODD", 1 },
- { "PERMUT", 2 },
-/*300*/ { "POISSON", 3 },
- { "TDIST", 3 },
- { "WEIBULL", 4 },
- { "SUMXMY2", 2 },
- { "SUMX2MY2", 2 },
-/*305*/ { "SUMX2PY2", 2 },
- { "CHITEST", 2 },
- { "CORREL", 2 },
- { "COVAR", 2 },
- { "FORECAST", 3 },
-/*310*/ { "FTEST", 2 },
- { "INTERCEPT", 2 },
- { "PEARSON", 2 },
- { "RSQ", 2 },
- { "STEYX", 2 },
-/*315*/ { "SLOPE", 2 },
- { "TTEST", 4 },
- { "PROB", 0 },
- { "DEVSQ", 0 },
- { "GEOMEAN", 0 },
-/*320*/ { "HARMEAN", 0 },
- { "SUMSQ", 0 },
- { "KURT", 0 },
- { "SKEW", 0 },
- { "ZTEST", 0 },
-/*325*/ { "LARGE", 2 },
- { "SMALL", 2 },
- { "QUARTILE", 2 },
- { "PERCENTILE", 2 },
- { "PERCENTRANK", 0 },
-/*330*/ { "MODE", 0 },
- { "TRIMMEAN", 2 },
- { "TINV", 2 },
- { "333" }, // not used
- { "MOVIE.COMMAND" }, // macro/internal
-/*335*/ { "GET.MOVIE" }, // macro/internal
- { "CONCATENATE", 0 },
- { "POWER", 2 },
- { "PIVOT.ADD.DATA" }, // macro/internal
- { "GET.PIVOT.TABLE" }, // macro/internal
-/*340*/ { "GET.PIVOT.FIELD" }, // macro/internal
- { "GET.PIVOT.ITEM" }, // macro/internal
- { "RADIANS", 1 },
- { "DEGREES", 1 },
- { "SUBTOTAL", 0 },
-/*345*/ { "SUMIF", 0 },
- { "COUNTIF", 2 },
- { "COUNTBLANK", 1 },
- { "SCENARIO.GET" }, // macro/internal
- { "OPTIONS.LISTS.GET" }, // macro/internal
-/*350*/ { "ISPMT", 4 },
- { "DATEDIF", 3 },
- { "DATESTRING", 1 },
- { "NUMBERSTRING", 2 },
- { "ROMAN", 0 },
-/*355*/ { "OPEN.DIALOG" }, // macro/internal
- { "SAVE.DIALOG" }, // macro/internal
- { "VIEW.GET" }, // macro/internal
- { "GETPIVOTDATA", 0 },
- { "HYPERLINK", 2 },
-/*360*/ { "PHONETIC", 1 },
- { "AVERAGEA", 0 },
- { "MAXA", 0 },
- { "MINA", 0 },
- { "STDEVPA", 0 },
-/*365*/ { "VARPA", 0 },
- { "STDEVA", 0 },
- { "VARA", 0 },
- { "BAHTTEXT", 1 },
- { "THAIDAYOFWEEK", 1 },
-/*370*/ { "THAIDIGIT", 1 },
- { "THAIMONTHOFYEAR", 1 },
- { "THAINUMSOUND", 1 },
- { "THAINUMSTRING", 1 },
- { "THAISTRINGLENGTH", 1 },
-/*375*/ { "ISTHAIDIGIT", 1 },
- { "ROUNDBAHTDOWN", 1 },
- { "ROUNDBAHTUP", 1 },
- { "THAIYEAR", 1 },
- { "RTD" },
-/*380*/ { "ISHYPERLINK", 1 }
-};
-
-const XclDumpFunc* lcl_GetFuncData( sal_uInt16 nIndex )
-{
- return (nIndex < STATIC_TABLE_SIZE( pFuncData )) ? (pFuncData + nIndex) : NULL;
-}
-
-// ----------------------------------------------------------------------------
-
-/** Stack helper to create a human readable formula string from UPN. */
-class XclDumpFormulaStackImpl : private ScfDelStack< ByteString >
-{
-public:
- void PushOperand( const ByteString& rOperand );
- void PushUnary( const ByteString& rOperator, bool bInFront );
- void PushBinary( const ByteString& rOperator );
- void PushFunction( const ByteString& rFuncName, sal_uInt16 nParamCount );
- inline ByteString GetString() const { return Top() ? *Top() : ByteString(); }
-};
-
-void XclDumpFormulaStackImpl::PushOperand( const ByteString& rOperand )
-{
- Push( new ByteString( rOperand ) );
-}
-
-void XclDumpFormulaStackImpl::PushUnary( const ByteString& rOperator, bool bInFront )
-{
- if( !Count() ) return;
- ByteString* pOp = Top();
- pOp->Insert( rOperator, bInFront ? 0 : pOp->Len() );
-}
-
-void XclDumpFormulaStackImpl::PushBinary( const ByteString& rOperator )
-{
- if( Count() < 2 ) return;
- // second operand is on top
- ByteString* pSecond = Pop();
- ByteString* pFirst = Top();
- *pFirst += rOperator;
- *pFirst += *pSecond;
- delete pSecond;
-}
-
-void XclDumpFormulaStackImpl::PushFunction( const ByteString& rFuncName, sal_uInt16 nParamCount )
-{
- if( Count() < nParamCount ) return;
- ByteString* pNew = new ByteString( ')' );
- for( sal_uInt16 nIndex = 0; nIndex < nParamCount; ++nIndex )
- {
- if( nIndex ) pNew->Insert( ';', 0 );
- ByteString* pOp = Pop();
- pNew->Insert( *pOp, 0 );
- delete pOp;
- }
- pNew->Insert( '(', 0 );
- pNew->Insert( rFuncName, 0 );
- Push( pNew );
-}
-
-// ----------------------------------------------------------------------------
-
-/** Stack to create a human readable formula and token class overview from UPN. */
-class XclDumpFormulaStack
-{
-public:
- void PushOperand( const ByteString& rOperand, sal_uInt8 nToken );
- inline void PushOperand( const sal_Char* pcOperand, sal_uInt8 nToken )
- { PushOperand( ByteString( pcOperand ), nToken ); }
-
- void PushUnary( const ByteString& rOperator, bool bInFront = true );
- inline void PushUnary( const sal_Char* pcOperator, bool bInFront = true )
- { PushUnary( ByteString( pcOperator ), bInFront ); }
-
- void PushBinary( const ByteString& rOperator );
- inline void PushBinary( const sal_Char* pcOperator )
- { PushBinary( ByteString( pcOperator ) ); }
-
- void PushFunction( const ByteString& rFuncName, sal_uInt16 nParamCount, sal_uInt8 nToken );
- inline void PushFunction( const sal_Char* pcFuncName, sal_uInt16 nParamCount, sal_uInt8 nToken )
- { PushFunction( ByteString( pcFuncName ), nParamCount, nToken ); }
-
- inline ByteString GetFormula() const { return maFmla.GetString(); }
- inline ByteString GetTokenClasses() const { return maClass.GetString(); }
-
- static ByteString GetTokenClass( sal_uInt8 nToken );
-
-private:
- void PushTokenClass( sal_uInt8 nToken );
-
- XclDumpFormulaStackImpl maFmla;
- XclDumpFormulaStackImpl maClass;
-};
-
-void XclDumpFormulaStack::PushOperand( const ByteString& rOperand, sal_uInt8 nToken )
-{
- maFmla.PushOperand( rOperand );
- maClass.PushOperand( GetTokenClass( nToken ) );
-}
-
-void XclDumpFormulaStack::PushUnary( const ByteString& rOperator, bool bInFront )
-{
- maFmla.PushUnary( rOperator, bInFront );
- maClass.PushUnary( rOperator, bInFront );
-}
-
-void XclDumpFormulaStack::PushBinary( const ByteString& rOperator )
-{
- maFmla.PushBinary( rOperator );
- maClass.PushBinary( rOperator );
-}
-
-void XclDumpFormulaStack::PushFunction( const ByteString& rFuncName, sal_uInt16 nParamCount, sal_uInt8 nToken )
-{
- maFmla.PushFunction( rFuncName, nParamCount );
- maClass.PushFunction( GetTokenClass( nToken ), nParamCount );
-}
-
-ByteString XclDumpFormulaStack::GetTokenClass( sal_uInt8 nToken )
-{
- sal_Char cClass = 'B';
- switch( nToken & 0xE0 )
- {
- case 0x20: cClass = 'R'; break;
- case 0x40: cClass = 'V'; break;
- case 0x60: cClass = 'A'; break;
- }
- return ByteString( cClass );
-}
-
-// ----------------------------------------------------------------------------
-
-const sal_Char* lcl_GetErrorString( sal_uInt8 nErr )
-{
- switch( nErr )
- {
- case 0x00: return "#NULL!";
- case 0x07: return "#DIV/0!";
- case 0x0F: return "#VALUE!";
- case 0x17: return "#REF!";
- case 0x1D: return "#NAME?";
- case 0x24: return "#NUM!";
- case 0x2A: return "#N/A!";
- }
- return "!unknown!";
-}
-
-
-
-void lcl_StartToken( ByteString& rString, sal_uInt16 nPos, sal_uInt8 nToken, const sal_Char* pTokenName )
-{
- rString.Erase();
- rString.Append( " " );
- __AddHex( rString, nPos );
- rString.Append( " " );
- __AddHex( rString, nToken );
- rString.Append( " t" ).Append( pTokenName ).Expand( 33, ' ' );
-}
-
-void lcl_StartTokenClass( ByteString& rString, sal_uInt16 nPos, sal_uInt8 nToken, const sal_Char* pTokenName )
-{
- ByteString aToken( pTokenName );
- aToken.Append( XclDumpFormulaStack::GetTokenClass( nToken ) );
- lcl_StartToken( rString, nPos, nToken, aToken.GetBuffer() );
-}
-
-void Biff8RecDumper::FormulaDump( const UINT16 nL, const FORMULA_TYPE eFT )
-{
- if( !nL )
- return;
-
- sal_uInt32 nStartPos = pIn->GetRecPos();
- const sal_uInt32 nAfterPos = nStartPos + nL;
-
- BYTE nOp;
- ByteString t, aOperand;
- BOOL bError = FALSE;
- const BOOL bRangeName = eFT == FT_RangeName;
- const BOOL bSharedFormula = eFT == FT_SharedFormula;
- const BOOL bRNorSF = bRangeName || bSharedFormula;
-
- XclDumpFormulaStack aStack;
- sal_Bool bPrinted = sal_True;
-
-#define PRINTTOKEN() { if( !bPrinted ) Print( t ); bPrinted = sal_True; }
-#define STARTTOKEN( name ) lcl_StartToken( t, static_cast< sal_uInt16 >( pIn->GetRecPos() - nStartPos - 1 ), nOp, name )
-#define STARTTOKENCLASS( name ) lcl_StartTokenClass( t, static_cast< sal_uInt16 >( pIn->GetRecPos() - nStartPos - 1 ), nOp, name )
-
- while( pIn->IsValid() && ( pIn->GetRecPos() < nAfterPos ) && !bError )
- {
- *pIn >> nOp;
- bPrinted = sal_False;
- aOperand.Erase();
-
- switch( nOp ) // Buch Seite:
- { // SDK4 SDK5
- case 0x01: // Array Formula [325 ]
- {
- STARTTOKEN( "Exp" );
- sal_uInt16 nRow, nCol;
- *pIn >> nRow >> nCol;
- t += "array formula or shared formula, base-address=";
- lcl_AddRef( t, nCol, nRow );
- aStack.PushFunction( "ARRAY", 0, nOp );
- }
- break;
- case 0x02: // Data Table [325 277]
- {
- STARTTOKEN( "Tbl" );
- sal_uInt16 nRow, nCol;
- *pIn >> nRow >> nCol;
- t += "multiple operation, base-address=";
- lcl_AddRef( t, nCol, nRow );
- aStack.PushFunction( "MULTIPLE.OPERATIONS", 0, nOp );
- }
- break;
- case 0x03: // Addition [312 264]
- STARTTOKEN( "Add" );
- aStack.PushBinary( "+" );
- break;
- case 0x04: // Subtraction [313 264]
- STARTTOKEN( "Sub" );
- aStack.PushBinary( "-" );
- break;
- case 0x05: // Multiplication [313 264]
- STARTTOKEN( "Mul" );
- aStack.PushBinary( "*" );
- break;
- case 0x06: // Division [313 264]
- STARTTOKEN( "Div" );
- aStack.PushBinary( "/" );
- break;
- case 0x07: // Exponetiation [313 265]
- STARTTOKEN( "Power" );
- aStack.PushBinary( "^" );
- break;
- case 0x08: // Concatenation [313 265]
- STARTTOKEN( "Concat" );
- aStack.PushBinary( "&" );
- break;
- case 0x09: // Less Than [313 265]
- STARTTOKEN( "LT" );
- aStack.PushBinary( "<" );
- break;
- case 0x0A: // Less Than or Equal [313 265]
- STARTTOKEN( "LE" );
- aStack.PushBinary( "<=" );
- break;
- case 0x0B: // Equal [313 265]
- STARTTOKEN( "EQ" );
- aStack.PushBinary( "=" );
- break;
- case 0x0C: // Greater Than or Equal [313 265]
- STARTTOKEN( "GE" );
- aStack.PushBinary( ">=" );
- break;
- case 0x0D: // Greater Than [313 265]
- STARTTOKEN( "GT" );
- aStack.PushBinary( ">" );
- break;
- case 0x0E: // Not Equal [313 265]
- STARTTOKEN( "NE" );
- aStack.PushBinary( "<>" );
- break;
- case 0x0F: // Intersection [314 265]
- STARTTOKEN( "Isect" );
- aStack.PushBinary( " " );
- break;
- case 0x10: // List [314 265]
- STARTTOKEN( "List" );
- aStack.PushBinary( ";" );
- break;
- case 0x11: // Range [314 265]
- STARTTOKEN( "Range" );
- aStack.PushBinary( ":" );
- break;
- case 0x12: // Unary Plus [312 264]
- STARTTOKEN( "Uplus" );
- aStack.PushUnary( "+" );
- break;
- case 0x13: // Unary Minus [312 264]
- STARTTOKEN( "Uminus" );
- aStack.PushUnary( "-" );
- break;
- case 0x14: // Percent Sign [312 264]
- STARTTOKEN( "Percent" );
- aStack.PushUnary( "%", false );
- break;
- case 0x15: // Parenthesis [326 278]
- STARTTOKEN( "Paren" );
- // simulate two unary operators to enclose operand
- aStack.PushUnary( "(" );
- aStack.PushUnary( ")", false );
- break;
- case 0x16: // Missing Argument [314 266]
- STARTTOKEN( "MissArg" );
- aStack.PushOperand( "~", nOp );
- break;
- case 0x17: // ByteString Constant [314 266]
- {
- STARTTOKEN( "Str" );
-
- UINT8 nLen;
- *pIn >> nLen;
-
- t += "string [len=";
- __AddDec( t, nLen );
- t += "] ";
-
- aOperand += '"';
- if( nLen )
- aOperand += GETSTR( pIn->ReadUniString( nLen ) );
- else
- pIn->Ignore( 1 );
- aOperand += '"';
- t += aOperand;
- aStack.PushOperand( aOperand, nOp );
- }
- break;
- case 0x18:
- {
- STARTTOKEN( "Extended" );
- UINT8 nEptg;
- *pIn >> nEptg;
-
-#define D(name,size,ext,type) {t+="eptg ";__AddDec(t,(UINT16)nEptg);t+=": "; \
- t+=name;t+=" [";__AddDec(t,(UINT16)size);t+="] ";t+=type; \
- if(ext)t+=" + ext";PRINTTOKEN();ContDump(size);aStack.PushOperand(name,nOp);}
- switch( nEptg )
- { // name size ext type
- case 0x00: // res
- D( "res", 0, 0, "" );
- break;
- case 0x01: // Lel 4 - err
- D( "Lel", 4, 0, "err" );
- break;
- case 0x02: // Rw 4 - ref
- D( "Rw", 4, 0, "ref" );
- break;
- case 0x03: // Col 4 - ref
- D( "Col", 4, 0, "ref" );
- break;
- case 0x04: // res
- case 0x05: // res
- D( "res", 0, 0, "" );
- break;
- case 0x06: // RwV 4 - val
- D( "RwV", 4, 0, "val" );
- break;
- case 0x07: // ColV 4 - val
- D( "ColV", 4, 0, "val" );
- break;
- case 0x08: // res
- case 0x09: // res
- D( "res", 0, 0, "" );
- break;
- case 0x0A: // Radical 13 - ref
- D( "Radical", 13, 0, "ref" );
- break;
- case 0x0B: // RadicalS 13 x ref
- D( "RadicalS", 13, 1, "ref" );
- break;
- case 0x0C: // RwS 4 x ref
- D( "RwS", 4, 1, "ref" );
- break;
- case 0x0D: // ColS 4 x ref
- D( "ColS", 4, 1, "ref" );
- break;
- case 0x0E: // RwSV 4 x val
- D( "RwSV", 4, 1, "val" );
- break;
- case 0x0F: // ColSV 4 x val
- D( "ColSV", 4, 1, "val" );
- break;
- case 0x10: // RadicalLel 4 - err
- D( "RadicalLel", 4, 0, "err" );
- break;
- case 0x11: // res
- case 0x12: // res
- case 0x13: // res
- case 0x14: // res
- case 0x15: // res
- case 0x16: // res
- case 0x17: // res
- case 0x18: // res
- D( "res", 0, 0, "" );
- break;
- case 0x19: // invalid values
- case 0x1A: // invalid values
- D( "invalid vals", 0, 0, "" );
- break;
- case 0x1B: // res
- case 0x1C: // res
- D( "res", 0, 0, "" );
- break;
- case 0x1D: // SxName 4 - val
- D( "SxName", 4, 0, "val" );
- break;
- case 0x1E: // res
- D( "res", 0, 0, "" );
- break;
- default:
- D( "!unknown!", 0, 0, "" );
- }
-#undef D
- }
- break;
- case 0x19: // Special Attribute [327 279]
- {
- STARTTOKEN( "Attr" );
- UINT16 nData, nFakt;
- BYTE nOpt;
-
- *pIn >> nOpt >> nData;
- nFakt = 2;
-
- t += "flags="; __AddHex( t, nOpt );
-
- if( nOpt & 0x01 ) t += " volatile";
- if( nOpt & 0x02 ) t += " if";
- if( nOpt & 0x04 ) t += " choose";
- if( nOpt & 0x08 ) t += " skip";
- if( nOpt & 0x10 ) t += " sum";
- if( nOpt & 0x20 ) t += " assignment";
- if( nOpt & 0x40 ) t += " space";
- if( nOpt & 0x80 ) t += " unknown";
-
- if( nOpt & 0x02 )
- {
- t += " skip-to-false=";
- __AddHex( t, nData );
- }
- if( nOpt & 0x04 )
- {
- t += " count=";
- __AddDec( t, nData );
- t += " skip=";
- for( sal_uInt16 nIdx = 0; nIdx <= nData; ++nIdx )
- {
- if( nIdx ) t += ',';
- __AddDec( t, pIn->ReaduInt16() );
- }
- }
- if( nOpt & 0x08 )
- {
- t += " skip=";
- __AddHex( t, nData );
- t += " (";
- __AddDec( t, sal_uInt8( nData + 1 ) );
- t += " bytes)";
- }
- if( nOpt & 0x10 )
- aStack.PushFunction( "ATTRSUM", 1, nOp );
- if( nOpt & 0x40 )
- {
- t += " type=";
- __AddDec( t, static_cast< sal_uInt8 >( nData ) );
- t += " count=";
- __AddDec( t, static_cast< sal_uInt8 >( nData >> 8 ) );
- }
- }
- break;
- case 0x1C: // Error Value [314 266]
- {
- STARTTOKEN( "Err" );
- sal_uInt8 nErr = pIn->ReaduInt8();
- t += "error value ("; __AddHex( t, nErr );
- t += ") ";
- t += lcl_GetErrorString( nErr );
- aStack.PushOperand( lcl_GetErrorString( nErr ), nOp );
- }
- break;
- case 0x1D: // Boolean [315 266]
- STARTTOKEN( "Bool" );
- aOperand += pIn->ReaduInt8() ? "TRUE" : "FALSE";
- t += aOperand;
- aStack.PushOperand( aOperand, nOp );
- break;
- case 0x1E: // Integer [315 266]
- STARTTOKEN( "Int" );
- __AddDec( aOperand, pIn->ReaduInt16() );
- t += aOperand;
- aStack.PushOperand( aOperand, nOp );
- break;
- case 0x1F: // Number [315 266]
- STARTTOKEN( "Num" );
- __AddDouble( aOperand, pIn->ReadDouble() );
- t += aOperand;
- aStack.PushOperand( aOperand, nOp );
- break;
- case 0x20: // Array Constant [317 268]
- case 0x40:
- case 0x60:
- STARTTOKENCLASS( "Array" );
- pIn->Ignore( 7 );
- aStack.PushOperand( "{ConstArray}", nOp );
- break;
- case 0x21: // Function, Fixed Number of Arguments [333 282]
- case 0x41:
- case 0x61:
- {
- STARTTOKENCLASS( "Func" );
- UINT16 nInd = pIn->ReaduInt16();
- const XclDumpFunc* pFunc = lcl_GetFuncData( nInd );
- aOperand += pFunc ? pFunc->pName : "!unknown!";
-
- t += "fix function: index="; __AddHex( t, nInd );
- t += " ("; t += aOperand;
- t += ')';
- aStack.PushFunction( aOperand, pFunc ? pFunc->nParam : 0, nOp );
- }
- break;
- case 0x22: // Function, Variable Number of Arg. [333 283]
- case 0x42:
- case 0x62:
- {
- STARTTOKENCLASS( "FuncVar" );
- BYTE nAnz;
- UINT16 nInd;
- *pIn >> nAnz >> nInd;
- const XclDumpFunc* pFunc = lcl_GetFuncData( nInd & 0x7FFF );
- aOperand += pFunc ? pFunc->pName : "!unknown!";
-
- t += "var function: index="; __AddHex( t, nInd );
- t += " ("; t += aOperand;
- t += ") param count="; __AddHex( t, nAnz );
- t += " ("; __AddDec( t, (UINT8)(nAnz & 0x7F) );
- t += ')';
- if( nAnz & 0x8000 )
- t += " cmd-equiv.";
- aStack.PushFunction( aOperand, nAnz & 0x7F, nOp );
- }
- break;
- case 0x23: // Name [318 269]
- case 0x43:
- case 0x63:
- {
- STARTTOKENCLASS( "Name" );
- sal_uInt16 nNameIdx = pIn->ReaduInt16();
- __AddDec( aOperand, nNameIdx );
- t += "internal name: index=";
- t += aOperand;
- pIn->Ignore( 2 );
- if( (0 < nNameIdx) && (nNameIdx <= maNames.size()) )
- aOperand = maNames[ nNameIdx - 1 ];
- else
- aOperand.Insert( "NAME(", 0 ).Append( ')' );
- aStack.PushOperand( aOperand, nOp );
- }
- break;
- case 0x24: // Cell Reference [319 270]
- case 0x44:
- case 0x64:
- case 0x2A: // Deleted Cell Reference [323 273]
- case 0x4A:
- case 0x6A:
- {
- if( (nOp & 0x1F) == 0x04 )
- STARTTOKENCLASS( "Ref" );
- else
- STARTTOKENCLASS( "RefErr" );
-
- UINT16 nCol, nRow;
- *pIn >> nRow >> nCol;
- AddRef( aOperand, nRow, nCol, bRangeName );
- t += "2D cell ref C/R="; __AddHex( t, nCol );
- t += '/'; __AddHex( t, nRow );
- t += ' '; t += aOperand;
- aStack.PushOperand( aOperand, nOp );
- }
- break;
- case 0x25: // Area Reference [320 270]
- case 0x45:
- case 0x65:
- case 0x2B: // Deleted Area Refernce [323 273]
- case 0x4B:
- case 0x6B:
- {
- if( (nOp & 0x1F) == 0x05 )
- STARTTOKENCLASS( "Area" );
- else
- STARTTOKENCLASS( "AreaErr" );
-
- UINT16 nRowFirst, nRowLast, nColFirst, nColLast;
- *pIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast;
- AddRangeRef( aOperand, nRowFirst, nColFirst, nRowLast, nColLast, bRangeName );
- t += "2D area ref C/R:C/R="; __AddHex( t, nColFirst );
- t += '/'; __AddHex( t, nRowFirst );
- t += ':'; __AddHex( t, nColLast );
- t += '/'; __AddHex( t, nRowLast );
- t += ' '; t += aOperand;
- aStack.PushOperand( aOperand, nOp );
- }
- break;
- case 0x26: // Constant Reference Subexpression [321 271]
- case 0x46:
- case 0x66:
- {
- STARTTOKENCLASS( "MemArea" );
- sal_uInt32 nRes;
- sal_uInt16 nSize;
- *pIn >> nRes >> nSize;
- t += "reserved="; __AddHex( t, nRes );
- t += " size="; __AddDec( t, nSize );
- }
- break;
- case 0x27: // Erroneous Constant Reference Subexpr. [322 272]
- case 0x47:
- case 0x67:
- {
- STARTTOKENCLASS( "MemErr" );
- sal_uInt32 nRes;
- sal_uInt16 nSize;
- *pIn >> nRes >> nSize;
- t += "reserved="; __AddHex( t, nRes );
- t += " size="; __AddDec( t, nSize );
- }
- break;
- case 0x28: // Incomplete Constant Reference Subexpr.[331 281]
- case 0x48:
- case 0x68:
- {
- STARTTOKENCLASS( "MemNoMem" );
- sal_uInt32 nRes;
- sal_uInt16 nSize;
- *pIn >> nRes >> nSize;
- t += "reserved="; __AddHex( t, nRes );
- t += " size="; __AddDec( t, nSize );
- }
- break;
- case 0x29: // Variable Reference Subexpression [331 281]
- case 0x49:
- case 0x69:
- {
- STARTTOKENCLASS( "MemFunc" );
- sal_uInt16 nSize;
- *pIn >> nSize;
- t += "size="; __AddDec( t, nSize );
- }
- break;
- case 0x2C: // Cell Reference Within a Name/ShrdFmla [323 273]
- case 0x4C:
- case 0x6C:
- {
- STARTTOKENCLASS( "RefN" );
- UINT16 nRow, nCol;
- *pIn >> nRow >> nCol;
- AddRef( aOperand, nRow, nCol, bRNorSF );
- t += "2D cell ref in name C/R="; __AddHex( t, nCol );
- t += '/'; __AddHex( t, nRow );
- t += ' '; t += aOperand;
- aStack.PushOperand( aOperand, nOp );
- }
- break;
- case 0x2D: // Area Reference Within a Name/ShrdFmla [324 274]
- case 0x4D:
- case 0x6D:
- {
- STARTTOKENCLASS( "AreaN" );
- UINT16 nRowFirst, nRowLast, nColFirst, nColLast;
- *pIn >> nRowFirst >> nRowLast >> nColFirst >> nColLast;
- AddRangeRef( aOperand, nRowFirst, nColFirst, nRowLast, nColLast, bRNorSF );
- t += "2D area ref in name C/R:C/R"; __AddHex( t, nColFirst );
- t += '/'; __AddHex( t, nRowFirst );
- t += ':'; __AddHex( t, nColLast );
- t += '/'; __AddHex( t, nRowLast );
- t += ' '; t += aOperand;
- aStack.PushOperand( aOperand, nOp );
- }
- break;
- case 0x2E: // Reference Subexpression Within a Name [332 282]
- case 0x4E:
- case 0x6E:
- {
- STARTTOKENCLASS( "MemAreaN" );
- sal_uInt16 nSize;
- *pIn >> nSize;
- t += "size="; __AddDec( t, nSize );
- }
- break;
- case 0x2F: // Incomplete Reference Subexpression... [332 282]
- case 0x4F:
- case 0x6F:
- {
- STARTTOKENCLASS( "MemNoMemN" );
- sal_uInt16 nSize;
- *pIn >> nSize;
- t += "size="; __AddDec( t, nSize );
- }
- break;
- case 0x39: // Name or External Name [ 275]
- case 0x59:
- case 0x79:
- {
- STARTTOKENCLASS( "NameX" );
- UINT16 nXti, nName;
- *pIn >> nXti >> nName;
- pIn->Ignore( 2 );
- t += "external name: XTI="; __AddDec( t, nXti );
- t += " name index="; __AddDec( t, nName );
- aOperand += "EXTNAME(XTI(";
- __AddDec( aOperand, nXti );
- aOperand += "),";
- __AddDec( aOperand, nName );
- aOperand += ')';
- aStack.PushOperand( aOperand, nOp );
- }
- break;
- case 0x3A: // 3-D Cell Reference [ 275]
- case 0x5A:
- case 0x7A:
- case 0x3C: // Deleted 3-D Cell Reference [ 277]
- case 0x5C:
- case 0x7C:
- {
- if( (nOp & 0x1F) == 0x1A )
- STARTTOKENCLASS( "Ref3d" );
- else
- STARTTOKENCLASS( "Ref3dErr" );
-
- UINT16 nXti, nRow, nCol;
- *pIn >> nXti >> nRow >> nCol;
- AddRef( aOperand, nRow, nCol, bRangeName, nXti );
- t += "3D cell ref Xti!C/R="; __AddHex( t, nXti );
- t += '!'; __AddHex( t, nCol );
- t += '/'; __AddHex( t, nRow );
- t += ' '; t += aOperand;
- aStack.PushOperand( aOperand, nOp );
- }
- break;
- case 0x3B: // 3-D Area Reference [ 276]
- case 0x5B:
- case 0x7B:
- case 0x3D: // Deleted 3-D Area Reference [ 277]
- case 0x5D:
- case 0x7D:
- {
- if( (nOp & 0x1F) == 0x1B )
- STARTTOKENCLASS( "Area3d" );
- else
- STARTTOKENCLASS( "Area3dErr" );
-
- UINT16 nXti, nRow1, nCol1, nRow2, nCol2;
- *pIn >> nXti >> nRow1 >> nRow2 >> nCol1 >> nCol2;
- AddRangeRef( aOperand, nRow1, nCol1, nRow2, nCol2, bRangeName, nXti );
- t += "3D area ref Xti!C/R:C/R="; __AddHex( t, nXti );
- t += '!'; __AddHex( t, nCol1 );
- t += '/'; __AddHex( t, nRow1 );
- t += ':'; __AddHex( t, nCol2 );
- t += '/'; __AddHex( t, nRow2 );
- t += ' '; t += aOperand;
- aStack.PushOperand( aOperand, nOp );
- }
- break;
- default:
- STARTTOKEN( "unknown" );
- bError = TRUE;
- }
- PRINTTOKEN();
- }
- t.Assign( " Formula = " );
- if( aStack.GetFormula().Len() ) t += aStack.GetFormula(); else t += "ERROR IN STACK";
- Print( t );
- t.Assign( " Tokencl = " ).Append( aStack.GetTokenClasses() );
- Print( t );
- pIn->Seek( nAfterPos );
-}
-
-
-// ============================================================================
-//
-// S T R E A M C O N T E N T S
-//
-// ============================================================================
-
-void Biff8RecDumper::DumpBinary( SvStream& rInStrm, ULONG nSize )
-{
- ULONG nStrmPos = rInStrm.Tell();
- rInStrm.Seek( STREAM_SEEK_TO_END );
- ULONG nStrmLen = rInStrm.Tell();
- rInStrm.Seek( nStrmPos );
- ULONG nDumpEnd = (nSize == STREAM_SEEK_TO_END) ? nStrmLen : ::std::min( nStrmPos + nSize, nStrmLen );
-
- const ULONG LINE_SIZE = 16;
- sal_uInt8 pnData[ LINE_SIZE ];
-
- while( rInStrm.Tell() < nDumpEnd )
- {
- ByteString aBinLine;
- ByteString aTextLine;
-
- ULONG nLineLen = ::std::min( nDumpEnd - rInStrm.Tell(), LINE_SIZE );
- rInStrm.Read( pnData, nLineLen );
-
- for( sal_uInt8 *pnByte = pnData, *pnEnd = pnData + nLineLen; pnByte != pnEnd; ++pnByte )
- {
- if( pnByte - pnData == LINE_SIZE / 2 )
- {
- aBinLine.Append( ' ' );
- aTextLine.Append( ' ' );
- }
- __AddPureHex( aBinLine, *pnByte );
- aBinLine.Append( ' ' );
- aTextLine.Append( static_cast< sal_Char >( IsPrintable( *pnByte ) ? *pnByte : '.' ) );
- }
-
- aBinLine.Expand( LINE_SIZE * 3 + 3, ' ' );
- (*pDumpStream) << aBinLine.GetBuffer() << aTextLine.GetBuffer() << "\n";
- }
-}
-
-// ============================================================================
-//
-// F O R M C O N T R O L S
-//
-// ============================================================================
-
-namespace {
-
-// little helpers -------------------------------------------------------------
-
-/** Import from bytestream. */
-SvStream& operator>>( SvStream& rStrm, XclGuid& rGuid )
-{
- rStrm.Read( rGuid.mpnData, 16 );
- return rStrm;
-}
-
-/** Output guid into text stream. */
-SvStream& operator<<( SvStream& rStrm, const XclGuid& rGuid )
-{
- ByteString aOut;
- lclAppendGuid( aOut, rGuid );
- return rStrm << aOut.GetBuffer();
-}
-
-void lclAlignStream( SvStream& rInStrm, ULONG nStartPos, ULONG nDataWidth )
-{
- rInStrm.SeekRel( nDataWidth - 1 - (rInStrm.Tell() - nStartPos + nDataWidth - 1) % nDataWidth );
-}
-
-// control types --------------------------------------------------------------
-
-const sal_uInt16 EXC_CTRL_PAGE = 0x0007;
-const sal_uInt16 EXC_CTRL_IMAGE = 0x000C;
-const sal_uInt16 EXC_CTRL_FRAME = 0x000E;
-const sal_uInt16 EXC_CTRL_SPINBUTTON = 0x0010;
-const sal_uInt16 EXC_CTRL_PUSHBUTTON = 0x0011;
-const sal_uInt16 EXC_CTRL_TABSTRIP = 0x0012;
-const sal_uInt16 EXC_CTRL_LABEL = 0x0015;
-const sal_uInt16 EXC_CTRL_TEXTBOX = 0x0017;
-const sal_uInt16 EXC_CTRL_LISTBOX = 0x0018;
-const sal_uInt16 EXC_CTRL_COMBOBOX = 0x0019;
-const sal_uInt16 EXC_CTRL_CHECKBOX = 0x001A;
-const sal_uInt16 EXC_CTRL_OPTIONBUTTON = 0x001B;
-const sal_uInt16 EXC_CTRL_TOGGLEBUTTON = 0x001C;
-const sal_uInt16 EXC_CTRL_SCROLLBAR = 0x002F;
-const sal_uInt16 EXC_CTRL_MULTIPAGE = 0x0039;
-const sal_uInt16 EXC_CTRL_REFEDIT = 0x8000;
-const sal_uInt16 EXC_CTRL_FONTDATA = 0xFFF0; // internal use only
-const sal_uInt16 EXC_CTRL_USERFORM = 0xFFF1; // internal use only
-const sal_uInt16 EXC_CTRL_ADDDATA = 0xFFF2; // internal use only
-const sal_uInt16 EXC_CTRL_FRAMECHILD = 0xFFF3; // internal use only
-const sal_uInt16 EXC_CTRL_PROGRESSBAR = 0xFFF4; // internal use only
-const sal_uInt16 EXC_CTRL_UNKNOWN = 0xFFFF; // internal use only
-
-const sal_uInt16 EXC_CTRL_RECORD_ID = 0x0000;
-const sal_uInt16 EXC_CTRL_CLIENT_ID = 0x0200;
-const sal_uInt16 EXC_CTRL_CONTAINER_ID = 0x0400;
-
-// control names --------------------------------------------------------------
-
-struct XclDumpControlInfo
-{
- sal_uInt16 mnType;
- const sal_Char* mpcName;
- sal_uInt16 mnId;
-};
-
-static const XclDumpControlInfo spControlInfos[] =
-{
- { EXC_CTRL_PAGE, "Page", EXC_CTRL_CONTAINER_ID },
- { EXC_CTRL_IMAGE, "Image", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_FRAME, "Frame", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_SPINBUTTON, "Spin", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_PUSHBUTTON, "PushButton", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_TABSTRIP, "TabStrip", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_LABEL, "Label", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_TEXTBOX, "TextBox", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_LISTBOX, "ListBox", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_COMBOBOX, "ComboBox", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_CHECKBOX, "CheckBox", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_OPTIONBUTTON, "OptionButton", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_TOGGLEBUTTON, "ToggleButton", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_SCROLLBAR, "ScrollBar", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_MULTIPAGE, "MultiPage", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_REFEDIT, "RefEdit", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_FONTDATA, "FontData", EXC_CTRL_CLIENT_ID },
- { EXC_CTRL_USERFORM, "UserForm", EXC_CTRL_CONTAINER_ID },
- { EXC_CTRL_ADDDATA, "AddData", EXC_CTRL_RECORD_ID },
- { EXC_CTRL_FRAMECHILD, "FrameChild", EXC_CTRL_RECORD_ID },
- { EXC_CTRL_PROGRESSBAR, "ProgressBar", EXC_CTRL_RECORD_ID }
-};
-
-typedef ::std::map< sal_uInt16, const XclDumpControlInfo* > XclDumpControlInfoMap;
-typedef ScfRef< XclDumpControlInfoMap > XclDumpControlInfoMapRef;
-
-XclDumpControlInfoMapRef lclCreateControlInfoMap()
-{
- XclDumpControlInfoMapRef xMap( new XclDumpControlInfoMap );
- for( const XclDumpControlInfo *pIt = spControlInfos, *pEnd = STATIC_TABLE_END( spControlInfos ); pIt != pEnd; ++pIt )
- (*xMap)[ pIt->mnType ] = pIt;
- return xMap;
-}
-
-const XclDumpControlInfoMap& lclGetControlInfoMap()
-{
- static const XclDumpControlInfoMapRef sxMap = lclCreateControlInfoMap();
- return *sxMap;
-}
-
-void lclAppendControlType( ByteString& rStr, sal_uInt16 nCtrlType )
-{
- const XclDumpControlInfoMap& rMap = lclGetControlInfoMap();
- XclDumpControlInfoMap::const_iterator aIt = rMap.find( nCtrlType );
- rStr.Append( (aIt == rMap.end()) ? "*UNKNOWN*" : aIt->second->mpcName );
-}
-
-void lclDumpControlType( SvStream& rOutStrm, sal_uInt16 nCtrlType )
-{
- ByteString aTitle( "type=" );
- lclAppendHex( aTitle, nCtrlType );
- aTitle.Append( " (" );
- lclAppendControlType( aTitle, nCtrlType );
- aTitle.Append( ')' );
- rOutStrm << aTitle.GetBuffer();
-}
-
-sal_uInt16 lclDumpControlHeader( SvStream& rInStrm, SvStream& rOutStrm, sal_uInt16 nCtrlType )
-{
- lclDumpControlType( rOutStrm, nCtrlType );
- sal_uInt16 nId, nSize;
- rInStrm >> nId >> nSize;
- ByteString aLine( " id=" ); lclAppendHex( aLine, nId );
- const XclDumpControlInfoMap& rMap = lclGetControlInfoMap();
- XclDumpControlInfoMap::const_iterator aIt = rMap.find( nCtrlType );
- bool bValid = (aIt != rMap.end()) && (aIt->second->mnId == nId);
- aLine.Append( bValid ? " (valid)" : " (invalid)" );
- aLine.Append( " size=" ); lclAppendHex( aLine, nSize );
- rOutStrm << aLine.GetBuffer() << "\n";
- return nSize;
-}
-
-// control GUIDs --------------------------------------------------------------
-
-struct XclDumpControlGuid
-{
- sal_uInt16 mnType;
- sal_uInt32 mnGuidData1;
- sal_uInt16 mnGuidData2;
- sal_uInt16 mnGuidData3;
- sal_uInt8 mnGuidData41;
- sal_uInt8 mnGuidData42;
- sal_uInt8 mnGuidData43;
- sal_uInt8 mnGuidData44;
- sal_uInt8 mnGuidData45;
- sal_uInt8 mnGuidData46;
- sal_uInt8 mnGuidData47;
- sal_uInt8 mnGuidData48;
-};
-
-static const XclDumpControlGuid spControlGuids[] =
-{
- { EXC_CTRL_PUSHBUTTON, 0xD7053240, 0xCE69, 0x11CD, 0xA7, 0x77, 0x00, 0xDD, 0x01, 0x14, 0x3C, 0x57 },
- { EXC_CTRL_TOGGLEBUTTON, 0x8BD21D60, 0xEC42, 0x11CE, 0x9E, 0x0D, 0x00, 0xAA, 0x00, 0x60, 0x02, 0xF3 },
- { EXC_CTRL_CHECKBOX, 0x8BD21D40, 0xEC42, 0x11CE, 0x9E, 0x0D, 0x00, 0xAA, 0x00, 0x60, 0x02, 0xF3 },
- { EXC_CTRL_OPTIONBUTTON, 0x8BD21D50, 0xEC42, 0x11CE, 0x9E, 0x0D, 0x00, 0xAA, 0x00, 0x60, 0x02, 0xF3 },
- { EXC_CTRL_LABEL, 0x978C9E23, 0xD4B0, 0x11CE, 0xBF, 0x2D, 0x00, 0xAA, 0x00, 0x3F, 0x40, 0xD0 },
- { EXC_CTRL_TEXTBOX, 0x8BD21D10, 0xEC42, 0x11CE, 0x9E, 0x0D, 0x00, 0xAA, 0x00, 0x60, 0x02, 0xF3 },
- { EXC_CTRL_LISTBOX, 0x8BD21D20, 0xEC42, 0x11CE, 0x9E, 0x0D, 0x00, 0xAA, 0x00, 0x60, 0x02, 0xF3 },
- { EXC_CTRL_COMBOBOX, 0x8BD21D30, 0xEC42, 0x11CE, 0x9E, 0x0D, 0x00, 0xAA, 0x00, 0x60, 0x02, 0xF3 },
- { EXC_CTRL_SPINBUTTON, 0x79176FB0, 0xB7F2, 0x11CE, 0x97, 0xEF, 0x00, 0xAA, 0x00, 0x6D, 0x27, 0x76 },
- { EXC_CTRL_SCROLLBAR, 0xDFD181E0, 0x5E2F, 0x11CE, 0xA4, 0x49, 0x00, 0xAA, 0x00, 0x4A, 0x80, 0x3D },
- { EXC_CTRL_IMAGE, 0x4C599241, 0x6926, 0x101B, 0x99, 0x92, 0x00, 0x00, 0x0B, 0x65, 0xC6, 0xF9 },
- { EXC_CTRL_PROGRESSBAR, 0x35053A22, 0x8589, 0x11D1, 0xB1, 0x6A, 0x00, 0xC0, 0xF0, 0x28, 0x36, 0x28 }
-};
-
-typedef ::std::map< XclGuid, sal_uInt16 > XclDumpControlGuidMap;
-typedef ScfRef< XclDumpControlGuidMap > XclDumpControlGuidMapRef;
-
-XclDumpControlGuidMapRef lclCreateControlGuidMap()
-{
- XclDumpControlGuidMapRef xMap( new XclDumpControlGuidMap );
- for( const XclDumpControlGuid *pIt = spControlGuids, *pEnd = STATIC_TABLE_END( spControlGuids ); pIt != pEnd; ++pIt )
- {
- XclGuid aGuid( pIt->mnGuidData1, pIt->mnGuidData2, pIt->mnGuidData3,
- pIt->mnGuidData41, pIt->mnGuidData42, pIt->mnGuidData43, pIt->mnGuidData44,
- pIt->mnGuidData45, pIt->mnGuidData46, pIt->mnGuidData47, pIt->mnGuidData48 );
- (*xMap)[ aGuid ] = pIt->mnType;
- }
- return xMap;
-}
-
-const XclDumpControlGuidMap& lclGetControlGuidMap()
-{
- static const XclDumpControlGuidMapRef sxMap = lclCreateControlGuidMap();
- return *sxMap;
-}
-
-sal_uInt16 lclDumpControlGuid( SvStream& rInStrm, SvStream& rOutStrm )
-{
- XclGuid aGuid;
- rInStrm >> aGuid;
- const XclDumpControlGuidMap& rMap = lclGetControlGuidMap();
- XclDumpControlGuidMap::const_iterator aIt = rMap.find( aGuid );
- sal_uInt16 nCtrlType = (aIt == rMap.end()) ? EXC_CTRL_UNKNOWN : aIt->second;
- rOutStrm << "guid=" << aGuid;
- return nCtrlType;
-};
-
-// other guids ----------------------------------------------------------------
-
-static const XclGuid saStdFontGuid( 0x0BE35203, 0x8F91, 0x11CE, 0x9D, 0xE3, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51 );
-static const XclGuid saStdPicGuid( 0x0BE35204, 0x8F91, 0x11CE, 0x9D, 0xE3, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51 );\
-
-// ----------------------------------------------------------------------------
-
-} // namespace
-
-// *** yet some other ugly macros for the specials of form control dumping ***
-
-// align the instream
-#define EXC_CTRLDUMP_ALIGN_INSTRM( val ) lclAlignStream( rInStrm, nStartPos, val )
-// push the string to outstream
-#define EXC_CTRLDUMP_PRINT() { if( t.Len() ) { rOutStrm << t.GetBuffer() << '\n'; t.Erase(); } }
-
-// implementation, don't use
-#define IMPL_EXC_CTRLDUMP_PLAIN_VALUE( type, func, text ) { type n; rInStrm >> n; t.Append( " " text "=" ); func( t, n ); EXC_CTRLDUMP_PRINT(); }
-#define IMPL_EXC_CTRLDUMP_VALUE( type, func, text ) { EXC_CTRLDUMP_ALIGN_INSTRM( sizeof( type ) ); IMPL_EXC_CTRLDUMP_PLAIN_VALUE( type, func, text ); }
-#define IMPL_EXC_CTRLDUMP_PLAIN_VAR( var, mask, func, text ) { rInStrm >> var; var &= (mask); t.Append( " " text "=" ); func( t, var ); EXC_CTRLDUMP_PRINT(); }
-#define IMPL_EXC_CTRLDUMP_VAR( var, mask, func, text ) { EXC_CTRLDUMP_ALIGN_INSTRM( sizeof( var ) ); IMPL_EXC_CTRLDUMP_PLAIN_VAR( var, mask, func, text ); }
-
-// read a value from stream (no stream alignment)
-#define EXC_CTRLDUMP_PLAIN_HEX4( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( sal_uInt32, lclAppendHex, text )
-#define EXC_CTRLDUMP_PLAIN_DEC4( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( sal_Int32, lclAppendDec, text )
-#define EXC_CTRLDUMP_PLAIN_HEX2( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( sal_uInt16, lclAppendHex, text )
-#define EXC_CTRLDUMP_PLAIN_DEC2( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( sal_Int16, lclAppendDec, text )
-#define EXC_CTRLDUMP_PLAIN_HEX1( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( sal_uInt8, lclAppendHex, text )
-#define EXC_CTRLDUMP_PLAIN_DEC1( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( sal_Int8, lclAppendDec, text )
-#define EXC_CTRLDUMP_PLAIN_DECF( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( float, lclAppendDec, text )
-// read a value from stream (with stream alignment)
-#define EXC_CTRLDUMP_HEX4( text ) IMPL_EXC_CTRLDUMP_VALUE( sal_uInt32, lclAppendHex, text )
-#define EXC_CTRLDUMP_DEC4( text ) IMPL_EXC_CTRLDUMP_VALUE( sal_Int32, lclAppendDec, text )
-#define EXC_CTRLDUMP_HEX2( text ) IMPL_EXC_CTRLDUMP_VALUE( sal_uInt16, lclAppendHex, text )
-#define EXC_CTRLDUMP_DEC2( text ) IMPL_EXC_CTRLDUMP_VALUE( sal_Int16, lclAppendDec, text )
-#define EXC_CTRLDUMP_HEX1( text ) IMPL_EXC_CTRLDUMP_VALUE( sal_uInt8, lclAppendHex, text )
-#define EXC_CTRLDUMP_DEC1( text ) IMPL_EXC_CTRLDUMP_VALUE( sal_Int8, lclAppendDec, text )
-// read a value from stream into existing variable (no stream alignment)
-#define EXC_CTRLDUMP_PLAIN_HEXVAR( var, text ) IMPL_EXC_CTRLDUMP_PLAIN_VAR( var, ~0, lclAppendHex, text )
-#define EXC_CTRLDUMP_PLAIN_DECVAR( var, text ) IMPL_EXC_CTRLDUMP_PLAIN_VAR( var, ~0, lclAppendDec, text )
-#define EXC_CTRLDUMP_PLAIN_HEXVARMASK( var, mask, text ) IMPL_EXC_CTRLDUMP_PLAIN_VAR( var, mask, lclAppendHex, text )
-#define EXC_CTRLDUMP_PLAIN_DECVARMASK( var, mask, text ) IMPL_EXC_CTRLDUMP_PLAIN_VAR( var, mask, lclAppendDec, text )
-// read a value from stream into existing variable (with stream alignment)
-#define EXC_CTRLDUMP_HEXVAR( var, text ) IMPL_EXC_CTRLDUMP_VAR( var, ~0, lclAppendHex, text )
-#define EXC_CTRLDUMP_DECVAR( var, text ) IMPL_EXC_CTRLDUMP_VAR( var, ~0, lclAppendDec, text )
-#define EXC_CTRLDUMP_HEXVARMASK( var, mask, text ) IMPL_EXC_CTRLDUMP_VAR( var, mask, lclAppendHex, text )
-#define EXC_CTRLDUMP_DECVARMASK( var, mask, text ) IMPL_EXC_CTRLDUMP_VAR( var, mask, lclAppendDec, text )
-// read flag fields
-#define EXC_CTRLDUMP_PLAIN_STARTOPTFLAG( text, doread, defaults )\
-{ \
- nFlags = defaults; \
- t.Append( " " text ); \
- if( doread ) \
- rInStrm >> nFlags; \
- else \
- t.Append( "-defaulted" ); \
- t.Append( '=' ); \
- lclAppendHex( t, nFlags ); \
-}
-#define EXC_CTRLDUMP_STARTOPTFLAG( text, doread, defaults ) { if( doread ) { EXC_CTRLDUMP_ALIGN_INSTRM( sizeof( nFlags ) ); } EXC_CTRLDUMP_PLAIN_STARTOPTFLAG( text, doread, defaults ) }
-#define EXC_CTRLDUMP_PLAIN_STARTFLAG( text ) EXC_CTRLDUMP_PLAIN_STARTOPTFLAG( text, true, 0 )
-#define EXC_CTRLDUMP_STARTFLAG( text ) EXC_CTRLDUMP_STARTOPTFLAG( text, true, 0 )
-#define EXC_CTRLDUMP_ADDFLAG( flag, text ) { if( nFlags & (flag) ) t.Append( " " text ); }
-#define EXC_CTRLDUMP_ADDFLAGVALUE( start, width, text ) { sal_uInt32 nValue; ::extract_value( nValue, nFlags, start, width ); t.Append( " " text "=" ); lclAppendDec( t, nValue ); }
-#define EXC_CTRLDUMP_ENDFLAG( reserved ) { if( nFlags & (reserved) ) { t.Append( " ?" ); lclAppendHex( t, static_cast< sal_uInt32 >( nFlags & (reserved) ) ); } EXC_CTRLDUMP_PRINT(); }
-// read coordinates
-#define EXC_CTRLDUMP_COORD2( text ) { EXC_CTRLDUMP_ALIGN_INSTRM( 4 ); EXC_CTRLDUMP_DEC2( text "-x" ); EXC_CTRLDUMP_DEC2( text "-y" ); }
-#define EXC_CTRLDUMP_COORD4( text ) { EXC_CTRLDUMP_DEC4( text "-x" ); EXC_CTRLDUMP_DEC4( text "-y" ); }
-#define EXC_CTRLDUMP_SIZE4( text ) { EXC_CTRLDUMP_DEC4( text "-width" ); EXC_CTRLDUMP_DEC4( text "-height" ); }
-// read guid
-#define EXC_CTRLDUMP_PLAIN_GUID( text ) IMPL_EXC_CTRLDUMP_PLAIN_VALUE( XclGuid, lclAppendGuid, text )
-#define EXC_CTRLDUMP_GUID( text ) { EXC_CTRLDUMP_ALIGN_INSTRM( 4 ); EXC_CTRLDUMP_PLAIN_GUID( text ); }
-// read control type
-#define EXC_CTRLDUMP_CTRLTYPE( var, text ) \
-{ \
- EXC_CTRLDUMP_ALIGN_INSTRM( 2 ); \
- rInStrm >> var; \
- t.Assign( " " text "=" ); lclAppendHex( t, var ); \
- t.Append( " (" ); lclAppendControlType( t, var ); \
- t.Append( ')' ); \
- EXC_CTRLDUMP_PRINT(); \
-}
-// read character array, add to string, but do not print
-#define EXC_CTRLDUMP_RAWSTRING( var ) \
-{ \
- t.Append( "='" ); \
- if( var ) \
- { \
- EXC_CTRLDUMP_ALIGN_INSTRM( 4 ); \
- ULONG nNextPos = rInStrm.Tell() + (var); \
- if( var > 128 ) var = 128; \
- sal_Char pc[ 129 ]; \
- rInStrm.Read( pc, var ); pc[ var ] = '\0'; \
- t.Append( pc ); \
- rInStrm.Seek( nNextPos ); \
- } \
- t.Append( '\'' ); \
-}
-// read a string
-#define EXC_CTRLDUMP_STRING( var, text ) \
-{ \
- t.Append( " " text ); \
- EXC_CTRLDUMP_RAWSTRING( var ); \
- EXC_CTRLDUMP_PRINT(); \
-}
-// read an array of strings
-#define EXC_CTRLDUMP_STRINGARRAY( total, count, text ) \
-{ \
- ULONG nNextPos = rInStrm.Tell() + (total); \
- for( sal_uInt32 nIdx = 0; (nIdx < (count)) && (rInStrm.Tell() < nNextPos); ++nIdx )\
- { \
- EXC_CTRLDUMP_ALIGN_INSTRM( 4 ); \
- sal_uInt32 nLen; \
- rInStrm >> nLen; \
- nLen &= 0x7FFFFFFF; \
- t.Append( " " text "[" ); \
- lclAppendDec( t, nIdx + 1 ); \
- t.Append( ']' ); \
- EXC_CTRLDUMP_RAWSTRING( nLen ); \
- } \
- EXC_CTRLDUMP_PRINT(); \
- rInStrm.Seek( nNextPos ); \
-}
-// read embedded font data
-#define EXC_CTRLDUMP_FONT( var, text ) \
-if( var ) \
-{ \
- EXC_CTRLDUMP_PRINT(); \
- XclGuid aGuid; rInStrm >> aGuid; \
- rOutStrm << "embedded-font-guid=" << aGuid; \
- if( aGuid == saStdFontGuid ) \
- { \
- rOutStrm << " (StdFont)\n"; \
- EXC_CTRLDUMP_PLAIN_HEX1( "unknown1" ); \
- EXC_CTRLDUMP_PLAIN_DEC1( "script-type" ); \
- EXC_CTRLDUMP_PLAIN_HEX1( "unknown2" ); \
- sal_uInt8 nFlags; \
- EXC_CTRLDUMP_PLAIN_STARTFLAG( "font-style-flags" ); \
- EXC_CTRLDUMP_ADDFLAG( 0x02, "italic" ); \
- EXC_CTRLDUMP_ADDFLAG( 0x04, "underline" ); \
- EXC_CTRLDUMP_ADDFLAG( 0x08, "strikeout" ); \
- EXC_CTRLDUMP_ENDFLAG( 0xF1 ); \
- EXC_CTRLDUMP_PLAIN_DEC2( "font-weight" ); \
- EXC_CTRLDUMP_PLAIN_DEC4( "font-size" ); \
-/* font-size := pt*10000 + (1-((pt+1)%3))*2500 */ \
- sal_uInt8 nLen; \
- EXC_CTRLDUMP_PLAIN_DECVAR( nLen, "font-name-len" ); \
- sal_Char* p = new sal_Char[ nLen + 1 ]; \
- rInStrm.Read( p, nLen ); p[ nLen ] = '\0'; \
- t.Append( " font-name='" ).Append( p ).Append( '\'' );\
- delete [] p; \
- EXC_CTRLDUMP_PRINT(); \
- } \
- else \
- rOutStrm << " (*UNKNOWN*)\n"; \
-}
-// read image data
-#define EXC_CTRLDUMP_IMAGE( var, text ) \
-if( var ) \
-{ \
- EXC_CTRLDUMP_PRINT(); \
- XclGuid aGuid; rInStrm >> aGuid; \
- rOutStrm << "embedded-" text "-guid=" << aGuid; \
- if( aGuid == saStdPicGuid ) \
- { \
- rOutStrm << " (StdPict)\n"; \
- EXC_CTRLDUMP_PLAIN_HEX2( "u1" ); \
- EXC_CTRLDUMP_PLAIN_HEX2( "u2" ); \
- sal_uInt32 nLen; \
- EXC_CTRLDUMP_PLAIN_DECVAR( nLen, text "-len" ); \
- rInStrm.SeekRel( nLen ); \
- } \
- else \
- rOutStrm << " (*UNKNOWN*)\n"; \
-}
-// hex dump remaining or unknown data
-#define EXC_CTRLDUMP_REMAINING( nextpos ) \
-{ \
- EXC_CTRLDUMP_ALIGN_INSTRM( 4 ); \
- if( rInStrm.Tell() < (nextpos) ) \
- { \
- rOutStrm << " unknown-data=\n"; \
- DumpBinary( rInStrm, ::std::min< ULONG >( (nextpos) - rInStrm.Tell(), 1024 ) );\
- } \
- rInStrm.Seek( nextpos ); \
-}
-
-// *** macros end ***
-
-void Biff8RecDumper::DumpControlContents( SvStream& rInStrm, sal_uInt16 nCtrlType )
-{
- SvStream& rOutStrm = *pDumpStream;
-
- if( nCtrlType == EXC_CTRL_PROGRESSBAR )
- {
- lclDumpControlType( rOutStrm, nCtrlType );
- rOutStrm << '\n';
-
- ByteString t; // "t" needed for macros
- sal_uInt32 nFlags = 0; // "nFlags" needed for macros
-
- EXC_CTRLDUMP_PLAIN_HEX4( "unknown" );
- EXC_CTRLDUMP_PLAIN_HEX4( "unknown" );
- EXC_CTRLDUMP_PLAIN_DEC4( "width" );
- EXC_CTRLDUMP_PLAIN_DEC4( "height" );
- EXC_CTRLDUMP_PLAIN_HEX4( "unknown" );
- EXC_CTRLDUMP_PLAIN_HEX4( "unknown" );
- EXC_CTRLDUMP_PLAIN_HEX4( "unknown" );
- EXC_CTRLDUMP_PLAIN_DECF( "min" );
- EXC_CTRLDUMP_PLAIN_DECF( "max" );
- EXC_CTRLDUMP_PLAIN_STARTFLAG( "flags1" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000001, "vertical" );
- EXC_CTRLDUMP_ADDFLAG( 0x00010000, "smooth-scroll" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFEFFFE );
- EXC_CTRLDUMP_PLAIN_HEX4( "unknown" );
- EXC_CTRLDUMP_PLAIN_HEX4( "unknown" );
- EXC_CTRLDUMP_PLAIN_HEX4( "unknown" );
- EXC_CTRLDUMP_PLAIN_STARTFLAG( "flags2" );
- EXC_CTRLDUMP_ADDFLAG( 0x0001, "border-single" );
- EXC_CTRLDUMP_ADDFLAG( 0x0002, "enabled" );
- EXC_CTRLDUMP_ADDFLAG( 0x0004, "3d-style" );
- EXC_CTRLDUMP_ADDFLAGVALUE( 3, 8, "mouse-icon" );
- EXC_CTRLDUMP_ADDFLAG( 0x2000, "ole-drop-manual" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFFD800 );
- return;
- }
-
- sal_uInt16 nSize = lclDumpControlHeader( rInStrm, rOutStrm, nCtrlType );
- if( nSize > 0 )
- {
- ULONG nStartPos = rInStrm.Tell(); // for stream alignment macro
- ByteString t; // "t" needed for macros
- sal_uInt32 nFlags = 0; // "nFlags" needed for macros
-
- bool bHasFontData = false;
- sal_uInt32 nNameLen = 0;
- sal_uInt32 nCaptionLen = 0;
- sal_uInt32 nValueLen = 0;
- sal_uInt32 nGroupNameLen = 0;
- sal_uInt32 nTagLen = 0;
- sal_uInt32 nTipLen = 0;
- sal_uInt32 nCtrlIdLen = 0;
- sal_uInt32 nCtrlSrcLen = 0;
- sal_uInt32 nRowSrcLen = 0;
- sal_uInt16 nPic = 0;
- sal_uInt16 nIcon = 0;
- sal_uInt16 nFont = 0;
-
- switch( nCtrlType )
- {
- case EXC_CTRL_PUSHBUTTON:
- {
- EXC_CTRLDUMP_STARTFLAG( "content-flags" );
- EXC_CTRLDUMP_ADDFLAG( 0x0001, "forecolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x0002, "backcolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x0004, "option" );
- EXC_CTRLDUMP_ADDFLAG( 0x0008, "caption" );
- EXC_CTRLDUMP_ADDFLAG( 0x0010, "picpos" );
- EXC_CTRLDUMP_ADDFLAG( 0x0020, "size" );
- EXC_CTRLDUMP_ADDFLAG( 0x0040, "mouseptr" );
- EXC_CTRLDUMP_ADDFLAG( 0x0080, "pic" );
- EXC_CTRLDUMP_ADDFLAG( 0x0100, "accel" );
- EXC_CTRLDUMP_ADDFLAG( 0x0200, "notakefocus" );
- EXC_CTRLDUMP_ADDFLAG( 0x0400, "icon" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFFF800 );
- sal_uInt32 nCtrlFlags = nFlags;
-
- if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_HEX4( "forecolor" );
- if( nCtrlFlags & 0x0002 ) EXC_CTRLDUMP_HEX4( "backcolor" );
-
- EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x0004, 0x0000001B );
- EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000004, "locked" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000008, "opaque" );
- EXC_CTRLDUMP_ADDFLAG( 0x00800000, "wordwrap" );
- EXC_CTRLDUMP_ADDFLAG( 0x10000000, "autosize" );
- EXC_CTRLDUMP_ENDFLAG( 0xEF7FFFF1 );
-
- if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_DECVARMASK( nCaptionLen, 0x7FFFFFFF, "caption-len" );
- if( nCtrlFlags & 0x0010 ) EXC_CTRLDUMP_COORD2( "picpos" );
- if( nCtrlFlags & 0x0040 ) EXC_CTRLDUMP_DEC1( "mouseptr" );
- if( nCtrlFlags & 0x0080 ) EXC_CTRLDUMP_HEXVAR( nPic, "pic" );
- if( nCtrlFlags & 0x0100 ) EXC_CTRLDUMP_HEX2( "accel" );
- if( nCtrlFlags & 0x0400 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" );
-
- if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_STRING( nCaptionLen, "caption" );
- if( nCtrlFlags & 0x0020 ) EXC_CTRLDUMP_SIZE4( "size" );
- EXC_CTRLDUMP_REMAINING( nStartPos + nSize );
-
- EXC_CTRLDUMP_IMAGE( nPic, "pic" );
- EXC_CTRLDUMP_IMAGE( nIcon, "icon" );
- bHasFontData = true;
- }
- break;
-
- case EXC_CTRL_TOGGLEBUTTON:
- case EXC_CTRL_CHECKBOX:
- case EXC_CTRL_OPTIONBUTTON:
- case EXC_CTRL_TEXTBOX:
- case EXC_CTRL_LISTBOX:
- case EXC_CTRL_COMBOBOX:
- case EXC_CTRL_REFEDIT:
- {
- EXC_CTRLDUMP_STARTFLAG( "content-flags" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000001, "option" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000002, "backcolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000004, "forecolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000008, "maxlen" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000010, "borderstyle" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000020, "scrollbars" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000040, "style" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000080, "mouseptr" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000100, "size" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000200, "passwordchar" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000400, "listwidth" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000800, "boundcol" );
- EXC_CTRLDUMP_ADDFLAG( 0x00001000, "textcol" );
- EXC_CTRLDUMP_ADDFLAG( 0x00002000, "colcount" );
- EXC_CTRLDUMP_ADDFLAG( 0x00004000, "listrows" );
- EXC_CTRLDUMP_ADDFLAG( 0x00008000, "colwidth?" );
- EXC_CTRLDUMP_ADDFLAG( 0x00010000, "matchentry" );
- EXC_CTRLDUMP_ADDFLAG( 0x00020000, "liststyle" );
- EXC_CTRLDUMP_ADDFLAG( 0x00040000, "showdropbtn" );
- EXC_CTRLDUMP_ADDFLAG( 0x00100000, "dropbtnstyle" );
- EXC_CTRLDUMP_ADDFLAG( 0x00200000, "multistate" );
- EXC_CTRLDUMP_ADDFLAG( 0x00400000, "value" );
- EXC_CTRLDUMP_ADDFLAG( 0x00800000, "caption" );
- EXC_CTRLDUMP_ADDFLAG( 0x01000000, "picpos" );
- EXC_CTRLDUMP_ADDFLAG( 0x02000000, "bordercolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x04000000, "specialeff" );
- EXC_CTRLDUMP_ADDFLAG( 0x08000000, "icon" );
- EXC_CTRLDUMP_ADDFLAG( 0x10000000, "pic" );
- EXC_CTRLDUMP_ADDFLAG( 0x20000000, "accel" );
- EXC_CTRLDUMP_ENDFLAG( 0x40080000 ); // 0x80000000 always set?
- sal_uInt32 nCtrlFlags = nFlags;
-
- EXC_CTRLDUMP_STARTFLAG( "2nd-content-flags" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000001, "groupname" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFFFFFE );
- sal_uInt32 nCtrlFlags2 = nFlags;
-
- EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x00000001, 0x2C80081B );
- EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000004, "locked" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000008, "opaque" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000400, "colheads" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000800, "intheight" );
- EXC_CTRLDUMP_ADDFLAG( 0x00001000, "matchreq" );
- EXC_CTRLDUMP_ADDFLAG( 0x00002000, "align" );
- EXC_CTRLDUMP_ADDFLAGVALUE( 15, 4, "ime-mode" );
- EXC_CTRLDUMP_ADDFLAG( 0x00080000, "dragbehav" );
- EXC_CTRLDUMP_ADDFLAG( 0x00100000, "enterkeybehav" );
- EXC_CTRLDUMP_ADDFLAG( 0x00200000, "enterfieldbehav" );
- EXC_CTRLDUMP_ADDFLAG( 0x00400000, "tabkeybehav" );
- EXC_CTRLDUMP_ADDFLAG( 0x00800000, "wordwrap" );
- EXC_CTRLDUMP_ADDFLAG( 0x04000000, "selmargin" );
- EXC_CTRLDUMP_ADDFLAG( 0x08000000, "autowordsel" );
- EXC_CTRLDUMP_ADDFLAG( 0x10000000, "autosize" );
- EXC_CTRLDUMP_ADDFLAG( 0x20000000, "hidesel" );
- EXC_CTRLDUMP_ADDFLAG( 0x40000000, "autotab" );
- EXC_CTRLDUMP_ADDFLAG( 0x80000000, "multiline" );
- EXC_CTRLDUMP_ENDFLAG( 0x030043F1 );
-
- if( nCtrlFlags & 0x00000002 ) EXC_CTRLDUMP_HEX4( "backcolor" );
- if( nCtrlFlags & 0x00000004 ) EXC_CTRLDUMP_HEX4( "forecolor" );
- if( nCtrlFlags & 0x00000008 ) EXC_CTRLDUMP_DEC4( "maxlen" );
- if( nCtrlFlags & 0x00000010 ) EXC_CTRLDUMP_DEC1( "borderstyle" );
- if( nCtrlFlags & 0x00000020 ) EXC_CTRLDUMP_DEC1( "scrollbars" );
- if( nCtrlFlags & 0x00000040 ) EXC_CTRLDUMP_DEC1( "style" );
- if( nCtrlFlags & 0x00000080 ) EXC_CTRLDUMP_DEC1( "mouseptr" );
- if( nCtrlFlags & 0x00000200 ) EXC_CTRLDUMP_HEX2( "passwordchar" );
- if( nCtrlFlags & 0x00000400 ) EXC_CTRLDUMP_DEC4( "listwidth" );
- if( nCtrlFlags & 0x00000800 ) EXC_CTRLDUMP_DEC2( "boundcol" );
- if( nCtrlFlags & 0x00001000 ) EXC_CTRLDUMP_DEC2( "textcol" );
- if( nCtrlFlags & 0x00002000 ) EXC_CTRLDUMP_DEC2( "colcount" );
- if( nCtrlFlags & 0x00004000 ) EXC_CTRLDUMP_DEC2( "listrows" );
- if( nCtrlFlags & 0x00008000 ) EXC_CTRLDUMP_DEC2( "colwidth?" );
- if( nCtrlFlags & 0x00010000 ) EXC_CTRLDUMP_DEC1( "matchentry" );
- if( nCtrlFlags & 0x00020000 ) EXC_CTRLDUMP_DEC1( "liststyle" );
- if( nCtrlFlags & 0x00040000 ) EXC_CTRLDUMP_DEC1( "showdropbtn" );
- if( nCtrlFlags & 0x00100000 ) EXC_CTRLDUMP_DEC1( "dropbtnstyle" );
- if( nCtrlFlags & 0x00200000 ) EXC_CTRLDUMP_DEC1( "multistate" );
- if( nCtrlFlags & 0x00400000 ) EXC_CTRLDUMP_DECVARMASK( nValueLen, 0x7FFFFFFF, "value-len" );
- if( nCtrlFlags & 0x00800000 ) EXC_CTRLDUMP_DECVARMASK( nCaptionLen, 0x7FFFFFFF, "caption-len" );
- if( nCtrlFlags & 0x01000000 ) EXC_CTRLDUMP_COORD2( "picpos" );
- if( nCtrlFlags & 0x02000000 ) EXC_CTRLDUMP_HEX4( "bordercolor" );
- if( nCtrlFlags & 0x04000000 ) EXC_CTRLDUMP_DEC4( "specialeff" );
- if( nCtrlFlags & 0x08000000 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" );
- if( nCtrlFlags & 0x10000000 ) EXC_CTRLDUMP_HEXVAR( nPic, "pic" );
- if( nCtrlFlags & 0x20000000 ) EXC_CTRLDUMP_HEX1( "accel" );
- if( nCtrlFlags2 & 0x00000001 ) EXC_CTRLDUMP_DECVARMASK( nGroupNameLen, 0x7FFFFFFF, "groupname-len" );
-
- if( nCtrlFlags & 0x00000100 ) EXC_CTRLDUMP_SIZE4( "size" );
- if( nCtrlFlags & 0x00400000 ) EXC_CTRLDUMP_STRING( nValueLen, "value" );
- if( nCtrlFlags & 0x00800000 ) EXC_CTRLDUMP_STRING( nCaptionLen, "caption" );
- if( nCtrlFlags2 & 0x00000001 ) EXC_CTRLDUMP_STRING( nGroupNameLen, "groupname" );
- EXC_CTRLDUMP_REMAINING( nStartPos + nSize );
-
- EXC_CTRLDUMP_IMAGE( nIcon, "icon" );
- EXC_CTRLDUMP_IMAGE( nPic, "pic" );
- bHasFontData = true;
- }
- break;
-
- case EXC_CTRL_LABEL:
- {
- EXC_CTRLDUMP_STARTFLAG( "content-flags" );
- EXC_CTRLDUMP_ADDFLAG( 0x0001, "forecolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x0002, "backcolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x0004, "option" );
- EXC_CTRLDUMP_ADDFLAG( 0x0008, "caption" );
- EXC_CTRLDUMP_ADDFLAG( 0x0010, "picpos" );
- EXC_CTRLDUMP_ADDFLAG( 0x0020, "size" );
- EXC_CTRLDUMP_ADDFLAG( 0x0040, "mouseptr" );
- EXC_CTRLDUMP_ADDFLAG( 0x0080, "bordercolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x0100, "borderstyle" );
- EXC_CTRLDUMP_ADDFLAG( 0x0200, "specialeff" );
- EXC_CTRLDUMP_ADDFLAG( 0x0400, "pic" );
- EXC_CTRLDUMP_ADDFLAG( 0x0800, "accel" );
- EXC_CTRLDUMP_ADDFLAG( 0x1000, "icon" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFFE000 );
- sal_uInt32 nCtrlFlags = nFlags;
-
- if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_HEX4( "forecolor" );
- if( nCtrlFlags & 0x0002 ) EXC_CTRLDUMP_HEX4( "backcolor" );
-
- EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x0004, 0x0080001B );
- EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000004, "locked" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000008, "opaque" );
- EXC_CTRLDUMP_ADDFLAG( 0x00800000, "wordwrap" );
- EXC_CTRLDUMP_ADDFLAG( 0x10000000, "autosize" );
- EXC_CTRLDUMP_ENDFLAG( 0xEF7FFFF0 ); // 0x00000001 always set?
-
- if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_DECVARMASK( nCaptionLen, 0x7FFFFFFF, "caption-len" );
- if( nCtrlFlags & 0x0010 ) EXC_CTRLDUMP_COORD2( "picpos" );
- if( nCtrlFlags & 0x0040 ) EXC_CTRLDUMP_DEC1( "mouseptr" );
- if( nCtrlFlags & 0x0080 ) EXC_CTRLDUMP_HEX4( "bordercolor" );
- if( nCtrlFlags & 0x0100 ) EXC_CTRLDUMP_HEX2( "borderstyle" );
- if( nCtrlFlags & 0x0200 ) EXC_CTRLDUMP_HEX2( "specialeff" );
- if( nCtrlFlags & 0x0400 ) EXC_CTRLDUMP_HEXVAR( nPic, "pic" );
- if( nCtrlFlags & 0x0800 ) EXC_CTRLDUMP_HEX2( "accel" );
- if( nCtrlFlags & 0x1000 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" );
-
- if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_STRING( nCaptionLen, "caption" );
- if( nCtrlFlags & 0x0020 ) EXC_CTRLDUMP_SIZE4( "size" );
- EXC_CTRLDUMP_REMAINING( nStartPos + nSize );
-
- EXC_CTRLDUMP_IMAGE( nPic, "pic" );
- EXC_CTRLDUMP_IMAGE( nIcon, "icon" );
- bHasFontData = true;
- }
- break;
-
- case EXC_CTRL_SPINBUTTON:
- case EXC_CTRL_SCROLLBAR:
- {
- EXC_CTRLDUMP_STARTFLAG( "content-flags" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000001, "forecolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000002, "backcolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000004, "option" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000008, "size" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000010, "mouseptr" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000100, "unknown1" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000200, "unknown2" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000400, "unknown3" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000020, "min" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000040, "max" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000080, "value" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000800, "step" );
- EXC_CTRLDUMP_ADDFLAG( 0x00001000, "page-step" );
- EXC_CTRLDUMP_ADDFLAG( 0x00002000, "orient" );
- EXC_CTRLDUMP_ADDFLAG( 0x00004000, "prop-thumb" );
- EXC_CTRLDUMP_ADDFLAG( 0x00008000, "delay" );
- EXC_CTRLDUMP_ADDFLAG( 0x00010000, "icon" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFE0000 );
- sal_uInt32 nCtrlFlags = nFlags;
-
- if( nCtrlFlags & 0x00000001 ) EXC_CTRLDUMP_HEX4( "forecolor" );
- if( nCtrlFlags & 0x00000002 ) EXC_CTRLDUMP_HEX4( "backcolor" );
-
- EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x00000004, 0x0000001B );
- EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000004, "locked" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000008, "opaque" );
- EXC_CTRLDUMP_ADDFLAG( 0x10000000, "autosize" );
- EXC_CTRLDUMP_ENDFLAG( 0xEFFFFFF1 );
-
- if( nCtrlFlags & 0x00000010 ) EXC_CTRLDUMP_DEC1( "mouseptr" );
- if( nCtrlFlags & 0x00000020 ) EXC_CTRLDUMP_DEC4( "min" );
- if( nCtrlFlags & 0x00000040 ) EXC_CTRLDUMP_DEC4( "max" );
- if( nCtrlFlags & 0x00000080 ) EXC_CTRLDUMP_DEC4( "value" );
- if( nCtrlFlags & 0x00000100 ) EXC_CTRLDUMP_HEX4( "unknown1" );
- if( nCtrlFlags & 0x00000200 ) EXC_CTRLDUMP_HEX4( "unknown2" );
- if( nCtrlFlags & 0x00000400 ) EXC_CTRLDUMP_HEX4( "unknown3" );
- if( nCtrlFlags & 0x00000800 ) EXC_CTRLDUMP_DEC4( "step" );
- if( nCtrlFlags & 0x00001000 ) EXC_CTRLDUMP_DEC4( "page-step" );
- if( nCtrlFlags & 0x00002000 ) EXC_CTRLDUMP_DEC4( "orient" );
- if( nCtrlFlags & 0x00004000 ) EXC_CTRLDUMP_DEC4( "prop-thumb" );
- if( nCtrlFlags & 0x00008000 ) EXC_CTRLDUMP_DEC4( "delay" );
- if( nCtrlFlags & 0x00010000 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" );
-
- if( nCtrlFlags & 0x00000008 ) EXC_CTRLDUMP_SIZE4( "size" );
- EXC_CTRLDUMP_REMAINING( nStartPos + nSize );
-
- EXC_CTRLDUMP_IMAGE( nIcon, "icon" );
- }
- break;
-
- case EXC_CTRL_IMAGE:
- {
- EXC_CTRLDUMP_STARTFLAG( "content-flags" );
- EXC_CTRLDUMP_ADDFLAG( 0x0004, "autosize" );
- EXC_CTRLDUMP_ADDFLAG( 0x0008, "bordercolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x0010, "backcolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x0020, "borderstyle" );
- EXC_CTRLDUMP_ADDFLAG( 0x0040, "mouseptr" );
- EXC_CTRLDUMP_ADDFLAG( 0x0080, "picsizemode" );
- EXC_CTRLDUMP_ADDFLAG( 0x0100, "speceffect" );
- EXC_CTRLDUMP_ADDFLAG( 0x0200, "size" );
- EXC_CTRLDUMP_ADDFLAG( 0x0400, "pic" );
- EXC_CTRLDUMP_ADDFLAG( 0x0800, "picalign" );
- EXC_CTRLDUMP_ADDFLAG( 0x1000, "pictiling" );
- EXC_CTRLDUMP_ADDFLAG( 0x2000, "option" );
- EXC_CTRLDUMP_ADDFLAG( 0x4000, "icon" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFF8003 );
- sal_uInt32 nCtrlFlags = nFlags;
-
- if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_HEX4( "bordercolor" );
- if( nCtrlFlags & 0x0010 ) EXC_CTRLDUMP_HEX4( "backcolor" );
- if( nCtrlFlags & 0x0020 ) EXC_CTRLDUMP_HEX1( "borderstyle" );
- if( nCtrlFlags & 0x0040 ) EXC_CTRLDUMP_DEC1( "mouseptr" );
- if( nCtrlFlags & 0x0080 ) EXC_CTRLDUMP_DEC1( "picsizemode" );
- if( nCtrlFlags & 0x0100 ) EXC_CTRLDUMP_HEX1( "speceffect" );
- if( nCtrlFlags & 0x0400 ) EXC_CTRLDUMP_HEXVAR( nPic, "pic" );
- if( nCtrlFlags & 0x0800 ) EXC_CTRLDUMP_HEX1( "picalign" );
-
- EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x2000, 0x0000001B );
- EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000008, "opaque" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFFFFF5 );
-
- if( nCtrlFlags & 0x4000 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" );
-
- if( nCtrlFlags & 0x0200 ) EXC_CTRLDUMP_SIZE4( "size" );
- EXC_CTRLDUMP_REMAINING( nStartPos + nSize );
-
- EXC_CTRLDUMP_IMAGE( nPic, "pic" );
- EXC_CTRLDUMP_IMAGE( nIcon, "icon" );
- }
- break;
-
- case EXC_CTRL_TABSTRIP:
- {
- EXC_CTRLDUMP_STARTFLAG( "content-flags" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000001, "selected-tab" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000002, "backcolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000004, "forecolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000010, "size" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000020, "caption-arr-len" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000040, "mouseptr" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000100, "taborientation" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000200, "tabstyle" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000400, "multirow" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000800, "fixed-width" );
- EXC_CTRLDUMP_ADDFLAG( 0x00001000, "fixed-height" );
- EXC_CTRLDUMP_ADDFLAG( 0x00008000, "infotip-arr-len" );
- EXC_CTRLDUMP_ADDFLAG( 0x00020000, "id-arr-len" );
- EXC_CTRLDUMP_ADDFLAG( 0x00040000, "option" );
- EXC_CTRLDUMP_ADDFLAG( 0x00080000, "last-id" );
- EXC_CTRLDUMP_ADDFLAG( 0x00200000, "unknown-arr-len" );
- EXC_CTRLDUMP_ADDFLAG( 0x00400000, "tab-count" );
- EXC_CTRLDUMP_ADDFLAG( 0x00800000, "shortcut-arr-len" );
- EXC_CTRLDUMP_ADDFLAG( 0x01000000, "icon" );
- EXC_CTRLDUMP_ENDFLAG( 0xFE116088 );
- sal_uInt32 nCtrlFlags = nFlags;
-
- sal_uInt32 nTabCount = 0;
- sal_uInt32 nIdArrLen = 0;
- sal_uInt32 nUnknownArrLen = 0;
- sal_uInt32 nShortArrLen = 0;
-
- if( nCtrlFlags & 0x00000001 ) EXC_CTRLDUMP_DEC4( "selected-tab" ); // size ok?
- if( nCtrlFlags & 0x00000002 ) EXC_CTRLDUMP_HEX4( "backcolor" );
- if( nCtrlFlags & 0x00000004 ) EXC_CTRLDUMP_HEX4( "forecolor" );
- if( nCtrlFlags & 0x00000020 ) EXC_CTRLDUMP_HEXVAR( nCaptionLen, "caption-arr-len" );
- if( nCtrlFlags & 0x00000040 ) EXC_CTRLDUMP_DEC1( "mouseptr" ); // size ok?
- if( nCtrlFlags & 0x00000100 ) EXC_CTRLDUMP_DEC4( "taborientation" ); // size ok?
- if( nCtrlFlags & 0x00000200 ) EXC_CTRLDUMP_DEC4( "tabstyle" ); // size ok?
- if( nCtrlFlags & 0x00000800 ) EXC_CTRLDUMP_DEC4( "fixed-width" );
- if( nCtrlFlags & 0x00001000 ) EXC_CTRLDUMP_DEC4( "fixed-height" );
- if( nCtrlFlags & 0x00008000 ) EXC_CTRLDUMP_HEXVAR( nTipLen, "infotip-arr-len" );
- if( nCtrlFlags & 0x00020000 ) EXC_CTRLDUMP_HEXVAR( nIdArrLen, "id-arr-len" );
-
- EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x00040000, 0x0000001B );
- EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFFFFFD );
-
- if( nCtrlFlags & 0x00080000 ) EXC_CTRLDUMP_DEC4( "last-id" );
- if( nCtrlFlags & 0x00200000 ) EXC_CTRLDUMP_HEXVAR( nUnknownArrLen, "unknown-arr-len" );
- if( nCtrlFlags & 0x00400000 ) EXC_CTRLDUMP_DECVAR( nTabCount, "tab-count" );
- if( nCtrlFlags & 0x00800000 ) EXC_CTRLDUMP_HEXVAR( nShortArrLen, "shortcut-arr-len" );
- if( nCtrlFlags & 0x01000000 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" );
-
- if( nCtrlFlags & 0x00000010 ) EXC_CTRLDUMP_SIZE4( "size" );
- if( nCtrlFlags & 0x00000020 ) EXC_CTRLDUMP_STRINGARRAY( nCaptionLen, nTabCount, "caption" );
- if( nCtrlFlags & 0x00008000 ) EXC_CTRLDUMP_STRINGARRAY( nTipLen, nTabCount, "infotip" );
- if( nCtrlFlags & 0x00020000 ) EXC_CTRLDUMP_STRINGARRAY( nIdArrLen, nTabCount, "id" );
- if( nCtrlFlags & 0x00200000 ) EXC_CTRLDUMP_STRINGARRAY( nUnknownArrLen, nTabCount, "unknown" );
- if( nCtrlFlags & 0x00800000 ) EXC_CTRLDUMP_STRINGARRAY( nShortArrLen, nTabCount, "shortcut" );
- EXC_CTRLDUMP_REMAINING( nStartPos + nSize );
-
- EXC_CTRLDUMP_IMAGE( nIcon, "icon" );
- bHasFontData = true;
- }
- break;
-
- case EXC_CTRL_USERFORM:
- case EXC_CTRL_FRAME:
- case EXC_CTRL_MULTIPAGE:
- case EXC_CTRL_PAGE:
- {
- EXC_CTRLDUMP_STARTFLAG( "content-flags" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000002, "backcolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000004, "forecolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000008, "last-id" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000040, "option" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000080, "borderstyle" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000100, "mouseptr" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000200, "scrollbars" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000400, "size" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000800, "scrollsize" );
- EXC_CTRLDUMP_ADDFLAG( 0x00001000, "scrollpos" );
- EXC_CTRLDUMP_ADDFLAG( 0x00008000, "icon" );
- EXC_CTRLDUMP_ADDFLAG( 0x00010000, "cycle" );
- EXC_CTRLDUMP_ADDFLAG( 0x00020000, "speceffect" );
- EXC_CTRLDUMP_ADDFLAG( 0x00040000, "bordercolor" );
- EXC_CTRLDUMP_ADDFLAG( 0x00080000, "caption" );
- EXC_CTRLDUMP_ADDFLAG( 0x00100000, "font" );
- EXC_CTRLDUMP_ADDFLAG( 0x00200000, "pic" );
- EXC_CTRLDUMP_ADDFLAG( 0x00400000, "zoom" );
- EXC_CTRLDUMP_ADDFLAG( 0x00800000, "picalign" );
- EXC_CTRLDUMP_ADDFLAG( 0x01000000, "pictiling" );
- EXC_CTRLDUMP_ADDFLAG( 0x02000000, "picsizemode" );
- EXC_CTRLDUMP_ADDFLAG( 0x04000000, "typeinfover" );
- EXC_CTRLDUMP_ADDFLAG( 0x08000000, "drawbuffer" );
- EXC_CTRLDUMP_ENDFLAG( 0xF0006031 );
- sal_uInt32 nCtrlFlags = nFlags;
-
- if( nCtrlFlags & 0x00000002 ) EXC_CTRLDUMP_HEX4( "backcolor" );
- if( nCtrlFlags & 0x00000004 ) EXC_CTRLDUMP_HEX4( "forecolor" );
- if( nCtrlFlags & 0x00000008 ) EXC_CTRLDUMP_DEC4( "last-id" );
-
- EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x00000040, 0x00000002 );
- EXC_CTRLDUMP_ADDFLAG( 0x00000002, "enabled" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFFFFFD );
-
- if( nCtrlFlags & 0x00000080 ) EXC_CTRLDUMP_HEX1( "borderstyle" );
- if( nCtrlFlags & 0x00000100 ) EXC_CTRLDUMP_DEC1( "mouseptr" );
- if( nCtrlFlags & 0x00000200 ) EXC_CTRLDUMP_HEX1( "scrollbars" );
- if( nCtrlFlags & 0x00008000 ) EXC_CTRLDUMP_HEXVAR( nIcon, "icon" );
- if( nCtrlFlags & 0x00010000 ) EXC_CTRLDUMP_DEC1( "cycle" );
- if( nCtrlFlags & 0x00020000 ) EXC_CTRLDUMP_HEX1( "speceffect" );
- if( nCtrlFlags & 0x00040000 ) EXC_CTRLDUMP_HEX4( "bordercolor" );
- if( nCtrlFlags & 0x00080000 ) EXC_CTRLDUMP_DECVARMASK( nCaptionLen, 0x7FFFFFFF, "caption-len" );
- if( nCtrlFlags & 0x00100000 ) EXC_CTRLDUMP_HEXVAR( nFont, "font" );
- if( nCtrlFlags & 0x00200000 ) EXC_CTRLDUMP_HEXVAR( nPic, "pic" );
- if( nCtrlFlags & 0x00400000 ) EXC_CTRLDUMP_DEC4( "zoom" );
- if( nCtrlFlags & 0x00800000 ) EXC_CTRLDUMP_HEX1( "picalign" );
- if( nCtrlFlags & 0x02000000 ) EXC_CTRLDUMP_DEC1( "picsizemode" );
- if( nCtrlFlags & 0x04000000 ) EXC_CTRLDUMP_DEC4( "typeinfover" );
- if( nCtrlFlags & 0x08000000 ) EXC_CTRLDUMP_DEC4( "drawbuffer" );
-
- if( nCtrlFlags & 0x00000400 ) EXC_CTRLDUMP_SIZE4( "size" );
- if( nCtrlFlags & 0x00000800 ) EXC_CTRLDUMP_SIZE4( "scrollsize" );
- if( nCtrlFlags & 0x00001000 ) EXC_CTRLDUMP_COORD4( "scrollpos" );
- if( nCtrlFlags & 0x00080000 ) EXC_CTRLDUMP_STRING( nCaptionLen, "caption" );
- EXC_CTRLDUMP_REMAINING( nStartPos + nSize );
-
- EXC_CTRLDUMP_FONT( nFont, "font" );
- EXC_CTRLDUMP_IMAGE( nIcon, "icon" );
- EXC_CTRLDUMP_IMAGE( nPic, "pic" );
- }
- break;
-
- case EXC_CTRL_FONTDATA:
- {
- EXC_CTRLDUMP_STARTFLAG( "content-flags" );
- EXC_CTRLDUMP_ADDFLAG( 0x01, "font-name" );
- EXC_CTRLDUMP_ADDFLAG( 0x02, "font-style" );
- EXC_CTRLDUMP_ADDFLAG( 0x04, "font-size" );
- EXC_CTRLDUMP_ADDFLAG( 0x10, "language-id" );
- EXC_CTRLDUMP_ADDFLAG( 0x40, "align" );
- EXC_CTRLDUMP_ADDFLAG( 0x80, "font-weight" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFFFF08 ); // 0x20 always set?
- sal_uInt32 nCtrlFlags = nFlags;
-
- if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_DECVARMASK( nNameLen, 0x7FFFFFFF, "font-name-len" );
-
- EXC_CTRLDUMP_STARTOPTFLAG( "font-style-flags", nCtrlFlags & 0x0002, 0x40000000 );
- EXC_CTRLDUMP_ADDFLAG( 0x0001, "bold" );
- EXC_CTRLDUMP_ADDFLAG( 0x0002, "italic" );
- EXC_CTRLDUMP_ADDFLAG( 0x0004, "underline" );
- EXC_CTRLDUMP_ADDFLAG( 0x0008, "strikeout" );
- EXC_CTRLDUMP_ADDFLAG( 0x2000, "sunken" );
- EXC_CTRLDUMP_ENDFLAG( 0xBFFFDFF0 ); // 0x40000000 always set?
-
- if( nCtrlFlags & 0x0004 ) EXC_CTRLDUMP_DEC4( "font-size" );
- if( nCtrlFlags & 0x0010 ) EXC_CTRLDUMP_HEX2( "language-id" );
- if( nCtrlFlags & 0x0040 )
- {
- EXC_CTRLDUMP_ALIGN_INSTRM( 2 );
- sal_uInt16 nAlign; rInStrm >> nAlign;
- t += " align="; lclAppendDec( t, nAlign );
- switch( nAlign )
- {
- case 1: t += "=left"; break;
- case 2: t += "=right"; break;
- case 3: t += "=center"; break;
- default: t += "=!unknown!";
- }
- EXC_CTRLDUMP_PRINT();
- }
- if( nCtrlFlags & 0x0080 ) EXC_CTRLDUMP_DEC2( "font-weight" );
-
- if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_STRING( nNameLen, "font-name" );
- EXC_CTRLDUMP_REMAINING( nStartPos + nSize );
- }
- break;
-
- case EXC_CTRL_ADDDATA:
- {
- EXC_CTRLDUMP_STARTFLAG( "content-flags" );
- EXC_CTRLDUMP_ADDFLAG( 0x0001, "guid1" );
- EXC_CTRLDUMP_ADDFLAG( 0x0002, "guid2" );
- EXC_CTRLDUMP_ADDFLAG( 0x0008, "guid4" );
- EXC_CTRLDUMP_ADDFLAG( 0x0040, "unknown1" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFFFFB4 );
- sal_uInt32 nCtrlFlags = nFlags;
-
- if( nCtrlFlags & 0x0040 ) EXC_CTRLDUMP_HEX4( "unknown1" );
-
- if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_GUID( "guid1" );
- if( nCtrlFlags & 0x0002 ) EXC_CTRLDUMP_GUID( "guid2" );
- if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_GUID( "guid4" );
- EXC_CTRLDUMP_REMAINING( nStartPos + nSize );
- }
- break;
-
- case EXC_CTRL_FRAMECHILD:
- {
- EXC_CTRLDUMP_STARTFLAG( "content-flags" );
- EXC_CTRLDUMP_ADDFLAG( 0x0001, "name-len" );
- EXC_CTRLDUMP_ADDFLAG( 0x0002, "tag-len" );
- EXC_CTRLDUMP_ADDFLAG( 0x0004, "storage-id" );
- EXC_CTRLDUMP_ADDFLAG( 0x0008, "helpcontext-id" );
- EXC_CTRLDUMP_ADDFLAG( 0x0010, "option" );
- EXC_CTRLDUMP_ADDFLAG( 0x0020, "substream-len" );
- EXC_CTRLDUMP_ADDFLAG( 0x0040, "tabpos" );
- EXC_CTRLDUMP_ADDFLAG( 0x0080, "type" );
- EXC_CTRLDUMP_ADDFLAG( 0x0100, "pos" );
- EXC_CTRLDUMP_ADDFLAG( 0x0800, "tiptext" );
- EXC_CTRLDUMP_ADDFLAG( 0x1000, "ctrl-id" );
- EXC_CTRLDUMP_ADDFLAG( 0x2000, "ctrl-source" );
- EXC_CTRLDUMP_ADDFLAG( 0x4000, "row-source" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFF8600 );
- sal_uInt32 nCtrlFlags = nFlags;
-
- sal_uInt32 nStorageId = 0;
- sal_uInt32 nSubStrmLen = 0;
- sal_uInt16 nChildType = EXC_CTRL_UNKNOWN;
-
- if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_DECVARMASK( nNameLen, 0x7FFFFFFF, "name-len" );
- if( nCtrlFlags & 0x0002 ) EXC_CTRLDUMP_DECVARMASK( nTagLen, 0x7FFFFFFF, "tag-len" );
- if( nCtrlFlags & 0x0004 ) EXC_CTRLDUMP_PLAIN_DECVAR( nStorageId, "storage-id" );
- if( nCtrlFlags & 0x0008 ) EXC_CTRLDUMP_PLAIN_DEC4( "helpcontext-id" );
-
- EXC_CTRLDUMP_STARTOPTFLAG( "option-flags", nCtrlFlags & 0x0010, 0x00000033 );
- EXC_CTRLDUMP_ADDFLAG( 0x00000001, "tabstop" );
- EXC_CTRLDUMP_ADDFLAG( 0x00000002, "visible" );
- EXC_CTRLDUMP_ADDFLAG( 0x00040000, "container" );
- EXC_CTRLDUMP_ENDFLAG( 0xFFFBFFFC );
-
- if( nCtrlFlags & 0x0020 ) EXC_CTRLDUMP_HEXVAR( nSubStrmLen, "substream-len" );
- if( nCtrlFlags & 0x0040 ) EXC_CTRLDUMP_DEC2( "tabpos" );
- if( nCtrlFlags & 0x0080 ) EXC_CTRLDUMP_CTRLTYPE( nChildType, "type" );
- if( nCtrlFlags & 0x0800 ) EXC_CTRLDUMP_DECVARMASK( nTipLen, 0x7FFFFFFF, "infotip-len" );
- if( nCtrlFlags & 0x1000 ) EXC_CTRLDUMP_DECVARMASK( nCtrlIdLen, 0x7FFFFFFF, "ctrl-id-len" );
- if( nCtrlFlags & 0x2000 ) EXC_CTRLDUMP_DECVARMASK( nCtrlSrcLen, 0x7FFFFFFF, "ctrl-source-len" );
- if( nCtrlFlags & 0x4000 ) EXC_CTRLDUMP_DECVARMASK( nRowSrcLen, 0x7FFFFFFF, "row-source-len" );
-
- if( nCtrlFlags & 0x0001 ) EXC_CTRLDUMP_STRING( nNameLen, "name" );
- if( nCtrlFlags & 0x0002 ) EXC_CTRLDUMP_STRING( nTagLen, "tag" );
- if( nCtrlFlags & 0x0100 ) EXC_CTRLDUMP_COORD4( "pos" );
- if( nCtrlFlags & 0x0800 ) EXC_CTRLDUMP_STRING( nTipLen, "infotip" );
- if( nCtrlFlags & 0x1000 ) EXC_CTRLDUMP_STRING( nCtrlIdLen, "ctrl-id" );
- if( nCtrlFlags & 0x2000 ) EXC_CTRLDUMP_STRING( nCtrlSrcLen, "ctrl-source" );
- if( nCtrlFlags & 0x4000 ) EXC_CTRLDUMP_STRING( nRowSrcLen, "row-source" );
- EXC_CTRLDUMP_REMAINING( nStartPos + nSize );
-
- if( (nCtrlFlags & 0x0080) && (nChildType != EXC_CTRL_UNKNOWN) )
- {
- if( (nFlags & 0x00040000) && (nStorageId > 0) )
- maCtrlStorages.push_back( XclDumpCtrlPortion( nStorageId, nChildType ) );
- if( (nCtrlFlags & 0x0020) && (nSubStrmLen > 0) )
- maCtrlPortions.push_back( XclDumpCtrlPortion( nSubStrmLen, nChildType ) );
- }
- }
- break;
-
- default:
- EXC_CTRLDUMP_REMAINING( nStartPos + nSize );
- }
-
- // font data
- if( bHasFontData )
- DumpControlContents( rInStrm, EXC_CTRL_FONTDATA );
- }
-}
-
-// ============================================================================
-//
-// S T R E A M S
-//
-// ============================================================================
-
-void Biff8RecDumper::DumpBinaryStream( SotStorageRef xStrg, const String& rStrmName, const String& rStrgPath )
-{
- SotStorageStreamRef xInStrm = OpenStream( xStrg, rStrmName );
- if( !xInStrm || !pDumpStream ) return;
-
- XclDumpStreamHeader aStrmHeader( *xInStrm, *pDumpStream, rStrmName, rStrgPath );
- DumpBinary( *xInStrm );
- (*pDumpStream) << "\n";
-}
-
-void Biff8RecDumper::DumpTextStream( SotStorageRef xStrg, const String& rStrmName, const String& rStrgPath )
-{
- SotStorageStreamRef xInStrm = OpenStream( xStrg, rStrmName );
- if( !xInStrm || !pDumpStream ) return;
-
- XclDumpStreamHeader aStrmHeader( *xInStrm, *pDumpStream, rStrmName, rStrgPath );
- while( xInStrm->Tell() < aStrmHeader.GetStreamLen() )
- {
- ByteString aLine;
- xInStrm->ReadLine( aLine );
- lclDumpString( *pDumpStream, aLine );
- (*pDumpStream) << "\n";
- }
- (*pDumpStream) << "\n";
-}
-
-void Biff8RecDumper::DumpRecordStream( SotStorageRef xStrg, const String& rStrmName, const String& rStrgPath )
-{
- SotStorageStreamRef xInStrm = OpenStream( xStrg, rStrmName );
- if( !xInStrm || !pDumpStream ) return;
-
- XclDumpStreamHeader aStrmHeader( *xInStrm, *pDumpStream, rStrmName, rStrgPath );
-
- XclImpStream* pOldStream = pIn;
- pIn = new XclImpStream( *xInStrm, GetRoot() );
- XclImpStream& rIn = *pIn;
- if( pOldStream )
- rIn.CopyDecrypterFrom( *pOldStream );
-
- // -- dump from here --
- UINT16 nId;
- BOOL bLoop = TRUE;
-
- while( bLoop && rIn.StartNextRecord() )
- {
- nId = rIn.GetRecId();
- if( HasModeDump( nId ) )
- RecDump( TRUE );
-
- bLoop = (nId != 0x000A);
- }
-
- delete pIn;
- pIn = pOldStream;
-}
-
-void Biff8RecDumper::DumpCtlsStream()
-{
- SotStorageStreamRef xInStrm = OpenStream( EXC_STREAM_CTLS );
- if( !xInStrm || !pDumpStream ) return;
-
- SvStream& rInStrm = *xInStrm;
- SvStream& rOutStrm = *pDumpStream;
- XclDumpStreamHeader aStrmHeader( rInStrm, rOutStrm, EXC_STREAM_CTLS, EMPTY_STRING );
-
- for( StrmPortionMap::const_iterator aIt = maCtlsPosMap.begin(), aEnd = maCtlsPosMap.end(); aIt != aEnd; ++aIt )
- {
- ULONG nCtrlPos = static_cast< ULONG >( aIt->first );
- ULONG nCtrlEnd = nCtrlPos + static_cast< ULONG >( aIt->second );
- if( nCtrlEnd <= aStrmHeader.GetStreamLen() )
- {
- // stream position
- ULONG nStartPos = nCtrlPos; // for stream alignment macro
- rInStrm.Seek( nStartPos );
-
- ByteString t( "\npos=" ); __AddHex( t, aIt->first );
- t.Append( " len=" ); __AddHex( t, aIt->second );
- rOutStrm << t.GetBuffer() << " ";
-
- // control type
- sal_uInt16 nCtrlType = lclDumpControlGuid( rInStrm, rOutStrm );
- rOutStrm << "\n";
-
- // control contents
- if( nCtrlType != EXC_CTRL_UNKNOWN )
- DumpControlContents( rInStrm, nCtrlType );
-
- // remaining unknown data
- EXC_CTRLDUMP_REMAINING( nCtrlEnd );
- rOutStrm << "\n";
- }
- }
-}
-
-void Biff8RecDumper::DumpControlFrameStream( SotStorageRef xInStrg, sal_uInt16 nCtrlType, const String& rStrgPath )
-{
- static const String saStrmName( sal_Unicode( 'f' ) );
-
- SotStorageStreamRef xInStrm = OpenStream( xInStrg, saStrmName );
- if( !xInStrm || !pDumpStream ) return;
-
- SvStream& rInStrm = *xInStrm;
- SvStream& rOutStrm = *pDumpStream;
- XclDumpStreamHeader aStrmHeader( rInStrm, rOutStrm, saStrmName, rStrgPath );
-
- if( aStrmHeader.GetStreamLen() > 0 )
- {
- ByteString t; // "t" needed for macros
-
- rOutStrm << "header-record\n";
- DumpControlContents( rInStrm, nCtrlType );
- rOutStrm << "\n";
-
- if( nCtrlType == EXC_CTRL_USERFORM )
- {
- rOutStrm << "add-records\n";
- sal_uInt16 nAddCount;
- EXC_CTRLDUMP_PLAIN_DECVAR( nAddCount, "count" );
- EXC_CTRLDUMP_PRINT();
- rOutStrm << "\n";
-
- for( sal_uInt16 nAdd = 0; (nAdd < nAddCount) && (rInStrm.Tell() < aStrmHeader.GetStreamLen()); ++nAdd )
- {
- DumpControlContents( rInStrm, EXC_CTRL_ADDDATA );
- rOutStrm << "\n";
- }
- }
-
- rOutStrm << "children-records\n";
- sal_uInt32 nRecCount, nTotalSize;
- EXC_CTRLDUMP_PLAIN_DECVAR( nRecCount, "count" );
- EXC_CTRLDUMP_PLAIN_HEXVAR( nTotalSize, "total-size" );
- if( nTotalSize > 0 )
- {
- EXC_CTRLDUMP_PLAIN_HEX4( "header-unknown" );
- rOutStrm << "\n";
-
- for( sal_uInt32 nRec = 0; (nRec < nRecCount) && (rInStrm.Tell() < aStrmHeader.GetStreamLen()); ++nRec )
- {
- DumpControlContents( rInStrm, EXC_CTRL_FRAMECHILD );
- rOutStrm << "\n";
- }
- }
- else
- rOutStrm << "\n";
-
- if( rInStrm.Tell() < aStrmHeader.GetStreamLen() )
- {
- rOutStrm << "remaining=\n";
- DumpBinary( rInStrm );
- rOutStrm << "\n";
- }
- }
-}
-
-void Biff8RecDumper::DumpControlObjectsStream( SotStorageRef xInStrg, const String& rStrgPath )
-{
- static const String saStrmName( sal_Unicode( 'o' ) );
-
- SotStorageStreamRef xInStrm = OpenStream( xInStrg, saStrmName );
- if( !xInStrm || !pDumpStream ) return;
-
- SvStream& rInStrm = *xInStrm;
- SvStream& rOutStrm = *pDumpStream;
- XclDumpStreamHeader aStrmHeader( rInStrm, rOutStrm, saStrmName, rStrgPath );
-
- if( aStrmHeader.GetStreamLen() > 0 )
- {
- ULONG nStrmPos = 0;
- for( XclDumpCtrlPortionVec::const_iterator aIt = maCtrlPortions.begin(), aEnd = maCtrlPortions.end(); aIt != aEnd; ++aIt )
- {
- rInStrm.Seek( nStrmPos );
- DumpControlContents( rInStrm, aIt->second );
- rOutStrm << "\n";
- nStrmPos += aIt->first;
- }
-
- if( rInStrm.Tell() < aStrmHeader.GetStreamLen() )
- {
- rOutStrm << "remaining=\n";
- DumpBinary( rInStrm );
- rOutStrm << "\n";
- }
- }
-}
-
-// ============================================================================
-//
-// S T O R A G E S
-//
-// ============================================================================
-
-void Biff8RecDumper::DumpAnyStorage( SotStorageRef xParentStrg, const String& rStrgName, const String& rStrgPath )
-{
- SotStorageRef xInStrg = OpenStorage( xParentStrg, rStrgName );
- if( !xInStrg || !pDumpStream ) return;
-
- XclDumpStorageHeader aStrgHeader( *xInStrg, *pDumpStream, rStrgPath );
-}
-
-void Biff8RecDumper::DumpUserFormStorage( SotStorageRef xParentStrg, const String& rStrgName, sal_uInt16 nCtrlType, const String& rStrgPath )
-{
- SotStorageRef xInStrg = OpenStorage( xParentStrg, rStrgName );
- if( !xInStrg || !pDumpStream ) return;
-
- XclDumpStorageHeader aStrgHeader( *xInStrg, *pDumpStream, rStrgPath );
-
- // streams
- maCtrlStorages.clear();
- maCtrlPortions.clear();
- DumpControlFrameStream( xInStrg, nCtrlType, rStrgPath );
- DumpControlObjectsStream( xInStrg, rStrgPath );
- DumpTextStream( xInStrg, CREATE_STRING( "\003VBFrame" ), rStrgPath );
-
- // frame substorages
- XclDumpCtrlPortionVec aCtrlStorages( maCtrlStorages ); // make local copy, maCtrlStorages is reused in loop
- for( XclDumpCtrlPortionVec::const_iterator aIt = aCtrlStorages.begin(), aEnd = aCtrlStorages.end(); aIt != aEnd; ++aIt )
- {
- sal_uInt32 nStorageId = aIt->first;
- String aSubName( sal_Unicode( 'i' ) );
- if( nStorageId < 10 )
- aSubName.Append( sal_Unicode( '0' ) );
- aSubName.Append( String::CreateFromInt32( static_cast< sal_Int32 >( nStorageId ) ) );
-
- String aPath( rStrgPath );
- aPath.Append( sal_Unicode( '/' ) ).Append( rStrgName );
-
- DumpUserFormStorage( xInStrg, aSubName, aIt->second, aPath );
- }
-}
-
-void Biff8RecDumper::DumpVbaProjectStorage()
-{
- SotStorageRef xInStrg = OpenStorage( EXC_STORAGE_VBA_PROJECT );
- if( !xInStrg || !pDumpStream ) return;
-
- XclDumpStorageHeader aStrgHeader( *xInStrg, *pDumpStream, EMPTY_STRING );
- // PROJECT substream
- DumpTextStream( xInStrg, CREATE_STRING( "PROJECT" ), EXC_STORAGE_VBA_PROJECT );
- // VBA storage
- DumpAnyStorage( xInStrg, EXC_STORAGE_VBA, EXC_STORAGE_VBA_PROJECT );
- // user forms
- SvStorageInfoList aInfoList;
- xInStrg->FillInfoList( &aInfoList );
- for( ULONG nInfo = 0; nInfo < aInfoList.Count(); ++nInfo )
- {
- SvStorageInfo& rInfo = aInfoList.GetObject( nInfo );
- if( rInfo.IsStorage() && (rInfo.GetName() != EXC_STORAGE_VBA) )
- DumpUserFormStorage( xInStrg, rInfo.GetName(), EXC_CTRL_USERFORM, EXC_STORAGE_VBA_PROJECT );
- }
-}
-
-// ============================================================================
-//
-// ============================================================================
-
-const sal_Char* Biff8RecDumper::GetBlanks( const UINT16 nNumOfBlanks )
-{
- DBG_ASSERT( pBlankLine, "-Biff8RecDumper::GetBlanks(): nicht so schnell mein Freund!" );
- DBG_ASSERT( nNumOfBlanks <= nLenBlankLine,
- "+Biff8RecDumper::GetBlanks(): So viel kannst Du nicht von mir verlangen!" );
-
- return pBlankLine + ( ( nNumOfBlanks <= nLenBlankLine )? ( nLenBlankLine - nNumOfBlanks ) : 0 );
-}
-
-
-BOOL Biff8RecDumper::IsLineEnd( const sal_Char c, sal_Char& rNext, SvStream& rIn, INT32& rLeft )
-{
- static const sal_Char cNL = '\n';
- static const sal_Char cRET = '\r';
-
- if( IsEndOfLine( c ) )
- {
- sal_Char cDouble = ( c == cNL )? cRET : cNL;
-
- if( rNext == cDouble )
- {
- rIn >> rNext;
- rLeft--;
- }
-
- return TRUE;
- }
- else
- return FALSE;
-}
-
-
-_KEYWORD Biff8RecDumper::GetKeyType( const ByteString& r )
-{
- ByteString t( r );
- _KEYWORD e;
-
- t.ToUpperAscii();
-
- if( t == "SKIPDUMP" )
- e = Skipdump;
- else if( t == "SKIPOFFSET" )
- e = SkipOffset;
- else if( t == "READCONTRECS" )
- e = ReadContRecs;
- else if( t == "NOWARNINGS" )
- e = NoWarnings;
- else if( t == "CONTLOAD" )
- e = Contload;
- else if( t == "BLANKLINE" )
- e = BlankLine;
- else if( t == "EXPORTBOOKSTREAM" )
- e = ExportBookStream;
- else if( t == "PARSEP" )
- e = Parsep;
- else if( t == "MAXBODYLINES" )
- e = Maxbodylines;
- else if( t == "INCLUDE" || t == "+" )
- e = Include;
- else if( t == "EXCLUDE" || t == "-" )
- e = Exclude;
- else if( t == "HEX" || t == "H" )
- e = Hex;
- else if( t == "BODY" || t == "B" )
- e = Body;
- else if( t == "NAMEONLY" || t =="N" )
- e = NameOnly;
- else if( t == "COMMENT" )
- e = Comment;
- else if( t == "OUTPUT" )
- e = Output;
- else if( t == "TITLE" )
- e = Title;
- else if( t == "CLEARFILE" )
- e = ClearFile;
- else
- e = KW_Unknown;
-
- return e;
-}
-
-
-void Biff8RecDumper::Init( void )
-{
- bClearFile = FALSE;
-
- if( pDumpModes || ppRecNames )
- return;
-
- const sal_Char* pDefName = "biffrecdumper.ini";
- const sal_Char* pIniKey = "BIFFRECDUMPERINI";
- const sal_Char pPathSep[] = { SAL_PATHDELIMITER, '\0' };
- ByteString aIniName;
-
- SvFileStream* pIn = NULL;
-
- // first try: search for biffrecdumper.ini in dir, specified in %HOME%
- const sal_Char* pHome = getenv( "HOME" );
- if( pHome )
- {
- aIniName = pHome;
- aIniName.EraseTrailingChars( *pPathSep );
- aIniName += pPathSep;
- aIniName += pDefName;
-
- pIn = CreateInStream( aIniName.GetBuffer() );
- }
-
- if( !pIn )
- { // %HOME% not set or %HOME%\biffrecdumper.ini could not be opened
- const sal_Char* pIni = getenv( pIniKey );
- if( pIni )
- {
- pIn = CreateInStream( pIni );
- if( !pIn )
- {
- AddError( 0, "Could not open ini file", ByteString( pIni ) );
- bEndLoading = TRUE; // zur Sicherheit....
- }
- }
- }
-
- if( pIn )
- {
- pIn->Seek( STREAM_SEEK_TO_END );
-
- const UINT32 nStreamLen = pIn->Tell();
-
- if( nStreamLen <= 1 )
- {
- pIn->Close();
- delete pIn;
- return;
- }
-
- pIn->Seek( STREAM_SEEK_TO_BEGIN );
-
- pDumpModes = new UINT16[ nRecCnt ];
- ppRecNames = new ByteString*[ nRecCnt ];
-
- memset( pDumpModes, 0x00, sizeof( UINT16 ) * nRecCnt );
- memset( ppRecNames, 0x00, sizeof( ByteString* )* nRecCnt );
-
- enum STATE { PreLine, InCommand, PostCommand, InId, PostEqu,
- InVal, InName, InInExClude, InBodyMode, PostSepIEC,
- PostSepBM, InComment };
-
- STATE eAct = PreLine;
- sal_Char c;
- sal_Char cNext;
- INT32 n = ( INT32 ) nStreamLen;
- ByteString aCommand;
- ByteString aVal;
- ByteString aInExClude;
- ByteString aHexBody;
- UINT32 nLine = 1;
- BOOL bCommand = FALSE;
-
- *pIn >> c >> cNext;
-
- while( n > 0 )
- {
- n--;
-
- switch( eAct )
- {
- case PreLine:
- if( IsAlphaNum( c ) )
- {
- if( IsNum( c ) )
- {
- eAct = InId;
- bCommand = FALSE;
- }
- else
- {
- eAct = InCommand;
- bCommand = TRUE;
- }
- aCommand.Erase();
- aCommand += c;
- }
- else if( c == cComm1 && cNext == cComm2 )
- eAct = InComment;
- else if( IsLineEnd( c, cNext, *pIn, n ) )
- nLine++;
- else if( !IsBlank( c ) )
- {
- AddError( nLine, "Unexpected command or id" );
- n = 0;
- }
- break;
- case InCommand:
- if( c == '=' )
- {
- eAct = PostEqu;
- aVal.Erase();
- }
- else if( IsAlpha( c ) )
- aCommand += c;
- else if( IsBlank( c ) )
- eAct = PostCommand;
- else if( IsLineEnd( c, cNext, *pIn, n ) )
- {
- if( ExecCommand( nLine, aCommand ) )
- {
- eAct = PreLine;
- nLine++;
- }
- else
- n = 0;
- }
- else if( c == cComm1 && cNext == cComm2 )
- {
- if( ExecCommand( nLine, aCommand ) )
- eAct = InComment;
- else
- {
- AddError( nLine, "Invalid command before comment", aCommand );
- n = 0;
- }
- }
- else
- {
- aCommand += '>';
- aCommand += c;
- aCommand += '<';
- AddError( nLine, "Invalid character in command or id", aCommand );
- n = 0;
- }
- break;
- case PostCommand:
- if( c == '=' )
- {
- eAct = PostEqu;
- aVal.Erase();
- }
- else if( IsLineEnd( c, cNext, *pIn, n ) )
- {
- if( ExecCommand( nLine, aCommand ) )
- {
- eAct = PreLine;
- nLine++;
- }
- else
- n = 0;
- }
- else if( c == cComm1 && cNext == cComm2 )
- {
- if( ExecCommand( nLine, aCommand ) )
- eAct = InComment;
- else
- {
- AddError( nLine, "Invalid command before comment", aCommand );
- n = 0;
- }
- }
- else if( !IsBlank( c ) )
- {
- AddError( nLine, "Expecting blank or \'=\' following the command", aCommand );
- n = 0;
- }
- break;
- case InId:
- if( c == '=' )
- {
- eAct = PostEqu;
- aVal.Erase();
- }
- else if( IsAlphaNum( c ) )
- aCommand += c;
- else if( IsBlank( c ) )
- eAct = PostCommand;
- else if( ( c == cComm1 && cNext == cComm2 ) || IsLineEnd( c, cNext, *pIn, n ) )
- {
- AddError( nLine, "Unexpected end of record id", aCommand );
- eAct = InComment;
- }
- else
- {
- AddError( nLine, "Unexpected sal_Char in record id", aCommand );
- n = 0;
- }
- break;
- case PostEqu:
- if( bCommand )
- { // Command
- if( c == cComm1 && cNext == cComm2 )
- {
- if( ExecCommand( nLine, aCommand ) )
- eAct = InComment;
- else
- {
- AddError( nLine, "Unknown command", aCommand );
- n = 0;
- }
- }
- else if( IsLineEnd( c, cNext, *pIn, n ) )
- {
- if( ExecCommand( nLine, aCommand ) )
- {
- eAct = PreLine;
- nLine++;
- }
- else
- {
- AddError( nLine, "Unknown command", aCommand );
- n = 0;
- }
- }
- else if( !bCommand && c == cParSep )
- eAct = PostSepIEC;
- else if( !IsBlank( c ) )
- {
- aVal.Erase();
- aVal += c;
- eAct = InVal;
- }
- }
- else
- { // Set
- if( ( c == cComm1 && cNext == cComm2 ) || IsLineEnd( c, cNext, *pIn, n ) )
- {
- AddError( nLine, "No mode set for record", aCommand );
- n = 0;
- }
- else if( !bCommand && c == cParSep )
- eAct = PostSepIEC;
- else
- {
- aVal.Erase();
- aVal += c;
- eAct = InName;
- aInExClude.Erase();
- aHexBody.Erase();
- }
- }
- break;
- case InVal:
- if( c == cComm1 && cNext == cComm2 )
- {
- if( ExecCommand( nLine, aCommand, &aVal ) )
- eAct = InComment;
- else
- {
- AddError( nLine, "Unknown command", aCommand );
- n = 0;
- }
- }
- else if( IsLineEnd( c, cNext, *pIn, n ) )
- {
- if( ExecCommand( nLine, aCommand, &aVal ) )
- {
- eAct = PreLine;
- nLine++;
- }
- else
- {
- AddError( nLine, "Unknown command", aCommand );
- n = 0;
- }
- }
- else
- aVal += c;
- break;
- case InName:
- if( c == cParSep )
- eAct = PostSepIEC;
- else if( c == cComm1 && cNext == cComm2 )
- {
- if( ExecSetVal( nLine, aCommand, &aVal, NULL, NULL ) )
- eAct = InComment;
- else
- n = 0;
- }
- else if( IsLineEnd( c, cNext, *pIn, n ) )
- {
- if( ExecSetVal( nLine, aCommand, &aVal, NULL, NULL ) )
- {
- eAct = PreLine;
- nLine++;
- }
- else
- n = 0;
- }
- else
- aVal += c;
- break;
- case InInExClude:
- if( c == cParSep )
- eAct = PostSepBM;
- else if( c == cComm1 && cNext == cComm2 )
- {
- if( ExecSetVal( nLine, aCommand, &aVal, &aInExClude, NULL ) )
- eAct = InComment;
- else
- n = 0;
- }
- else if( IsLineEnd( c, cNext, *pIn, n ) )
- {
- if( ExecSetVal( nLine, aCommand, &aVal, &aInExClude, NULL ) )
- {
- eAct = PreLine;
- nLine++;
- }
- else
- n = 0;
- }
- else
- aInExClude += c;
- break;
- case InBodyMode:
- if( c == cParSep )
- {
- AddError( nLine, "Only 3 parameter possible" );
- n = 0;
- }
- else if( c == cComm1 && cNext == cComm2 )
- {
- if( ExecSetVal( nLine, aCommand, &aVal, &aInExClude, &aHexBody ) )
- eAct = InComment;
- else
- n = 0;
- }
- else if( IsLineEnd( c, cNext, *pIn, n ) )
- {
- if( ExecSetVal( nLine, aCommand, &aVal, &aInExClude, &aHexBody ) )
- {
- eAct = PreLine;
- nLine++;
- }
- else
- n = 0;
- }
- else
- aInExClude += c;
- break;
- case PostSepIEC:
- if( c == cParSep )
- eAct = PostSepBM;
- else if( c == cComm1 && cNext == cComm2 )
- {
- if( ExecSetVal( nLine, aCommand, &aVal, NULL, NULL ) )
- eAct = InComment;
- else
- n = 0;
- }
- else if( IsLineEnd( c, cNext, *pIn, n ) )
- {
- if( ExecSetVal( nLine, aCommand, &aVal, NULL, NULL ) )
- {
- eAct = PreLine;
- nLine++;
- }
- else
- n = 0;
- }
- else if( !IsBlank( c ) )
- {
- aInExClude += c;
- eAct = InInExClude;
- }
- break;
- case PostSepBM:
- if( c == cParSep )
- eAct = PostSepBM;
- else if( c == cComm1 && cNext == cComm2 )
- {
- if( ExecSetVal( nLine, aCommand, &aVal, &aInExClude, NULL ) )
- eAct = InComment;
- else
- n = 0;
- }
- else if( IsLineEnd( c, cNext, *pIn, n ) )
- {
- if( ExecSetVal( nLine, aCommand, &aVal, &aInExClude, NULL ) )
- {
- eAct = PreLine;
- nLine++;
- }
- else
- n = 0;
- }
- else if( !IsBlank( c ) )
- {
- aHexBody += c;
- eAct = InBodyMode;
- }
- break;
- case InComment:
- if( IsLineEnd( c, cNext, *pIn, n ) )
- {
- eAct = PreLine;
- nLine++;
- }
- break;
- default:
- n = 0;
- }
-
- c = cNext;
- *pIn >> cNext;
- }
-
- pIn->Close();
- delete pIn;
- }
-}
-
-
-BOOL Biff8RecDumper::ExecCommand( const UINT32 nL, const ByteString& r, const ByteString* pVal )
-{
- _KEYWORD e = GetKeyType( r );
- BOOL b = TRUE;
- const UINT32 nValLen = ( pVal )? pVal->Len() : 0;
- BOOL bSet;
- UINT16 nMode;
-
- switch( e )
- {
- case Skipdump: bSkip = TRUE; break;
- case SkipOffset: bSkipOffset = TRUE; break;
- case ReadContRecs: bReadContRecs = TRUE; break;
- case NoWarnings: bWarnings = FALSE; break;
- case Contload: bEndLoading = TRUE; break;
- case BlankLine: bBlankLine = TRUE; break;
- case ExportBookStream: bExportBookStream = TRUE; break;
- case Parsep:
- if( nValLen == 0 )
- {
- AddError( nL, "No separator found" );
- b = FALSE;
- }
- else if( nValLen == 1 )
- cParSep = *( pVal->GetBuffer() );
- else
- {
- AddError( nL, "More than 1 sal_Char is not valid for separator", *pVal );
- b = FALSE;
- }
- break;
- case Maxbodylines:
- if( nValLen )
- {
- UINT32 n = GetVal( *pVal );
-
- if( n == 0xFFFFFFFF )
- {
- AddError( nL, "Syntax error in value of body lines" );
- b = FALSE;
- }
- else
- nMaxBodyLines = n;
- }
- else
- {
- AddError( nL, "No value specified for number of body lines" );
- b = FALSE;
- }
- break;
- case Include:
- bSet = FALSE;
- nMode = MODE_SKIP;
- goto _common;
- case Exclude:
- bSet = TRUE;
- nMode = MODE_SKIP;
- goto _common;
- case Hex:
- bSet = TRUE;
- nMode = MODE_HEX;
- goto _common;
- case Body:
- bSet = FALSE;
- nMode = MODE_HEX;
- goto _common;
- case NameOnly:
- bSet = TRUE;
- nMode = MODE_NAMEONLY;
- goto _common;
-_common:
- if( pVal )
- {
- IdRangeList aRL;
- if( FillIdRangeList( nL, aRL, *pVal ) )
- {
- const IdRange* p = aRL.First();
- if( bSet )
- {
- while( p )
- { SetFlag( p->nFirst, p->nLast, nMode ); p = aRL.Next(); }
- }
- else
- {
- while( p )
- { ClrFlag( p->nFirst, p->nLast, nMode ); p = aRL.Next(); }
- }
- }
- else
- b = FALSE;
- }
- break;
- case Comment:
- if( pVal && pVal->Len() >= 2 )
- {
- cComm1 = pVal->GetChar( 0 );
- cComm2 = pVal->GetChar( 1 );
- }
- break;
- case Output:
- CopyStrpOnStrp( pOutName, pVal );
- if( pOutName )
- {
- if( *pOutName == "*" )
- {
- ByteString aDefault( "DefaultDumpName.txt" );
- SfxObjectShell* pShell = GetDocShell();
- if( pShell )
- {
- SfxMedium* pMedium = pShell->GetMedium();
- if( pMedium )
- {
- const ByteString aTextExtension( ".txt" );
- aDefault = GETSTR( pMedium->GetPhysicalName() );
- xub_StrLen nStrLen = aDefault.Len();
- if( nStrLen >= 4 )
- {
- ByteString aTmp( aDefault );
- aTmp.ToLowerAscii();
- if( aTmp.Copy( nStrLen -4 ) == ".xls" )
- aDefault.Replace( nStrLen - 4, aTextExtension.Len(), aTextExtension );
- else
- aDefault += aTextExtension;
- }
- else
- aDefault += aTextExtension;
- }
- }
-
- *pOutName = aDefault;
- }
- CreateOutStream();
- }
- else if( pDumpStream )
- {
- pDumpStream->Close();
- DELANDNULL( pDumpStream );
- }
- break;
- case Title:
- CopyStrpOnStrp( pTitle, pVal );
- break;
- case ClearFile:
- bClearFile = TRUE;
- break;
- default:
- AddError( nL, "Unknown command", r );
- b = FALSE;
- }
-
- return b;
-}
-
-
-BOOL Biff8RecDumper::ExecSetVal( const UINT32 nL, const ByteString& rId, const ByteString* pName,
- const ByteString* pIEC, const ByteString* pHB )
-{
- UINT32 _nId = GetVal( rId );
-
- if( _nId == 0xFFFFFFFF )
- {
- AddError( nL, "Syntax error in record id", rId );
- return FALSE;
- }
- else if( _nId >= ( UINT32 ) nRecCnt )
- {
- AddError( nL, "Record id to high", rId );
- return FALSE;
- }
-
- UINT16 nId = ( UINT16 ) _nId;
-
- if( pName && pName->Len() )
- SetName( nId, *pName );
-
- _KEYWORD e;
- UINT16 n = GetMode( nId );
-
- if( pIEC && pIEC->Len() )
- {
- e = GetKeyType( *pIEC );
-
- if( e == Include )
- n &= ~MODE_SKIP;
- else if( e == Exclude )
- n |= MODE_SKIP;
- else
- {
- AddError( nL, "Invalid key for in-/exclude", *pIEC );
- return FALSE;
- }
- }
-
- if( pHB && pHB->Len() )
- {
- e = GetKeyType( *pHB );
-
- if( e == NameOnly )
- n |= MODE_NAMEONLY;
- else
- {
- n &= ~MODE_NAMEONLY;
- if( e == Hex )
- n |= MODE_HEX;
- else if( e == Body )
- n &= ~MODE_HEX;
- else
- {
- AddError( nL, "Invalid key for hex/body/name only", *pIEC );
- return FALSE;
- }
- }
- }
-
- SetMode( nId, n );
- return TRUE;
-}
-
-
-void Biff8RecDumper::SetFlag( const UINT16 nF, const UINT16 nL, const UINT16 nFl )
-{
- UINT16 n = ( nF < nL )? nF : nL;
- UINT16 nLast = ( nF < nL )? nL : nF;
-
- if( nLast >= nRecCnt )
- nLast = nRecCnt - 1;
-
- while( n <= nLast )
- {
- pDumpModes[ n ] |= nFl;
- n++;
- }
-}
-
-
-void Biff8RecDumper::ClrFlag( const UINT16 nF, const UINT16 nL, const UINT16 nFlags )
-{
- UINT16 n = ( nF < nL )? nF : nL;
- UINT16 nLast = ( nF < nL )? nL : nF;
- UINT16 nFl = ~nFlags;
-
- if( nLast >= nRecCnt )
- nLast = nRecCnt - 1;
-
- while( n <= nLast )
- {
- pDumpModes[ n ] &= nFl;
- n++;
- }
-}
-
-
-void Biff8RecDumper::SetName( const UINT16 n, ByteString* p )
-{
- if( n < nRecCnt )
- CopyStrpOnStrp( ppRecNames[ n ], p );
-}
-
-
-UINT32 Biff8RecDumper::GetVal( const ByteString& r )
-{
- const sal_Char* p = r.GetBuffer();
- sal_Char c = *p;
- UINT32 n = 0;
- const UINT32 nLimitDec = 0xFFFFFFFF / 10;
- const UINT32 nLimitHex = 0xFFFFFFFF / 16;
- BOOL bError = FALSE;
-
- enum STATE { First, Dec, MaybeHex, Hex };
-
- STATE e = First;
-
- while( c )
- {
- switch( e )
- {
- case First:
- if( IsNum( c ) )
- {
- if( c == '0' )
- e = MaybeHex;
- else
- {
- e = Dec;
- n = GetVal( c );
- }
- }
- else
- bError = TRUE;
- break;
- case Dec:
- if( n < nLimitDec && IsNum( c ) )
- {
- n *= 10;
- n += GetVal( c );
- }
- else
- bError = TRUE;
- break;
- case MaybeHex:
- if( c == 'x' || c == 'X' )
- {
- e = Hex;
- n = 0;
- }
- else if( IsNum( c ) )
- {
- n = GetVal( c );
- e = Dec;
- }
- else
- bError = TRUE;
- break;
- case Hex:
- if( n < nLimitHex && IsHex( c ) )
- {
- n *= 16;
- n += GetVal( c );
- }
- else
- bError = TRUE;
- break;
- }
-
- if( bError )
- c = 0x00;
- else
- {
- p++;
- c = *p;
- }
- }
-
- if( bError )
- return 0xFFFFFFFF;
- else
- return n;
-}
-
-
-BOOL Biff8RecDumper::FillIdRangeList( const UINT32 nL, IdRangeList& rRL, const ByteString& rV )
-{
- rRL.Clear();
-
- const sal_Char* pSyntErr = "Syntax error in number (list)";
-
-#define SYNTERR(ch) AddError( ((UINT32)(b=FALSE))+nL, pSyntErr, ch? ((((t+=">")+=ByteString::CreateFromInt32(ch))+="<")) : t )
-#define NEWVAL(_n) _n=(n>=(UINT32)nRecCnt)?nRecCnt-1:(UINT16)n
-#define ORDERN() {if(n1>n2){UINT16 nT=n1;n1=n2;n2=nT;}}
-
- const sal_Char* p = rV.GetBuffer();
- sal_Char c = *p;
- const sal_Char cSep = cParSep;
- const sal_Char cCont = '.';
- const sal_Char cAll = '*';
- ByteString t;
- UINT16 n1 = 0, n2 = 0;
- UINT32 n;
- BOOL b = TRUE;
- BOOL bExp2 = FALSE;
-
- enum STATE { PreFirst, InFirst, PostFirst, InCont, PreLast, InLast, PostLast };
- STATE e = PreFirst;
-
- while( c )
- {
- switch( e )
- {
- case PreFirst:
- if( IsAlphaNum( c ) )
- {
- t += c;
- e = InFirst;
- }
- else if( c == cAll )
- {
- rRL.Append( 0, nRecCnt - 1 );
- e = PostLast;
- }
- else if( !IsBlank( c ) )
- SYNTERR( c );
- break;
- case InFirst:
- if( c == cSep || c == cCont || IsBlank( c ) )
- {
- n = GetVal( t );
- if( n == 0xFFFFFFFF )
- SYNTERR( 0 );
- else
- NEWVAL( n1 );
-
- t.Erase();
-
- if( c == cSep )
- {
- rRL.Append( n1, n1 );
- e = PreFirst;
- }
- else if( c == cCont )
- {
- bExp2 = TRUE;
- e = InCont;
- }
- else
- e = PostFirst;
- }
- else if( IsAlphaNum( c ) )
- t += c;
- else
- SYNTERR( c );
- break;
- case PostFirst:
- if( c == cCont )
- {
- e = InCont;
- bExp2 = TRUE;
- }
- else if( c == cSep )
- {
- n = GetVal( t );
- if( n == 0xFFFFFFFF )
- SYNTERR( 0 );
- else
- NEWVAL( n1 );
-
- e = PreFirst;
- }
- else if( !IsBlank( c ) )
- SYNTERR( c );
- break;
- case InCont:
- if( IsAlphaNum( c ) )
- {
- t += c;
- e = InLast;
- }
- else if( IsBlank( c ) )
- e = PreLast;
- else if( c == cSep || c == cAll )
- {
- rRL.Append( n1, nRecCnt - 1 );
- bExp2 = FALSE;
- e = PreFirst;
- }
- else if( c != cCont )
- SYNTERR( c );
- break;
- case PreLast:
- if( IsAlphaNum( c ) )
- {
- t += c;
- e = InLast;
- }
- else if( !IsBlank( c ) )
- SYNTERR( c );
- break;
- break;
- case InLast:
- if( c == cSep || IsBlank( c ) )
- {
- n = GetVal( t );
- if( n == 0xFFFFFFFF )
- SYNTERR( 0 );
- else
- NEWVAL( n2 );
-
- t.Erase();
- ORDERN();
- rRL.Append( n1, n2 );
- bExp2 = FALSE;
- e = ( c == cSep )? PreFirst : PostLast;
- }
- else if( IsAlphaNum( c ) )
- t += c;
- else
- SYNTERR( c );
- break;
- case PostLast:
- if( c == cSep )
- {
- e = PreFirst;
- bExp2 = FALSE;
- }
- else if( !IsBlank( c ) )
- SYNTERR( c );
- break;
- }
-
- if( b )
- {
- p++;
- c = *p;
- }
- else
- c = 0x00;
- }
-
- if( bExp2 )
- {
- if( t.Len() )
- {
- n = GetVal( t );
- if( n == 0xFFFFFFFF )
- SYNTERR( 0 );
- else
- NEWVAL( n2 );
- ORDERN();
- }
- else
- n2 = nRecCnt - 1;
-
- if( b )
- rRL.Append( n1, n2 );
- }
-
-#undef SYNTERR
-#undef NEWVAL
-#undef ORDERN
-
- return b;
-}
-
-
-BOOL Biff8RecDumper::CreateOutStream()
-{
- if( pDumpStream )
- {
- pDumpStream->Close();
- DELANDNULL( pDumpStream );
- }
-
- if( !bSkip && pOutName )
- {
- pOutName->EraseLeadingChars( ' ' );
- pOutName->EraseTrailingChars( ' ' );
- pOutName->EraseLeadingChars( '\t' );
- pOutName->EraseTrailingChars( '\t' );
-
- pDumpStream = new SvFileStream( String::CreateFromAscii( pOutName->GetBuffer() ), STREAM_WRITE|STREAM_SHARE_DENYWRITE|(bClearFile?STREAM_TRUNC:0) );
-
- if( pDumpStream->IsOpen() )
- {
- pDumpStream->Seek( bClearFile? STREAM_SEEK_TO_BEGIN : STREAM_SEEK_TO_END );
- return TRUE;
- }
- else
- {
- DELANDNULL( pDumpStream );
- }
- }
-
- return FALSE;
-}
-
-
-SvFileStream* Biff8RecDumper::CreateInStream( const sal_Char* pN )
-{
- SvFileStream* p = new SvFileStream( String::CreateFromAscii( pN ), STREAM_READ|STREAM_SHARE_DENYWRITE );
-
- if( p->IsOpen() )
- return p;
- else
- {
- delete p;
- return NULL;
- }
-}
-
-
-SvFileStream* Biff8RecDumper::CreateInStream( const sal_Char* pP, const sal_Char* pN )
-{
- ByteString t( pP );
- const sal_Char c = t.GetChar( t.Len() - 1 );
-
- if( c != '\\' )
- t += '\\';
- else if( c != '/' )
- t += '/';
-
- t += pN;
-
- return CreateInStream( t.GetBuffer() );
-}
-
-
-void Biff8RecDumper::AddError( const UINT32 n, const ByteString& rT, const ByteString& rH )
-{
- DUMP_ERR* p = new DUMP_ERR( n, rT, rH );
-
- if( pFirst )
- pLast->pNext = p;
- else
- pFirst = p;
-
- pLast = p;
-}
-
-
-Biff8RecDumper::Biff8RecDumper( const XclImpRoot& rRoot, BOOL _bBIFF8 ) :
- XclImpRoot( rRoot ),
- bBIFF8( _bBIFF8 ),
- bEncrypted( false ),
- mnEscherPos( 0 )
-{
- nXFCount = 0;
- nFontIndex = 0;
- nInstances++;
- mnSubstream = EXC_BOF_UNKNOWN;
-
- if( !pCharType )
- {
- pCharType = new UINT8[ 256 ];
- memset( pCharType, 0x00, 256 );
-
- pCharVal = new UINT8[ 256 ];
- memset( pCharVal, 0x00, 256 );
-
- sal_Char c;
- UINT8 n;
-
-#define __TYPE(n) pCharType[(UINT8)n]
-#define __VAL(n) pCharVal[(UINT8)n]
-
- __TYPE( '\n' ) = CT_EOL;
- __TYPE( '\r' ) = CT_EOL;
-
- __TYPE( ' ' ) = CT_BLANK;
- __TYPE( '\t' ) = CT_BLANK;
-
- for( c = '0', n = 0 ; c <= '9' ; c++, n++ )
- {
- __TYPE( c ) = CT_NUM|CT_HEX|CT_ALPHANUM;
- __VAL( c ) = n;
- }
- for( c = 'a', n = 10 ; c <= 'f' ; c++, n++ )
- {
- __TYPE( c ) = CT_HEX|CT_ALPHA|CT_ALPHANUM|CT_LOWERALPHA;
- __VAL( c ) = n;
- }
- for( c = 'g' ; c <= 'z' ; c++ )
- __TYPE( c ) = CT_ALPHA|CT_ALPHANUM|CT_LOWERALPHA;
- for( c = 'A', n = 10 ; c <= 'F' ; c++, n++ )
- {
- __TYPE( c ) = CT_HEX|CT_ALPHA|CT_ALPHANUM|CT_UPPERALPHA;
- __VAL( c ) = n;
- }
- for( c = 'G' ; c <= 'Z' ; c++ )
- __TYPE( c ) = CT_ALPHA|CT_ALPHANUM|CT_UPPERALPHA;
-
-#undef __TYPE
-#undef __VAL
- }
-
- pDumpStream = NULL;
-
- if( !pBlankLine )
- {
- pBlankLine = new sal_Char[ nLenBlankLine + 1 ];
- memset( pBlankLine, ' ', nLenBlankLine );
- pBlankLine[ nLenBlankLine ] = 0x00;
- }
-
- pTitle = NULL;
- pOutName = NULL;
- pLevelPre = pLevelPreStringNT;
-
- nMaxBodyLines = 1024;
- bEndLoading = bSkip = bSkipOffset = bReadContRecs = bBlankLine = bExportBookStream = FALSE;
- bWarnings = TRUE;
-
- pDumpModes = NULL;
- ppRecNames = NULL;
-
- pFirst = pLast = pAct = NULL;
-
- cParSep = ',';
- cComm1 = cComm2 = '/';
-
- nFieldCnt = nItemCnt = nTabIndexCnt = 0;
-
- Init();
-}
-
-
-Biff8RecDumper::~Biff8RecDumper()
-{
- if( pDumpStream )
- {
- pDumpStream->Close();
- delete pDumpStream;
- }
-
- if( nInstances )
- {
- nInstances--;
- if( !nInstances )
- {
- delete[] pBlankLine;
- pBlankLine = NULL;
-
- delete[] pCharType;
- pCharType = NULL;
-
- delete[] pCharVal;
- pCharVal = NULL;
- }
- }
-
- if( pDumpModes )
- delete[] pDumpModes;
-
- if( ppRecNames )
- {
- ByteString** pp = ppRecNames;
- UINT16 n = nRecCnt;
- while( n )
- {
- if( *pp )
- delete *pp;
- pp++;
- n--;
- }
- delete[] ppRecNames;
- }
-
- if( pTitle )
- delete pTitle;
-
- if( pOutName )
- delete pOutName;
-
- DUMP_ERR* p = pFirst;
- DUMP_ERR* pD;
- if( p )
- {
- pD = p;
- p = p->pNext;
- delete pD;
- }
-}
-
-
-BOOL Biff8RecDumper::Dump( XclImpStream& r )
-{
- const DUMP_ERR* pErr = FirstErr();
-
- if( pErr )
- {
- if( pDumpStream )
- {
- SvFileStream& rOut = *pDumpStream;
- while( pErr )
- {
- rOut << "\nError";
- if( pErr->nLine )
- {
- ByteString t;
- t += ByteString::CreateFromInt32( pErr->nLine );
- rOut << " at line " << t.GetBuffer();
- }
-
- rOut << ": " << pErr->aText.GetBuffer();
-
- if( pErr->pHint )
- rOut << " (" << pErr->pHint->GetBuffer() << ')';
- pErr = NextErr();
- }
- rOut << '\n';
- }
- }
- else if( pDumpStream && !bSkip )
- {
- SvStream& rOutStrm = *pDumpStream;
-
- if( bExportBookStream && pOutName )
- {
- ByteString aBookOutName( *pOutName, 0, pOutName->Len() - 4 );
- aBookOutName.Append( "_book.xls" );
- SvFileStream aBook( String::CreateFromAscii( aBookOutName.GetBuffer() ), STREAM_WRITE|STREAM_SHARE_DENYWRITE|STREAM_TRUNC );
- if( aBook.IsOpen() )
- {
- const sal_uInt32 nBufLen = 0xFFFF;
- sal_uInt8 pBuffer[ nBufLen ];
- r.StoreGlobalPosition();
- while( r.StartNextRecord() )
- {
- r.ResetRecord( false );
- sal_uInt16 nRecSize = (sal_uInt16) Min( r.GetRecSize(), nBufLen );
- aBook << r.GetRecId() << nRecSize;
- r.Read( pBuffer, nRecSize );
- aBook.Write( pBuffer, nRecSize );
- }
- r.SeekGlobalPosition();
- }
- }
-
- if( pTitle )
- rOutStrm << pTitle->GetBuffer();
-
- pIn = &r;
- r.StoreGlobalPosition();
-
- ::std::auto_ptr< XclDumpStorageHeader > xStrgHerader;
- SotStorageRef xRootStrg = GetRootStorage();
- if( xRootStrg.Is() )
- xStrgHerader.reset( new XclDumpStorageHeader( *xRootStrg, rOutStrm, EMPTY_STRING ) );
-
- ::std::auto_ptr< ScfProgressBar > xProgress( new ScfProgressBar(
- GetDocShell(), String( RTL_CONSTASCII_USTRINGPARAM( "Dumper" ) ) ) );
- sal_Int32 nStreamSeg = xProgress->AddSegment( r.GetSvStreamSize() );
- xProgress->ActivateSegment( nStreamSeg );
-
- while( r.StartNextRecord() )
- {
- xProgress->ProgressAbs( r.GetSvStreamPos() );
- if( HasModeDump( r.GetRecId() ) )
- RecDump();
- }
-
- rOutStrm << "\n\n";
-
- pIn = NULL;
- xProgress.reset();
-
- r.SeekGlobalPosition();
-
- // dump substreams
- if( xRootStrg.Is() )
- {
- pIn = NULL;
- bool bOldEncr = bEncrypted;
- bEncrypted = false;
- DumpRecordStream( xRootStrg, EXC_STREAM_USERNAMES, EMPTY_STRING );
-
- pIn = &r;
- bEncrypted = bOldEncr;
- DumpRecordStream( xRootStrg, EXC_STREAM_REVLOG, EMPTY_STRING );
-
- pIn = NULL;
-
- DumpCtlsStream();
- DumpVbaProjectStorage();
- }
- }
-
- return !bEndLoading;
-}
-
-#undef Read1
-#undef Read2
-#undef Read4
-#undef Read8
-
-#endif
-
diff --git a/sc/source/filter/excel/excel.cxx b/sc/source/filter/excel/excel.cxx
index 3965d0acaf4e..8365ef0db3f9 100644
--- a/sc/source/filter/excel/excel.cxx
+++ b/sc/source/filter/excel/excel.cxx
@@ -98,15 +98,21 @@ FltError ScFormatFilterPluginImpl::ScImportExcel( SfxMedium& rMedium, ScDocument
CREATE_OUSTRING( "com.sun.star.comp.oox.ExcelBiffFilter" ), aArgs ), uno::UNO_QUERY_THROW );
xImporter->setTargetDocument( xComponent );
- MediaDescriptor aDescriptor;
- if( const SfxItemSet* pItemSet = rMedium.GetItemSet() )
+ MediaDescriptor aMediaDesc;
+ SfxItemSet* pItemSet = rMedium.GetItemSet();
+ if( pItemSet )
+ {
if( const SfxStringItem* pItem = static_cast< const SfxStringItem* >( pItemSet->GetItem( SID_FILE_NAME ) ) )
- aDescriptor[ MediaDescriptor::PROP_URL() ] <<= ::rtl::OUString( pItem->GetValue() );
- aDescriptor[ MediaDescriptor::PROP_INPUTSTREAM() ] <<= rMedium.GetInputStream();
+ aMediaDesc[ MediaDescriptor::PROP_URL() ] <<= ::rtl::OUString( pItem->GetValue() );
+ if( const SfxStringItem* pItem = static_cast< const SfxStringItem* >( pItemSet->GetItem( SID_PASSWORD ) ) )
+ aMediaDesc[ MediaDescriptor::PROP_PASSWORD() ] <<= ::rtl::OUString( pItem->GetValue() );
+ }
+ aMediaDesc[ MediaDescriptor::PROP_INPUTSTREAM() ] <<= rMedium.GetInputStream();
+ aMediaDesc[ MediaDescriptor::PROP_INTERACTIONHANDLER() ] <<= rMedium.GetInteractionHandler();
// call the filter
uno::Reference< document::XFilter > xFilter( xImporter, uno::UNO_QUERY_THROW );
- bool bResult = xFilter->filter( aDescriptor.getAsConstPropertyValueList() );
+ bool bResult = xFilter->filter( aMediaDesc.getAsConstPropertyValueList() );
// if filter returns false, document is invalid, or dumper has disabled import -> exit here
if( !bResult )
@@ -141,27 +147,27 @@ FltError ScFormatFilterPluginImpl::ScImportExcel( SfxMedium& rMedium, ScDocument
if( xRootStrg.Is() )
{
// try to open the "Book" stream
- SotStorageStreamRef xBookStrm5 = ScfTools::OpenStorageStreamRead( xRootStrg, EXC_STREAM_BOOK );
- XclBiff eBookStrm5Biff = xBookStrm5.Is() ? XclImpStream::DetectBiffVersion( *xBookStrm5 ) : EXC_BIFF_UNKNOWN;
+ SotStorageStreamRef xBookStrm = ScfTools::OpenStorageStreamRead( xRootStrg, EXC_STREAM_BOOK );
+ XclBiff eBookBiff = xBookStrm.Is() ? XclImpStream::DetectBiffVersion( *xBookStrm ) : EXC_BIFF_UNKNOWN;
// try to open the "Workbook" stream
- SotStorageStreamRef xBookStrm8 = ScfTools::OpenStorageStreamRead( xRootStrg, EXC_STREAM_WORKBOOK );
- XclBiff eBookStrm8Biff = xBookStrm8.Is() ? XclImpStream::DetectBiffVersion( *xBookStrm8 ) : EXC_BIFF_UNKNOWN;
+ SotStorageStreamRef xWorkbookStrm = ScfTools::OpenStorageStreamRead( xRootStrg, EXC_STREAM_WORKBOOK );
+ XclBiff eWorkbookBiff = xWorkbookStrm.Is() ? XclImpStream::DetectBiffVersion( *xWorkbookStrm ) : EXC_BIFF_UNKNOWN;
// decide which stream to use
- if( (eBookStrm8Biff != EXC_BIFF_UNKNOWN) && ((eBookStrm5Biff == EXC_BIFF_UNKNOWN) || (eBookStrm8Biff > eBookStrm5Biff)) )
+ if( (eWorkbookBiff != EXC_BIFF_UNKNOWN) && ((eBookBiff == EXC_BIFF_UNKNOWN) || (eWorkbookBiff > eBookBiff)) )
{
/* Only "Workbook" stream exists; or both streams exist,
and "Workbook" has higher BIFF version than "Book" stream. */
- xStrgStrm = xBookStrm8;
- eBiff = eBookStrm8Biff;
+ xStrgStrm = xWorkbookStrm;
+ eBiff = eWorkbookBiff;
}
- else if( eBookStrm5Biff != EXC_BIFF_UNKNOWN )
+ else if( eBookBiff != EXC_BIFF_UNKNOWN )
{
/* Only "Book" stream exists; or both streams exist,
and "Book" has higher BIFF version than "Workbook" stream. */
- xStrgStrm = xBookStrm5;
- eBiff = eBookStrm5Biff;
+ xStrgStrm = xBookStrm;
+ eBiff = eBookBiff;
}
pBookStrm = xStrgStrm;
diff --git a/sc/source/filter/excel/impop.cxx b/sc/source/filter/excel/impop.cxx
index cfbef0a15a6e..5a0ae1f9a972 100644
--- a/sc/source/filter/excel/impop.cxx
+++ b/sc/source/filter/excel/impop.cxx
@@ -46,6 +46,7 @@
#include <svx/pageitem.hxx>
#include <svx/colritem.hxx>
#include <sfx2/printer.hxx>
+#include <sfx2/docfile.hxx>
#include <svtools/zforlist.hxx>
#include <sfx2/objsh.hxx>
@@ -175,6 +176,15 @@ ImportExcel::~ImportExcel( void )
}
+void ImportExcel::ReadFileSharing()
+{
+ sal_uInt16 nRecommendReadOnly, nPasswordHash;
+ maStrm >> nRecommendReadOnly >> nPasswordHash;
+ if( (nRecommendReadOnly != 0) || (nPasswordHash != 0) )
+ if( SfxItemSet* pItemSet = GetMedium().GetItemSet() )
+ pItemSet->Put( SfxBoolItem( SID_DOC_READONLY, TRUE ) );
+}
+
sal_uInt16 ImportExcel::ReadXFIndex( bool bBiff2 )
{
sal_uInt16 nXFIdx = 0;
@@ -604,7 +614,6 @@ void ImportExcel::DocPasssword( void )
void ImportExcel::Codepage( void )
{
- maStrm.EnableDecryption();
SetCodePage( maStrm.ReaduInt16() );
}
diff --git a/sc/source/filter/excel/makefile.mk b/sc/source/filter/excel/makefile.mk
index 4fffb1ef3ed1..5b483f04729d 100644
--- a/sc/source/filter/excel/makefile.mk
+++ b/sc/source/filter/excel/makefile.mk
@@ -103,7 +103,6 @@ SLOFILES = \
$(SLO)$/xlpage.obj \
$(SLO)$/xlpivot.obj \
$(SLO)$/xlroot.obj \
- $(SLO)$/xlstream.obj \
$(SLO)$/xlstyle.obj \
$(SLO)$/xltools.obj \
$(SLO)$/xltracer.obj \
@@ -153,6 +152,7 @@ EXCEPTIONSFILES = \
$(SLO)$/xlchart.obj \
$(SLO)$/xlformula.obj \
$(SLO)$/xlpivot.obj \
+ $(SLO)$/xlroot.obj \
$(SLO)$/xlstyle.obj \
$(SLO)$/xlview.obj
diff --git a/sc/source/filter/excel/read.cxx b/sc/source/filter/excel/read.cxx
index 679fedc0969b..6f2175f1f0c9 100644
--- a/sc/source/filter/excel/read.cxx
+++ b/sc/source/filter/excel/read.cxx
@@ -305,6 +305,7 @@ FltError ImportExcel::Read( void )
if( eLastErr != ERRCODE_NONE )
eAkt = Z_Ende;
break;
+ case EXC_ID_FILESHARING: ReadFileSharing(); break;
case 0x41: rTabViewSett.ReadPane( maStrm ); break;
case 0x42: Codepage(); break; // CODEPAGE [ 2345]
case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
@@ -374,6 +375,7 @@ FltError ImportExcel::Read( void )
if( eLastErr != ERRCODE_NONE )
eAkt = Z_Ende;
break;
+ case EXC_ID_FILESHARING: ReadFileSharing(); break;
case 0x41: rTabViewSett.ReadPane( maStrm ); break;
case 0x42: Codepage(); break; // CODEPAGE [ 2345]
case 0x55: DefColWidth(); break;
@@ -412,6 +414,7 @@ FltError ImportExcel::Read( void )
if( eLastErr != ERRCODE_NONE )
eAkt = Z_Ende;
break;
+ case EXC_ID_FILESHARING: ReadFileSharing(); break;
case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
case 0x42: Codepage(); break; // CODEPAGE [ 2345]
case 0x55: DefColWidth(); break;
@@ -546,6 +549,7 @@ FltError ImportExcel::Read( void )
if( eLastErr != ERRCODE_NONE )
eAkt = Z_Ende;
break;
+ case EXC_ID_FILESHARING: ReadFileSharing(); break;
case 0x3D: Window1(); break;
case 0x42: Codepage(); break; // CODEPAGE [ 2345]
case 0x85: Boundsheet(); break; // BOUNDSHEET [ 5]
@@ -902,6 +906,7 @@ FltError ImportExcel8::Read( void )
if( eLastErr != ERRCODE_NONE )
eAkt = EXC_STATE_END;
break;
+ case EXC_ID_FILESHARING: ReadFileSharing(); break;
case 0x3D: Window1(); break;
case 0x42: Codepage(); break; // CODEPAGE [ 2345 ]
case 0x85: Boundsheet(); break; // BOUNDSHEET [ 5 ]
diff --git a/sc/source/filter/excel/xeformula.cxx b/sc/source/filter/excel/xeformula.cxx
index 457c31d4ab04..ef15b16030cf 100644
--- a/sc/source/filter/excel/xeformula.cxx
+++ b/sc/source/filter/excel/xeformula.cxx
@@ -31,25 +31,29 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
+// XXX xelink.hxx MUST be included before xeformula.hxx because of the
+// redifinition of the CREATE_OUSTRING() macro, which is in oox/helper.hxx
+// (indirectly included via xelink.hxx) and ../inc/ftools.hxx (indirectly
+// included via xeformula.hxx) that does an undef first. Ugly.
+#include "xelink.hxx"
+#include "xeformula.hxx"
+
#include <list>
#include <map>
+#include <memory>
+#include "addincol.hxx"
#include "compiler.hxx"
+#include "document.hxx"
+#include "externalrefmgr.hxx"
#include "rangelst.hxx"
-#include "addincol.hxx"
-#include "xestream.hxx"
-#include "xehelper.hxx"
-#include "xelink.hxx"
-#include "xename.hxx"
-#include "xeformula.hxx"
#include "token.hxx"
#include "tokenarray.hxx"
+#include "xehelper.hxx"
+#include "xename.hxx"
+#include "xestream.hxx"
-#include "document.hxx"
-#include "externalrefmgr.hxx"
-
-#include <memory>
+using namespace ::formula;
-using namespace formula;
// External reference log =====================================================
XclExpRefLogEntry::XclExpRefLogEntry() :
@@ -63,90 +67,60 @@ XclExpRefLogEntry::XclExpRefLogEntry() :
// Formula compiler ===========================================================
-/** Type of token class handling. */
-enum XclExpTokenClassType
-{
- EXC_CLASSTYPE_CELL, /// Cell formula, shared formula.
- EXC_CLASSTYPE_ARRAY, /// Array formula, conditional formatting, data validation.
- EXC_CLASSTYPE_NAME /// Defined name, range list.
-};
+namespace {
-/** Type of the link manager to be used. */
-enum XclExpLinkMgrType
+/** Wrapper structure for a processed Calc formula token with additional
+ settings (whitespaces). */
+struct XclExpScToken
{
- EXC_LINKMGRTYPE_NONE, /// No link manager, 2D references only.
- EXC_LINKMGRTYPE_LOCAL, /// Local (per-sheet) link manager.
- EXC_LINKMGRTYPE_GLOBAL /// Global link manager.
+ const FormulaToken* mpScToken; /// Currently processed Calc token.
+ sal_uInt8 mnSpaces; /// Number of spaces before the Calc token.
+
+ inline explicit XclExpScToken() : mpScToken( 0 ), mnSpaces( 0 ) {}
+ inline bool Is() const { return mpScToken != 0; }
+ inline StackVar GetType() const { return mpScToken ? mpScToken->GetType() : static_cast< StackVar >( svUnknown ); }
+ inline OpCode GetOpCode() const { return mpScToken ? mpScToken->GetOpCode() : static_cast< OpCode >( ocNone ); }
};
// ----------------------------------------------------------------------------
-/** Configuration data of the formula compiler. */
-struct XclExpCompConfig
+/** Effective token class conversion types. */
+enum XclExpClassConv
{
- XclFormulaType meType; /// Type of the formula to be created.
- XclExpTokenClassType meClassType; /// Token class handling type.
- XclExpLinkMgrType meLinkMgrType; /// Link manager to be used.
- bool mbFromCell; /// True = Any kind of cell formula (cell, array, shared).
- bool mb3DRefOnly; /// True = Only 3D references allowed (e.g. names).
- bool mbAllowArrays; /// True = Allow inline arrays.
+ EXC_CLASSCONV_ORG, /// Keep original class of the token.
+ EXC_CLASSCONV_VAL, /// Convert ARR tokens to VAL class (REF remains uncahnged).
+ EXC_CLASSCONV_ARR /// Convert VAL tokens to ARR class (REF remains uncahnged).
};
// ----------------------------------------------------------------------------
-/** Working data of the formula compiler. Used to push onto a stack for recursive calls. */
-struct XclExpCompData
+/** Token class conversion and position of a token in the token array. */
+struct XclExpTokenConvInfo
{
- typedef ::std::list< const ScMatrix* > ScMatrixList;
- typedef ScfRef< ScMatrixList > ScMatrixListRef;
- typedef ScfRef< ScTokenArray > ScTokenArrayRef;
-
- XclExpCompConfig maCfg; /// Configuration for current formula type.
- ScfUInt8Vec maTokVec; /// Byte vector containing token data.
- ScTokenArrayRef mxOwnScTokArr; /// Own clone of a Calc token array.
- XclTokenArrayIterator maTokArrIt; /// Iterator in Calc token array.
- XclExpLinkManager* mpLinkMgr; /// Link manager for current context (local/global).
- XclExpRefLog* mpRefLog; /// Log for external references.
- ScMatrixListRef mxInlineArr; /// List of inline arrays (in reverse order)
-
- const ScAddress* mpScBasePos; /// Current cell position of the formula.
-
- // processing data during compilation
- sal_uInt16 mnLastTokPos; /// Position of last appended Excel token ID.
- sal_uInt8 mnLastDefClass; /// Default class of last appended Excel token ID.
- sal_uInt8 mnRefExpClass; /// New class for VAL parameters, if REF is expected.
- sal_uInt8 mnValExpClass; /// New class for all parameters, if VAL is expected.
- sal_uInt8 mnArrExpClass; /// New class for all parameters, if ARR is expected.
- bool mbStopAtSep; /// True = Stop subexpression creation at an ocSep token.
- bool mbVolatile; /// True = Formula contains volatile function.
- bool mbIsArrExp; /// True = ARR class is expected somewhere before.
- bool mbOk; /// Current state of the compiler.
-
- explicit XclExpCompData();
+ sal_uInt16 mnTokPos; /// Position of the token in the token array.
+ XclFuncParamConv meConv; /// Token class conversion type.
+ bool mbValType; /// Data type (false = REFTYPE, true = VALTYPE).
};
-XclExpCompData::XclExpCompData() :
- mpLinkMgr( 0 ),
- mpRefLog( 0 ),
- mpScBasePos( 0 ),
- mbOk( false )
+/** Vector of token position and conversion for all operands of an operator,
+ or for all parameters of a function. */
+struct XclExpOperandList : public ::std::vector< XclExpTokenConvInfo >
{
-}
-
-// ----------------------------------------------------------------------------
+ inline explicit XclExpOperandList() { reserve( 2 ); }
+ void AppendOperand( sal_uInt16 nTokPos, XclFuncParamConv eConv, bool bValType );
+};
-/** Working data for a processed Calc formula token. */
-struct XclExpTokenData
+void XclExpOperandList::AppendOperand( sal_uInt16 nTokPos, XclFuncParamConv eConv, bool bValType )
{
- const formula::FormulaToken*
- mpScToken; /// Currently processed Calc token.
- sal_uInt8 mnSpaces; /// Number of spaces before the Calc token.
+ resize( size() + 1 );
+ XclExpTokenConvInfo& rConvInfo = back();
+ rConvInfo.mnTokPos = nTokPos;
+ rConvInfo.meConv = eConv;
+ rConvInfo.mbValType = bValType;
+}
- inline explicit XclExpTokenData() : mpScToken( 0 ), mnSpaces( 0 ) {}
- inline bool Is() const { return mpScToken != 0; }
- inline formula::StackVar GetType() const { return mpScToken ? mpScToken->GetType() : static_cast< formula::StackVar >( svUnknown ); }
- inline OpCode GetOpCode() const { return mpScToken ? mpScToken->GetOpCode() : static_cast< OpCode >( ocNone ); }
-};
+typedef ScfRef< XclExpOperandList > XclExpOperandListRef;
+typedef ::std::vector< XclExpOperandListRef > XclExpOperandListVector;
// ----------------------------------------------------------------------------
@@ -175,87 +149,168 @@ class XclExpFuncData
{
public:
explicit XclExpFuncData(
- const XclExpTokenData& rTokData,
+ const XclExpScToken& rTokData,
const XclFunctionInfo& rFuncInfo,
- const XclExpExtFuncData& rExtFuncData,
- sal_uInt8 nExpRetClass );
+ const XclExpExtFuncData& rExtFuncData );
- inline const formula::FormulaToken& GetScToken() const { return *mrTokData.mpScToken; }
+ inline const FormulaToken& GetScToken() const { return *mrTokData.mpScToken; }
inline OpCode GetOpCode() const { return mrFuncInfo.meOpCode; }
inline sal_uInt16 GetXclFuncIdx() const { return mrFuncInfo.mnXclFunc; }
inline bool IsVolatile() const { return mrFuncInfo.IsVolatile(); }
+ inline bool IsFixedParamCount() const { return mrFuncInfo.IsFixedParamCount(); }
inline bool IsMacroFunc() const { return mrFuncInfo.IsMacroFunc(); }
inline sal_uInt8 GetSpaces() const { return mrTokData.mnSpaces; }
inline const XclExpExtFuncData& GetExtFuncData() const { return maExtFuncData; }
-
inline sal_uInt8 GetReturnClass() const { return mrFuncInfo.mnRetClass; }
- inline sal_uInt8 GetExpReturnClass() const { return mnExpRetClass; }
- inline sal_uInt8 GetExpParamClass() const { return mrFuncInfo.mpnParamClass[ mnClassIdx ]; }
- void IncExpParamClassIdx();
+ const XclFuncParamInfo& GetParamInfo() const;
+ bool IsCalcOnlyParam() const;
+ bool IsExcelOnlyParam() const;
+ void IncParamInfoIdx();
inline sal_uInt8 GetMinParamCount() const { return mrFuncInfo.mnMinParamCount; }
inline sal_uInt8 GetMaxParamCount() const { return mrFuncInfo.mnMaxParamCount; }
- inline sal_uInt8 GetParamCount() const { return mnParamCount; }
- inline void IncParamCount() { ++mnParamCount; }
+ inline sal_uInt8 GetParamCount() const { return static_cast< sal_uInt8 >( mxOperands->size() ); }
+ void FinishParam( sal_uInt16 nTokPos );
+ inline XclExpOperandListRef GetOperandList() const { return mxOperands; }
inline ScfUInt16Vec& GetAttrPosVec() { return maAttrPosVec; }
inline void AppendAttrPos( sal_uInt16 nPos ) { maAttrPosVec.push_back( nPos ); }
private:
ScfUInt16Vec maAttrPosVec; /// Token array positions of tAttr tokens.
- const XclExpTokenData& mrTokData; /// Data about processed function name token.
+ const XclExpScToken& mrTokData; /// Data about processed function name token.
const XclFunctionInfo& mrFuncInfo; /// Constant data about processed function.
XclExpExtFuncData maExtFuncData; /// Data for external functions (macro, add-in).
- sal_uInt8 mnExpRetClass; /// Expected token class for return value.
- sal_uInt8 mnClassIdx; /// Index into expected parameter class array of mrFuncInfo.
- sal_uInt8 mnParamCount; /// Current number of parameters of a function.
+ XclExpOperandListRef mxOperands; /// Class conversion and position of all parameters.
+ const XclFuncParamInfo* mpParamInfo; /// Information for current parameter.
};
-XclExpFuncData::XclExpFuncData(
- const XclExpTokenData& rTokData, const XclFunctionInfo& rFuncInfo,
- const XclExpExtFuncData& rExtFuncData, sal_uInt8 nExpRetClass ) :
+XclExpFuncData::XclExpFuncData( const XclExpScToken& rTokData,
+ const XclFunctionInfo& rFuncInfo, const XclExpExtFuncData& rExtFuncData ) :
mrTokData( rTokData ),
mrFuncInfo( rFuncInfo ),
maExtFuncData( rExtFuncData ),
- mnExpRetClass( nExpRetClass ),
- mnClassIdx( 0 ),
- mnParamCount( 0 )
+ mxOperands( new XclExpOperandList ),
+ mpParamInfo( rFuncInfo.mpParamInfos )
{
DBG_ASSERT( mrTokData.mpScToken, "XclExpFuncData::XclExpFuncData - missing core token" );
// set name of an add-in function
- if( !maExtFuncData.maFuncName.Len() && dynamic_cast< const formula::FormulaExternalToken* >( mrTokData.mpScToken ) )
+ if( (maExtFuncData.maFuncName.Len() == 0) && dynamic_cast< const FormulaExternalToken* >( mrTokData.mpScToken ) )
maExtFuncData.Set( GetScToken().GetExternal(), true, false );
}
-void XclExpFuncData::IncExpParamClassIdx()
+const XclFuncParamInfo& XclExpFuncData::GetParamInfo() const
{
- if( (mnClassIdx + 1 < EXC_FUNCINFO_CLASSCOUNT) && (mrFuncInfo.mpnParamClass[ mnClassIdx + 1 ] != EXC_TOKCLASS_NONE) )
- ++mnClassIdx;
+ static const XclFuncParamInfo saInvalidInfo = { EXC_PARAM_NONE, EXC_PARAMCONV_ORG, false };
+ return mpParamInfo ? *mpParamInfo : saInvalidInfo;
}
-// reference handling ---------------------------------------------------------
-
-namespace {
+bool XclExpFuncData::IsCalcOnlyParam() const
+{
+ return mpParamInfo && (mpParamInfo->meValid == EXC_PARAM_CALCONLY);
+}
-inline bool lclIsRefRel2D( const ScSingleRefData& rRefData )
+bool XclExpFuncData::IsExcelOnlyParam() const
{
- return rRefData.IsColRel() || rRefData.IsRowRel();
+ return mpParamInfo && (mpParamInfo->meValid == EXC_PARAM_EXCELONLY);
}
-inline bool lclIsRefDel2D( const ScSingleRefData& rRefData )
+void XclExpFuncData::IncParamInfoIdx()
{
- return rRefData.IsColDeleted() || rRefData.IsRowDeleted();
+ if( mpParamInfo )
+ {
+ // move pointer to next entry, if something explicit follows
+ if( (static_cast<size_t>(mpParamInfo - mrFuncInfo.mpParamInfos + 1) < EXC_FUNCINFO_PARAMINFO_COUNT) && (mpParamInfo[ 1 ].meValid != EXC_PARAM_NONE) )
+ ++mpParamInfo;
+ // if last parameter type is 'Excel-only' or 'Calc-only', do not repeat it
+ else if( IsExcelOnlyParam() || IsCalcOnlyParam() )
+ mpParamInfo = 0;
+ // otherwise: repeat last parameter class
+ }
}
-inline bool lclIsRefRel2D( const ScComplexRefData& rRefData )
+void XclExpFuncData::FinishParam( sal_uInt16 nTokPos )
{
- return lclIsRefRel2D( rRefData.Ref1 ) || lclIsRefRel2D( rRefData.Ref2 );
+ // write token class conversion info for this parameter
+ const XclFuncParamInfo& rParamInfo = GetParamInfo();
+ mxOperands->AppendOperand( nTokPos, rParamInfo.meConv, rParamInfo.mbValType );
+ // move to next parameter info structure
+ IncParamInfoIdx();
}
-inline bool lclIsRefDel2D( const ScComplexRefData& rRefData )
+// compiler configuration -----------------------------------------------------
+
+/** Type of token class handling. */
+enum XclExpFmlaClassType
{
- return lclIsRefDel2D( rRefData.Ref1 ) || lclIsRefDel2D( rRefData.Ref2 );
+ EXC_CLASSTYPE_CELL, /// Cell formula, shared formula.
+ EXC_CLASSTYPE_ARRAY, /// Array formula, conditional formatting, data validation.
+ EXC_CLASSTYPE_NAME /// Defined name, range list.
+};
+
+/** Configuration data of the formula compiler. */
+struct XclExpCompConfig
+{
+ XclFormulaType meType; /// Type of the formula to be created.
+ XclExpFmlaClassType meClassType; /// Token class handling type.
+ bool mbLocalLinkMgr; /// True = local (per-sheet) link manager, false = global.
+ bool mbFromCell; /// True = Any kind of cell formula (cell, array, shared).
+ bool mb3DRefOnly; /// True = Only 3D references allowed (e.g. names).
+ bool mbAllowArrays; /// True = Allow inline arrays.
+};
+
+/** The table containing configuration data for all formula types. */
+static const XclExpCompConfig spConfigTable[] =
+{
+ // formula type token class type lclLM inCell 3dOnly allowArray
+ { EXC_FMLATYPE_CELL, EXC_CLASSTYPE_CELL, true, true, false, true },
+ { EXC_FMLATYPE_SHARED, EXC_CLASSTYPE_CELL, true, true, false, true },
+ { EXC_FMLATYPE_MATRIX, EXC_CLASSTYPE_ARRAY, true, true, false, true },
+ { EXC_FMLATYPE_CONDFMT, EXC_CLASSTYPE_ARRAY, true, false, false, false },
+ { EXC_FMLATYPE_DATAVAL, EXC_CLASSTYPE_ARRAY, true, false, false, false },
+ { EXC_FMLATYPE_NAME, EXC_CLASSTYPE_NAME, false, false, true, true },
+ { EXC_FMLATYPE_CHART, EXC_CLASSTYPE_NAME, true, false, true, true },
+ { EXC_FMLATYPE_CONTROL, EXC_CLASSTYPE_NAME, true, false, false, false },
+ { EXC_FMLATYPE_WQUERY, EXC_CLASSTYPE_NAME, true, false, true, false },
+ { EXC_FMLATYPE_LISTVAL, EXC_CLASSTYPE_NAME, true, false, false, false }
+};
+
+// ----------------------------------------------------------------------------
+
+/** Working data of the formula compiler. Used to push onto a stack for recursive calls. */
+struct XclExpCompData
+{
+ typedef ScfRef< ScTokenArray > ScTokenArrayRef;
+
+ const XclExpCompConfig& mrCfg; /// Configuration for current formula type.
+ ScTokenArrayRef mxOwnScTokArr; /// Own clone of a Calc token array.
+ XclTokenArrayIterator maTokArrIt; /// Iterator in Calc token array.
+ XclExpLinkManager* mpLinkMgr; /// Link manager for current context (local/global).
+ XclExpRefLog* mpRefLog; /// Log for external references.
+ const ScAddress* mpScBasePos; /// Current cell position of the formula.
+
+ ScfUInt8Vec maTokVec; /// Byte vector containing token data.
+ ScfUInt8Vec maExtDataVec; /// Byte vector containing extended data (arrays, stacked NLRs).
+ XclExpOperandListVector maOpListVec; /// Formula structure, maps operators to their operands.
+ ScfUInt16Vec maOpPosStack; /// Stack with positions of operand tokens waiting for an operator.
+ bool mbStopAtSep; /// True = Stop subexpression creation at an ocSep token.
+ bool mbVolatile; /// True = Formula contains volatile function.
+ bool mbOk; /// Current state of the compiler.
+
+ explicit XclExpCompData( const XclExpCompConfig* pCfg );
+};
+
+XclExpCompData::XclExpCompData( const XclExpCompConfig* pCfg ) :
+ mrCfg( pCfg ? *pCfg : spConfigTable[ 0 ] ),
+ mpLinkMgr( 0 ),
+ mpRefLog( 0 ),
+ mpScBasePos( 0 ),
+ mbStopAtSep( false ),
+ mbVolatile( false ),
+ mbOk( pCfg != 0 )
+{
+ DBG_ASSERT( pCfg, "XclExpFmlaCompImpl::Init - unknown formula type" );
}
} // namespace
@@ -263,7 +318,7 @@ inline bool lclIsRefDel2D( const ScComplexRefData& rRefData )
// ----------------------------------------------------------------------------
/** Implementation class of the export formula compiler. */
-class XclExpFmlaCompImpl : protected XclExpRoot, protected XclTokenArrayHelper, private XclExpCompData
+class XclExpFmlaCompImpl : protected XclExpRoot, protected XclTokenArrayHelper
{
public:
explicit XclExpFmlaCompImpl( const XclExpRoot& rRoot );
@@ -285,64 +340,64 @@ public:
// ------------------------------------------------------------------------
private:
const XclExpCompConfig* GetConfigForType( XclFormulaType eType ) const;
- inline sal_uInt16 GetSize() const { return static_cast< sal_uInt16 >( maTokVec.size() ); }
+ inline sal_uInt16 GetSize() const { return static_cast< sal_uInt16 >( mxData->maTokVec.size() ); }
- void EnterRecursive();
void Init( XclFormulaType eType );
void Init( XclFormulaType eType, const ScTokenArray& rScTokArr,
const ScAddress* pScBasePos, XclExpRefLog* pRefLog );
- void LeaveRecursive();
- void FinalizeFormula( ScfUInt8Vec & rExtensionTokens );
- void AppendInlineArrays( ScfUInt8Vec & rExtensionTokens );
- XclTokenArrayRef CreateTokenArray( ScfUInt8Vec* pExtensionTokens = NULL );
+ void RecalcTokenClasses();
+ void RecalcTokenClass( const XclExpTokenConvInfo& rConvInfo, XclFuncParamConv ePrevConv, XclExpClassConv ePrevClassConv, bool bWasRefClass );
+
+ void FinalizeFormula();
+ XclTokenArrayRef CreateTokenArray();
// compiler ---------------------------------------------------------------
- // XclExpTokenData: pass-by-value and return-by-value is intended
-
- const formula::FormulaToken* GetNextRawToken();
- const formula::FormulaToken* PeekNextRawToken( bool bSkipSpaces ) const;
-
- bool GetNextToken( XclExpTokenData& rTokData );
- XclExpTokenData GetNextToken();
-
- XclExpTokenData Expression( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses, bool bStopAtSep );
- XclExpTokenData SkipExpression( XclExpTokenData aTokData, bool bStopAtSep );
-
- XclExpTokenData OrTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses );
- XclExpTokenData AndTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses );
- XclExpTokenData CompareTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses );
- XclExpTokenData ConcatTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses );
- XclExpTokenData AddSubTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses );
- XclExpTokenData MulDivTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses );
- XclExpTokenData PowTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses );
- XclExpTokenData UnaryPostTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses );
- XclExpTokenData UnaryPreTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses );
- XclExpTokenData ListTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses );
- XclExpTokenData IntersectTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool& rbHasRefOp );
- XclExpTokenData RangeTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool& rbHasRefOp );
- XclExpTokenData Factor( XclExpTokenData aTokData, sal_uInt8 nExpClass );
+ // XclExpScToken: pass-by-value and return-by-value is intended
+
+ const FormulaToken* GetNextRawToken();
+ const FormulaToken* PeekNextRawToken( bool bSkipSpaces ) const;
+
+ bool GetNextToken( XclExpScToken& rTokData );
+ XclExpScToken GetNextToken();
+
+ XclExpScToken Expression( XclExpScToken aTokData, bool bInParentheses, bool bStopAtSep );
+ XclExpScToken SkipExpression( XclExpScToken aTokData, bool bStopAtSep );
+
+ XclExpScToken OrTerm( XclExpScToken aTokData, bool bInParentheses );
+ XclExpScToken AndTerm( XclExpScToken aTokData, bool bInParentheses );
+ XclExpScToken CompareTerm( XclExpScToken aTokData, bool bInParentheses );
+ XclExpScToken ConcatTerm( XclExpScToken aTokData, bool bInParentheses );
+ XclExpScToken AddSubTerm( XclExpScToken aTokData, bool bInParentheses );
+ XclExpScToken MulDivTerm( XclExpScToken aTokData, bool bInParentheses );
+ XclExpScToken PowTerm( XclExpScToken aTokData, bool bInParentheses );
+ XclExpScToken UnaryPostTerm( XclExpScToken aTokData, bool bInParentheses );
+ XclExpScToken UnaryPreTerm( XclExpScToken aTokData, bool bInParentheses );
+ XclExpScToken ListTerm( XclExpScToken aTokData, bool bInParentheses );
+ XclExpScToken IntersectTerm( XclExpScToken aTokData, bool& rbHasRefOp );
+ XclExpScToken RangeTerm( XclExpScToken aTokData, bool& rbHasRefOp );
+ XclExpScToken Factor( XclExpScToken aTokData );
// formula structure ------------------------------------------------------
- void ProcessDouble( const XclExpTokenData& rTokData );
- void ProcessString( const XclExpTokenData& rTokData );
- void ProcessError( const XclExpTokenData& rTokData );
- void ProcessMissing( const XclExpTokenData& rTokData );
- void ProcessBad( const XclExpTokenData& rTokData );
- void ProcessParentheses( const XclExpTokenData& rTokData, sal_uInt8 nExpClass );
- void ProcessBoolean( const XclExpTokenData& rTokData );
- void ProcessDdeLink( const XclExpTokenData& rTokData, sal_uInt8 nExpClass );
- void ProcessExternal( const XclExpTokenData& rTokData, sal_uInt8 nExpClass );
- void ProcessExternalName( const XclExpTokenData& rTokData, sal_uInt8 nExpClass );
-
- void ProcessFunction( const XclExpTokenData& rTokData, sal_uInt8 nExpClass );
+ void ProcessDouble( const XclExpScToken& rTokData );
+ void ProcessString( const XclExpScToken& rTokData );
+ void ProcessError( const XclExpScToken& rTokData );
+ void ProcessMissing( const XclExpScToken& rTokData );
+ void ProcessBad( const XclExpScToken& rTokData );
+ void ProcessParentheses( const XclExpScToken& rTokData );
+ void ProcessBoolean( const XclExpScToken& rTokData );
+ void ProcessDdeLink( const XclExpScToken& rTokData );
+ void ProcessExternal( const XclExpScToken& rTokData );
+ void ProcessMatrix( const XclExpScToken& rTokData );
+
+ void ProcessFunction( const XclExpScToken& rTokData );
void PrepareFunction( XclExpFuncData& rFuncData );
void FinishFunction( XclExpFuncData& rFuncData, sal_uInt8 nCloseSpaces );
void FinishIfFunction( XclExpFuncData& rFuncData );
void FinishChooseFunction( XclExpFuncData& rFuncData );
- XclExpTokenData ProcessParam( XclExpTokenData aTokData, XclExpFuncData& rFuncData );
+ XclExpScToken ProcessParam( XclExpScToken aTokData, XclExpFuncData& rFuncData );
void PrepareParam( XclExpFuncData& rFuncData );
void FinishParam( XclExpFuncData& rFuncData );
void AppendDefaultParam( XclExpFuncData& rFuncData );
@@ -360,28 +415,20 @@ private:
bool bNatLangRef ) const;
XclExpRefLogEntry* GetNewRefLogEntry();
- void ProcessCellRef( const XclExpTokenData& rTokData, sal_uInt8 nExpClass );
- void ProcessRangeRef( const XclExpTokenData& rTokData, sal_uInt8 nExpClass );
- void ProcessMatrix( const XclExpTokenData& rTokData, sal_uInt8 nExpClass );
- void ProcessDefinedName( const XclExpTokenData& rTokData, sal_uInt8 nExpClass );
- void ProcessDatabaseArea( const XclExpTokenData& rTokData, sal_uInt8 nExpClass );
-
- // token identifiers ------------------------------------------------------
-
- void SetReplaceTokenClasses();
- void SetArrExpFlag( bool bIsArrExp );
- void UpdateArrExpFlag( sal_uInt8 nParamExpClass, sal_uInt8 nFuncRetClass );
-
- void AdjustTokenClass( sal_uInt8& rnTokenId, sal_uInt8 nExpClass );
- void AdjustLastTokenClass( sal_uInt8 nExpClass );
- void AdjustLastTokenClassForEastereggOp();
-
- void AppendOpTokenId( sal_uInt8 nTokenId, sal_uInt8 nExpClass, sal_uInt8 nSpaces = 0 );
-//UNUSED2008-05 void AppendFuncTokenId( sal_uInt16 nXclFuncIdx, sal_uInt8 nRetClass, sal_uInt8 nExpRetClass, sal_uInt8 nSpaces = 0 );
- void AppendVarFuncTokenId( sal_uInt16 nXclFuncIdx, sal_uInt8 nRetClass, sal_uInt8 nExpRetClass, sal_uInt8 nParamCount, sal_uInt8 nSpaces = 0 );
+ void ProcessCellRef( const XclExpScToken& rTokData );
+ void ProcessRangeRef( const XclExpScToken& rTokData );
+ void ProcessExternalCellRef( const XclExpScToken& rTokData );
+ void ProcessExternalRangeRef( const XclExpScToken& rTokData );
+ void ProcessDefinedName( const XclExpScToken& rTokData );
+ void ProcessExternalName( const XclExpScToken& rTokData );
+ void ProcessDatabaseArea( const XclExpScToken& rTokData );
// token vector -----------------------------------------------------------
+ void PushOperandPos( sal_uInt16 nTokPos );
+ void PushOperatorPos( sal_uInt16 nTokPos, const XclExpOperandListRef& rxOperands );
+ sal_uInt16 PopOperandPos();
+
void Append( sal_uInt8 nData );
void Append( sal_uInt8 nData, size_t nCount );
void Append( sal_uInt16 nData );
@@ -393,21 +440,30 @@ private:
void AppendRange( const XclRange& rXclRange );
void AppendSpaceToken( sal_uInt8 nType, sal_uInt8 nCount );
+
+ void AppendOperandTokenId( sal_uInt8 nTokenId, sal_uInt8 nSpaces = 0 );
void AppendIntToken( sal_uInt16 nValue, sal_uInt8 nSpaces = 0 );
void AppendNumToken( double fValue, sal_uInt8 nSpaces = 0 );
void AppendBoolToken( bool bValue, sal_uInt8 nSpaces = 0 );
void AppendErrorToken( sal_uInt8 nErrCode, sal_uInt8 nSpaces = 0 );
void AppendMissingToken( sal_uInt8 nSpaces = 0 );
- void AppendNameToken( sal_uInt16 nNameIdx, sal_uInt8 nExpClass, sal_uInt8 nSpaces = 0 );
- void AppendMissingNameToken( const String& rName, sal_uInt8 nExpClass, sal_uInt8 nSpaces = 0 );
- void AppendNameXToken( sal_uInt16 nExtSheet, sal_uInt16 nExtName, sal_uInt8 nExpClass, sal_uInt8 nSpaces = 0 );
- void AppendMacroCallToken( const XclExpExtFuncData& rExtFuncData, sal_uInt8 nExpClass, sal_uInt8 nSpaces = 0 );
- void AppendAddInFuncToken( const XclExpExtFuncData& rExtFuncData, sal_uInt8 nExpClass, sal_uInt8 nSpaces = 0 );
- void AppendEuroToolFuncToken( const XclExpExtFuncData& rExtFuncData, sal_uInt8 nExpClass, sal_uInt8 nSpaces = 0 );
+ void AppendNameToken( sal_uInt16 nNameIdx, sal_uInt8 nSpaces = 0 );
+ void AppendMissingNameToken( const String& rName, sal_uInt8 nSpaces = 0 );
+ void AppendNameXToken( sal_uInt16 nExtSheet, sal_uInt16 nExtName, sal_uInt8 nSpaces = 0 );
+ void AppendMacroCallToken( const XclExpExtFuncData& rExtFuncData, sal_uInt8 nSpaces = 0 );
+ void AppendAddInCallToken( const XclExpExtFuncData& rExtFuncData, sal_uInt8 nSpaces = 0 );
+ void AppendEuroToolCallToken( const XclExpExtFuncData& rExtFuncData, sal_uInt8 nSpaces = 0 );
+
+ void AppendOperatorTokenId( sal_uInt8 nTokenId, const XclExpOperandListRef& rxOperands, sal_uInt8 nSpaces = 0 );
+ void AppendUnaryOperatorToken( sal_uInt8 nTokenId, sal_uInt8 nSpaces = 0 );
+ void AppendBinaryOperatorToken( sal_uInt8 nTokenId, bool bValType, sal_uInt8 nSpaces = 0 );
+ void AppendLogicalOperatorToken( sal_uInt16 nXclFuncIdx, sal_uInt8 nOpCount );
+ void AppendFuncToken( const XclExpFuncData& rFuncData );
+
void AppendParenToken( sal_uInt8 nOpenSpaces = 0, sal_uInt8 nCloseSpaces = 0 );
void AppendJumpToken( XclExpFuncData& rFuncData, sal_uInt8 nAttrType );
- void Insert( sal_uInt16 nInsertPos, sal_uInt16 nInsertSize );
+ void InsertZeros( sal_uInt16 nInsertPos, sal_uInt16 nInsertSize );
void Overwrite( sal_uInt16 nWriteToPos, sal_uInt16 nOffset );
void UpdateAttrGoto( sal_uInt16 nAttrPos );
@@ -415,14 +471,23 @@ private:
bool IsSpaceToken( sal_uInt16 nPos ) const;
void RemoveTrailingParen();
+ void AppendExt( sal_uInt8 nData );
+ void AppendExt( sal_uInt8 nData, size_t nCount );
+ void AppendExt( sal_uInt16 nData );
+ void AppendExt( sal_uInt32 nData );
+ void AppendExt( double fData );
+ void AppendExt( const String& rString );
+
// ------------------------------------------------------------------------
private:
typedef ::std::map< XclFormulaType, XclExpCompConfig > XclExpCompConfigMap;
- typedef ::std::list< XclExpCompData > XclExpCompDataList;
+ typedef ScfRef< XclExpCompData > XclExpCompDataRef;
+ typedef ::std::vector< XclExpCompDataRef > XclExpCompDataVector;
XclExpCompConfigMap maCfgMap; /// Compiler configuration map for all formula types.
XclFunctionProvider maFuncProv; /// Excel function data provider.
- XclExpCompDataList maCompDataList; /// List for working data, when compiler is called recursively.
+ XclExpCompDataRef mxData; /// Working data for current formula.
+ XclExpCompDataVector maDataStack; /// Stack for working data, when compiler is called recursively.
const XclBiff meBiff; /// Cached BIFF version to save GetBiff() calls.
const SCsCOL mnMaxAbsCol; /// Maximum column index.
const SCsROW mnMaxAbsRow; /// Maximum row index.
@@ -430,31 +495,8 @@ private:
const SCsROW mnMaxScRow; /// Maximum row index in Calc itself.
const sal_uInt16 mnMaxColMask; /// Mask to delete invalid bits in column fields.
const sal_uInt16 mnMaxRowMask; /// Mask to delete invalid bits in row fields.
- bool mbRunning; /// true = compiler already running (for recursive calls).
-};
-
-// ----------------------------------------------------------------------------
-
-namespace {
-
-/** The table containing configuration data for all formula types. */
-static const XclExpCompConfig spConfigTable[] =
-{
- // formula type token class type link manager type inCell 3dOnly allowArray
- { EXC_FMLATYPE_CELL, EXC_CLASSTYPE_CELL, EXC_LINKMGRTYPE_LOCAL, true, false, true },
- { EXC_FMLATYPE_SHARED, EXC_CLASSTYPE_CELL, EXC_LINKMGRTYPE_LOCAL, true, false, true },
- { EXC_FMLATYPE_MATRIX, EXC_CLASSTYPE_ARRAY, EXC_LINKMGRTYPE_LOCAL, true, false, true },
- { EXC_FMLATYPE_CONDFMT, EXC_CLASSTYPE_ARRAY, EXC_LINKMGRTYPE_NONE, false, false, false },
- { EXC_FMLATYPE_DATAVAL, EXC_CLASSTYPE_ARRAY, EXC_LINKMGRTYPE_NONE, false, false, false },
- { EXC_FMLATYPE_NAME, EXC_CLASSTYPE_NAME, EXC_LINKMGRTYPE_GLOBAL, false, true, true },
- { EXC_FMLATYPE_CHART, EXC_CLASSTYPE_NAME, EXC_LINKMGRTYPE_LOCAL, false, true, true },
- { EXC_FMLATYPE_CONTROL, EXC_CLASSTYPE_NAME, EXC_LINKMGRTYPE_LOCAL, false, false, false },
- { EXC_FMLATYPE_WQUERY, EXC_CLASSTYPE_NAME, EXC_LINKMGRTYPE_LOCAL, false, true, false },
- { EXC_FMLATYPE_LISTVAL, EXC_CLASSTYPE_NAME, EXC_LINKMGRTYPE_NONE, false, false, false }
};
-} // namespace
-
// ----------------------------------------------------------------------------
XclExpFmlaCompImpl::XclExpFmlaCompImpl( const XclExpRoot& rRoot ) :
@@ -466,8 +508,7 @@ XclExpFmlaCompImpl::XclExpFmlaCompImpl( const XclExpRoot& rRoot ) :
mnMaxScCol( static_cast< SCsCOL >( rRoot.GetScMaxPos().Col() ) ),
mnMaxScRow( static_cast< SCsROW >( rRoot.GetScMaxPos().Row() ) ),
mnMaxColMask( static_cast< sal_uInt16 >( rRoot.GetXclMaxPos().Col() ) ),
- mnMaxRowMask( static_cast< sal_uInt16 >( rRoot.GetXclMaxPos().Row() ) ),
- mbRunning( false )
+ mnMaxRowMask( static_cast< sal_uInt16 >( rRoot.GetXclMaxPos().Row() ) )
{
// build the configuration map
for( const XclExpCompConfig* pEntry = spConfigTable; pEntry != STATIC_TABLE_END( spConfigTable ); ++pEntry )
@@ -481,9 +522,9 @@ XclTokenArrayRef XclExpFmlaCompImpl::CreateFormula( XclFormulaType eType,
Init( eType, rScTokArr, pScBasePos, pRefLog );
// start compilation, if initialization didn't fail
- if( mbOk )
+ if( mxData->mbOk )
{
- XclExpTokenData aTokData( GetNextToken() );
+ XclExpScToken aTokData( GetNextToken() );
USHORT nScError = rScTokArr.GetCodeError();
if( (nScError != 0) && (!aTokData.Is() || (aTokData.GetOpCode() == ocStop)) )
{
@@ -492,29 +533,28 @@ XclTokenArrayRef XclExpFmlaCompImpl::CreateFormula( XclFormulaType eType,
}
else if( aTokData.Is() )
{
- // expected class is VAL in cell and array formulas, and REF in names
- sal_uInt8 nExpClass = (maCfg.meClassType == EXC_CLASSTYPE_NAME) ? EXC_TOKCLASS_REF : EXC_TOKCLASS_VAL;
- aTokData = Expression( aTokData, nExpClass, false, false );
+ aTokData = Expression( aTokData, false, false );
}
else
{
DBG_ERRORFILE( "XclExpFmlaCompImpl::CreateFormula - empty token array" );
- mbOk = false;
+ mxData->mbOk = false;
}
- if( mbOk )
+ if( mxData->mbOk )
{
// #i44907# auto-generated SUBTOTAL formula cells have trailing ocStop token
- mbOk = !aTokData.Is() || (aTokData.GetOpCode() == ocStop);
- DBG_ASSERT( mbOk, "XclExpFmlaCompImpl::CreateFormula - unknown garbage behind formula" );
+ mxData->mbOk = !aTokData.Is() || (aTokData.GetOpCode() == ocStop);
+ DBG_ASSERT( mxData->mbOk, "XclExpFmlaCompImpl::CreateFormula - unknown garbage behind formula" );
}
}
- // finalizing, e.g. add tAttrVolatile token, and storing any inline arrays
- ScfUInt8Vec aExtensionTokens;
- FinalizeFormula( aExtensionTokens );
+ // finalize (add tAttrVolatile token, calculate all token classes)
+ RecalcTokenClasses();
+ FinalizeFormula();
- return CreateTokenArray( &aExtensionTokens );
+ // leave recursive call, create and return the final token array
+ return CreateTokenArray();
}
XclTokenArrayRef XclExpFmlaCompImpl::CreateErrorFormula( sal_uInt8 nErrCode )
@@ -527,7 +567,7 @@ XclTokenArrayRef XclExpFmlaCompImpl::CreateErrorFormula( sal_uInt8 nErrCode )
XclTokenArrayRef XclExpFmlaCompImpl::CreateSpecialRefFormula( sal_uInt8 nTokenId, const XclAddress& rXclPos )
{
Init( EXC_FMLATYPE_NAME );
- AppendOpTokenId( nTokenId, EXC_TOKCLASS_NONE );
+ AppendOperandTokenId( nTokenId );
Append( rXclPos.mnRow );
Append( rXclPos.mnCol ); // do not use AppendAddress(), we always need 16-bit column here
return CreateTokenArray();
@@ -536,7 +576,7 @@ XclTokenArrayRef XclExpFmlaCompImpl::CreateSpecialRefFormula( sal_uInt8 nTokenId
XclTokenArrayRef XclExpFmlaCompImpl::CreateNameXFormula( sal_uInt16 nExtSheet, sal_uInt16 nExtName )
{
Init( EXC_FMLATYPE_NAME );
- AppendNameXToken( nExtSheet, nExtName, EXC_TOKCLASS_NONE );
+ AppendNameXToken( nExtSheet, nExtName );
return CreateTokenArray();
}
@@ -555,47 +595,13 @@ const XclExpCompConfig* XclExpFmlaCompImpl::GetConfigForType( XclFormulaType eTy
return (aIt == maCfgMap.end()) ? 0 : &aIt->second;
}
-void XclExpFmlaCompImpl::EnterRecursive()
-{
- if( mbRunning )
- // compiler invoked recursively - store old working data
- maCompDataList.push_back( static_cast< const XclExpCompData& >( *this ) );
- else
- mbRunning = true;
-}
-
void XclExpFmlaCompImpl::Init( XclFormulaType eType )
{
// compiler invoked recursively? - store old working data
- EnterRecursive();
-
- // compiler configuration
- const XclExpCompConfig* pCfg = GetConfigForType( eType );
- mbOk = pCfg != 0;
- DBG_ASSERT( mbOk, "XclExpFmlaCompImpl::Init - unknown formula type" );
- if( mbOk )
- {
- // copy config data to own member
- maCfg = *pCfg;
-
- // reset per-formula data
- maTokVec.clear();
- mxOwnScTokArr.reset();
- maTokArrIt.Init();
- mpLinkMgr = 0;
- mpRefLog = 0;
- mxInlineArr.reset();
-
- mpScBasePos = 0;
-
- // init processing data used during compilation
- mnLastTokPos = SAL_MAX_UINT16;
- mnLastDefClass = EXC_TOKCLASS_NONE;
- mbStopAtSep = false;
- mbVolatile = false;
- mbIsArrExp = false;
- SetReplaceTokenClasses(); // initializes the token class variables for AdjustTokenClass()
- }
+ if( mxData.get() )
+ maDataStack.push_back( mxData );
+ // new compiler working data structure
+ mxData.reset( new XclExpCompData( GetConfigForType( eType ) ) );
}
void XclExpFmlaCompImpl::Init( XclFormulaType eType, const ScTokenArray& rScTokArr,
@@ -605,199 +611,222 @@ void XclExpFmlaCompImpl::Init( XclFormulaType eType, const ScTokenArray& rScTokA
Init( eType );
// special initialization
- if( mbOk ) switch( maCfg.meType )
+ if( mxData->mbOk ) switch( mxData->mrCfg.meType )
{
case EXC_FMLATYPE_CELL:
case EXC_FMLATYPE_MATRIX:
case EXC_FMLATYPE_CHART:
- mbOk = pScBasePos != 0;
- DBG_ASSERT( mbOk, "XclExpFmlaCompImpl::Init - missing cell address" );
- mpScBasePos = pScBasePos;
+ mxData->mbOk = pScBasePos != 0;
+ DBG_ASSERT( mxData->mbOk, "XclExpFmlaCompImpl::Init - missing cell address" );
+ mxData->mpScBasePos = pScBasePos;
break;
case EXC_FMLATYPE_SHARED:
- mbOk = pScBasePos != 0;
- DBG_ASSERT( mbOk, "XclExpFmlaCompImpl::Init - missing cell address" );
+ mxData->mbOk = pScBasePos != 0;
+ DBG_ASSERT( mxData->mbOk, "XclExpFmlaCompImpl::Init - missing cell address" );
// clone the passed token array, convert references relative to current cell position
- mxOwnScTokArr.reset( rScTokArr.Clone() );
- ScCompiler::MoveRelWrap( *mxOwnScTokArr, GetDocPtr(), *pScBasePos, MAXCOL, MAXROW );
- // don't remember pScBasePos in mpScBasePos, shared formulas use real relative refs
+ mxData->mxOwnScTokArr.reset( rScTokArr.Clone() );
+ ScCompiler::MoveRelWrap( *mxData->mxOwnScTokArr, GetDocPtr(), *pScBasePos, MAXCOL, MAXROW );
+ // don't remember pScBasePos in mxData->mpScBasePos, shared formulas use real relative refs
break;
default:;
}
- if( mbOk )
+ if( mxData->mbOk )
{
// link manager to be used
- switch( maCfg.meLinkMgrType )
- {
- case EXC_LINKMGRTYPE_NONE: mpLinkMgr = 0; break;
- case EXC_LINKMGRTYPE_LOCAL: mpLinkMgr = &GetLocalLinkManager(); break;
- case EXC_LINKMGRTYPE_GLOBAL: mpLinkMgr = &GetGlobalLinkManager(); break;
- }
+ mxData->mpLinkMgr = mxData->mrCfg.mbLocalLinkMgr ? &GetLocalLinkManager() : &GetGlobalLinkManager();
// token array iterator (use cloned token array if present)
- maTokArrIt.Init( mxOwnScTokArr.is() ? *mxOwnScTokArr : rScTokArr, false );
- mpRefLog = pRefLog;
+ mxData->maTokArrIt.Init( mxData->mxOwnScTokArr.is() ? *mxData->mxOwnScTokArr : rScTokArr, false );
+ mxData->mpRefLog = pRefLog;
}
}
-void XclExpFmlaCompImpl::LeaveRecursive()
+void XclExpFmlaCompImpl::RecalcTokenClasses()
{
- mbRunning = !maCompDataList.empty();
- if( mbRunning )
+ if( mxData->mbOk )
{
- // compiler invoked recursively - restore old working data
- static_cast< XclExpCompData& >( *this ) = maCompDataList.back();
- maCompDataList.pop_back();
+ mxData->mbOk = mxData->maOpPosStack.size() == 1;
+ DBG_ASSERT( mxData->mbOk, "XclExpFmlaCompImpl::RecalcTokenClasses - position of root token expected on stack" );
+ if( mxData->mbOk )
+ {
+ /* Cell and array formulas start with VAL conversion and VALTYPE
+ parameter type, defined names start with ARR conversion and
+ REFTYPE parameter type for the root token. */
+ XclExpOperandList aOperands;
+ bool bNameFmla = mxData->mrCfg.meClassType == EXC_CLASSTYPE_NAME;
+ XclFuncParamConv eParamConv = bNameFmla ? EXC_PARAMCONV_ARR : EXC_PARAMCONV_VAL;
+ XclExpClassConv eClassConv = bNameFmla ? EXC_CLASSCONV_ARR : EXC_CLASSCONV_VAL;
+ XclExpTokenConvInfo aConvInfo = { PopOperandPos(), eParamConv, !bNameFmla };
+ RecalcTokenClass( aConvInfo, eParamConv, eClassConv, bNameFmla );
+ }
+
+ // clear operand vectors (calls to the expensive InsertZeros() may follow)
+ mxData->maOpListVec.clear();
+ mxData->maOpPosStack.clear();
}
}
-void XclExpFmlaCompImpl::AppendInlineArrays( ScfUInt8Vec& rExtensionTokens )
+void XclExpFmlaCompImpl::RecalcTokenClass( const XclExpTokenConvInfo& rConvInfo,
+ XclFuncParamConv ePrevConv, XclExpClassConv ePrevClassConv, bool bWasRefClass )
{
- // The const_cast is needed, otherwise MS and Sun compilers can't promote
- // the non-const iterators obtained via ScMatrixList* to const iterators.
- const ScMatrixList* pList = const_cast< const ScMatrixList* >( mxInlineArr.get() );
- for( ScMatrixList::const_reverse_iterator aIt = pList->rbegin(), aEnd = pList->rend(); aIt != aEnd ; ++aIt )
- {
- const ScMatrix* pMatrix = *aIt;
- SCSIZE nC, nMaxC, nR, nMaxR;
+ DBG_ASSERT( rConvInfo.mnTokPos < GetSize(), "XclExpFmlaCompImpl::RecalcTokenClass - invalid token position" );
+ sal_uInt8& rnTokenId = mxData->maTokVec[ rConvInfo.mnTokPos ];
+ sal_uInt8 nTokClass = GetTokenClass( rnTokenId );
- pMatrix->GetDimensions( nMaxC, nMaxR );
+ // REF tokens in VALTYPE parameters behave like VAL tokens
+ if( rConvInfo.mbValType && (nTokClass == EXC_TOKCLASS_REF) )
+ ChangeTokenClass( rnTokenId, nTokClass = EXC_TOKCLASS_VAL );
- if( meBiff == EXC_BIFF8 )
- {
- rExtensionTokens.push_back( sal::static_int_cast<sal_uInt8>( nMaxC - 1 ) );
- rExtensionTokens.resize( rExtensionTokens.size() + 2 );
- ShortToSVBT16( static_cast< USHORT >( nMaxR - 1 ), &*(rExtensionTokens.end() - 2) );
- }
- else
- {
- rExtensionTokens.push_back( static_cast< sal_uInt8 >( (nMaxC == 256) ? 0 : nMaxC ) );
- rExtensionTokens.resize( rExtensionTokens.size() + 2 );
- ShortToSVBT16( static_cast< USHORT >( nMaxR ), &*(rExtensionTokens.end() - 2) );
- }
+ // replace RPO conversion of operator with parent conversion
+ XclFuncParamConv eConv = (rConvInfo.meConv == EXC_PARAMCONV_RPO) ? ePrevConv : rConvInfo.meConv;
- for( nR = 0 ; nR < nMaxR ; nR++)
- {
- for( nC = 0 ; nC < nMaxC ; nC++)
+ // find the effective token class conversion to be performed for this token
+ XclExpClassConv eClassConv = EXC_CLASSCONV_ORG;
+ switch( eConv )
+ {
+ case EXC_PARAMCONV_ORG:
+ // conversion is forced independent of parent conversion
+ eClassConv = EXC_CLASSCONV_ORG;
+ break;
+ case EXC_PARAMCONV_VAL:
+ // conversion is forced independent of parent conversion
+ eClassConv = EXC_CLASSCONV_VAL;
+ break;
+ case EXC_PARAMCONV_ARR:
+ // conversion is forced independent of parent conversion
+ eClassConv = EXC_CLASSCONV_ARR;
+ break;
+ case EXC_PARAMCONV_RPT:
+ switch( ePrevConv )
{
- if( pMatrix->IsValue( nC, nR ) )
- {
- ScMatValType nType;
- const ScMatrixValue* pVal = pMatrix->Get( nC, nR, nType);
-
- if( nType == SC_MATVAL_BOOLEAN )
- {
- rExtensionTokens.push_back( EXC_CACHEDVAL_BOOL );
-
- rExtensionTokens.resize( rExtensionTokens.size() + 8 );
- const bool bVal = ! ::rtl::math::approxEqual( pVal->fVal, 0. );
- UInt32ToSVBT32( bVal ? 1 : 0, &*(rExtensionTokens.end() - 8) );
- UInt32ToSVBT32( 0, &*(rExtensionTokens.end() - 4) );
- }
- else
- {
- USHORT nErr = pVal->GetError();
- if( nErr )
- {
- rExtensionTokens.push_back( EXC_CACHEDVAL_ERROR );
-
- rExtensionTokens.resize( rExtensionTokens.size() + 8 );
- UInt32ToSVBT32( XclTools::GetXclErrorCode ( nErr ),
- &*(rExtensionTokens.end() - 8) );
- UInt32ToSVBT32( 0, &*(rExtensionTokens.end() - 4) );
- }
- else
- {
- rExtensionTokens.push_back( EXC_CACHEDVAL_DOUBLE );
-
- const double nVal = pMatrix->GetDouble( nC, nR );
- rExtensionTokens.resize( rExtensionTokens.size() + 8 );
- DoubleToSVBT64( nVal, &*(rExtensionTokens.end() - 8) );
- }
- }
- }
- else if( pMatrix->IsEmpty( nC, nR ) )
- {
- rExtensionTokens.push_back( EXC_CACHEDVAL_EMPTY );
-
- rExtensionTokens.resize( rExtensionTokens.size() + 8 );
- UInt32ToSVBT32( 0, &*(rExtensionTokens.end() - 8) );
- UInt32ToSVBT32( 0, &*(rExtensionTokens.end() - 4) );
- }
- else if( pMatrix->IsString( nC, nR ) )
- {
- rExtensionTokens.push_back( EXC_CACHEDVAL_STRING );
-
- const String & rString = pMatrix->GetString( nC, nR );
- XclExpStringRef xXclStr = XclExpStringHelper::CreateString(
- GetRoot(), rString,
- ((meBiff == EXC_BIFF8) ? EXC_STR_DEFAULT : EXC_STR_8BITLENGTH),
- EXC_TOK_STR_MAXLEN );
- size_t nSize = rExtensionTokens.size();
- rExtensionTokens.resize( nSize + xXclStr->GetSize() );
- xXclStr->WriteToMem( &rExtensionTokens[ nSize ] );
- }
-
+ case EXC_PARAMCONV_ORG:
+ case EXC_PARAMCONV_VAL:
+ case EXC_PARAMCONV_ARR:
+ /* If parent token has REF class (REF token in REFTYPE
+ function parameter), then RPT does not repeat the
+ previous explicit ORG or ARR conversion, but always
+ falls back to VAL conversion. */
+ eClassConv = bWasRefClass ? EXC_CLASSCONV_VAL : ePrevClassConv;
+ break;
+ case EXC_PARAMCONV_RPT:
+ // nested RPT repeats the previous effective conversion
+ eClassConv = ePrevClassConv;
+ break;
+ case EXC_PARAMCONV_RPX:
+ /* If parent token has REF class (REF token in REFTYPE
+ function parameter), then RPX repeats the previous
+ effective conversion (wich will be either ORG or ARR,
+ but never VAL), otherwise falls back to ORG conversion. */
+ eClassConv = bWasRefClass ? ePrevClassConv : EXC_CLASSCONV_ORG;
+ break;
+ case EXC_PARAMCONV_RPO: // does not occur
+ break;
}
- }
+ break;
+ case EXC_PARAMCONV_RPX:
+ /* If current token still has REF class, set previous effective
+ conversion as current conversion. This will not have an effect
+ on the REF token but is needed for RPT parameters of this
+ function that want to repeat this conversion type. If current
+ token is VAL or ARR class, the previous ARR conversion will be
+ repeated on the token, but VAL conversion will not. */
+ eClassConv = ((nTokClass == EXC_TOKCLASS_REF) || (ePrevClassConv == EXC_CLASSCONV_ARR)) ?
+ ePrevClassConv : EXC_CLASSCONV_ORG;
+ break;
+ case EXC_PARAMCONV_RPO: // does not occur (see above)
+ break;
}
+
+ // do the token class conversion
+ switch( eClassConv )
+ {
+ case EXC_CLASSCONV_ORG:
+ /* Cell formulas: leave the current token class. Cell formulas
+ are the only type of formulas where all tokens can keep
+ their original token class.
+ Array and defined name formulas: convert VAL to ARR. */
+ if( (mxData->mrCfg.meClassType != EXC_CLASSTYPE_CELL) && (nTokClass == EXC_TOKCLASS_VAL) )
+ ChangeTokenClass( rnTokenId, nTokClass = EXC_TOKCLASS_ARR );
+ break;
+ case EXC_CLASSCONV_VAL:
+ // convert ARR to VAL
+ if( nTokClass == EXC_TOKCLASS_ARR )
+ ChangeTokenClass( rnTokenId, nTokClass = EXC_TOKCLASS_VAL );
+ break;
+ case EXC_CLASSCONV_ARR:
+ // convert VAL to ARR
+ if( nTokClass == EXC_TOKCLASS_VAL )
+ ChangeTokenClass( rnTokenId, nTokClass = EXC_TOKCLASS_ARR );
+ break;
+ }
+
+ // do conversion for nested operands, if token is an operator or function
+ if( rConvInfo.mnTokPos < mxData->maOpListVec.size() )
+ if( const XclExpOperandList* pOperands = mxData->maOpListVec[ rConvInfo.mnTokPos ].get() )
+ for( XclExpOperandList::const_iterator aIt = pOperands->begin(), aEnd = pOperands->end(); aIt != aEnd; ++aIt )
+ RecalcTokenClass( *aIt, eConv, eClassConv, nTokClass == EXC_TOKCLASS_REF );
}
-void XclExpFmlaCompImpl::FinalizeFormula( ScfUInt8Vec & rExtensionTokens )
+void XclExpFmlaCompImpl::FinalizeFormula()
{
- if( mbOk )
+ if( mxData->mbOk )
{
// Volatile? Add a tAttrVolatile token at the beginning of the token array.
- if( mbVolatile )
+ if( mxData->mbVolatile )
{
// tAttrSpace token can be extended with volatile flag
if( !IsSpaceToken( 0 ) )
{
- Insert( 0, 4 );
- maTokVec[ 0 ] = EXC_TOKID_ATTR;
+ InsertZeros( 0, 4 );
+ mxData->maTokVec[ 0 ] = EXC_TOKID_ATTR;
}
- maTokVec[ 1 ] |= EXC_TOK_ATTR_VOLATILE;
+ mxData->maTokVec[ 1 ] |= EXC_TOK_ATTR_VOLATILE;
}
// Token array too long? -> error
- mbOk = maTokVec.size() <= EXC_TOKARR_MAXLEN;
-
- // Store any inline arrays
- if( mbOk && mxInlineArr.is() )
- AppendInlineArrays( rExtensionTokens );
+ mxData->mbOk = mxData->maTokVec.size() <= EXC_TOKARR_MAXLEN;
}
- if( !mbOk )
+ if( !mxData->mbOk )
{
// Any unrecoverable error? -> Create a =#NA formula.
- maTokVec.clear();
- mbVolatile = false;
+ mxData->maTokVec.clear();
+ mxData->maExtDataVec.clear();
+ mxData->mbVolatile = false;
AppendErrorToken( EXC_ERR_NA );
}
}
-XclTokenArrayRef XclExpFmlaCompImpl::CreateTokenArray( ScfUInt8Vec* pExtensionTokens )
+XclTokenArrayRef XclExpFmlaCompImpl::CreateTokenArray()
{
- // create the Excel token array object before calling LeaveRecursive()
- XclTokenArrayRef xTokArr( new XclTokenArray( maTokVec, mbVolatile, pExtensionTokens ) );
+ // create the Excel token array from working data before resetting mxData
+ DBG_ASSERT( mxData->mrCfg.mbAllowArrays || mxData->maExtDataVec.empty(), "XclExpFmlaCompImpl::CreateTokenArray - unexpected extended data" );
+ if( !mxData->mrCfg.mbAllowArrays )
+ mxData->maExtDataVec.clear();
+ XclTokenArrayRef xTokArr( new XclTokenArray( mxData->maTokVec, mxData->maExtDataVec, mxData->mbVolatile ) );
+ mxData.reset();
// compiler invoked recursively? - restore old working data
- LeaveRecursive();
+ if( !maDataStack.empty() )
+ {
+ mxData = maDataStack.back();
+ maDataStack.pop_back();
+ }
return xTokArr;
}
// compiler -------------------------------------------------------------------
-const formula::FormulaToken* XclExpFmlaCompImpl::GetNextRawToken()
+const FormulaToken* XclExpFmlaCompImpl::GetNextRawToken()
{
- const formula::FormulaToken* pScToken = maTokArrIt.Get();
- ++maTokArrIt;
+ const FormulaToken* pScToken = mxData->maTokArrIt.Get();
+ ++mxData->maTokArrIt;
return pScToken;
}
-const formula::FormulaToken* XclExpFmlaCompImpl::PeekNextRawToken( bool bSkipSpaces ) const
+const FormulaToken* XclExpFmlaCompImpl::PeekNextRawToken( bool bSkipSpaces ) const
{
/* Returns pointer to next raw token in the token array. The token array
iterator already points to the next token (A call to GetNextToken()
@@ -806,11 +835,11 @@ const formula::FormulaToken* XclExpFmlaCompImpl::PeekNextRawToken( bool bSkipSpa
created and set to the passed skip-spaces mode. If spaces have to be
skipped, and the iterator currently points to a space token, the
constructor will move it to the next non-space token. */
- XclTokenArrayIterator aTempIt( maTokArrIt, bSkipSpaces );
+ XclTokenArrayIterator aTempIt( mxData->maTokArrIt, bSkipSpaces );
return aTempIt.Get();
}
-bool XclExpFmlaCompImpl::GetNextToken( XclExpTokenData& rTokData )
+bool XclExpFmlaCompImpl::GetNextToken( XclExpScToken& rTokData )
{
rTokData.mpScToken = GetNextRawToken();
rTokData.mnSpaces = (rTokData.GetOpCode() == ocSpaces) ? rTokData.mpScToken->GetByte() : 0;
@@ -819,9 +848,9 @@ bool XclExpFmlaCompImpl::GetNextToken( XclExpTokenData& rTokData )
return rTokData.Is();
}
-XclExpTokenData XclExpFmlaCompImpl::GetNextToken()
+XclExpScToken XclExpFmlaCompImpl::GetNextToken()
{
- XclExpTokenData aTokData;
+ XclExpScToken aTokData;
GetNextToken( aTokData );
return aTokData;
}
@@ -919,195 +948,187 @@ inline sal_uInt8 lclGetRangeTokenId( OpCode eOpCode )
} // namespace
-XclExpTokenData XclExpFmlaCompImpl::Expression( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses, bool bStopAtSep )
+XclExpScToken XclExpFmlaCompImpl::Expression( XclExpScToken aTokData, bool bInParentheses, bool bStopAtSep )
{
- if( mbOk && aTokData.Is() )
+ if( mxData->mbOk && aTokData.Is() )
{
// remember old stop-at-ocSep mode, restored below
- bool bOldStopAtSep = mbStopAtSep;
- mbStopAtSep = bStopAtSep;
+ bool bOldStopAtSep = mxData->mbStopAtSep;
+ mxData->mbStopAtSep = bStopAtSep;
// start compilation of the subexpression
- aTokData = OrTerm( aTokData, nExpClass, bInParentheses );
+ aTokData = OrTerm( aTokData, bInParentheses );
// restore old stop-at-ocSep mode
- mbStopAtSep = bOldStopAtSep;
+ mxData->mbStopAtSep = bOldStopAtSep;
}
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::SkipExpression( XclExpTokenData aTokData, bool bStopAtSep )
+XclExpScToken XclExpFmlaCompImpl::SkipExpression( XclExpScToken aTokData, bool bStopAtSep )
{
- while( mbOk && aTokData.Is() && (aTokData.GetOpCode() != ocClose) && (!bStopAtSep || (aTokData.GetOpCode() != ocSep)) )
+ while( mxData->mbOk && aTokData.Is() && (aTokData.GetOpCode() != ocClose) && (!bStopAtSep || (aTokData.GetOpCode() != ocSep)) )
{
if( aTokData.GetOpCode() == ocOpen )
{
aTokData = SkipExpression( GetNextToken(), false );
- if( mbOk ) mbOk = aTokData.GetOpCode() == ocClose;
+ if( mxData->mbOk ) mxData->mbOk = aTokData.GetOpCode() == ocClose;
}
aTokData = GetNextToken();
}
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::OrTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses )
+XclExpScToken XclExpFmlaCompImpl::OrTerm( XclExpScToken aTokData, bool bInParentheses )
{
- aTokData = AndTerm( aTokData, nExpClass, bInParentheses );
+ aTokData = AndTerm( aTokData, bInParentheses );
sal_uInt8 nParamCount = 1;
- while( mbOk && (aTokData.GetOpCode() == ocOr) )
+ while( mxData->mbOk && (aTokData.GetOpCode() == ocOr) )
{
- AdjustLastTokenClassForEastereggOp(); // see comment in this function
RemoveTrailingParen();
- aTokData = AndTerm( GetNextToken(), EXC_TOKCLASS_REF, bInParentheses );
+ aTokData = AndTerm( GetNextToken(), bInParentheses );
RemoveTrailingParen();
++nParamCount;
- if( mbOk ) mbOk = nParamCount <= EXC_FUNC_MAXPARAM;
+ if( mxData->mbOk ) mxData->mbOk = nParamCount <= EXC_FUNC_MAXPARAM;
}
- if( mbOk && (nParamCount > 1) )
- AppendVarFuncTokenId( EXC_FUNCID_OR, EXC_TOKCLASS_VAL, nExpClass, nParamCount );
+ if( mxData->mbOk && (nParamCount > 1) )
+ AppendLogicalOperatorToken( EXC_FUNCID_OR, nParamCount );
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::AndTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses )
+XclExpScToken XclExpFmlaCompImpl::AndTerm( XclExpScToken aTokData, bool bInParentheses )
{
- aTokData = CompareTerm( aTokData, nExpClass, bInParentheses );
+ aTokData = CompareTerm( aTokData, bInParentheses );
sal_uInt8 nParamCount = 1;
- while( mbOk && (aTokData.GetOpCode() == ocAnd) )
+ while( mxData->mbOk && (aTokData.GetOpCode() == ocAnd) )
{
- AdjustLastTokenClassForEastereggOp(); // see comment in this function
RemoveTrailingParen();
- aTokData = CompareTerm( GetNextToken(), EXC_TOKCLASS_REF, bInParentheses );
+ aTokData = CompareTerm( GetNextToken(), bInParentheses );
RemoveTrailingParen();
++nParamCount;
- if( mbOk ) mbOk = nParamCount <= EXC_FUNC_MAXPARAM;
+ if( mxData->mbOk ) mxData->mbOk = nParamCount <= EXC_FUNC_MAXPARAM;
}
- if( mbOk && (nParamCount > 1) )
- AppendVarFuncTokenId( EXC_FUNCID_AND, EXC_TOKCLASS_VAL, nExpClass, nParamCount );
+ if( mxData->mbOk && (nParamCount > 1) )
+ AppendLogicalOperatorToken( EXC_FUNCID_AND, nParamCount );
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::CompareTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses )
+XclExpScToken XclExpFmlaCompImpl::CompareTerm( XclExpScToken aTokData, bool bInParentheses )
{
- aTokData = ConcatTerm( aTokData, nExpClass, bInParentheses );
+ aTokData = ConcatTerm( aTokData, bInParentheses );
sal_uInt8 nOpTokenId = EXC_TOKID_NONE;
- while( mbOk && ((nOpTokenId = lclGetCompareTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
+ while( mxData->mbOk && ((nOpTokenId = lclGetCompareTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
{
- AdjustLastTokenClass( nExpClass | EXC_TOKCLASS_INOP_FLAG );
sal_uInt8 nSpaces = aTokData.mnSpaces;
- aTokData = ConcatTerm( GetNextToken(), nExpClass | EXC_TOKCLASS_INOP_FLAG, bInParentheses );
- AppendOpTokenId( nOpTokenId, nExpClass, nSpaces );
+ aTokData = ConcatTerm( GetNextToken(), bInParentheses );
+ AppendBinaryOperatorToken( nOpTokenId, true, nSpaces );
}
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::ConcatTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses )
+XclExpScToken XclExpFmlaCompImpl::ConcatTerm( XclExpScToken aTokData, bool bInParentheses )
{
- aTokData = AddSubTerm( aTokData, nExpClass, bInParentheses );
+ aTokData = AddSubTerm( aTokData, bInParentheses );
sal_uInt8 nOpTokenId = EXC_TOKID_NONE;
- while( mbOk && ((nOpTokenId = lclGetConcatTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
+ while( mxData->mbOk && ((nOpTokenId = lclGetConcatTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
{
- AdjustLastTokenClass( nExpClass | EXC_TOKCLASS_INOP_FLAG );
sal_uInt8 nSpaces = aTokData.mnSpaces;
- aTokData = AddSubTerm( GetNextToken(), nExpClass | EXC_TOKCLASS_INOP_FLAG, bInParentheses );
- AppendOpTokenId( nOpTokenId, nExpClass, nSpaces );
+ aTokData = AddSubTerm( GetNextToken(), bInParentheses );
+ AppendBinaryOperatorToken( nOpTokenId, true, nSpaces );
}
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::AddSubTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses )
+XclExpScToken XclExpFmlaCompImpl::AddSubTerm( XclExpScToken aTokData, bool bInParentheses )
{
- aTokData = MulDivTerm( aTokData, nExpClass, bInParentheses );
+ aTokData = MulDivTerm( aTokData, bInParentheses );
sal_uInt8 nOpTokenId = EXC_TOKID_NONE;
- while( mbOk && ((nOpTokenId = lclGetAddSubTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
+ while( mxData->mbOk && ((nOpTokenId = lclGetAddSubTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
{
- AdjustLastTokenClass( nExpClass | EXC_TOKCLASS_INOP_FLAG );
sal_uInt8 nSpaces = aTokData.mnSpaces;
- aTokData = MulDivTerm( GetNextToken(), nExpClass | EXC_TOKCLASS_INOP_FLAG, bInParentheses );
- AppendOpTokenId( nOpTokenId, nExpClass, nSpaces );
+ aTokData = MulDivTerm( GetNextToken(), bInParentheses );
+ AppendBinaryOperatorToken( nOpTokenId, true, nSpaces );
}
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::MulDivTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses )
+XclExpScToken XclExpFmlaCompImpl::MulDivTerm( XclExpScToken aTokData, bool bInParentheses )
{
- aTokData = PowTerm( aTokData, nExpClass, bInParentheses );
+ aTokData = PowTerm( aTokData, bInParentheses );
sal_uInt8 nOpTokenId = EXC_TOKID_NONE;
- while( mbOk && ((nOpTokenId = lclGetMulDivTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
+ while( mxData->mbOk && ((nOpTokenId = lclGetMulDivTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
{
- AdjustLastTokenClass( nExpClass | EXC_TOKCLASS_INOP_FLAG );
sal_uInt8 nSpaces = aTokData.mnSpaces;
- aTokData = PowTerm( GetNextToken(), nExpClass | EXC_TOKCLASS_INOP_FLAG, bInParentheses );
- AppendOpTokenId( nOpTokenId, nExpClass, nSpaces );
+ aTokData = PowTerm( GetNextToken(), bInParentheses );
+ AppendBinaryOperatorToken( nOpTokenId, true, nSpaces );
}
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::PowTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses )
+XclExpScToken XclExpFmlaCompImpl::PowTerm( XclExpScToken aTokData, bool bInParentheses )
{
- aTokData = UnaryPostTerm( aTokData, nExpClass, bInParentheses );
+ aTokData = UnaryPostTerm( aTokData, bInParentheses );
sal_uInt8 nOpTokenId = EXC_TOKID_NONE;
- while( mbOk && ((nOpTokenId = lclGetPowTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
+ while( mxData->mbOk && ((nOpTokenId = lclGetPowTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
{
- AdjustLastTokenClass( nExpClass | EXC_TOKCLASS_INOP_FLAG );
sal_uInt8 nSpaces = aTokData.mnSpaces;
- aTokData = UnaryPostTerm( GetNextToken(), nExpClass | EXC_TOKCLASS_INOP_FLAG, bInParentheses );
- AppendOpTokenId( nOpTokenId, nExpClass, nSpaces );
+ aTokData = UnaryPostTerm( GetNextToken(), bInParentheses );
+ AppendBinaryOperatorToken( nOpTokenId, true, nSpaces );
}
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::UnaryPostTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses )
+XclExpScToken XclExpFmlaCompImpl::UnaryPostTerm( XclExpScToken aTokData, bool bInParentheses )
{
- aTokData = UnaryPreTerm( aTokData, nExpClass, bInParentheses );
+ aTokData = UnaryPreTerm( aTokData, bInParentheses );
sal_uInt8 nOpTokenId = EXC_TOKID_NONE;
- while( mbOk && ((nOpTokenId = lclGetUnaryPostTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
+ while( mxData->mbOk && ((nOpTokenId = lclGetUnaryPostTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
{
- AdjustLastTokenClass( nExpClass | EXC_TOKCLASS_INOP_FLAG );
- AppendOpTokenId( nOpTokenId, nExpClass, aTokData.mnSpaces );
+ AppendUnaryOperatorToken( nOpTokenId, aTokData.mnSpaces );
GetNextToken( aTokData );
}
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::UnaryPreTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses )
+XclExpScToken XclExpFmlaCompImpl::UnaryPreTerm( XclExpScToken aTokData, bool bInParentheses )
{
- sal_uInt8 nOpTokenId = mbOk ? lclGetUnaryPreTokenId( aTokData.GetOpCode() ) : EXC_TOKID_NONE;
+ sal_uInt8 nOpTokenId = mxData->mbOk ? lclGetUnaryPreTokenId( aTokData.GetOpCode() ) : EXC_TOKID_NONE;
if( nOpTokenId != EXC_TOKID_NONE )
{
sal_uInt8 nSpaces = aTokData.mnSpaces;
- aTokData = UnaryPreTerm( GetNextToken(), nExpClass | EXC_TOKCLASS_INOP_FLAG, bInParentheses );
- AppendOpTokenId( nOpTokenId, nExpClass, nSpaces );
+ aTokData = UnaryPreTerm( GetNextToken(), bInParentheses );
+ AppendUnaryOperatorToken( nOpTokenId, nSpaces );
}
else
- aTokData = ListTerm( aTokData, nExpClass, bInParentheses );
+ {
+ aTokData = ListTerm( aTokData, bInParentheses );
+ }
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::ListTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool bInParentheses )
+XclExpScToken XclExpFmlaCompImpl::ListTerm( XclExpScToken aTokData, bool bInParentheses )
{
sal_uInt16 nSubExprPos = GetSize();
bool bHasAnyRefOp = false;
bool bHasListOp = false;
- aTokData = IntersectTerm( aTokData, nExpClass, bHasAnyRefOp );
+ aTokData = IntersectTerm( aTokData, bHasAnyRefOp );
sal_uInt8 nOpTokenId = EXC_TOKID_NONE;
- while( mbOk && ((nOpTokenId = lclGetListTokenId( aTokData.GetOpCode(), mbStopAtSep )) != EXC_TOKID_NONE) )
+ while( mxData->mbOk && ((nOpTokenId = lclGetListTokenId( aTokData.GetOpCode(), mxData->mbStopAtSep )) != EXC_TOKID_NONE) )
{
- AdjustLastTokenClass( EXC_TOKCLASS_ANY_IN_REFOP );
sal_uInt8 nSpaces = aTokData.mnSpaces;
- aTokData = IntersectTerm( GetNextToken(), EXC_TOKCLASS_ANY_IN_REFOP, bHasAnyRefOp );
- AppendOpTokenId( nOpTokenId, nExpClass, nSpaces );
+ aTokData = IntersectTerm( GetNextToken(), bHasAnyRefOp );
+ AppendBinaryOperatorToken( nOpTokenId, false, nSpaces );
bHasAnyRefOp = bHasListOp = true;
}
if( bHasAnyRefOp )
{
- // adjust last added token back to REF
- AdjustLastTokenClass( EXC_TOKCLASS_ANY_IN_REFOP );
// add a tMemFunc token enclosing the entire reference subexpression
sal_uInt16 nSubExprSize = GetSize() - nSubExprPos;
- Insert( nSubExprPos, 3 );
- maTokVec[ nSubExprPos ] = GetTokenId( EXC_TOKID_MEMFUNC, EXC_TOKCLASS_REF );
+ InsertZeros( nSubExprPos, 3 );
+ mxData->maTokVec[ nSubExprPos ] = GetTokenId( EXC_TOKID_MEMFUNC, EXC_TOKCLASS_REF );
Overwrite( nSubExprPos + 1, nSubExprSize );
- // adjust the tMemFunc token according to passed expected token class
- mnLastTokPos = nSubExprPos;
- AdjustLastTokenClass( nExpClass );
+ // update the operand/operator stack (set the list expression as operand of the tMemFunc)
+ XclExpOperandListRef xOperands( new XclExpOperandList );
+ xOperands->AppendOperand( PopOperandPos(), EXC_PARAMCONV_VAL, false );
+ PushOperatorPos( nSubExprPos, xOperands );
}
// #i86439# enclose list operator into parentheses, e.g. Calc's =AREAS(A1~A2) to Excel's =AREAS((A1;A2))
if( bHasListOp && !bInParentheses )
@@ -1115,77 +1136,66 @@ XclExpTokenData XclExpFmlaCompImpl::ListTerm( XclExpTokenData aTokData, sal_uInt
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::IntersectTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool& rbHasRefOp )
+XclExpScToken XclExpFmlaCompImpl::IntersectTerm( XclExpScToken aTokData, bool& rbHasRefOp )
{
- aTokData = RangeTerm( aTokData, nExpClass, rbHasRefOp );
+ aTokData = RangeTerm( aTokData, rbHasRefOp );
sal_uInt8 nOpTokenId = EXC_TOKID_NONE;
- while( mbOk && ((nOpTokenId = lclGetIntersectTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
+ while( mxData->mbOk && ((nOpTokenId = lclGetIntersectTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
{
- AdjustLastTokenClass( EXC_TOKCLASS_ANY_IN_REFOP );
sal_uInt8 nSpaces = aTokData.mnSpaces;
- aTokData = RangeTerm( GetNextToken(), EXC_TOKCLASS_ANY_IN_REFOP, rbHasRefOp );
- AppendOpTokenId( nOpTokenId, nExpClass, nSpaces );
+ aTokData = RangeTerm( GetNextToken(), rbHasRefOp );
+ AppendBinaryOperatorToken( nOpTokenId, false, nSpaces );
rbHasRefOp = true;
}
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::RangeTerm( XclExpTokenData aTokData, sal_uInt8 nExpClass, bool& rbHasRefOp )
+XclExpScToken XclExpFmlaCompImpl::RangeTerm( XclExpScToken aTokData, bool& rbHasRefOp )
{
- aTokData = Factor( aTokData, nExpClass );
+ aTokData = Factor( aTokData );
sal_uInt8 nOpTokenId = EXC_TOKID_NONE;
- while( mbOk && ((nOpTokenId = lclGetRangeTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
+ while( mxData->mbOk && ((nOpTokenId = lclGetRangeTokenId( aTokData.GetOpCode() )) != EXC_TOKID_NONE) )
{
- AdjustLastTokenClass( EXC_TOKCLASS_ANY_IN_REFOP );
sal_uInt8 nSpaces = aTokData.mnSpaces;
- aTokData = Factor( GetNextToken(), EXC_TOKCLASS_ANY_IN_REFOP );
- AppendOpTokenId( nOpTokenId, nExpClass, nSpaces );
+ aTokData = Factor( GetNextToken() );
+ AppendBinaryOperatorToken( nOpTokenId, false, nSpaces );
rbHasRefOp = true;
}
return aTokData;
}
-XclExpTokenData XclExpFmlaCompImpl::Factor( XclExpTokenData aTokData, sal_uInt8 nExpClass )
+XclExpScToken XclExpFmlaCompImpl::Factor( XclExpScToken aTokData )
{
- if( !mbOk || !aTokData.Is() ) return XclExpTokenData();
+ if( !mxData->mbOk || !aTokData.Is() ) return XclExpScToken();
- formula::StackVar eTokType = aTokData.GetType();
- OpCode eOpCode = aTokData.GetOpCode();
-
- if (eOpCode == ocExternalRef)
+ switch( aTokData.GetType() )
{
- ProcessExternalName( aTokData, nExpClass );
- return GetNextToken();
- }
-
- switch( eTokType )
- {
- case svUnknown: mbOk = false; break;
- case formula::svDouble: ProcessDouble( aTokData ); break;
- case formula::svString: ProcessString( aTokData ); break;
+ case svUnknown: mxData->mbOk = false; break;
+ case svDouble: ProcessDouble( aTokData ); break;
+ case svString: ProcessString( aTokData ); break;
#if 0 // erAck
- case formula::svError: ProcessError( aTokData ); break;
+ case svError: ProcessError( aTokData ); break;
#endif
- case svSingleRef: ProcessCellRef( aTokData, nExpClass ); break;
- case formula::svDoubleRef: ProcessRangeRef( aTokData, nExpClass ); break;
- case svMatrix: ProcessMatrix( aTokData, nExpClass ); break;
- case svExternal: ProcessExternal( aTokData, nExpClass ); break;
-
- default:
+ case svSingleRef: ProcessCellRef( aTokData ); break;
+ case svDoubleRef: ProcessRangeRef( aTokData ); break;
+ case svExternalSingleRef: ProcessExternalCellRef( aTokData ); break;
+ case svExternalDoubleRef: ProcessExternalRangeRef( aTokData ); break;
+ case svExternalName: ProcessExternalName( aTokData ); break;
+ case svMatrix: ProcessMatrix( aTokData ); break;
+ case svExternal: ProcessExternal( aTokData ); break;
+
+ default: switch( aTokData.GetOpCode() )
{
- switch( eOpCode )
- {
- case ocNone: /* do nothing */ break;
- case ocMissing: ProcessMissing( aTokData ); break;
- case ocBad: ProcessBad( aTokData ); break;
- case ocOpen: ProcessParentheses( aTokData, nExpClass ); break;
- case ocName: ProcessDefinedName( aTokData, nExpClass ); break;
- case ocDBArea: ProcessDatabaseArea( aTokData, nExpClass ); break;
- case ocFalse:
- case ocTrue: ProcessBoolean( aTokData ); break;
- case ocDde: ProcessDdeLink( aTokData, nExpClass ); break;
- default: ProcessFunction( aTokData, nExpClass );
- }
+ case ocNone: /* do nothing */ break;
+ case ocMissing: ProcessMissing( aTokData ); break;
+ case ocBad: ProcessBad( aTokData ); break;
+ case ocOpen: ProcessParentheses( aTokData ); break;
+ case ocName: ProcessDefinedName( aTokData ); break;
+ case ocDBArea: ProcessDatabaseArea( aTokData ); break;
+ case ocFalse:
+ case ocTrue: ProcessBoolean( aTokData ); break;
+ case ocDde: ProcessDdeLink( aTokData ); break;
+ default: ProcessFunction( aTokData );
}
}
@@ -1194,7 +1204,7 @@ XclExpTokenData XclExpFmlaCompImpl::Factor( XclExpTokenData aTokData, sal_uInt8
// formula structure ----------------------------------------------------------
-void XclExpFmlaCompImpl::ProcessDouble( const XclExpTokenData& rTokData )
+void XclExpFmlaCompImpl::ProcessDouble( const XclExpScToken& rTokData )
{
double fValue = rTokData.mpScToken->GetDouble();
double fInt;
@@ -1205,13 +1215,13 @@ void XclExpFmlaCompImpl::ProcessDouble( const XclExpTokenData& rTokData )
AppendNumToken( fValue, rTokData.mnSpaces );
}
-void XclExpFmlaCompImpl::ProcessString( const XclExpTokenData& rTokData )
+void XclExpFmlaCompImpl::ProcessString( const XclExpScToken& rTokData )
{
- AppendOpTokenId( EXC_TOKID_STR, EXC_TOKCLASS_NONE, rTokData.mnSpaces );
+ AppendOperandTokenId( EXC_TOKID_STR, rTokData.mnSpaces );
Append( rTokData.mpScToken->GetString() );
}
-void XclExpFmlaCompImpl::ProcessError( const XclExpTokenData& rTokData )
+void XclExpFmlaCompImpl::ProcessError( const XclExpScToken& rTokData )
{
#if 0 // erAck
AppendErrorToken( XclTools::GetXclErrorCode( rTokData.mpScToken->GetError() ), rTokData.mnSpaces );
@@ -1220,36 +1230,36 @@ void XclExpFmlaCompImpl::ProcessError( const XclExpTokenData& rTokData )
#endif
}
-void XclExpFmlaCompImpl::ProcessMissing( const XclExpTokenData& rTokData )
+void XclExpFmlaCompImpl::ProcessMissing( const XclExpScToken& rTokData )
{
AppendMissingToken( rTokData.mnSpaces );
}
-void XclExpFmlaCompImpl::ProcessBad( const XclExpTokenData& rTokData )
+void XclExpFmlaCompImpl::ProcessBad( const XclExpScToken& rTokData )
{
AppendErrorToken( EXC_ERR_NA, rTokData.mnSpaces );
}
-void XclExpFmlaCompImpl::ProcessParentheses( const XclExpTokenData& rTokData, sal_uInt8 nExpClass )
+void XclExpFmlaCompImpl::ProcessParentheses( const XclExpScToken& rTokData )
{
- XclExpTokenData aTokData( Expression( GetNextToken(), nExpClass, true, false ) );
- mbOk = aTokData.GetOpCode() == ocClose;
+ XclExpScToken aTokData = Expression( GetNextToken(), true, false );
+ mxData->mbOk = aTokData.GetOpCode() == ocClose;
AppendParenToken( rTokData.mnSpaces, aTokData.mnSpaces );
}
-void XclExpFmlaCompImpl::ProcessBoolean( const XclExpTokenData& rTokData )
+void XclExpFmlaCompImpl::ProcessBoolean( const XclExpScToken& rTokData )
{
- mbOk = GetNextToken().GetOpCode() == ocOpen;
- if( mbOk ) mbOk = GetNextToken().GetOpCode() == ocClose;
- if( mbOk )
+ mxData->mbOk = GetNextToken().GetOpCode() == ocOpen;
+ if( mxData->mbOk ) mxData->mbOk = GetNextToken().GetOpCode() == ocClose;
+ if( mxData->mbOk )
AppendBoolToken( rTokData.GetOpCode() == ocTrue, rTokData.mnSpaces );
}
namespace {
-inline bool lclGetTokenString( String& rString, const XclExpTokenData& rTokData )
+inline bool lclGetTokenString( String& rString, const XclExpScToken& rTokData )
{
- bool bIsStr = (rTokData.GetType() == formula::svString) && (rTokData.GetOpCode() == ocPush);
+ bool bIsStr = (rTokData.GetType() == svString) && (rTokData.GetOpCode() == ocPush);
if( bIsStr )
rString = rTokData.mpScToken->GetString();
return bIsStr;
@@ -1257,169 +1267,113 @@ inline bool lclGetTokenString( String& rString, const XclExpTokenData& rTokData
} // namespace
-void XclExpFmlaCompImpl::ProcessDdeLink( const XclExpTokenData& rTokData, sal_uInt8 nExpClass )
+void XclExpFmlaCompImpl::ProcessDdeLink( const XclExpScToken& rTokData )
{
String aApplic, aTopic, aItem;
- mbOk = GetNextToken().GetOpCode() == ocOpen;
- if( mbOk ) mbOk = lclGetTokenString( aApplic, GetNextToken() );
- if( mbOk ) mbOk = GetNextToken().GetOpCode() == ocSep;
- if( mbOk ) mbOk = lclGetTokenString( aTopic, GetNextToken() );
- if( mbOk ) mbOk = GetNextToken().GetOpCode() == ocSep;
- if( mbOk ) mbOk = lclGetTokenString( aItem, GetNextToken() );
- if( mbOk ) mbOk = GetNextToken().GetOpCode() == ocClose;
- if( mbOk ) mbOk = aApplic.Len() && aTopic.Len() && aItem.Len();
- if( mbOk )
+ mxData->mbOk = GetNextToken().GetOpCode() == ocOpen;
+ if( mxData->mbOk ) mxData->mbOk = lclGetTokenString( aApplic, GetNextToken() );
+ if( mxData->mbOk ) mxData->mbOk = GetNextToken().GetOpCode() == ocSep;
+ if( mxData->mbOk ) mxData->mbOk = lclGetTokenString( aTopic, GetNextToken() );
+ if( mxData->mbOk ) mxData->mbOk = GetNextToken().GetOpCode() == ocSep;
+ if( mxData->mbOk ) mxData->mbOk = lclGetTokenString( aItem, GetNextToken() );
+ if( mxData->mbOk ) mxData->mbOk = GetNextToken().GetOpCode() == ocClose;
+ if( mxData->mbOk ) mxData->mbOk = aApplic.Len() && aTopic.Len() && aItem.Len();
+ if( mxData->mbOk )
{
sal_uInt16 nExtSheet, nExtName;
- if( mpLinkMgr && mpLinkMgr->InsertDde( nExtSheet, nExtName, aApplic, aTopic, aItem ) )
- AppendNameXToken( nExtSheet, nExtName, nExpClass, rTokData.mnSpaces );
+ if( mxData->mpLinkMgr && mxData->mpLinkMgr->InsertDde( nExtSheet, nExtName, aApplic, aTopic, aItem ) )
+ AppendNameXToken( nExtSheet, nExtName, rTokData.mnSpaces );
else
AppendErrorToken( EXC_ERR_NA, rTokData.mnSpaces );
}
}
-void XclExpFmlaCompImpl::ProcessExternal( const XclExpTokenData& rTokData, sal_uInt8 nExpClass )
+void XclExpFmlaCompImpl::ProcessExternal( const XclExpScToken& rTokData )
{
/* #i47228# Excel import generates svExternal/ocMacro tokens for invalid
names and for external/invalid function calls. This function looks for
the next token in the token array. If it is an opening parenthesis, the
token is processed as external function call, otherwise as undefined name. */
- const formula::FormulaToken* pNextScToken = PeekNextRawToken( true );
+ const FormulaToken* pNextScToken = PeekNextRawToken( true );
if( !pNextScToken || (pNextScToken->GetOpCode() != ocOpen) )
- AppendMissingNameToken( rTokData.mpScToken->GetExternal(), nExpClass, rTokData.mnSpaces );
+ AppendMissingNameToken( rTokData.mpScToken->GetExternal(), rTokData.mnSpaces );
else
- ProcessFunction( rTokData, nExpClass );
+ ProcessFunction( rTokData );
}
-void XclExpFmlaCompImpl::ProcessExternalName( const XclExpTokenData& rTokData, sal_uInt8 nExpClass )
+void XclExpFmlaCompImpl::ProcessMatrix( const XclExpScToken& rTokData )
{
- StackVar eType = rTokData.GetType();
-
- ScExternalRefManager* pRefMgr = GetDoc().GetExternalRefManager();
- USHORT nFileId = rTokData.mpScToken->GetIndex();
- switch (eType)
+ const ScMatrix* pMatrix = static_cast< const ScToken* >( rTokData.mpScToken )->GetMatrix();
+ if( pMatrix && mxData->mrCfg.mbAllowArrays )
{
- case svExternalSingleRef:
- {
- if (!mpScBasePos)
- {
- AppendErrorToken(EXC_ERR_REF, rTokData.mnSpaces);
- break;
- }
- ScSingleRefData aRef(static_cast<const ScToken*>(rTokData.mpScToken)->GetSingleRef());
- aRef.CalcAbsIfRel(*mpScBasePos);
- const String& rTabName = rTokData.mpScToken->GetString();
- ScExternalRefCache::TokenRef p = pRefMgr->getSingleRefToken(nFileId, rTabName, ScAddress(aRef.nCol, aRef.nRow, aRef.nTab), NULL, NULL);
- if (!p.get())
- {
- AppendErrorToken(EXC_ERR_REF, rTokData.mnSpaces);
- break;
- }
+ SCSIZE nScCols, nScRows;
+ pMatrix->GetDimensions( nScCols, nScRows );
+ DBG_ASSERT( (nScCols > 0) && (nScRows > 0), "XclExpFmlaCompImpl::ProcessMatrix - invalid matrix size" );
+ sal_uInt16 nCols = ::limit_cast< sal_uInt16 >( nScCols, 0, 256 );
+ sal_uInt16 nRows = ::limit_cast< sal_uInt16 >( nScRows, 0, 1024 );
- mpLinkMgr->StoreCell(nFileId, rTabName, aRef);
-
- XclAddress aXclPos(ScAddress::UNINITIALIZED);
- ConvertRefData(aRef, aXclPos, false, false, false);
-
- sal_uInt16 nExtSheet, nFirstSBTab, nLastSBTab;
- mpLinkMgr->FindExtSheet(nFileId, rTabName, 1, nExtSheet, nFirstSBTab, nLastSBTab, GetNewRefLogEntry());
- sal_uInt8 nBaseId = lclIsRefDel2D(aRef) ? EXC_TOKID_REFERR3D : EXC_TOKID_REF3D;
- AppendOpTokenId(GetTokenId(nBaseId, EXC_TOKCLASS_REF), nExpClass, rTokData.mnSpaces);
- Append(nExtSheet);
- if (meBiff <= EXC_BIFF5)
- {
- Append(0, 8);
- Append(static_cast<sal_uInt16>(nFirstSBTab));
- Append(static_cast<sal_uInt16>(nFirstSBTab));
- }
- AppendAddress(aXclPos);
- }
- break;
- case svExternalDoubleRef:
- {
- if (!mpScBasePos)
- {
- AppendErrorToken(XclTools::GetXclErrorCode(errNoRef), rTokData.mnSpaces);
- break;
- }
- ScComplexRefData aRef(static_cast<const ScToken*>(rTokData.mpScToken)->GetDoubleRef());
- aRef.CalcAbsIfRel(*mpScBasePos);
- const String& rTabName = rTokData.mpScToken->GetString();
- const ScSingleRefData& r1 = aRef.Ref1;
- const ScSingleRefData& r2 = aRef.Ref2;
- ScRange aRange(r1.nCol, r1.nRow, r1.nTab, r2.nCol, r2.nRow, r2.nTab);
- ScExternalRefCache::TokenArrayRef pArray = pRefMgr->getDoubleRefTokens(nFileId, rTabName, aRange, NULL);
- if (!pArray.get())
- {
- AppendErrorToken(EXC_ERR_REF, rTokData.mnSpaces);
- break;
- }
+ // create the tArray token
+ AppendOperandTokenId( GetTokenId( EXC_TOKID_ARRAY, EXC_TOKCLASS_ARR ), rTokData.mnSpaces );
+ Append( static_cast< sal_uInt8 >( (meBiff == EXC_BIFF8) ? (nCols - 1) : nCols ) );
+ Append( static_cast< sal_uInt16 >( (meBiff == EXC_BIFF8) ? (nRows - 1) : nRows ) );
+ Append( static_cast< sal_uInt32 >( 0 ) );
- mpLinkMgr->StoreCellRange(nFileId, rTabName, aRef);
- XclRange aXclRange(ScAddress::UNINITIALIZED);
- ConvertRefData(aRef, aXclRange, false);
- sal_uInt16 nExtSheet, nFirstSBTab, nLastSBTab;
- sal_uInt16 nTabSpan = r2.nTab - r1.nTab + 1;
- mpLinkMgr->FindExtSheet(nFileId, rTabName, nTabSpan, nExtSheet, nFirstSBTab, nLastSBTab, GetNewRefLogEntry());
-
- sal_uInt8 nBaseId = lclIsRefDel2D(aRef) ? EXC_TOKID_AREAERR3D : EXC_TOKID_AREA3D;
- AppendOpTokenId(GetTokenId( nBaseId, EXC_TOKCLASS_REF ), nExpClass, rTokData.mnSpaces);
- Append(nExtSheet);
- if (meBiff <= EXC_BIFF5)
- {
- Append(0, 8);
- Append(static_cast<sal_uInt16>(nFirstSBTab));
- Append(static_cast<sal_uInt16>(nLastSBTab));
- }
- AppendRange(aXclRange);
- }
- break;
- case svExternalName:
+ // create the extended data containing the array values
+ AppendExt( static_cast< sal_uInt8 >( (meBiff == EXC_BIFF8) ? (nCols - 1) : nCols ) );
+ AppendExt( static_cast< sal_uInt16 >( (meBiff == EXC_BIFF8) ? (nRows - 1) : nRows ) );
+ for( SCSIZE nScRow = 0; nScRow < nScRows; ++nScRow )
{
- const String& aName = rTokData.mpScToken->GetString();
- ScExternalRefCache::TokenArrayRef pArray = pRefMgr->getRangeNameTokens(nFileId, aName);
- if (!pArray.get() || !mpScBasePos)
+ for( SCSIZE nScCol = 0; nScCol < nScCols; ++nScCol )
{
- AppendErrorToken(XclTools::GetXclErrorCode(errNoName), rTokData.mnSpaces);
- break;
- }
-
- // Go through all these tokens to store the external cell/range
- // references for CRN records.
- for (formula::FormulaToken* p = pArray->First(); p; p = pArray->Next())
- {
- if (p->GetOpCode() == ocExternalRef)
+ ScMatValType nType;
+ const ScMatrixValue* pMatVal = pMatrix->Get( nScCol, nScRow, nType );
+ DBG_ASSERT( pMatVal, "XclExpFmlaCompImpl::ProcessMatrix - missing matrix value" );
+ if( ScMatrix::IsValueType( nType ) ) // value, boolean, or error
+ {
+ if( ScMatrix::IsBooleanType( nType ) )
+ {
+ AppendExt( EXC_CACHEDVAL_BOOL );
+ AppendExt( static_cast< sal_uInt8 >( pMatVal->GetBoolean() ? 1 : 0 ) );
+ AppendExt( 0, 7 );
+ }
+ else if( USHORT nErr = pMatVal->GetError() )
+ {
+ AppendExt( EXC_CACHEDVAL_ERROR );
+ AppendExt( XclTools::GetXclErrorCode( nErr ) );
+ AppendExt( 0, 7 );
+ }
+ else
+ {
+ AppendExt( EXC_CACHEDVAL_DOUBLE );
+ AppendExt( pMatVal->fVal );
+ }
+ }
+ else // string or empty
{
- if (p->GetType() == svExternalSingleRef)
+ const String& rStr = pMatVal->GetString();
+ if( rStr.Len() == 0 )
{
- ScSingleRefData aData(static_cast<ScToken*>(p)->GetSingleRef());
- aData.CalcAbsIfRel(*mpScBasePos);
- mpLinkMgr->StoreCell(nFileId, p->GetString(), aData);
+ AppendExt( EXC_CACHEDVAL_EMPTY );
+ AppendExt( 0, 8 );
}
- else if (p->GetType() == svExternalDoubleRef)
+ else
{
- ScComplexRefData aData(static_cast<ScToken*>(p)->GetDoubleRef());
- aData.CalcAbsIfRel(*mpScBasePos);
- mpLinkMgr->StoreCellRange(nFileId, p->GetString(), aData);
+ AppendExt( EXC_CACHEDVAL_STRING );
+ AppendExt( rStr );
}
}
}
-
- const String* pFile = pRefMgr->getExternalFileName(nFileId);
- sal_uInt16 nExtSheet, nExtName;
- if (mpLinkMgr->InsertExtName(nExtSheet, nExtName, *pFile, aName, pArray))
- AppendNameXToken(nExtSheet, nExtName, nExpClass, rTokData.mnSpaces);
- else
- AppendErrorToken(EXC_ERR_REF, rTokData.mnSpaces);
}
- break;
- default:
- ; // nothing
+ }
+ else
+ {
+ // array in places that do not allow it (cond fmts, data validation)
+ AppendErrorToken( EXC_ERR_NA, rTokData.mnSpaces );
}
}
-void XclExpFmlaCompImpl::ProcessFunction( const XclExpTokenData& rTokData, sal_uInt8 nExpClass )
+void XclExpFmlaCompImpl::ProcessFunction( const XclExpScToken& rTokData )
{
OpCode eOpCode = rTokData.GetOpCode();
const XclFunctionInfo* pFuncInfo = maFuncProv.GetFuncInfoFromOpCode( eOpCode );
@@ -1437,15 +1391,15 @@ void XclExpFmlaCompImpl::ProcessFunction( const XclExpTokenData& rTokData, sal_u
}
}
- mbOk = pFuncInfo != 0;
- if( !mbOk ) return;
+ mxData->mbOk = pFuncInfo != 0;
+ if( !mxData->mbOk ) return;
// functions simulated by a macro call in file format
if( pFuncInfo->IsMacroFunc() )
aExtFuncData.Set( pFuncInfo->GetMacroFuncName(), false, true );
- XclExpFuncData aFuncData( rTokData, *pFuncInfo, aExtFuncData, nExpClass );
- XclExpTokenData aTokData;
+ XclExpFuncData aFuncData( rTokData, *pFuncInfo, aExtFuncData );
+ XclExpScToken aTokData;
// preparations for special functions, before function processing starts
PrepareFunction( aFuncData );
@@ -1455,12 +1409,12 @@ void XclExpFmlaCompImpl::ProcessFunction( const XclExpTokenData& rTokData, sal_u
while( eState != STATE_END ) switch( eState )
{
case STATE_START:
- mbOk = GetNextToken( aTokData ) && (aTokData.GetOpCode() == ocOpen);
- eState = mbOk ? STATE_OPEN : STATE_END;
+ mxData->mbOk = GetNextToken( aTokData ) && (aTokData.GetOpCode() == ocOpen);
+ eState = mxData->mbOk ? STATE_OPEN : STATE_END;
break;
case STATE_OPEN:
- mbOk = GetNextToken( aTokData );
- eState = mbOk ? ((aTokData.GetOpCode() == ocClose) ? STATE_CLOSE : STATE_PARAM) : STATE_END;
+ mxData->mbOk = GetNextToken( aTokData );
+ eState = mxData->mbOk ? ((aTokData.GetOpCode() == ocClose) ? STATE_CLOSE : STATE_PARAM) : STATE_END;
break;
case STATE_PARAM:
aTokData = ProcessParam( aTokData, aFuncData );
@@ -1468,13 +1422,13 @@ void XclExpFmlaCompImpl::ProcessFunction( const XclExpTokenData& rTokData, sal_u
{
case ocSep: eState = STATE_SEP; break;
case ocClose: eState = STATE_CLOSE; break;
- default: mbOk = false;
+ default: mxData->mbOk = false;
}
- if( !mbOk ) eState = STATE_END;
+ if( !mxData->mbOk ) eState = STATE_END;
break;
case STATE_SEP:
- mbOk = (aFuncData.GetParamCount() < EXC_FUNC_MAXPARAM) && GetNextToken( aTokData );
- eState = mbOk ? STATE_PARAM : STATE_END;
+ mxData->mbOk = (aFuncData.GetParamCount() < EXC_FUNC_MAXPARAM) && GetNextToken( aTokData );
+ eState = mxData->mbOk ? STATE_PARAM : STATE_END;
break;
case STATE_CLOSE:
FinishFunction( aFuncData, aTokData.mnSpaces );
@@ -1506,11 +1460,8 @@ void XclExpFmlaCompImpl::FinishFunction( XclExpFuncData& rFuncData, sal_uInt8 nC
// check if parameter count fits into the limits of the function
sal_uInt8 nParamCount = rFuncData.GetParamCount();
- sal_uInt8 nMinCount = rFuncData.GetMinParamCount();
- sal_uInt8 nMaxCount = rFuncData.GetMaxParamCount();
- if( (nMinCount <= nParamCount) && (nParamCount <= nMaxCount) )
+ if( (rFuncData.GetMinParamCount() <= nParamCount) && (nParamCount <= rFuncData.GetMaxParamCount()) )
{
- sal_uInt16 nXclFuncIdx = rFuncData.GetXclFuncIdx();
// first put the tAttrSpace tokens, they must not be included in tAttrGoto handling
AppendSpaceToken( EXC_TOK_ATTR_SPACE_SP_CLOSE, nCloseSpaces );
AppendSpaceToken( EXC_TOK_ATTR_SPACE_SP, rFuncData.GetSpaces() );
@@ -1526,31 +1477,10 @@ void XclExpFmlaCompImpl::FinishFunction( XclExpFuncData& rFuncData, sal_uInt8 nC
}
// put the tFunc or tFuncVar token (or another special token, e.g. tAttrSum)
- sal_uInt8 nRetClass = rFuncData.GetReturnClass();
- sal_uInt8 nExpRetClass = rFuncData.GetExpReturnClass();
- if( (nXclFuncIdx == EXC_FUNCID_SUM) && (nParamCount == 1) )
- {
- // SUM with only one parameter
- AppendOpTokenId( EXC_TOKID_ATTR, nExpRetClass );
- Append( EXC_TOK_ATTR_SUM );
- Append( sal_uInt16( 0 ) );
- }
- else if( (nMinCount == nMaxCount) && (nXclFuncIdx != EXC_FUNCID_EXTERNCALL) )
- {
- // fixed number of parameters
- AppendOpTokenId( GetTokenId( EXC_TOKID_FUNC, nRetClass ), nExpRetClass );
- Append( nXclFuncIdx );
- }
- else
- {
- // variable number of parameters
- AppendOpTokenId( GetTokenId( EXC_TOKID_FUNCVAR, nRetClass ), nExpRetClass );
- Append( nParamCount );
- Append( nXclFuncIdx );
- }
+ AppendFuncToken( rFuncData );
// update volatile flag - is set if at least one used function is volatile
- mbVolatile |= rFuncData.IsVolatile();
+ mxData->mbVolatile |= rFuncData.IsVolatile();
// update jump tokens for specific functions, add additional tokens
switch( rFuncData.GetOpCode() )
@@ -1564,11 +1494,11 @@ void XclExpFmlaCompImpl::FinishFunction( XclExpFuncData& rFuncData, sal_uInt8 nC
case ocCot: // simulate COT(x) by (1/TAN(x))
case ocCotHyp: // simulate COTH(x) by (1/TANH(x))
- AppendOpTokenId( EXC_TOKID_DIV, EXC_TOKCLASS_NONE );
+ AppendBinaryOperatorToken( EXC_TOKID_DIV, true );
AppendParenToken();
break;
case ocArcCot: // simulate ACOT(x) by (PI/2-ATAN(x))
- AppendOpTokenId( EXC_TOKID_SUB, EXC_TOKCLASS_NONE );
+ AppendBinaryOperatorToken( EXC_TOKID_SUB, true );
AppendParenToken();
break;
@@ -1576,7 +1506,7 @@ void XclExpFmlaCompImpl::FinishFunction( XclExpFuncData& rFuncData, sal_uInt8 nC
}
}
else
- mbOk = false;
+ mxData->mbOk = false;
}
void XclExpFmlaCompImpl::FinishIfFunction( XclExpFuncData& rFuncData )
@@ -1607,7 +1537,7 @@ void XclExpFmlaCompImpl::FinishChooseFunction( XclExpFuncData& rFuncData )
// size of jump table: number of choices, plus 1 for error position
sal_uInt16 nJumpArrSize = 2 * (nChoices + 1);
// insert the jump table into the tAttrChoose token
- Insert( nJumpArrPos, nJumpArrSize );
+ InsertZeros( nJumpArrPos, nJumpArrSize );
// update positions of tAttrGoto tokens after jump table insertion
sal_uInt16 nIdx;
for( nIdx = 1; nIdx < nParamCount; ++nIdx )
@@ -1621,25 +1551,20 @@ void XclExpFmlaCompImpl::FinishChooseFunction( XclExpFuncData& rFuncData )
Overwrite( nJumpArrPos + 2 * nIdx, static_cast< sal_uInt16 >( rAttrPos[ nIdx ] + 4 - nJumpArrPos ) );
}
-XclExpTokenData XclExpFmlaCompImpl::ProcessParam( XclExpTokenData aTokData, XclExpFuncData& rFuncData )
+XclExpScToken XclExpFmlaCompImpl::ProcessParam( XclExpScToken aTokData, XclExpFuncData& rFuncData )
{
- if( rFuncData.GetExpParamClass() == EXC_FUNC_PAR_CALCONLY )
+ if( rFuncData.IsCalcOnlyParam() )
{
// skip Calc-only parameter, stop at next ocClose or ocSep
aTokData = SkipExpression( aTokData, true );
- rFuncData.IncExpParamClassIdx();
+ rFuncData.IncParamInfoIdx();
}
else
{
// insert Excel-only parameters, modifies param count and class in rFuncData
- while( rFuncData.GetExpParamClass() == EXC_FUNC_PAR_EXCELONLY )
+ while( rFuncData.IsExcelOnlyParam() )
AppendDefaultParam( rFuncData );
- // propagate expected ARR class to subsequent subexpressions
- sal_uInt8 nExpClass = rFuncData.GetExpParamClass();
- bool bOldIsArrExp = mbIsArrExp;
- UpdateArrExpFlag( nExpClass, rFuncData.GetReturnClass() );
-
// process the parameter, stop at next ocClose or ocSep
PrepareParam( rFuncData );
/* #i37355# insert tMissArg token for missing parameters --
@@ -1649,12 +1574,10 @@ XclExpTokenData XclExpFmlaCompImpl::ProcessParam( XclExpTokenData aTokData, XclE
{
case ocSep:
case ocClose: AppendMissingToken(); break; // empty parameter
- default: aTokData = Expression( aTokData, nExpClass, false, true );
+ default: aTokData = Expression( aTokData, false, true );
}
- // restore old expected ARR class mode
- SetArrExpFlag( bOldIsArrExp );
// finalize the parameter and add special tokens, e.g. for IF or CHOOSE parameters
- if( mbOk ) FinishParam( rFuncData );
+ if( mxData->mbOk ) FinishParam( rFuncData );
}
return aTokData;
}
@@ -1698,21 +1621,18 @@ void XclExpFmlaCompImpl::PrepareParam( XclExpFuncData& rFuncData )
void XclExpFmlaCompImpl::FinishParam( XclExpFuncData& rFuncData )
{
- // index of this parameter is equal to number of already finished parameters
- sal_uInt8 nParamIdx = rFuncData.GetParamCount();
-
- // increase parameter count
- rFuncData.IncParamCount();
- // move to next expected parameter class
- rFuncData.IncExpParamClassIdx();
+ // increase parameter count, update operand stack
+ rFuncData.FinishParam( PopOperandPos() );
+ // append more tokens for parameters of some special functions
+ sal_uInt8 nParamIdx = rFuncData.GetParamCount() - 1;
switch( rFuncData.GetOpCode() )
{
case ocArcCotHyp: // simulate ACOTH(x) by ATANH(1/(x))
if( nParamIdx == 0 )
{
AppendParenToken();
- AppendOpTokenId( EXC_TOKID_DIV, EXC_TOKCLASS_NONE );
+ AppendBinaryOperatorToken( EXC_TOKID_DIV, true );
}
break;
default:;
@@ -1727,19 +1647,19 @@ void XclExpFmlaCompImpl::AppendDefaultParam( XclExpFuncData& rFuncData )
switch( rFuncData.GetOpCode() )
{
case ocExternal:
- AppendAddInFuncToken( rFuncData.GetExtFuncData(), EXC_TOKCLASS_REF );
+ AppendAddInCallToken( rFuncData.GetExtFuncData() );
break;
case ocEuroConvert:
- AppendEuroToolFuncToken( rFuncData.GetExtFuncData(), EXC_TOKCLASS_REF );
+ AppendEuroToolCallToken( rFuncData.GetExtFuncData() );
break;
case ocMacro:
- AppendMacroCallToken( rFuncData.GetExtFuncData(), EXC_TOKCLASS_REF );
+ AppendMacroCallToken( rFuncData.GetExtFuncData() );
break;
default:
{
DBG_ASSERT( rFuncData.IsMacroFunc(), "XclExpFmlaCompImpl::AppendDefaultParam - unknown opcode" );
if( rFuncData.IsMacroFunc() )
- AppendMacroCallToken( rFuncData.GetExtFuncData(), EXC_TOKCLASS_REF );
+ AppendMacroCallToken( rFuncData.GetExtFuncData() );
else
AppendMissingToken(); // to keep parameter count valid
}
@@ -1813,25 +1733,77 @@ void XclExpFmlaCompImpl::AppendTrailingParam( XclExpFuncData& rFuncData )
}
break;
+ case ocNormDist:
+ if( nParamCount == 3 )
+ {
+ // NORMDIST function needs 4 parameters in Excel
+ PrepareParam( rFuncData );
+ AppendBoolToken( true );
+ FinishParam( rFuncData );
+ }
+ break;
+
+ case ocLogNormDist:
+ switch( nParamCount )
+ {
+ // LOGNORMDIST function needs 3 parameters in Excel
+ case 1:
+ PrepareParam( rFuncData );
+ AppendIntToken( 0 );
+ FinishParam( rFuncData );
+ // do not break, add next default parameter
+ case 2:
+ PrepareParam( rFuncData );
+ AppendIntToken( 1 );
+ FinishParam( rFuncData );
+ break;
+ default:;
+ }
+
+ break;
+
default:;
}
}
-// ----------------------------------------------------------------------------
+// reference handling ---------------------------------------------------------
+
+namespace {
+
+inline bool lclIsRefRel2D( const ScSingleRefData& rRefData )
+{
+ return rRefData.IsColRel() || rRefData.IsRowRel();
+}
+
+inline bool lclIsRefDel2D( const ScSingleRefData& rRefData )
+{
+ return rRefData.IsColDeleted() || rRefData.IsRowDeleted();
+}
+
+inline bool lclIsRefRel2D( const ScComplexRefData& rRefData )
+{
+ return lclIsRefRel2D( rRefData.Ref1 ) || lclIsRefRel2D( rRefData.Ref2 );
+}
+
+inline bool lclIsRefDel2D( const ScComplexRefData& rRefData )
+{
+ return lclIsRefDel2D( rRefData.Ref1 ) || lclIsRefDel2D( rRefData.Ref2 );
+}
+
+} // namespace
SCTAB XclExpFmlaCompImpl::GetScTab( const ScSingleRefData& rRefData ) const
{
- bool bInvTab = rRefData.IsTabDeleted() || (!mpScBasePos && rRefData.IsTabRel());
+ bool bInvTab = rRefData.IsTabDeleted() || (!mxData->mpScBasePos && IsInGlobals() && rRefData.IsTabRel());
return bInvTab ? SCTAB_INVALID : static_cast< SCTAB >( rRefData.nTab );
}
bool XclExpFmlaCompImpl::IsRef2D( const ScSingleRefData& rRefData ) const
{
- /* rRefData.IsFlag3D() determines if sheet name is always visible, even on the
- own sheet. If 3D references are allowed, the passed reference does not count
- as 2D reference. If only 2D references are allowed (mpLinkMgr is 0), this
- flag is ignored, thus the passed reference will be handled as 2D reference. */
- return (!mpLinkMgr || !rRefData.IsFlag3D()) && !rRefData.IsTabDeleted() &&
+ /* rRefData.IsFlag3D() determines if sheet name is always visible, even on
+ the own sheet. If 3D references are allowed, the passed reference does
+ not count as 2D reference. */
+ return (!mxData->mpLinkMgr || !rRefData.IsFlag3D()) && !rRefData.IsTabDeleted() &&
(rRefData.IsTabRel() ? (rRefData.nRelTab == 0) : (static_cast< SCTAB >( rRefData.nTab ) == GetCurrScTab()));
}
@@ -1844,10 +1816,10 @@ void XclExpFmlaCompImpl::ConvertRefData(
ScSingleRefData& rRefData, XclAddress& rXclPos,
bool bNatLangRef, bool bTruncMaxCol, bool bTruncMaxRow ) const
{
- if( mpScBasePos )
+ if( mxData->mpScBasePos )
{
// *** reference position exists (cell, matrix) - convert to absolute ***
- rRefData.CalcAbsIfRel( *mpScBasePos );
+ rRefData.CalcAbsIfRel( *mxData->mpScBasePos );
// convert column index
SCsCOL& rnScCol = rRefData.nCol;
@@ -1876,6 +1848,10 @@ void XclExpFmlaCompImpl::ConvertRefData(
// convert row index (2-step-cast ScsROW->sal_Int16->sal_uInt16 to get all bits correctly)
sal_Int16 nXclRelRow = static_cast< sal_Int16 >( rRefData.IsRowRel() ? rRefData.nRelRow : rRefData.nRow );
rXclPos.mnRow = static_cast< sal_uInt16 >( nXclRelRow ) & mnMaxRowMask;
+
+ // resolve relative tab index if possible
+ if( rRefData.IsTabRel() && !IsInGlobals() && (GetCurrScTab() < GetDoc().GetTableCount()) )
+ rRefData.nTab = static_cast< SCsTAB >( GetCurrScTab() + rRefData.nRelTab );
}
// flags for relative column and row
@@ -1905,19 +1881,19 @@ void XclExpFmlaCompImpl::ConvertRefData(
XclExpRefLogEntry* XclExpFmlaCompImpl::GetNewRefLogEntry()
{
- if( mpRefLog )
+ if( mxData->mpRefLog )
{
- mpRefLog->resize( mpRefLog->size() + 1 );
- return &mpRefLog->back();
+ mxData->mpRefLog->resize( mxData->mpRefLog->size() + 1 );
+ return &mxData->mpRefLog->back();
}
return 0;
}
-void XclExpFmlaCompImpl::ProcessCellRef( const XclExpTokenData& rTokData, sal_uInt8 nExpClass )
+void XclExpFmlaCompImpl::ProcessCellRef( const XclExpScToken& rTokData )
{
// get the Excel address components, adjust internal data in aRefData
- bool bNatLangRef = (meBiff == EXC_BIFF8) && mpScBasePos && (rTokData.GetOpCode() == ocColRowName);
- ScSingleRefData aRefData( static_cast<const ScToken*>(rTokData.mpScToken)->GetSingleRef() );
+ bool bNatLangRef = (meBiff == EXC_BIFF8) && mxData->mpScBasePos && (rTokData.GetOpCode() == ocColRowName);
+ ScSingleRefData aRefData = static_cast< const ScToken* >( rTokData.mpScToken )->GetSingleRef();
XclAddress aXclPos( ScAddress::UNINITIALIZED );
ConvertRefData( aRefData, aXclPos, bNatLangRef, false, false );
@@ -1927,33 +1903,33 @@ void XclExpFmlaCompImpl::ProcessCellRef( const XclExpTokenData& rTokData, sal_uI
"XclExpFmlaCompImpl::ProcessCellRef - broken natural language reference" );
// create tNlr token for natural language reference
sal_uInt8 nSubId = aRefData.IsColRel() ? EXC_TOK_NLR_COLV : EXC_TOK_NLR_ROWV;
- AppendOpTokenId( EXC_TOKID_NLR, nExpClass, rTokData.mnSpaces );
+ AppendOperandTokenId( EXC_TOKID_NLR, rTokData.mnSpaces );
Append( nSubId );
AppendAddress( aXclPos );
}
else
{
// store external cell contents in CRN records
- if( maCfg.mbFromCell && mpLinkMgr && mpScBasePos )
- mpLinkMgr->StoreCell( aRefData );
+ if( mxData->mrCfg.mbFromCell && mxData->mpLinkMgr && mxData->mpScBasePos )
+ mxData->mpLinkMgr->StoreCell( aRefData );
// create the tRef, tRefErr, tRefN, tRef3d, or tRefErr3d token
- if( !maCfg.mb3DRefOnly && IsRef2D( aRefData ) )
+ if( !mxData->mrCfg.mb3DRefOnly && IsRef2D( aRefData ) )
{
// 2D reference (not in defined names, but allowed in range lists)
- sal_uInt8 nBaseId = (!mpScBasePos && lclIsRefRel2D( aRefData )) ? EXC_TOKID_REFN :
+ sal_uInt8 nBaseId = (!mxData->mpScBasePos && lclIsRefRel2D( aRefData )) ? EXC_TOKID_REFN :
(lclIsRefDel2D( aRefData ) ? EXC_TOKID_REFERR : EXC_TOKID_REF);
- AppendOpTokenId( GetTokenId( nBaseId, EXC_TOKCLASS_REF ), nExpClass, rTokData.mnSpaces );
+ AppendOperandTokenId( GetTokenId( nBaseId, EXC_TOKCLASS_REF ), rTokData.mnSpaces );
AppendAddress( aXclPos );
}
- else if( mpLinkMgr ) // 3D reference
+ else if( mxData->mpLinkMgr ) // 3D reference
{
// 1-based EXTERNSHEET index and 0-based Excel sheet index
sal_uInt16 nExtSheet, nXclTab;
- mpLinkMgr->FindExtSheet( nExtSheet, nXclTab, GetScTab( aRefData ), GetNewRefLogEntry() );
+ mxData->mpLinkMgr->FindExtSheet( nExtSheet, nXclTab, GetScTab( aRefData ), GetNewRefLogEntry() );
// write the token
sal_uInt8 nBaseId = lclIsRefDel2D( aRefData ) ? EXC_TOKID_REFERR3D : EXC_TOKID_REF3D;
- AppendOpTokenId( GetTokenId( nBaseId, EXC_TOKCLASS_REF ), nExpClass, rTokData.mnSpaces );
+ AppendOperandTokenId( GetTokenId( nBaseId, EXC_TOKCLASS_REF ), rTokData.mnSpaces );
Append( nExtSheet );
if( meBiff <= EXC_BIFF5 )
{
@@ -1971,35 +1947,35 @@ void XclExpFmlaCompImpl::ProcessCellRef( const XclExpTokenData& rTokData, sal_uI
}
}
-void XclExpFmlaCompImpl::ProcessRangeRef( const XclExpTokenData& rTokData, sal_uInt8 nExpClass )
+void XclExpFmlaCompImpl::ProcessRangeRef( const XclExpScToken& rTokData )
{
// get the Excel address components, adjust internal data in aRefData
- ScComplexRefData aRefData( static_cast<const ScToken*>(rTokData.mpScToken)->GetDoubleRef() );
+ ScComplexRefData aRefData = static_cast< const ScToken* >( rTokData.mpScToken )->GetDoubleRef();
XclRange aXclRange( ScAddress::UNINITIALIZED );
ConvertRefData( aRefData, aXclRange, false );
// store external cell contents in CRN records
- if( maCfg.mbFromCell && mpLinkMgr && mpScBasePos )
- mpLinkMgr->StoreCellRange( aRefData );
+ if( mxData->mrCfg.mbFromCell && mxData->mpLinkMgr && mxData->mpScBasePos )
+ mxData->mpLinkMgr->StoreCellRange( aRefData );
// create the tArea, tAreaErr, tAreaN, tArea3d, or tAreaErr3d token
- if( !maCfg.mb3DRefOnly && IsRef2D( aRefData ) )
+ if( !mxData->mrCfg.mb3DRefOnly && IsRef2D( aRefData ) )
{
// 2D reference (not in name formulas, but allowed in range lists)
- sal_uInt8 nBaseId = (!mpScBasePos && lclIsRefRel2D( aRefData )) ? EXC_TOKID_AREAN :
+ sal_uInt8 nBaseId = (!mxData->mpScBasePos && lclIsRefRel2D( aRefData )) ? EXC_TOKID_AREAN :
(lclIsRefDel2D( aRefData ) ? EXC_TOKID_AREAERR : EXC_TOKID_AREA);
- AppendOpTokenId( GetTokenId( nBaseId, EXC_TOKCLASS_REF ), nExpClass, rTokData.mnSpaces );
+ AppendOperandTokenId( GetTokenId( nBaseId, EXC_TOKCLASS_REF ), rTokData.mnSpaces );
AppendRange( aXclRange );
}
- else if( mpLinkMgr ) // 3D reference
+ else if( mxData->mpLinkMgr ) // 3D reference
{
// 1-based EXTERNSHEET index and 0-based Excel sheet indexes
sal_uInt16 nExtSheet, nFirstXclTab, nLastXclTab;
- mpLinkMgr->FindExtSheet( nExtSheet, nFirstXclTab, nLastXclTab,
+ mxData->mpLinkMgr->FindExtSheet( nExtSheet, nFirstXclTab, nLastXclTab,
GetScTab( aRefData.Ref1 ), GetScTab( aRefData.Ref2 ), GetNewRefLogEntry() );
// write the token
sal_uInt8 nBaseId = lclIsRefDel2D( aRefData ) ? EXC_TOKID_AREAERR3D : EXC_TOKID_AREA3D;
- AppendOpTokenId( GetTokenId( nBaseId, EXC_TOKCLASS_REF ), nExpClass, rTokData.mnSpaces );
+ AppendOperandTokenId( GetTokenId( nBaseId, EXC_TOKCLASS_REF ), rTokData.mnSpaces );
Append( nExtSheet );
if( meBiff <= EXC_BIFF5 )
{
@@ -2016,7 +1992,80 @@ void XclExpFmlaCompImpl::ProcessRangeRef( const XclExpTokenData& rTokData, sal_u
}
}
-void XclExpFmlaCompImpl::ProcessDefinedName( const XclExpTokenData& rTokData, sal_uInt8 nExpClass )
+void XclExpFmlaCompImpl::ProcessExternalCellRef( const XclExpScToken& rTokData )
+{
+ if( mxData->mpLinkMgr )
+ {
+ // get the Excel address components, adjust internal data in aRefData
+ ScSingleRefData aRefData = static_cast< const ScToken* >( rTokData.mpScToken )->GetSingleRef();
+ XclAddress aXclPos( ScAddress::UNINITIALIZED );
+ ConvertRefData( aRefData, aXclPos, false, false, false );
+
+ // store external cell contents in CRN records
+ USHORT nFileId = rTokData.mpScToken->GetIndex();
+ const String& rTabName = rTokData.mpScToken->GetString();
+ if( mxData->mrCfg.mbFromCell && mxData->mpScBasePos )
+ mxData->mpLinkMgr->StoreCell( nFileId, rTabName, aRefData );
+
+ // 1-based EXTERNSHEET index and 0-based Excel sheet indexes
+ sal_uInt16 nExtSheet, nFirstSBTab, nLastSBTab;
+ mxData->mpLinkMgr->FindExtSheet( nFileId, rTabName, 1, nExtSheet, nFirstSBTab, nLastSBTab, GetNewRefLogEntry() );
+ // write the token
+ sal_uInt8 nBaseId = lclIsRefDel2D( aRefData ) ? EXC_TOKID_REFERR3D : EXC_TOKID_REF3D;
+ AppendOperandTokenId( GetTokenId( nBaseId, EXC_TOKCLASS_REF ), rTokData.mnSpaces );
+ Append( nExtSheet );
+ if( meBiff <= EXC_BIFF5 )
+ {
+ Append( 0, 8 );
+ Append( nFirstSBTab );
+ Append( nLastSBTab );
+ }
+ AppendAddress( aXclPos );
+ }
+ else
+ {
+ AppendErrorToken( EXC_ERR_REF, rTokData.mnSpaces );
+ }
+}
+
+void XclExpFmlaCompImpl::ProcessExternalRangeRef( const XclExpScToken& rTokData )
+{
+ if( mxData->mpLinkMgr )
+ {
+ // get the Excel address components, adjust internal data in aRefData
+ ScComplexRefData aRefData = static_cast< const ScToken* >( rTokData.mpScToken )->GetDoubleRef();
+ XclRange aXclRange( ScAddress::UNINITIALIZED );
+ ConvertRefData( aRefData, aXclRange, false );
+
+ // store external cell contents in CRN records
+ USHORT nFileId = rTokData.mpScToken->GetIndex();
+ const String& rTabName = rTokData.mpScToken->GetString();
+ if( mxData->mrCfg.mbFromCell && mxData->mpScBasePos )
+ mxData->mpLinkMgr->StoreCellRange( nFileId, rTabName, aRefData );
+
+ // 1-based EXTERNSHEET index and 0-based Excel sheet indexes
+ sal_uInt16 nExtSheet, nFirstSBTab, nLastSBTab;
+ sal_uInt16 nTabSpan = static_cast< sal_uInt16 >( aRefData.Ref2.nTab - aRefData.Ref1.nTab + 1 );
+ mxData->mpLinkMgr->FindExtSheet( nFileId, rTabName, nTabSpan, nExtSheet, nFirstSBTab, nLastSBTab, GetNewRefLogEntry() );
+ // write the token
+ sal_uInt8 nBaseId = lclIsRefDel2D( aRefData ) ? EXC_TOKID_AREAERR3D : EXC_TOKID_AREA3D;
+ AppendOperandTokenId( GetTokenId( nBaseId, EXC_TOKCLASS_REF ), rTokData.mnSpaces );
+ Append( nExtSheet );
+ if( meBiff <= EXC_BIFF5 )
+ {
+ Append( 0, 8 );
+ Append( nFirstSBTab );
+ Append( nLastSBTab );
+ }
+ AppendRange( aXclRange );
+ }
+ else
+ {
+ AppendErrorToken( EXC_ERR_REF, rTokData.mnSpaces );
+ }
+}
+
+void XclExpFmlaCompImpl::ProcessDefinedName( const XclExpScToken& rTokData )
{
XclExpNameManager& rNameMgr = GetNameManager();
sal_uInt16 nNameIdx = rNameMgr.InsertName( rTokData.mpScToken->GetIndex() );
@@ -2024,218 +2073,167 @@ void XclExpFmlaCompImpl::ProcessDefinedName( const XclExpTokenData& rTokData, sa
{
// global names always with tName token, local names dependent on config
SCTAB nScTab = rNameMgr.GetScTab( nNameIdx );
- if( (nScTab == SCTAB_GLOBAL) || (!maCfg.mb3DRefOnly && (nScTab == GetCurrScTab())) )
+ if( (nScTab == SCTAB_GLOBAL) || (!mxData->mrCfg.mb3DRefOnly && (nScTab == GetCurrScTab())) )
{
- AppendNameToken( nNameIdx, nExpClass, rTokData.mnSpaces );
+ AppendNameToken( nNameIdx, rTokData.mnSpaces );
}
- else if( mpLinkMgr )
+ else if( mxData->mpLinkMgr )
{
// use the same special EXTERNNAME to refer to any local name
- sal_uInt16 nExtSheet = mpLinkMgr->FindExtSheet( EXC_EXTSH_OWNDOC );
- AppendNameXToken( nExtSheet, nNameIdx, nExpClass, rTokData.mnSpaces );
+ sal_uInt16 nExtSheet = mxData->mpLinkMgr->FindExtSheet( EXC_EXTSH_OWNDOC );
+ AppendNameXToken( nExtSheet, nNameIdx, rTokData.mnSpaces );
}
else
AppendErrorToken( EXC_ERR_NAME, rTokData.mnSpaces );
// volatile names (containing volatile functions)
- mbVolatile |= rNameMgr.IsVolatile( nNameIdx );
+ mxData->mbVolatile |= rNameMgr.IsVolatile( nNameIdx );
}
else
AppendErrorToken( EXC_ERR_NAME, rTokData.mnSpaces );
}
-void XclExpFmlaCompImpl::ProcessDatabaseArea( const XclExpTokenData& rTokData, sal_uInt8 nExpClass )
-{
- sal_uInt16 nNameIdx = GetNameManager().InsertDBRange( rTokData.mpScToken->GetIndex() );
- AppendNameToken( nNameIdx, nExpClass, rTokData.mnSpaces );
-}
-
-// token identifiers ----------------------------------------------------------
-
-void XclExpFmlaCompImpl::SetReplaceTokenClasses()
+void XclExpFmlaCompImpl::ProcessExternalName( const XclExpScToken& rTokData )
{
- /* REF expected: change VAL to ARR in array and name type, or if ARR is expected somewhere before.
- Example: How does the return class of PI() (default VAL) change in SUM() (expects REF)?
- =SUM(PI()) -> PI() still returns VAL in cell formula
- {=SUM(PI())} -> PI() returns ARR in array formula
- =MDET(SUM(PI())) -> expected ARR from MDET(), PI() returns ARR too
- */
- mnRefExpClass = (mbIsArrExp || (maCfg.meClassType != EXC_CLASSTYPE_CELL)) ? EXC_TOKCLASS_ARR : EXC_TOKCLASS_VAL;
+ if( mxData->mpLinkMgr )
+ {
+ ScExternalRefManager& rExtRefMgr = *GetDoc().GetExternalRefManager();
+ USHORT nFileId = rTokData.mpScToken->GetIndex();
+ const String& rName = rTokData.mpScToken->GetString();
+ ScExternalRefCache::TokenArrayRef xArray = rExtRefMgr.getRangeNameTokens( nFileId, rName );
+ if( xArray.get() )
+ {
+ // store external cell contents in CRN records
+ if( mxData->mpScBasePos )
+ {
+ for( FormulaToken* pScToken = xArray->First(); pScToken; pScToken = xArray->Next() )
+ {
+ if( pScToken->GetOpCode() == ocExternalRef )
+ {
+ switch( pScToken->GetType() )
+ {
+ case svExternalSingleRef:
+ {
+ ScSingleRefData aRefData = static_cast< ScToken* >( pScToken )->GetSingleRef();
+ aRefData.CalcAbsIfRel( *mxData->mpScBasePos );
+ mxData->mpLinkMgr->StoreCell( nFileId, pScToken->GetString(), aRefData );
+ }
+ break;
+ case svExternalDoubleRef:
+ {
+ ScComplexRefData aRefData = static_cast< ScToken* >( pScToken )->GetDoubleRef();
+ aRefData.CalcAbsIfRel( *mxData->mpScBasePos );
+ mxData->mpLinkMgr->StoreCellRange( nFileId, pScToken->GetString(), aRefData );
+ }
+ default:
+ ; // nothing, avoid compiler warning
+ }
+ }
+ }
+ }
- /* VAL expected: set to ARR, if ARR is expected somewhere before; otherwise set to VAL.
- Example: How does the class of A1 (default REF) change in ABS() (expects VAL)?
- =ABS(A1) -> A1 is VAL in cell formula
- =MDET(ABS(A1)) -> expected ARR from MDET(), A1 is ARR in cell formula
- */
- mnValExpClass = mbIsArrExp ? EXC_TOKCLASS_ARR : EXC_TOKCLASS_VAL;
+ // insert the new external name and create the tNameX token
+ sal_uInt16 nExtSheet, nExtName;
+ const String* pFile = rExtRefMgr.getExternalFileName( nFileId );
+ if( pFile && mxData->mpLinkMgr->InsertExtName( nExtSheet, nExtName, *pFile, rName, xArray ) )
+ {
+ AppendNameXToken( nExtSheet, nExtName, rTokData.mnSpaces );
+ return;
+ }
+ }
+ }
- /* ARR expected: always set to ARR. */
- mnArrExpClass = EXC_TOKCLASS_ARR;
+ // on any error: create a #NAME? error
+ AppendErrorToken( EXC_ERR_NAME, rTokData.mnSpaces );
}
-void XclExpFmlaCompImpl::SetArrExpFlag( bool bIsArrExp )
+void XclExpFmlaCompImpl::ProcessDatabaseArea( const XclExpScToken& rTokData )
{
- if( mbIsArrExp != bIsArrExp )
- {
- mbIsArrExp = bIsArrExp;
- SetReplaceTokenClasses();
- }
+ sal_uInt16 nNameIdx = GetNameManager().InsertDBRange( rTokData.mpScToken->GetIndex() );
+ AppendNameToken( nNameIdx, rTokData.mnSpaces );
}
-void XclExpFmlaCompImpl::UpdateArrExpFlag( sal_uInt8 nParamExpClass, sal_uInt8 nFuncRetClass )
-{
- bool bNewIsArrExp = false;
- switch( maCfg.meClassType )
- {
- case EXC_CLASSTYPE_CELL:
- bNewIsArrExp = nParamExpClass == EXC_TOKCLASS_ARR;
- break;
- case EXC_CLASSTYPE_ARRAY:
- bNewIsArrExp = nParamExpClass != EXC_TOKCLASS_VAL;
- break;
- case EXC_CLASSTYPE_NAME:
- bNewIsArrExp = ((nParamExpClass != EXC_TOKCLASS_VAL) || (nFuncRetClass != EXC_TOKCLASS_REF));
- break;
+// token vector ---------------------------------------------------------------
- default :
- break;
- }
- SetArrExpFlag( mbIsArrExp || bNewIsArrExp );
+void XclExpFmlaCompImpl::PushOperandPos( sal_uInt16 nTokPos )
+{
+ mxData->maOpPosStack.push_back( nTokPos );
}
-void XclExpFmlaCompImpl::AdjustTokenClass( sal_uInt8& rnTokenId, sal_uInt8 nExpClass )
+void XclExpFmlaCompImpl::PushOperatorPos( sal_uInt16 nTokPos, const XclExpOperandListRef& rxOperands )
{
- sal_uInt8 nIsClass = GetTokenClass( rnTokenId );
- if( nIsClass != EXC_TOKCLASS_NONE )
- {
- if( nExpClass == EXC_TOKCLASS_ANY_IN_REFOP )
- {
- // always set to REF, if used by reference operators
- ChangeTokenClass( rnTokenId, EXC_TOKCLASS_REF );
- }
- else
- {
- /* If a REF token is part of a value operator, it behaves like a VAL token.
- e.g.: =SUM(A1) -> SUM() expects REF, A1 is REF.
- =SUM(A1+A1) -> SUM() expects REF, but both A1 are handled like VAL tokens. */
- if( (nIsClass == EXC_TOKCLASS_REF) && ::get_flag( nExpClass, EXC_TOKCLASS_INOP_FLAG ) )
- {
- ChangeTokenClass( rnTokenId, EXC_TOKCLASS_VAL );
- nIsClass = EXC_TOKCLASS_VAL; // update nIsClass for following switch
- }
-
- // change token class according to expected parameter class
- switch( nExpClass )
- {
- case EXC_TOKCLASS_REF:
- case EXC_TOKCLASS_REF_IN_VALOP:
- if( nIsClass == EXC_TOKCLASS_VAL )
- ChangeTokenClass( rnTokenId, mnRefExpClass );
- break;
- case EXC_TOKCLASS_VAL:
- case EXC_TOKCLASS_VAL_IN_VALOP:
- ChangeTokenClass( rnTokenId, mnValExpClass );
- break;
- case EXC_TOKCLASS_ARR:
- case EXC_TOKCLASS_ARR_IN_VALOP:
- ChangeTokenClass( rnTokenId, mnArrExpClass );
- break;
- }
- }
- }
+ PushOperandPos( nTokPos );
+ DBG_ASSERT( rxOperands.get(), "XclExpFmlaCompImpl::AppendOperatorTokenId - missing operand list" );
+ if( mxData->maOpListVec.size() <= nTokPos )
+ mxData->maOpListVec.resize( nTokPos + 1, XclExpOperandListRef() );
+ mxData->maOpListVec[ nTokPos ] = rxOperands;
}
-void XclExpFmlaCompImpl::AdjustLastTokenClass( sal_uInt8 nExpClass )
+sal_uInt16 XclExpFmlaCompImpl::PopOperandPos()
{
- DBG_ASSERT( mnLastTokPos < GetSize(), "XclExpFmlaCompImpl::AdjustLastTokenClass - invalid position" );
- sal_uInt8& rnTokenId = maTokVec[ mnLastTokPos ];
- mnLastDefClass = GetTokenClass( rnTokenId );
- AdjustTokenClass( rnTokenId, nExpClass );
+ DBG_ASSERT( !mxData->maOpPosStack.empty(), "XclExpFmlaCompImpl::PopOperandPos - token stack broken" );
+ sal_uInt16 nTokPos = mxData->maOpPosStack.back();
+ mxData->maOpPosStack.pop_back();
+ return nTokPos;
}
-void XclExpFmlaCompImpl::AdjustLastTokenClassForEastereggOp()
+namespace {
+
+inline void lclAppend( ScfUInt8Vec& orVector, sal_uInt16 nData )
{
- /* This very special function cares about the leading subexpression of the
- Calc easteregg operators OR and AND.
- Example: The Calc formula =(A1:A2)OR(0) will be compiled to the Excel
- formula =OR(A1:A2,0). The Excel OR function expects REF parameters to
- be able to process all cells in a range reference. Since this compiler
- didn't know this when processing the (A1:A2) subexpression, it may
- create a tAreaV token from the reference (e.g. if in cell context).
- This would cause Excel to only evaluate cell A1, and to ignore cell A2,
- if the formula is located in cell B1.
- So this function changes the last token back to its default class and
- adjusts it with expected REF class, which is what would happen, if a
- regular OR or AND function is processed. */
- DBG_ASSERT( mnLastTokPos < GetSize(), "XclExpFmlaCompImpl::AdjustLastTokenClassForEastereggOp - invalid position" );
- sal_uInt8& rnTokenId = maTokVec[ mnLastTokPos ];
- if( GetTokenClass( rnTokenId ) != EXC_TOKCLASS_NONE )
- {
- ChangeTokenClass( rnTokenId, mnLastDefClass );
- AdjustTokenClass( rnTokenId, EXC_TOKCLASS_REF );
- }
+ orVector.resize( orVector.size() + 2 );
+ ShortToSVBT16( nData, &*(orVector.end() - 2) );
}
-void XclExpFmlaCompImpl::AppendOpTokenId( sal_uInt8 nTokenId, sal_uInt8 nExpClass, sal_uInt8 nSpaces )
+inline void lclAppend( ScfUInt8Vec& orVector, sal_uInt32 nData )
{
- AppendSpaceToken( EXC_TOK_ATTR_SPACE_SP, nSpaces );
- mnLastTokPos = GetSize();
- Append( nTokenId );
- AdjustLastTokenClass( nExpClass );
+ orVector.resize( orVector.size() + 4 );
+ UInt32ToSVBT32( nData, &*(orVector.end() - 4) );
}
-//UNUSED2008-05 void XclExpFmlaCompImpl::AppendFuncTokenId(
-//UNUSED2008-05 sal_uInt16 nXclFuncIdx, sal_uInt8 nRetClass, sal_uInt8 nExpRetClass, sal_uInt8 nSpaces )
-//UNUSED2008-05 {
-//UNUSED2008-05 AppendOpTokenId( GetTokenId( EXC_TOKID_FUNC, nRetClass ), nExpRetClass, nSpaces );
-//UNUSED2008-05 Append( nXclFuncIdx );
-//UNUSED2008-05 }
+inline void lclAppend( ScfUInt8Vec& orVector, double fData )
+{
+ orVector.resize( orVector.size() + 8 );
+ DoubleToSVBT64( fData, &*(orVector.end() - 8) );
+}
-void XclExpFmlaCompImpl::AppendVarFuncTokenId(
- sal_uInt16 nXclFuncIdx, sal_uInt8 nRetClass, sal_uInt8 nExpRetClass,
- sal_uInt8 nParamCount, sal_uInt8 nSpaces )
+inline void lclAppend( ScfUInt8Vec& orVector, const XclExpRoot& rRoot, const String& rString, XclStrFlags nStrFlags )
{
- AppendOpTokenId( GetTokenId( EXC_TOKID_FUNCVAR, nRetClass ), nExpRetClass, nSpaces );
- Append( nParamCount );
- Append( nXclFuncIdx );
+ XclExpStringRef xXclStr = XclExpStringHelper::CreateString( rRoot, rString, nStrFlags, EXC_TOK_STR_MAXLEN );
+ size_t nSize = orVector.size();
+ orVector.resize( nSize + xXclStr->GetSize() );
+ xXclStr->WriteToMem( &orVector[ nSize ] );
}
-// token vector ---------------------------------------------------------------
+} // namespace
void XclExpFmlaCompImpl::Append( sal_uInt8 nData )
{
- maTokVec.push_back( nData );
+ mxData->maTokVec.push_back( nData );
}
void XclExpFmlaCompImpl::Append( sal_uInt8 nData, size_t nCount )
{
- maTokVec.resize( maTokVec.size() + nCount, nData );
+ mxData->maTokVec.resize( mxData->maTokVec.size() + nCount, nData );
}
void XclExpFmlaCompImpl::Append( sal_uInt16 nData )
{
- maTokVec.resize( maTokVec.size() + 2 );
- ShortToSVBT16( nData, &*(maTokVec.end() - 2) );
+ lclAppend( mxData->maTokVec, nData );
}
void XclExpFmlaCompImpl::Append( sal_uInt32 nData )
{
- maTokVec.resize( maTokVec.size() + 4 );
- UInt32ToSVBT32( nData, &*(maTokVec.end() - 4) );
+ lclAppend( mxData->maTokVec, nData );
}
void XclExpFmlaCompImpl::Append( double fData )
{
- maTokVec.resize( maTokVec.size() + 8 );
- DoubleToSVBT64( fData, &*(maTokVec.end() - 8) );
+ lclAppend( mxData->maTokVec, fData );
}
void XclExpFmlaCompImpl::Append( const String& rString )
{
- XclExpStringRef xXclStr = XclExpStringHelper::CreateString(
- GetRoot(), rString, EXC_STR_8BITLENGTH, EXC_TOK_STR_MAXLEN );
- size_t nSize = maTokVec.size();
- maTokVec.resize( nSize + xXclStr->GetSize() );
- xXclStr->WriteToMem( &maTokVec[ nSize ] );
+ lclAppend( mxData->maTokVec, GetRoot(), rString, EXC_STR_8BITLENGTH );
}
void XclExpFmlaCompImpl::AppendAddress( const XclAddress& rXclPos )
@@ -2265,7 +2263,7 @@ void XclExpFmlaCompImpl::AppendRange( const XclRange& rXclRange )
void XclExpFmlaCompImpl::AppendSpaceToken( sal_uInt8 nType, sal_uInt8 nCount )
{
- if( nCount )
+ if( nCount > 0 )
{
Append( EXC_TOKID_ATTR );
Append( EXC_TOK_ATTR_SPACE );
@@ -2274,40 +2272,47 @@ void XclExpFmlaCompImpl::AppendSpaceToken( sal_uInt8 nType, sal_uInt8 nCount )
}
}
+void XclExpFmlaCompImpl::AppendOperandTokenId( sal_uInt8 nTokenId, sal_uInt8 nSpaces )
+{
+ AppendSpaceToken( EXC_TOK_ATTR_SPACE_SP, nSpaces );
+ PushOperandPos( GetSize() );
+ Append( nTokenId );
+}
+
void XclExpFmlaCompImpl::AppendIntToken( sal_uInt16 nValue, sal_uInt8 nSpaces )
{
- AppendOpTokenId( EXC_TOKID_INT, EXC_TOKCLASS_NONE, nSpaces );
+ AppendOperandTokenId( EXC_TOKID_INT, nSpaces );
Append( nValue );
}
void XclExpFmlaCompImpl::AppendNumToken( double fValue, sal_uInt8 nSpaces )
{
- AppendOpTokenId( EXC_TOKID_NUM, EXC_TOKCLASS_NONE, nSpaces );
+ AppendOperandTokenId( EXC_TOKID_NUM, nSpaces );
Append( fValue );
}
void XclExpFmlaCompImpl::AppendBoolToken( bool bValue, sal_uInt8 nSpaces )
{
- AppendOpTokenId( EXC_TOKID_BOOL, EXC_TOKCLASS_NONE, nSpaces );
+ AppendOperandTokenId( EXC_TOKID_BOOL, nSpaces );
Append( bValue ? EXC_TOK_BOOL_TRUE : EXC_TOK_BOOL_FALSE );
}
void XclExpFmlaCompImpl::AppendErrorToken( sal_uInt8 nErrCode, sal_uInt8 nSpaces )
{
- AppendOpTokenId( EXC_TOKID_ERR, EXC_TOKCLASS_NONE, nSpaces );
+ AppendOperandTokenId( EXC_TOKID_ERR, nSpaces );
Append( nErrCode );
}
void XclExpFmlaCompImpl::AppendMissingToken( sal_uInt8 nSpaces )
{
- AppendOpTokenId( EXC_TOKID_MISSARG, EXC_TOKCLASS_NONE, nSpaces );
+ AppendOperandTokenId( EXC_TOKID_MISSARG, nSpaces );
}
-void XclExpFmlaCompImpl::AppendNameToken( sal_uInt16 nNameIdx, sal_uInt8 nExpClass, sal_uInt8 nSpaces )
+void XclExpFmlaCompImpl::AppendNameToken( sal_uInt16 nNameIdx, sal_uInt8 nSpaces )
{
if( nNameIdx > 0 )
{
- AppendOpTokenId( GetTokenId( EXC_TOKID_NAME, EXC_TOKCLASS_REF ), nExpClass, nSpaces );
+ AppendOperandTokenId( GetTokenId( EXC_TOKID_NAME, EXC_TOKCLASS_REF ), nSpaces );
Append( nNameIdx );
Append( 0, (meBiff <= EXC_BIFF5) ? 12 : 2 );
}
@@ -2315,15 +2320,15 @@ void XclExpFmlaCompImpl::AppendNameToken( sal_uInt16 nNameIdx, sal_uInt8 nExpCla
AppendErrorToken( EXC_ERR_NAME );
}
-void XclExpFmlaCompImpl::AppendMissingNameToken( const String& rName, sal_uInt8 nExpClass, sal_uInt8 nSpaces )
+void XclExpFmlaCompImpl::AppendMissingNameToken( const String& rName, sal_uInt8 nSpaces )
{
sal_uInt16 nNameIdx = GetNameManager().InsertRawName( rName );
- AppendNameToken( nNameIdx, nExpClass, nSpaces );
+ AppendNameToken( nNameIdx, nSpaces );
}
-void XclExpFmlaCompImpl::AppendNameXToken( sal_uInt16 nExtSheet, sal_uInt16 nExtName, sal_uInt8 nExpClass, sal_uInt8 nSpaces )
+void XclExpFmlaCompImpl::AppendNameXToken( sal_uInt16 nExtSheet, sal_uInt16 nExtName, sal_uInt8 nSpaces )
{
- AppendOpTokenId( GetTokenId( EXC_TOKID_NAMEX, EXC_TOKCLASS_REF ), nExpClass, nSpaces );
+ AppendOperandTokenId( GetTokenId( EXC_TOKID_NAMEX, EXC_TOKCLASS_REF ), nSpaces );
Append( nExtSheet );
if( meBiff <= EXC_BIFF5 )
Append( 0, 8 );
@@ -2331,34 +2336,94 @@ void XclExpFmlaCompImpl::AppendNameXToken( sal_uInt16 nExtSheet, sal_uInt16 nExt
Append( 0, (meBiff <= EXC_BIFF5) ? 12 : 2 );
}
-void XclExpFmlaCompImpl::AppendMacroCallToken( const XclExpExtFuncData& rExtFuncData, sal_uInt8 nExpClass, sal_uInt8 nSpaces )
+void XclExpFmlaCompImpl::AppendMacroCallToken( const XclExpExtFuncData& rExtFuncData, sal_uInt8 nSpaces )
{
sal_uInt16 nNameIdx = GetNameManager().InsertMacroCall( rExtFuncData.maFuncName, rExtFuncData.mbVBasic, true, rExtFuncData.mbHidden );
- AppendNameToken( nNameIdx, nExpClass, nSpaces );
+ AppendNameToken( nNameIdx, nSpaces );
}
-void XclExpFmlaCompImpl::AppendAddInFuncToken( const XclExpExtFuncData& rExtFuncData, sal_uInt8 nExpClass, sal_uInt8 nSpaces )
+void XclExpFmlaCompImpl::AppendAddInCallToken( const XclExpExtFuncData& rExtFuncData, sal_uInt8 nSpaces )
{
String aXclFuncName;
- if( ScGlobal::GetAddInCollection()->GetExcelName( rExtFuncData.maFuncName, GetUILanguage(), aXclFuncName ) )
+ if( mxData->mpLinkMgr && ScGlobal::GetAddInCollection()->GetExcelName( rExtFuncData.maFuncName, GetUILanguage(), aXclFuncName ) )
{
sal_uInt16 nExtSheet, nExtName;
- if( mpLinkMgr && mpLinkMgr->InsertAddIn( nExtSheet, nExtName, aXclFuncName ) )
+ if( mxData->mpLinkMgr->InsertAddIn( nExtSheet, nExtName, aXclFuncName ) )
{
- AppendNameXToken( nExtSheet, nExtName, nExpClass, nSpaces );
+ AppendNameXToken( nExtSheet, nExtName, nSpaces );
return;
}
}
- AppendMacroCallToken( rExtFuncData, nExpClass, nSpaces );
+ AppendMacroCallToken( rExtFuncData, nSpaces );
}
-void XclExpFmlaCompImpl::AppendEuroToolFuncToken( const XclExpExtFuncData& rExtFuncData, sal_uInt8 nExpClass, sal_uInt8 nSpaces )
+void XclExpFmlaCompImpl::AppendEuroToolCallToken( const XclExpExtFuncData& rExtFuncData, sal_uInt8 nSpaces )
{
sal_uInt16 nExtSheet, nExtName;
- if( mpLinkMgr && mpLinkMgr->InsertEuroTool( nExtSheet, nExtName, rExtFuncData.maFuncName ) )
- AppendNameXToken( nExtSheet, nExtName, nExpClass, nSpaces );
+ if( mxData->mpLinkMgr && mxData->mpLinkMgr->InsertEuroTool( nExtSheet, nExtName, rExtFuncData.maFuncName ) )
+ AppendNameXToken( nExtSheet, nExtName, nSpaces );
+ else
+ AppendMacroCallToken( rExtFuncData, nSpaces );
+}
+
+void XclExpFmlaCompImpl::AppendOperatorTokenId( sal_uInt8 nTokenId, const XclExpOperandListRef& rxOperands, sal_uInt8 nSpaces )
+{
+ AppendSpaceToken( EXC_TOK_ATTR_SPACE_SP, nSpaces );
+ PushOperatorPos( GetSize(), rxOperands );
+ Append( nTokenId );
+}
+
+void XclExpFmlaCompImpl::AppendUnaryOperatorToken( sal_uInt8 nTokenId, sal_uInt8 nSpaces )
+{
+ XclExpOperandListRef xOperands( new XclExpOperandList );
+ xOperands->AppendOperand( PopOperandPos(), EXC_PARAMCONV_RPO, true );
+ AppendOperatorTokenId( nTokenId, xOperands, nSpaces );
+}
+
+void XclExpFmlaCompImpl::AppendBinaryOperatorToken( sal_uInt8 nTokenId, bool bValType, sal_uInt8 nSpaces )
+{
+ XclExpOperandListRef xOperands( new XclExpOperandList );
+ xOperands->AppendOperand( PopOperandPos(), EXC_PARAMCONV_RPO, bValType );
+ xOperands->AppendOperand( PopOperandPos(), EXC_PARAMCONV_RPO, bValType );
+ AppendOperatorTokenId( nTokenId, xOperands, nSpaces );
+}
+
+void XclExpFmlaCompImpl::AppendLogicalOperatorToken( sal_uInt16 nXclFuncIdx, sal_uInt8 nOpCount )
+{
+ XclExpOperandListRef xOperands( new XclExpOperandList );
+ for( sal_uInt8 nOpIdx = 0; nOpIdx < nOpCount; ++nOpIdx )
+ xOperands->AppendOperand( PopOperandPos(), EXC_PARAMCONV_RPX, false );
+ AppendOperatorTokenId( GetTokenId( EXC_TOKID_FUNCVAR, EXC_TOKCLASS_VAL ), xOperands );
+ Append( nOpCount );
+ Append( nXclFuncIdx );
+}
+
+void XclExpFmlaCompImpl::AppendFuncToken( const XclExpFuncData& rFuncData )
+{
+ sal_uInt16 nXclFuncIdx = rFuncData.GetXclFuncIdx();
+ sal_uInt8 nParamCount = rFuncData.GetParamCount();
+ sal_uInt8 nRetClass = rFuncData.GetReturnClass();
+
+ if( (nXclFuncIdx == EXC_FUNCID_SUM) && (nParamCount == 1) )
+ {
+ // SUM with only one parameter
+ AppendOperatorTokenId( EXC_TOKID_ATTR, rFuncData.GetOperandList() );
+ Append( EXC_TOK_ATTR_SUM );
+ Append( sal_uInt16( 0 ) );
+ }
+ else if( rFuncData.IsFixedParamCount() )
+ {
+ // fixed number of parameters
+ AppendOperatorTokenId( GetTokenId( EXC_TOKID_FUNC, nRetClass ), rFuncData.GetOperandList() );
+ Append( nXclFuncIdx );
+ }
else
- AppendMacroCallToken( rExtFuncData, nExpClass, nSpaces );
+ {
+ // variable number of parameters
+ AppendOperatorTokenId( GetTokenId( EXC_TOKID_FUNCVAR, nRetClass ), rFuncData.GetOperandList() );
+ Append( nParamCount );
+ Append( nXclFuncIdx );
+ }
}
void XclExpFmlaCompImpl::AppendParenToken( sal_uInt8 nOpenSpaces, sal_uInt8 nCloseSpaces )
@@ -2378,16 +2443,31 @@ void XclExpFmlaCompImpl::AppendJumpToken( XclExpFuncData& rFuncData, sal_uInt8 n
Append( sal_uInt16( 0 ) ); // placeholder that will be updated later
}
-void XclExpFmlaCompImpl::Insert( sal_uInt16 nInsertPos, sal_uInt16 nInsertSize )
+void XclExpFmlaCompImpl::InsertZeros( sal_uInt16 nInsertPos, sal_uInt16 nInsertSize )
{
- DBG_ASSERT( nInsertPos < maTokVec.size(), "XclExpFmlaCompImpl::Insert - invalid position" );
- maTokVec.insert( maTokVec.begin() + nInsertPos, nInsertSize, 0 );
+ // insert zeros into the token array
+ DBG_ASSERT( nInsertPos < mxData->maTokVec.size(), "XclExpFmlaCompImpl::Insert - invalid position" );
+ mxData->maTokVec.insert( mxData->maTokVec.begin() + nInsertPos, nInsertSize, 0 );
+
+ // update positions of operands waiting for an operator
+ for( ScfUInt16Vec::iterator aIt = mxData->maOpPosStack.begin(), aEnd = mxData->maOpPosStack.end(); aIt != aEnd; ++aIt )
+ if( nInsertPos <= *aIt )
+ *aIt = *aIt + nInsertSize;
+
+ // update operand lists of all operator tokens
+ if( nInsertPos < mxData->maOpListVec.size() )
+ mxData->maOpListVec.insert( mxData->maOpListVec.begin() + nInsertPos, nInsertSize, XclExpOperandListRef() );
+ for( XclExpOperandListVector::iterator aIt = mxData->maOpListVec.begin(), aEnd = mxData->maOpListVec.end(); aIt != aEnd; ++aIt )
+ if( aIt->get() )
+ for( XclExpOperandList::iterator aIt2 = (*aIt)->begin(), aEnd2 = (*aIt)->end(); aIt2 != aEnd2; ++aIt2 )
+ if( nInsertPos <= aIt2->mnTokPos )
+ aIt2->mnTokPos = aIt2->mnTokPos + nInsertSize;
}
void XclExpFmlaCompImpl::Overwrite( sal_uInt16 nWriteToPos, sal_uInt16 nOffset )
{
- DBG_ASSERT( static_cast< size_t >( nWriteToPos + 1 ) < maTokVec.size(), "XclExpFmlaCompImpl::Overwrite - invalid position" );
- ShortToSVBT16( nOffset, &maTokVec[ nWriteToPos ] );
+ DBG_ASSERT( static_cast< size_t >( nWriteToPos + 1 ) < mxData->maTokVec.size(), "XclExpFmlaCompImpl::Overwrite - invalid position" );
+ ShortToSVBT16( nOffset, &mxData->maTokVec[ nWriteToPos ] );
}
void XclExpFmlaCompImpl::UpdateAttrGoto( sal_uInt16 nAttrPos )
@@ -2403,19 +2483,49 @@ void XclExpFmlaCompImpl::UpdateAttrGoto( sal_uInt16 nAttrPos )
bool XclExpFmlaCompImpl::IsSpaceToken( sal_uInt16 nPos ) const
{
return
- (static_cast< size_t >( nPos + 4 ) <= maTokVec.size()) &&
- (maTokVec[ nPos ] == EXC_TOKID_ATTR) &&
- (maTokVec[ nPos + 1 ] == EXC_TOK_ATTR_SPACE);
+ (static_cast< size_t >( nPos + 4 ) <= mxData->maTokVec.size()) &&
+ (mxData->maTokVec[ nPos ] == EXC_TOKID_ATTR) &&
+ (mxData->maTokVec[ nPos + 1 ] == EXC_TOK_ATTR_SPACE);
}
void XclExpFmlaCompImpl::RemoveTrailingParen()
{
// remove trailing tParen token
- if( !maTokVec.empty() && (maTokVec.back() == EXC_TOKID_PAREN) )
- maTokVec.pop_back();
+ if( !mxData->maTokVec.empty() && (mxData->maTokVec.back() == EXC_TOKID_PAREN) )
+ mxData->maTokVec.pop_back();
// remove remaining tAttrSpace tokens
- while( (maTokVec.size() >= 4) && IsSpaceToken( GetSize() - 4 ) )
- maTokVec.erase( maTokVec.end() - 4, maTokVec.end() );
+ while( (mxData->maTokVec.size() >= 4) && IsSpaceToken( GetSize() - 4 ) )
+ mxData->maTokVec.erase( mxData->maTokVec.end() - 4, mxData->maTokVec.end() );
+}
+
+void XclExpFmlaCompImpl::AppendExt( sal_uInt8 nData )
+{
+ mxData->maExtDataVec.push_back( nData );
+}
+
+void XclExpFmlaCompImpl::AppendExt( sal_uInt8 nData, size_t nCount )
+{
+ mxData->maExtDataVec.resize( mxData->maExtDataVec.size() + nCount, nData );
+}
+
+void XclExpFmlaCompImpl::AppendExt( sal_uInt16 nData )
+{
+ lclAppend( mxData->maExtDataVec, nData );
+}
+
+void XclExpFmlaCompImpl::AppendExt( sal_uInt32 nData )
+{
+ lclAppend( mxData->maExtDataVec, nData );
+}
+
+void XclExpFmlaCompImpl::AppendExt( double fData )
+{
+ lclAppend( mxData->maExtDataVec, fData );
+}
+
+void XclExpFmlaCompImpl::AppendExt( const String& rString )
+{
+ lclAppend( mxData->maExtDataVec, GetRoot(), rString, (meBiff == EXC_BIFF8) ? EXC_STR_DEFAULT : EXC_STR_8BITLENGTH );
}
// ============================================================================
@@ -2530,29 +2640,5 @@ XclTokenArrayRef XclExpFormulaCompiler::CreateNameXFormula(
return mxImpl->CreateNameXFormula( nExtSheet, nExtName );
}
-void XclExpFmlaCompImpl::ProcessMatrix( const XclExpTokenData& rTokData, sal_uInt8 nExpClass )
-{
- const ScMatrix* pMatrix = static_cast<const ScToken*>(rTokData.mpScToken)->GetMatrix();
- if( maCfg.mbAllowArrays && pMatrix )
- {
- SCSIZE nCols, nRows;
- pMatrix->GetDimensions( nCols, nRows );
-
- AppendOpTokenId( GetTokenId( EXC_TOKID_ARRAY, EXC_TOKCLASS_ARR ), nExpClass, rTokData.mnSpaces );
- Append( static_cast< sal_uInt8 >( (meBiff == EXC_BIFF8) ? (nCols - 1) : nCols ) );
- Append( static_cast< sal_uInt16 >( (meBiff == EXC_BIFF8) ? (nRows - 1) : nRows ) );
- Append( static_cast< sal_uInt32 >( 0 ) );
-
- if( !mxInlineArr )
- mxInlineArr.reset( new ScMatrixList );
- mxInlineArr->push_front( pMatrix ); // save it for later
- }
- else
- {
- // Array in places that do not allow it (cond fmts, data validation)
- AppendErrorToken( EXC_ERR_NA, rTokData.mnSpaces );
- }
-}
-
// ============================================================================
diff --git a/sc/source/filter/excel/xelink.cxx b/sc/source/filter/excel/xelink.cxx
index 2c6741811f3f..47f101f4c351 100644
--- a/sc/source/filter/excel/xelink.cxx
+++ b/sc/source/filter/excel/xelink.cxx
@@ -903,7 +903,7 @@ typedef ::std::vector< XclExpTabName > XclExpTabNameVec;
inline bool operator<( const XclExpTabName& rArg1, const XclExpTabName& rArg2 )
{
// compare the sheet names only
- return ScGlobal::pCollator->compareString( rArg1.first, rArg2.first ) == COMPARE_LESS;
+ return ScGlobal::GetCollator()->compareString( rArg1.first, rArg2.first ) == COMPARE_LESS;
}
void XclExpTabInfo::CalcSortedIndexes()
diff --git a/sc/source/filter/excel/xepivot.cxx b/sc/source/filter/excel/xepivot.cxx
index 9d19ee268008..94649d4de9a5 100644
--- a/sc/source/filter/excel/xepivot.cxx
+++ b/sc/source/filter/excel/xepivot.cxx
@@ -663,6 +663,9 @@ XclExpPivotCache::XclExpPivotCache( const XclExpRoot& rRoot, const ScDPObject& r
if( 2 * (nDocRow2 - nDocRow1) < (nSrcRow2 - nSrcRow1) )
::set_flag( maPCInfo.mnFlags, EXC_SXDB_SAVEDATA, false );
+ // #160184# Excel must refresh tables to make drilldown working
+ ::set_flag( maPCInfo.mnFlags, EXC_SXDB_REFRESH_LOAD );
+
// adjust row indexes, keep one row of empty area to surely have the empty cache item
if( nSrcRow1 < nDocRow1 )
nSrcRow1 = nDocRow1 - 1;
diff --git a/sc/source/filter/excel/xestream.cxx b/sc/source/filter/excel/xestream.cxx
index 6b2f53c8056a..10d23eccdf27 100644
--- a/sc/source/filter/excel/xestream.cxx
+++ b/sc/source/filter/excel/xestream.cxx
@@ -485,7 +485,7 @@ XclExpBiff8Encrypter::XclExpBiff8Encrypter( const XclExpRoot& rRoot, const sal_u
String aPass = rRoot.GetPassword();
if (aPass.Len() == 0)
// Empty password. Get the default biff8 password.
- aPass = XclCryptoHelper::GetBiff8WbProtPassword();
+ aPass = rRoot.GetDefaultPassword();
Init(aPass, nDocId, nSalt);
}
@@ -985,11 +985,6 @@ bool XclExpXmlStream::importDocument() throw()
return false;
}
-sal_Int32 XclExpXmlStream::getSchemeClr( sal_Int32 /*nColorSchemeToken*/ ) const
-{
- return -1;
-}
-
oox::vml::Drawing* XclExpXmlStream::getVmlDrawing()
{
return 0;
diff --git a/sc/source/filter/excel/xicontent.cxx b/sc/source/filter/excel/xicontent.cxx
index 24c1999b581b..7b5fb222a12b 100644
--- a/sc/source/filter/excel/xicontent.cxx
+++ b/sc/source/filter/excel/xicontent.cxx
@@ -377,14 +377,33 @@ void XclImpHyperlink::ConvertToValidTabName(String& rUrl)
String aNewUrl(sal_Unicode('#')), aTabName;
bool bInQuote = false;
+ bool bQuoteTabName = false;
for (xub_StrLen i = 1; i < n; ++i)
{
c = rUrl.GetChar(i);
if (c == sal_Unicode('\''))
{
+ if (bInQuote && i+1 < n && rUrl.GetChar(i+1) == sal_Unicode('\''))
+ {
+ // Two consecutive single quotes ('') signify a single literal
+ // quite. When this occurs, the whole table name needs to be
+ // quoted.
+ bQuoteTabName = true;
+ aTabName.Append(c);
+ aTabName.Append(c);
+ ++i;
+ continue;
+ }
+
bInQuote = !bInQuote;
if (!bInQuote && aTabName.Len() > 0)
+ {
+ if (bQuoteTabName)
+ aNewUrl.Append(sal_Unicode('\''));
aNewUrl.Append(aTabName);
+ if (bQuoteTabName)
+ aNewUrl.Append(sal_Unicode('\''));
+ }
}
else if (bInQuote)
aTabName.Append(c);
@@ -1011,7 +1030,7 @@ XclImpDecrypterRef lclReadFilepass5( XclImpStream& rStrm )
{
sal_uInt16 nKey, nHash;
rStrm >> nKey >> nHash;
- xDecr.reset( new XclImpBiff5Decrypter( rStrm.GetRoot(), nKey, nHash ) );
+ xDecr.reset( new XclImpBiff5Decrypter( nKey, nHash ) );
}
return xDecr;
}
@@ -1022,14 +1041,13 @@ XclImpDecrypterRef lclReadFilepass8_Standard( XclImpStream& rStrm )
DBG_ASSERT( rStrm.GetRecLeft() == 48, "lclReadFilepass8 - wrong record size" );
if( rStrm.GetRecLeft() == 48 )
{
- sal_uInt8 pnDocId[ 16 ];
- sal_uInt8 pnSaltData[ 16 ];
- sal_uInt8 pnSaltHash[ 16 ];
- rStrm.Read( pnDocId, 16 );
- rStrm.Read( pnSaltData, 16 );
- rStrm.Read( pnSaltHash, 16 );
- xDecr.reset( new XclImpBiff8Decrypter(
- rStrm.GetRoot(), pnDocId, pnSaltData, pnSaltHash ) );
+ sal_uInt8 pnSalt[ 16 ];
+ sal_uInt8 pnVerifier[ 16 ];
+ sal_uInt8 pnVerifierHash[ 16 ];
+ rStrm.Read( pnSalt, 16 );
+ rStrm.Read( pnVerifier, 16 );
+ rStrm.Read( pnVerifierHash, 16 );
+ xDecr.reset( new XclImpBiff8Decrypter( pnSalt, pnVerifier, pnVerifierHash ) );
}
return xDecr;
}
@@ -1087,6 +1105,7 @@ ErrCode XclImpDecryptHelper::ReadFilepass( XclImpStream& rStrm )
XclImpDecrypterRef xDecr;
rStrm.DisableDecryption();
+ // read the FILEPASS record and create a new decrypter object
switch( rStrm.GetRoot().GetBiff() )
{
case EXC_BIFF2:
@@ -1097,21 +1116,15 @@ ErrCode XclImpDecryptHelper::ReadFilepass( XclImpStream& rStrm )
default: DBG_ERROR_BIFF();
};
- if (!xDecr.is())
- return EXC_ENCR_ERROR_UNSUPP_CRYPT;
-
// set decrypter at import stream
rStrm.SetDecrypter( xDecr );
- // Store the document password for export.
- SfxItemSet* pSet = rStrm.GetRoot().GetDocShell()->GetMedium()->GetItemSet();
- if (pSet)
- {
- String aPass = xDecr->GetPassword();
- pSet->Put( SfxStringItem(SID_PASSWORD, aPass) );
- }
+ // request and verify a password (decrypter implements IDocPasswordVerifier)
+ if( xDecr.is() )
+ rStrm.GetRoot().RequestPassword( *xDecr );
- return xDecr->GetError();
+ // return error code (success, wrong password, etc.)
+ return xDecr.is() ? xDecr->GetError() : EXC_ENCR_ERROR_UNSUPP_CRYPT;
}
// Document protection ========================================================
diff --git a/sc/source/filter/excel/xiroot.cxx b/sc/source/filter/excel/xiroot.cxx
index 55ba4bdc4cb4..30cab47f57f5 100644
--- a/sc/source/filter/excel/xiroot.cxx
+++ b/sc/source/filter/excel/xiroot.cxx
@@ -52,7 +52,6 @@
XclImpRootData::XclImpRootData( XclBiff eBiff, SfxMedium& rMedium,
SotStorageRef xRootStrg, ScDocument& rDoc, rtl_TextEncoding eTextEnc ) :
XclRootData( eBiff, rMedium, xRootStrg, rDoc, eTextEnc, false ),
- mbPassQueried( false ),
mbHasCodePage( false )
{
}
@@ -270,16 +269,5 @@ String XclImpRoot::GetScAddInName( const String& rXclName ) const
return rXclName;
}
-const String& XclImpRoot::QueryPassword() const
-{
- if( !mrImpData.mbPassQueried )
- {
- mrImpData.maPassw = ScfApiHelper::QueryPasswordForMedium( GetMedium() );
- // set to true, even if dialog has been cancelled (never ask twice)
- mrImpData.mbPassQueried = true;
- }
- return mrImpData.maPassw;
-}
-
// ============================================================================
diff --git a/sc/source/filter/excel/xistream.cxx b/sc/source/filter/excel/xistream.cxx
index e7780c065118..b168c4389c4c 100644
--- a/sc/source/filter/excel/xistream.cxx
+++ b/sc/source/filter/excel/xistream.cxx
@@ -31,13 +31,16 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
-// ============================================================================
#include "xistream.hxx"
#include "xlstring.hxx"
#include "xiroot.hxx"
#include <vector>
+using ::rtl::OString;
+using ::rtl::OUString;
+using ::rtl::OUStringToOString;
+
// ============================================================================
// Decryption
// ============================================================================
@@ -50,6 +53,7 @@ XclImpDecrypter::XclImpDecrypter() :
}
XclImpDecrypter::XclImpDecrypter( const XclImpDecrypter& rSrc ) :
+ ::comphelper::IDocPasswordVerifier(),
mnError( rSrc.mnError ),
mnOldPos( STREAM_SEEK_TO_END ),
mnRecSize( 0 )
@@ -68,6 +72,13 @@ XclImpDecrypterRef XclImpDecrypter::Clone() const
return xNewDecr;
}
+::comphelper::DocPasswordVerifierResult XclImpDecrypter::verifyPassword( const OUString& rPassword )
+{
+ bool bValid = OnVerify( rPassword );
+ mnError = bValid ? ERRCODE_NONE : ERRCODE_ABORT;
+ return bValid ? ::comphelper::DocPasswordVerifierResult_OK : ::comphelper::DocPasswordVerifierResult_WRONG_PASSWORD;
+}
+
void XclImpDecrypter::Update( SvStream& rStrm, sal_uInt16 nRecSize )
{
if( IsValid() )
@@ -99,47 +110,48 @@ sal_uInt16 XclImpDecrypter::Read( SvStream& rStrm, void* pData, sal_uInt16 nByte
return nRet;
}
-const String XclImpDecrypter::GetPassword() const
-{
- return maPass;
-}
+// ----------------------------------------------------------------------------
-void XclImpDecrypter::SetHasValidPassword( bool bValid )
+XclImpBiff5Decrypter::XclImpBiff5Decrypter( sal_uInt16 nKey, sal_uInt16 nHash ) :
+ maPassword( 16 ),
+ mnKey( nKey ),
+ mnHash( nHash )
{
- mnError = bValid ? ERRCODE_NONE : EXC_ENCR_ERROR_WRONG_PASS;
}
-void XclImpDecrypter::SetPassword( const String& rPass )
+XclImpBiff5Decrypter::XclImpBiff5Decrypter( const XclImpBiff5Decrypter& rSrc ) :
+ XclImpDecrypter( rSrc ),
+ maPassword( rSrc.maPassword ),
+ mnKey( rSrc.mnKey ),
+ mnHash( rSrc.mnHash )
{
- maPass = rPass;
+ if( IsValid() )
+ maCodec.InitKey( &maPassword.front() );
}
-// ----------------------------------------------------------------------------
-
-XclImpBiff5Decrypter::XclImpBiff5Decrypter( const XclImpRoot& rRoot, sal_uInt16 nKey, sal_uInt16 nHash )
+XclImpBiff5Decrypter* XclImpBiff5Decrypter::OnClone() const
{
- Init( XclCryptoHelper::GetBiff5WbProtPassword(), nKey, nHash );
- if( !IsValid() )
- {
- //! TODO: correct byte string encoding in all cases?
- ByteString aPass( rRoot.QueryPassword(), RTL_TEXTENCODING_MS_1252 );
- Init( aPass, nKey, nHash );
- }
+ return new XclImpBiff5Decrypter( *this );
}
-XclImpBiff5Decrypter::XclImpBiff5Decrypter( const XclImpBiff5Decrypter& rSrc ) :
- XclImpDecrypter( rSrc )
+bool XclImpBiff5Decrypter::OnVerify( const OUString& rPassword )
{
- if( rSrc.IsValid() )
+ /* Convert password to a byte string. TODO: this needs some finetuning
+ according to the spec... */
+ OString aBytePassword = OUStringToOString( rPassword, osl_getThreadTextEncoding() );
+ sal_Int32 nLen = aBytePassword.getLength();
+ if( (0 < nLen) && (nLen < 16) )
{
- memcpy( mpnPassw, rSrc.mpnPassw, sizeof( mpnPassw ) );
- maCodec.InitKey( mpnPassw );
- }
-}
+ // copy byte string to sal_uInt8 array
+ maPassword.clear();
+ maPassword.resize( 16, 0 );
+ memcpy( &maPassword.front(), aBytePassword.getStr(), static_cast< size_t >( nLen ) );
-XclImpBiff5Decrypter* XclImpBiff5Decrypter::OnClone() const
-{
- return new XclImpBiff5Decrypter( *this );
+ // init codec
+ maCodec.InitKey( &maPassword.front() );
+ return maCodec.VerifyKey( mnKey, mnHash );
+ }
+ return false;
}
void XclImpBiff5Decrypter::OnUpdate( sal_Size /*nOldStrmPos*/, sal_Size nNewStrmPos, sal_uInt16 nRecSize )
@@ -155,48 +167,26 @@ sal_uInt16 XclImpBiff5Decrypter::OnRead( SvStream& rStrm, sal_uInt8* pnData, sal
return nRet;
}
-void XclImpBiff5Decrypter::Init( const ByteString& rPass, sal_uInt16 nKey, sal_uInt16 nHash )
-{
- xub_StrLen nLen = rPass.Len();
- bool bValid = (0 < nLen) && (nLen < 16);
-
- if( bValid )
- {
- // transform ByteString to sal_uInt8 array
- memset( mpnPassw, 0, sizeof( mpnPassw ) );
- for( xub_StrLen nChar = 0; nChar < nLen; ++nChar )
- mpnPassw[ nChar ] = static_cast< sal_uInt8 >( rPass.GetChar( nChar ) );
- // init codec
- maCodec.InitKey( mpnPassw );
- bValid = maCodec.VerifyKey( nKey, nHash );
-
- String aUniPass( rPass, RTL_TEXTENCODING_MS_1252 );
- SetPassword( aUniPass );
- }
-
- SetHasValidPassword( bValid );
-}
-
// ----------------------------------------------------------------------------
-XclImpBiff8Decrypter::XclImpBiff8Decrypter(
- const XclImpRoot& rRoot, sal_uInt8 pnDocId[ 16 ],
- sal_uInt8 pnSaltData[ 16 ], sal_uInt8 pnSaltHash[ 16 ] )
+XclImpBiff8Decrypter::XclImpBiff8Decrypter( sal_uInt8 pnSalt[ 16 ],
+ sal_uInt8 pnVerifier[ 16 ], sal_uInt8 pnVerifierHash[ 16 ] ) :
+ maPassword( 16, 0 ),
+ maSalt( pnSalt, pnSalt + 16 ),
+ maVerifier( pnVerifier, pnVerifier + 16 ),
+ maVerifierHash( pnVerifierHash, pnVerifierHash + 16 )
{
- Init( XclCryptoHelper::GetBiff8WbProtPassword(), pnDocId, pnSaltData, pnSaltHash );
- if( !IsValid() )
- Init( rRoot.QueryPassword(), pnDocId, pnSaltData, pnSaltHash );
}
XclImpBiff8Decrypter::XclImpBiff8Decrypter( const XclImpBiff8Decrypter& rSrc ) :
- XclImpDecrypter( rSrc )
+ XclImpDecrypter( rSrc ),
+ maPassword( rSrc.maPassword ),
+ maSalt( rSrc.maSalt ),
+ maVerifier( rSrc.maVerifier ),
+ maVerifierHash( rSrc.maVerifierHash )
{
- if( rSrc.IsValid() )
- {
- memcpy( mpnPassw, rSrc.mpnPassw, sizeof( mpnPassw ) );
- memcpy( mpnDocId, rSrc.mpnDocId, sizeof( mpnDocId ) );
- maCodec.InitKey( mpnPassw, mpnDocId );
- }
+ if( IsValid() )
+ maCodec.InitKey( &maPassword.front(), &maSalt.front() );
}
XclImpBiff8Decrypter* XclImpBiff8Decrypter::OnClone() const
@@ -204,6 +194,27 @@ XclImpBiff8Decrypter* XclImpBiff8Decrypter::OnClone() const
return new XclImpBiff8Decrypter( *this );
}
+bool XclImpBiff8Decrypter::OnVerify( const OUString& rPassword )
+{
+ sal_Int32 nLen = rPassword.getLength();
+ if( (0 < nLen) && (nLen < 16) )
+ {
+ // copy string to sal_uInt16 array
+ maPassword.clear();
+ maPassword.resize( 16, 0 );
+ const sal_Unicode* pcChar = rPassword.getStr();
+ const sal_Unicode* pcCharEnd = pcChar + nLen;
+ ::std::vector< sal_uInt16 >::iterator aIt = maPassword.begin();
+ for( ; pcChar < pcCharEnd; ++pcChar, ++aIt )
+ *aIt = static_cast< sal_uInt16 >( *pcChar );
+
+ // init codec
+ maCodec.InitKey( &maPassword.front(), &maSalt.front() );
+ return maCodec.VerifyKey( &maVerifier.front(), &maVerifierHash.front() );
+ }
+ return false;
+}
+
void XclImpBiff8Decrypter::OnUpdate( sal_Size nOldStrmPos, sal_Size nNewStrmPos, sal_uInt16 /*nRecSize*/ )
{
if( nNewStrmPos != nOldStrmPos )
@@ -252,31 +263,6 @@ sal_uInt16 XclImpBiff8Decrypter::OnRead( SvStream& rStrm, sal_uInt8* pnData, sal
return nRet;
}
-void XclImpBiff8Decrypter::Init(
- const String& rPass, sal_uInt8 pnDocId[ 16 ],
- sal_uInt8 pnSaltData[ 16 ], sal_uInt8 pnSaltHash[ 16 ] )
-{
- xub_StrLen nLen = rPass.Len();
- bool bValid = (0 < nLen) && (nLen < 16);
-
- if( bValid )
- {
- // transform String to sal_uInt16 array
- memset( mpnPassw, 0, sizeof( mpnPassw ) );
- for( xub_StrLen nChar = 0; nChar < nLen; ++nChar )
- mpnPassw[ nChar ] = static_cast< sal_uInt16 >( rPass.GetChar( nChar ) );
- // copy document ID
- memcpy( mpnDocId, pnDocId, sizeof( mpnDocId ) );
- // init codec
- maCodec.InitKey( mpnPassw, mpnDocId );
- bValid = maCodec.VerifyKey( pnSaltData, pnSaltHash );
-
- SetPassword(rPass);
- }
-
- SetHasValidPassword( bValid );
-}
-
sal_uInt32 XclImpBiff8Decrypter::GetBlock( sal_Size nStrmPos ) const
{
return static_cast< sal_uInt32 >( nStrmPos / EXC_ENCR_BLOCKSIZE );
diff --git a/sc/source/filter/excel/xistyle.cxx b/sc/source/filter/excel/xistyle.cxx
index 7f1627e89e7f..a83e203c167d 100644
--- a/sc/source/filter/excel/xistyle.cxx
+++ b/sc/source/filter/excel/xistyle.cxx
@@ -1088,26 +1088,25 @@ void XclImpXF::ReadXF( XclImpStream& rStrm )
}
}
-void XclImpXF::SetStyleName( const String& rStyleName )
+void XclImpXF::SetStyleName( const String& rStyleName, bool bBuiltIn, bool bForceCreate )
{
DBG_ASSERT( IsStyleXF(), "XclImpXF::SetStyleName - not a style XF" );
- DBG_ASSERT( rStyleName.Len(), "XclImpXF::SetStyleName - style name empty" );
- if( IsStyleXF() && !maStyleName.Len() )
+ DBG_ASSERT( rStyleName.Len() > 0, "XclImpXF::SetStyleName - style name empty" );
+ if( IsStyleXF() && (rStyleName.Len() > 0) )
{
maStyleName = rStyleName;
- mbForceCreate = true;
+ mbWasBuiltIn = bBuiltIn;
+ mbForceCreate = bForceCreate;
}
}
-void XclImpXF::SetBuiltInStyleName( sal_uInt8 nStyleId, sal_uInt8 nLevel )
+void XclImpXF::ChangeStyleName( const String& rStyleName )
{
- DBG_ASSERT( IsStyleXF(), "XclImpXF::SetStyleName - not a style XF" );
- if( IsStyleXF() && !maStyleName.Len() )
- {
- mbWasBuiltIn = true;
- maStyleName = XclTools::GetBuiltInStyleName( nStyleId, nLevel );
- mbForceCreate = nStyleId == EXC_STYLE_NORMAL; // force creation of "Default" style
- }
+ DBG_ASSERT( IsStyleXF(), "XclImpXF::ChangeStyleName - not a style XF" );
+ DBG_ASSERT( rStyleName.Len() > 0, "XclImpXF::ChangeStyleName - new style name empty" );
+ DBG_ASSERT( maStyleName.Len() > 0, "XclImpXF::ChangeStyleName - old style name empty" );
+ if( IsStyleXF() && (rStyleName.Len() > 0) )
+ maStyleName = rStyleName;
}
void XclImpXF::CreateUserStyle()
@@ -1239,6 +1238,7 @@ ScStyleSheet* XclImpXF::CreateStyleSheet()
{
if( !mpStyleSheet && maStyleName.Len() ) // valid name implies style XF
{
+ bool bCreatePattern = false;
// there may be a user-defined "Default" - test on built-in too!
bool bDefStyle = mbWasBuiltIn && (maStyleName == ScGlobal::GetRscString( STR_STYLENAME_STANDARD ));
if( bDefStyle )
@@ -1249,16 +1249,23 @@ ScStyleSheet* XclImpXF::CreateStyleSheet()
mpStyleSheet = static_cast< ScStyleSheet* >( GetStyleSheetPool().Find(
ScGlobal::GetRscString( STR_STYLENAME_STANDARD ), SFX_STYLE_FAMILY_PARA ) );
DBG_ASSERT( mpStyleSheet, "XclImpXF::CreateStyleSheet - Default style not found" );
+ bCreatePattern = true;
}
else
{
- /* mbWasBuiltIn==true forces renaming of equal-named user defined styles
- to be able to re-export built-in styles correctly. */
- mpStyleSheet = &ScfTools::MakeCellStyleSheet( GetStyleSheetPool(), maStyleName, mbWasBuiltIn );
+ /* #i103281# do not create another style sheet of the same name,
+ if it exists already. This is needed to prevent that styles
+ pasted from clipboard get duplicated over and over. */
+ mpStyleSheet = static_cast< ScStyleSheet* >( GetStyleSheetPool().Find( maStyleName, SFX_STYLE_FAMILY_PARA ) );
+ if( !mpStyleSheet )
+ {
+ mpStyleSheet = &static_cast< ScStyleSheet& >( GetStyleSheetPool().Make( maStyleName, SFX_STYLE_FAMILY_PARA, SFXSTYLEBIT_USERDEF ) );
+ bCreatePattern = true;
+ }
}
// bDefStyle==true omits default pool items in CreatePattern()
- if( mpStyleSheet )
+ if( bCreatePattern && mpStyleSheet )
mpStyleSheet->GetItemSet().Put( CreatePattern( bDefStyle ).GetItemSet() );
}
return mpStyleSheet;
@@ -1274,6 +1281,16 @@ XclImpXFBuffer::XclImpXFBuffer( const XclImpRoot& rRoot ) :
void XclImpXFBuffer::Initialize()
{
maXFList.Clear();
+ maStyleXFs.clear();
+ /* Reserve style names that are built-in in Calc. For BIFF4 workbooks
+ which contain a separate list of styles per sheet, reserve all existing
+ names if current sheet is not the first sheet. This will create unique
+ names for styles in different sheets with the same name. */
+ bool bReserveAll = (GetBiff() == EXC_BIFF4) && (GetCurrScTab() > 0);
+ SfxStyleSheetIterator aStyleIter( GetDoc().GetStyleSheetPool(), SFX_STYLE_FAMILY_PARA );
+ for( SfxStyleSheetBase* pStyleSheet = aStyleIter.First(); pStyleSheet; pStyleSheet = aStyleIter.Next() )
+ if( bReserveAll || !pStyleSheet->IsUserDefined() )
+ maStyleXFs[ pStyleSheet->GetName() ] = 0;
}
void XclImpXFBuffer::ReadXF( XclImpStream& rStrm )
@@ -1282,9 +1299,9 @@ void XclImpXFBuffer::ReadXF( XclImpStream& rStrm )
pXF->ReadXF( rStrm );
maXFList.Append( pXF );
+ // set the name of the "Default" cell style (always the first XF in an Excel file)
if( (GetBiff() >= EXC_BIFF3) && (maXFList.Count() == 1) )
- // set the name of the "Default" cell style (always the first XF in an Excel file)
- pXF->SetBuiltInStyleName( EXC_STYLE_NORMAL, 0 );
+ CalcStyleName( *pXF, EXC_STYLE_NORMAL, 0 );
}
void XclImpXFBuffer::ReadStyle( XclImpStream& rStrm )
@@ -1301,7 +1318,7 @@ void XclImpXFBuffer::ReadStyle( XclImpStream& rStrm )
{
sal_uInt8 nStyleId, nLevel;
rStrm >> nStyleId >> nLevel;
- pXF->SetBuiltInStyleName( nStyleId, nLevel );
+ CalcStyleName( *pXF, nStyleId, nLevel );
}
else // user-defined styles
{
@@ -1310,8 +1327,20 @@ void XclImpXFBuffer::ReadStyle( XclImpStream& rStrm )
aStyleName = rStrm.ReadByteString( false ); // 8 bit length
else
aStyleName = rStrm.ReadUniString();
- if( aStyleName.Len() ) // #i1624# #i1768# ignore unnamed styles
- pXF->SetStyleName( aStyleName );
+
+ if( aStyleName.Len() > 0 ) // #i1624# #i1768# ignore unnamed styles
+ {
+ // #i103281# check if this is a new built-in style introduced in XL2007
+ bool bBuiltIn = false;
+ if( (GetBiff() == EXC_BIFF8) && (rStrm.GetNextRecId() == EXC_ID_STYLEEXT) && rStrm.StartNextRecord() )
+ {
+ sal_uInt8 nExtFlags;
+ rStrm.Ignore( 12 );
+ rStrm >> nExtFlags;
+ bBuiltIn = ::get_flag( nExtFlags, EXC_STYLEEXT_BUILTIN );
+ }
+ CalcStyleName( *pXF, aStyleName, bBuiltIn );
+ }
}
}
}
@@ -1345,6 +1374,49 @@ void XclImpXFBuffer::ApplyPattern(
}
}
+void XclImpXFBuffer::CalcStyleName( XclImpXF& rXF, const String& rStyleName, bool bBuiltIn )
+{
+ DBG_ASSERT( rStyleName.Len() > 0, "XclImpXFBuffer::CalcStyleName - style name empty" );
+ if( rStyleName.Len() > 0 )
+ {
+ String aStyleName = bBuiltIn ? XclTools::GetBuiltInStyleName( rStyleName ) : rStyleName;
+ SetStyleName( rXF, aStyleName, bBuiltIn, !bBuiltIn );
+ }
+}
+
+void XclImpXFBuffer::CalcStyleName( XclImpXF& rXF, sal_uInt8 nStyleId, sal_uInt8 nLevel )
+{
+ // force creation of "Default" style
+ SetStyleName( rXF, XclTools::GetBuiltInStyleName( nStyleId, nLevel ), true, nStyleId == EXC_STYLE_NORMAL );
+}
+
+void XclImpXFBuffer::SetStyleName( XclImpXF& rXF, const String& rStyleName, bool bBuiltIn, bool bForceCreate )
+{
+ DBG_ASSERT( rXF.IsStyleXF(), "XclImpXFBuffer::SetStyleName - not a style XF" );
+ if( rXF.IsStyleXF() )
+ {
+ // find an unused name
+ String aUnusedName( rStyleName );
+ sal_Int32 nIndex = 0;
+ while( maStyleXFs.count( aUnusedName ) > 0 )
+ aUnusedName.Assign( rStyleName ).Append( ' ' ).Append( String::CreateFromInt32( ++nIndex ) );
+
+ // move old style to new name, if new style is built-in
+ if( bBuiltIn && (aUnusedName != rStyleName) )
+ {
+ XclImpXF*& rpXF = maStyleXFs[ aUnusedName ];
+ rpXF = maStyleXFs[ rStyleName ];
+ if( rpXF )
+ rpXF->ChangeStyleName( aUnusedName );
+ aUnusedName = rStyleName;
+ }
+
+ // insert new style
+ maStyleXFs[ aUnusedName ] = &rXF;
+ rXF.SetStyleName( aUnusedName, bBuiltIn, bForceCreate );
+ }
+}
+
// Buffer for XF indexes in cells =============================================
IMPL_FIXEDMEMPOOL_NEWDEL( XclImpXFRange, 100, 500 )
diff --git a/sc/source/filter/excel/xlformula.cxx b/sc/source/filter/excel/xlformula.cxx
index 2e15a39e68dd..5e6c85b49077 100644
--- a/sc/source/filter/excel/xlformula.cxx
+++ b/sc/source/filter/excel/xlformula.cxx
@@ -30,16 +30,23 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
+
+// XXX xestream.hxx MUST be included before xlformula.hxx because of the
+// redifinition of the CREATE_OUSTRING() macro, which is in oox/helper.hxx
+// (indirectly included via xestream.hxx) and ../inc/ftools.hxx (indirectly
+// included via xlformula.hxx) that does an undef first. Ugly.
#include "xestream.hxx"
#include "xlformula.hxx"
+
#include "compiler.hxx"
#include "rangenam.hxx"
-#include "xlroot.hxx"
-#include "xistream.hxx"
#include "token.hxx"
#include "tokenarray.hxx"
+#include "xistream.hxx"
+#include "xlroot.hxx"
+
+using namespace ::formula;
-using namespace formula;
// Function data ==============================================================
String XclFunctionInfo::GetMacroFuncName() const
@@ -49,278 +56,291 @@ String XclFunctionInfo::GetMacroFuncName() const
return EMPTY_STRING;
}
+// abbreviations for function return token class
const sal_uInt8 R = EXC_TOKCLASS_REF;
const sal_uInt8 V = EXC_TOKCLASS_VAL;
const sal_uInt8 A = EXC_TOKCLASS_ARR;
-const sal_uInt8 C = EXC_FUNC_PAR_CALCONLY;
-const sal_uInt8 E = EXC_FUNC_PAR_EXCELONLY;
-const sal_uInt8 I = EXC_FUNC_PAR_INVALID;
+
+// abbreviations for parameter infos
+#define RO { EXC_PARAM_REGULAR, EXC_PARAMCONV_ORG, false }
+#define RV { EXC_PARAM_REGULAR, EXC_PARAMCONV_VAL, false }
+#define RA { EXC_PARAM_REGULAR, EXC_PARAMCONV_ARR, false }
+#define RR { EXC_PARAM_REGULAR, EXC_PARAMCONV_RPT, false }
+#define RX { EXC_PARAM_REGULAR, EXC_PARAMCONV_RPX, false }
+#define VO { EXC_PARAM_REGULAR, EXC_PARAMCONV_ORG, true }
+#define VV { EXC_PARAM_REGULAR, EXC_PARAMCONV_VAL, true }
+#define VA { EXC_PARAM_REGULAR, EXC_PARAMCONV_ARR, true }
+#define VR { EXC_PARAM_REGULAR, EXC_PARAMCONV_RPT, true }
+#define VX { EXC_PARAM_REGULAR, EXC_PARAMCONV_RPX, true }
+#define RO_E { EXC_PARAM_EXCELONLY, EXC_PARAMCONV_ORG, false }
+#define VR_E { EXC_PARAM_EXCELONLY, EXC_PARAMCONV_RPT, true }
+#define C { EXC_PARAM_CALCONLY, EXC_PARAMCONV_ORG, false }
/** Functions new in BIFF2. */
static const XclFunctionInfo saFuncTable_2[] =
{
- { ocCount, 0, 0, 30, V, { R }, 0, 0 },
- { ocIf, 1, 2, 3, R, { V, R }, 0, 0 },
- { ocIsNA, 2, 1, 1, V, { V }, 0, 0 },
- { ocIsError, 3, 1, 1, V, { V }, 0, 0 },
- { ocSum, 4, 0, 30, V, { R }, 0, 0 },
- { ocAverage, 5, 1, 30, V, { R }, 0, 0 },
- { ocMin, 6, 1, 30, V, { R }, 0, 0 },
- { ocMax, 7, 1, 30, V, { R }, 0, 0 },
- { ocRow, 8, 0, 1, V, { R }, 0, 0 },
- { ocColumn, 9, 0, 1, V, { R }, 0, 0 },
+ { ocCount, 0, 0, 30, V, { RX }, 0, 0 },
+ { ocIf, 1, 2, 3, R, { VO, RO }, 0, 0 },
+ { ocIsNA, 2, 1, 1, V, { VR }, 0, 0 },
+ { ocIsError, 3, 1, 1, V, { VR }, 0, 0 },
+ { ocSum, 4, 0, 30, V, { RX }, 0, 0 },
+ { ocAverage, 5, 1, 30, V, { RX }, 0, 0 },
+ { ocMin, 6, 1, 30, V, { RX }, 0, 0 },
+ { ocMax, 7, 1, 30, V, { RX }, 0, 0 },
+ { ocRow, 8, 0, 1, V, { RO }, 0, 0 },
+ { ocColumn, 9, 0, 1, V, { RO }, 0, 0 },
{ ocNotAvail, 10, 0, 0, V, {}, 0, 0 },
- { ocNPV, 11, 2, 30, V, { V, R }, 0, 0 },
- { ocStDev, 12, 1, 30, V, { R }, 0, 0 },
- { ocCurrency, 13, 1, 2, V, { V }, 0, 0 },
- { ocFixed, 14, 1, 2, V, { V, V, C, I }, 0, 0 },
- { ocSin, 15, 1, 1, V, { V }, 0, 0 },
- { ocCos, 16, 1, 1, V, { V }, 0, 0 },
- { ocTan, 17, 1, 1, V, { V }, 0, 0 },
- { ocCot, 17, 1, 1, V, { V }, EXC_FUNCFLAG_EXPORTONLY, 0 },
- { ocArcTan, 18, 1, 1, V, { V }, 0, 0 },
- { ocArcCot, 18, 1, 1, V, { V }, EXC_FUNCFLAG_EXPORTONLY, 0 },
+ { ocNPV, 11, 2, 30, V, { VR, RX }, 0, 0 },
+ { ocStDev, 12, 1, 30, V, { RX }, 0, 0 },
+ { ocCurrency, 13, 1, 2, V, { VR }, 0, 0 },
+ { ocFixed, 14, 1, 2, V, { VR, VR, C }, 0, 0 },
+ { ocSin, 15, 1, 1, V, { VR }, 0, 0 },
+ { ocCos, 16, 1, 1, V, { VR }, 0, 0 },
+ { ocTan, 17, 1, 1, V, { VR }, 0, 0 },
+ { ocCot, 17, 1, 1, V, { VR }, EXC_FUNCFLAG_EXPORTONLY, 0 },
+ { ocArcTan, 18, 1, 1, V, { VR }, 0, 0 },
+ { ocArcCot, 18, 1, 1, V, { VR }, EXC_FUNCFLAG_EXPORTONLY, 0 },
{ ocPi, 19, 0, 0, V, {}, 0, 0 },
- { ocSqrt, 20, 1, 1, V, { V }, 0, 0 },
- { ocExp, 21, 1, 1, V, { V }, 0, 0 },
- { ocLn, 22, 1, 1, V, { V }, 0, 0 },
- { ocLog10, 23, 1, 1, V, { V }, 0, 0 },
- { ocAbs, 24, 1, 1, V, { V }, 0, 0 },
- { ocInt, 25, 1, 1, V, { V }, 0, 0 },
- { ocPlusMinus, 26, 1, 1, V, { V }, 0, 0 },
- { ocRound, 27, 2, 2, V, { V }, 0, 0 },
- { ocLookup, 28, 2, 3, V, { V, R }, 0, 0 },
- { ocIndex, 29, 2, 4, R, { R, V }, 0, 0 },
- { ocRept, 30, 2, 2, V, { V }, 0, 0 },
- { ocMid, 31, 3, 3, V, { V }, 0, 0 },
- { ocLen, 32, 1, 1, V, { V }, 0, 0 },
- { ocValue, 33, 1, 1, V, { V }, 0, 0 },
+ { ocSqrt, 20, 1, 1, V, { VR }, 0, 0 },
+ { ocExp, 21, 1, 1, V, { VR }, 0, 0 },
+ { ocLn, 22, 1, 1, V, { VR }, 0, 0 },
+ { ocLog10, 23, 1, 1, V, { VR }, 0, 0 },
+ { ocAbs, 24, 1, 1, V, { VR }, 0, 0 },
+ { ocInt, 25, 1, 1, V, { VR }, 0, 0 },
+ { ocPlusMinus, 26, 1, 1, V, { VR }, 0, 0 },
+ { ocRound, 27, 2, 2, V, { VR }, 0, 0 },
+ { ocLookup, 28, 2, 3, V, { VR, RA }, 0, 0 },
+ { ocIndex, 29, 2, 4, R, { RA, VV }, 0, 0 },
+ { ocRept, 30, 2, 2, V, { VR }, 0, 0 },
+ { ocMid, 31, 3, 3, V, { VR }, 0, 0 },
+ { ocLen, 32, 1, 1, V, { VR }, 0, 0 },
+ { ocValue, 33, 1, 1, V, { VR }, 0, 0 },
{ ocTrue, 34, 0, 0, V, {}, 0, 0 },
{ ocFalse, 35, 0, 0, V, {}, 0, 0 },
- { ocAnd, 36, 1, 30, V, { R }, 0, 0 },
- { ocOr, 37, 1, 30, V, { R }, 0, 0 },
- { ocNot, 38, 1, 1, V, { V }, 0, 0 },
- { ocMod, 39, 2, 2, V, { V }, 0, 0 },
- { ocDBCount, 40, 3, 3, V, { R }, 0, 0 },
- { ocDBSum, 41, 3, 3, V, { R }, 0, 0 },
- { ocDBAverage, 42, 3, 3, V, { R }, 0, 0 },
- { ocDBMin, 43, 3, 3, V, { R }, 0, 0 },
- { ocDBMax, 44, 3, 3, V, { R }, 0, 0 },
- { ocDBStdDev, 45, 3, 3, V, { R }, 0, 0 },
- { ocVar, 46, 1, 30, V, { R }, 0, 0 },
- { ocDBVar, 47, 3, 3, V, { R }, 0, 0 },
- { ocText, 48, 2, 2, V, { V }, 0, 0 },
- { ocRGP, 49, 1, 2, A, { R, R, C, C, I }, 0, 0 },
- { ocTrend, 50, 1, 3, A, { R, R, R, C, I }, 0, 0 },
- { ocRKP, 51, 1, 2, A, { R, R, C, C, I }, 0, 0 },
- { ocGrowth, 52, 1, 3, A, { R, R, R, C, I }, 0, 0 },
- { ocBW, 56, 3, 5, V, { V }, 0, 0 },
- { ocZW, 57, 3, 5, V, { V }, 0, 0 },
- { ocZZR, 58, 3, 5, V, { V }, 0, 0 },
- { ocRMZ, 59, 3, 5, V, { V }, 0, 0 },
- { ocZins, 60, 3, 6, V, { V }, 0, 0 },
- { ocMIRR, 61, 3, 3, V, { R, V }, 0, 0 },
- { ocIRR, 62, 1, 2, V, { R, V }, 0, 0 },
+ { ocAnd, 36, 1, 30, V, { RX }, 0, 0 },
+ { ocOr, 37, 1, 30, V, { RX }, 0, 0 },
+ { ocNot, 38, 1, 1, V, { VR }, 0, 0 },
+ { ocMod, 39, 2, 2, V, { VR }, 0, 0 },
+ { ocDBCount, 40, 3, 3, V, { RO, RR }, 0, 0 },
+ { ocDBSum, 41, 3, 3, V, { RO, RR }, 0, 0 },
+ { ocDBAverage, 42, 3, 3, V, { RO, RR }, 0, 0 },
+ { ocDBMin, 43, 3, 3, V, { RO, RR }, 0, 0 },
+ { ocDBMax, 44, 3, 3, V, { RO, RR }, 0, 0 },
+ { ocDBStdDev, 45, 3, 3, V, { RO, RR }, 0, 0 },
+ { ocVar, 46, 1, 30, V, { RX }, 0, 0 },
+ { ocDBVar, 47, 3, 3, V, { RO, RR }, 0, 0 },
+ { ocText, 48, 2, 2, V, { VR }, 0, 0 },
+ { ocRGP, 49, 1, 2, A, { RA, RA, C, C }, 0, 0 },
+ { ocTrend, 50, 1, 3, A, { RA, RA, RA, C }, 0, 0 },
+ { ocRKP, 51, 1, 2, A, { RA, RA, C, C }, 0, 0 },
+ { ocGrowth, 52, 1, 3, A, { RA, RA, RA, C }, 0, 0 },
+ { ocBW, 56, 3, 5, V, { VR }, 0, 0 },
+ { ocZW, 57, 3, 5, V, { VR }, 0, 0 },
+ { ocZZR, 58, 3, 5, V, { VR }, 0, 0 },
+ { ocRMZ, 59, 3, 5, V, { VR }, 0, 0 },
+ { ocZins, 60, 3, 6, V, { VR }, 0, 0 },
+ { ocMIRR, 61, 3, 3, V, { RA, VR }, 0, 0 },
+ { ocIRR, 62, 1, 2, V, { RA, VR }, 0, 0 },
{ ocRandom, 63, 0, 0, V, {}, EXC_FUNCFLAG_VOLATILE, 0 },
- { ocMatch, 64, 2, 3, V, { V, R }, 0, 0 },
- { ocGetDate, 65, 3, 3, V, { V }, 0, 0 },
- { ocGetTime, 66, 3, 3, V, { V }, 0, 0 },
- { ocGetDay, 67, 1, 1, V, { V }, 0, 0 },
- { ocGetMonth, 68, 1, 1, V, { V }, 0, 0 },
- { ocGetYear, 69, 1, 1, V, { V }, 0, 0 },
- { ocGetDayOfWeek, 70, 1, 1, V, { V, C, I }, 0, 0 },
- { ocGetHour, 71, 1, 1, V, { V }, 0, 0 },
- { ocGetMin, 72, 1, 1, V, { V }, 0, 0 },
- { ocGetSec, 73, 1, 1, V, { V }, 0, 0 },
+ { ocMatch, 64, 2, 3, V, { VR, RX, RR }, 0, 0 },
+ { ocGetDate, 65, 3, 3, V, { VR }, 0, 0 },
+ { ocGetTime, 66, 3, 3, V, { VR }, 0, 0 },
+ { ocGetDay, 67, 1, 1, V, { VR }, 0, 0 },
+ { ocGetMonth, 68, 1, 1, V, { VR }, 0, 0 },
+ { ocGetYear, 69, 1, 1, V, { VR }, 0, 0 },
+ { ocGetDayOfWeek, 70, 1, 1, V, { VR, C }, 0, 0 },
+ { ocGetHour, 71, 1, 1, V, { VR }, 0, 0 },
+ { ocGetMin, 72, 1, 1, V, { VR }, 0, 0 },
+ { ocGetSec, 73, 1, 1, V, { VR }, 0, 0 },
{ ocGetActTime, 74, 0, 0, V, {}, EXC_FUNCFLAG_VOLATILE, 0 },
- { ocAreas, 75, 1, 1, V, { R }, 0, 0 },
- { ocRows, 76, 1, 1, V, { R }, 0, 0 },
- { ocColumns, 77, 1, 1, V, { R }, 0, 0 },
- { ocOffset, 78, 3, 5, R, { R, V }, EXC_FUNCFLAG_VOLATILE, 0 },
- { ocSearch, 82, 2, 3, V, { V }, 0, 0 },
- { ocMatTrans, 83, 1, 1, A, { A }, 0, 0 },
- { ocType, 86, 1, 1, V, { V }, 0, 0 },
- { ocArcTan2, 97, 2, 2, V, { V }, 0, 0 },
- { ocArcSin, 98, 1, 1, V, { V }, 0, 0 },
- { ocArcCos, 99, 1, 1, V, { V }, 0, 0 },
- { ocChose, 100, 2, 30, R, { V, R }, 0, 0 },
- { ocHLookup, 101, 3, 3, V, { V, R, R, C, I }, 0, 0 },
- { ocVLookup, 102, 3, 3, V, { V, R, R, C, I }, 0, 0 },
- { ocIsRef, 105, 1, 1, V, { R }, 0, 0 },
- { ocLog, 109, 1, 2, V, { V }, 0, 0 },
- { ocChar, 111, 1, 1, V, { V }, 0, 0 },
- { ocLower, 112, 1, 1, V, { V }, 0, 0 },
- { ocUpper, 113, 1, 1, V, { V }, 0, 0 },
- { ocPropper, 114, 1, 1, V, { V }, 0, 0 },
- { ocLeft, 115, 1, 2, V, { V }, 0, 0 },
- { ocRight, 116, 1, 2, V, { V }, 0, 0 },
- { ocExact, 117, 2, 2, V, { V }, 0, 0 },
- { ocTrim, 118, 1, 1, V, { V }, 0, 0 },
- { ocReplace, 119, 4, 4, V, { V }, 0, 0 },
- { ocSubstitute, 120, 3, 4, V, { V }, 0, 0 },
- { ocCode, 121, 1, 1, V, { V }, 0, 0 },
- { ocFind, 124, 2, 3, V, { V }, 0, 0 },
- { ocCell, 125, 1, 2, V, { V, R }, EXC_FUNCFLAG_VOLATILE, 0 },
- { ocIsErr, 126, 1, 1, V, { V }, 0, 0 },
- { ocIsString, 127, 1, 1, V, { V }, 0, 0 },
- { ocIsValue, 128, 1, 1, V, { V }, 0, 0 },
- { ocIsEmpty, 129, 1, 1, V, { V }, 0, 0 },
- { ocT, 130, 1, 1, V, { R }, 0, 0 },
- { ocN, 131, 1, 1, V, { R }, 0, 0 },
- { ocGetDateValue, 140, 1, 1, V, { V }, 0, 0 },
- { ocGetTimeValue, 141, 1, 1, V, { V }, 0, 0 },
- { ocLIA, 142, 3, 3, V, { V }, 0, 0 },
- { ocDIA, 143, 4, 4, V, { V }, 0, 0 },
- { ocGDA, 144, 4, 5, V, { V }, 0, 0 },
- { ocIndirect, 148, 1, 2, R, { V }, EXC_FUNCFLAG_VOLATILE, 0 },
- { ocClean, 162, 1, 1, V, { V }, 0, 0 },
- { ocMatDet, 163, 1, 1, V, { A }, 0, 0 },
- { ocMatInv, 164, 1, 1, A, { A }, 0, 0 },
- { ocMatMult, 165, 2, 2, A, { A }, 0, 0 },
- { ocZinsZ, 167, 4, 6, V, { V }, 0, 0 },
- { ocKapz, 168, 4, 6, V, { V }, 0, 0 },
- { ocCount2, 169, 0, 30, V, { R }, 0, 0 },
- { ocProduct, 183, 0, 30, V, { R }, 0, 0 },
- { ocFact, 184, 1, 1, V, { V }, 0, 0 },
- { ocDBProduct, 189, 3, 3, V, { R }, 0, 0 },
- { ocIsNonString, 190, 1, 1, V, { V }, 0, 0 },
- { ocStDevP, 193, 1, 30, V, { R }, 0, 0 },
- { ocVarP, 194, 1, 30, V, { R }, 0, 0 },
- { ocDBStdDevP, 195, 3, 3, V, { R }, 0, 0 },
- { ocDBVarP, 196, 3, 3, V, { R }, 0, 0 },
- { ocTrunc, 197, 1, 1, V, { V, C, I }, 0, 0 },
- { ocIsLogical, 198, 1, 1, V, { V }, 0, 0 },
- { ocDBCount2, 199, 3, 3, V, { R }, 0, 0 },
- { ocCurrency, 204, 1, 2, V, { V }, EXC_FUNCFLAG_IMPORTONLY, 0 },
- { ocRoundUp, 212, 2, 2, V, { V }, 0, 0 },
- { ocRoundDown, 213, 2, 2, V, { V }, 0, 0 },
- { ocExternal, 255, 1, 30, R, { E, R }, EXC_FUNCFLAG_IMPORTONLY, 0 }
+ { ocAreas, 75, 1, 1, V, { RO }, 0, 0 },
+ { ocRows, 76, 1, 1, V, { RO }, 0, 0 },
+ { ocColumns, 77, 1, 1, V, { RO }, 0, 0 },
+ { ocOffset, 78, 3, 5, R, { RO, VR }, EXC_FUNCFLAG_VOLATILE, 0 },
+ { ocSearch, 82, 2, 3, V, { VR }, 0, 0 },
+ { ocMatTrans, 83, 1, 1, A, { VO }, 0, 0 },
+ { ocType, 86, 1, 1, V, { VX }, 0, 0 },
+ { ocArcTan2, 97, 2, 2, V, { VR }, 0, 0 },
+ { ocArcSin, 98, 1, 1, V, { VR }, 0, 0 },
+ { ocArcCos, 99, 1, 1, V, { VR }, 0, 0 },
+ { ocChose, 100, 2, 30, R, { VO, RO }, 0, 0 },
+ { ocHLookup, 101, 3, 3, V, { VV, RO, RO, C }, 0, 0 },
+ { ocVLookup, 102, 3, 3, V, { VV, RO, RO, C }, 0, 0 },
+ { ocIsRef, 105, 1, 1, V, { RX }, 0, 0 },
+ { ocLog, 109, 1, 2, V, { VR }, 0, 0 },
+ { ocChar, 111, 1, 1, V, { VR }, 0, 0 },
+ { ocLower, 112, 1, 1, V, { VR }, 0, 0 },
+ { ocUpper, 113, 1, 1, V, { VR }, 0, 0 },
+ { ocPropper, 114, 1, 1, V, { VR }, 0, 0 },
+ { ocLeft, 115, 1, 2, V, { VR }, 0, 0 },
+ { ocRight, 116, 1, 2, V, { VR }, 0, 0 },
+ { ocExact, 117, 2, 2, V, { VR }, 0, 0 },
+ { ocTrim, 118, 1, 1, V, { VR }, 0, 0 },
+ { ocReplace, 119, 4, 4, V, { VR }, 0, 0 },
+ { ocSubstitute, 120, 3, 4, V, { VR }, 0, 0 },
+ { ocCode, 121, 1, 1, V, { VR }, 0, 0 },
+ { ocFind, 124, 2, 3, V, { VR }, 0, 0 },
+ { ocCell, 125, 1, 2, V, { VV, RO }, EXC_FUNCFLAG_VOLATILE, 0 },
+ { ocIsErr, 126, 1, 1, V, { VR }, 0, 0 },
+ { ocIsString, 127, 1, 1, V, { VR }, 0, 0 },
+ { ocIsValue, 128, 1, 1, V, { VR }, 0, 0 },
+ { ocIsEmpty, 129, 1, 1, V, { VR }, 0, 0 },
+ { ocT, 130, 1, 1, V, { RO }, 0, 0 },
+ { ocN, 131, 1, 1, V, { RO }, 0, 0 },
+ { ocGetDateValue, 140, 1, 1, V, { VR }, 0, 0 },
+ { ocGetTimeValue, 141, 1, 1, V, { VR }, 0, 0 },
+ { ocLIA, 142, 3, 3, V, { VR }, 0, 0 },
+ { ocDIA, 143, 4, 4, V, { VR }, 0, 0 },
+ { ocGDA, 144, 4, 5, V, { VR }, 0, 0 },
+ { ocIndirect, 148, 1, 2, R, { VR }, EXC_FUNCFLAG_VOLATILE, 0 },
+ { ocClean, 162, 1, 1, V, { VR }, 0, 0 },
+ { ocMatDet, 163, 1, 1, V, { VA }, 0, 0 },
+ { ocMatInv, 164, 1, 1, A, { VA }, 0, 0 },
+ { ocMatMult, 165, 2, 2, A, { VA }, 0, 0 },
+ { ocZinsZ, 167, 4, 6, V, { VR }, 0, 0 },
+ { ocKapz, 168, 4, 6, V, { VR }, 0, 0 },
+ { ocCount2, 169, 0, 30, V, { RX }, 0, 0 },
+ { ocProduct, 183, 0, 30, V, { RX }, 0, 0 },
+ { ocFact, 184, 1, 1, V, { VR }, 0, 0 },
+ { ocDBProduct, 189, 3, 3, V, { RO, RR }, 0, 0 },
+ { ocIsNonString, 190, 1, 1, V, { VR }, 0, 0 },
+ { ocStDevP, 193, 1, 30, V, { RX }, 0, 0 },
+ { ocVarP, 194, 1, 30, V, { RX }, 0, 0 },
+ { ocDBStdDevP, 195, 3, 3, V, { RO, RR }, 0, 0 },
+ { ocDBVarP, 196, 3, 3, V, { RO, RR }, 0, 0 },
+ { ocTrunc, 197, 1, 1, V, { VR, C }, 0, 0 },
+ { ocIsLogical, 198, 1, 1, V, { VR }, 0, 0 },
+ { ocDBCount2, 199, 3, 3, V, { RO, RR }, 0, 0 },
+ { ocCurrency, 204, 1, 2, V, { VR }, EXC_FUNCFLAG_IMPORTONLY, 0 },
+ { ocRoundUp, 212, 2, 2, V, { VR }, 0, 0 },
+ { ocRoundDown, 213, 2, 2, V, { VR }, 0, 0 },
+ { ocExternal, 255, 1, 30, R, { RO_E, RO }, EXC_FUNCFLAG_IMPORTONLY, 0 }
};
/** Functions new in BIFF3. */
static const XclFunctionInfo saFuncTable_3[] =
{
- { ocRGP, 49, 1, 4, A, { R, R, V, V }, 0, 0 }, // BIFF2: 1-2, BIFF3: 1-4
- { ocTrend, 50, 1, 4, A, { R, R, R, V }, 0, 0 }, // BIFF2: 1-3, BIFF3: 1-4
- { ocRKP, 51, 1, 4, A, { R, R, V, V }, 0, 0 }, // BIFF2: 1-2, BIFF3: 1-4
- { ocGrowth, 52, 1, 4, A, { R, R, R, V }, 0, 0 }, // BIFF2: 1-3, BIFF3: 1-4
- { ocTrunc, 197, 1, 2, V, { V }, 0, 0 }, // BIFF2: 1, BIFF3: 1-2
- { ocAddress, 219, 2, 5, V, { V, V, V, V, V }, 0, 0 },
- { ocGetDiffDate360, 220, 2, 2, V, { V, V, C, I }, 0, 0 },
+ { ocRGP, 49, 1, 4, A, { RA, RA, VV }, 0, 0 }, // BIFF2: 1-2, BIFF3: 1-4
+ { ocTrend, 50, 1, 4, A, { RA, RA, RA, VV }, 0, 0 }, // BIFF2: 1-3, BIFF3: 1-4
+ { ocRKP, 51, 1, 4, A, { RA, RA, VV }, 0, 0 }, // BIFF2: 1-2, BIFF3: 1-4
+ { ocGrowth, 52, 1, 4, A, { RA, RA, RA, VV }, 0, 0 }, // BIFF2: 1-3, BIFF3: 1-4
+ { ocTrunc, 197, 1, 2, V, { VR }, 0, 0 }, // BIFF2: 1, BIFF3: 1-2
+ { ocAddress, 219, 2, 5, V, { VR }, 0, 0 },
+ { ocGetDiffDate360, 220, 2, 2, V, { VR, VR, C }, 0, 0 },
{ ocGetActDate, 221, 0, 0, V, {}, EXC_FUNCFLAG_VOLATILE, 0 },
- { ocVBD, 222, 5, 7, V, { V }, 0, 0 },
- { ocMedian, 227, 1, 30, V, { R }, 0, 0 },
- { ocSumProduct, 228, 1, 30, V, { A }, 0, 0 },
- { ocSinHyp, 229, 1, 1, V, { V }, 0, 0 },
- { ocCosHyp, 230, 1, 1, V, { V }, 0, 0 },
- { ocTanHyp, 231, 1, 1, V, { V }, 0, 0 },
- { ocCotHyp, 231, 1, 1, V, { V }, EXC_FUNCFLAG_EXPORTONLY, 0 },
- { ocArcSinHyp, 232, 1, 1, V, { V }, 0, 0 },
- { ocArcCosHyp, 233, 1, 1, V, { V }, 0, 0 },
- { ocArcTanHyp, 234, 1, 1, V, { V }, 0, 0 },
- { ocArcCotHyp, 234, 1, 1, V, { V }, EXC_FUNCFLAG_EXPORTONLY, 0 },
- { ocDBGet, 235, 3, 3, V, { R }, 0, 0 },
- { ocInfo, 244, 1, 1, V, { V }, EXC_FUNCFLAG_VOLATILE, 0 }
+ { ocVBD, 222, 5, 7, V, { VR }, 0, 0 },
+ { ocMedian, 227, 1, 30, V, { RX }, 0, 0 },
+ { ocSumProduct, 228, 1, 30, V, { VA }, 0, 0 },
+ { ocSinHyp, 229, 1, 1, V, { VR }, 0, 0 },
+ { ocCosHyp, 230, 1, 1, V, { VR }, 0, 0 },
+ { ocTanHyp, 231, 1, 1, V, { VR }, 0, 0 },
+ { ocCotHyp, 231, 1, 1, V, { VR }, EXC_FUNCFLAG_EXPORTONLY, 0 },
+ { ocArcSinHyp, 232, 1, 1, V, { VR }, 0, 0 },
+ { ocArcCosHyp, 233, 1, 1, V, { VR }, 0, 0 },
+ { ocArcTanHyp, 234, 1, 1, V, { VR }, 0, 0 },
+ { ocArcCotHyp, 234, 1, 1, V, { VR }, EXC_FUNCFLAG_EXPORTONLY, 0 },
+ { ocDBGet, 235, 3, 3, V, { RO, RR }, 0, 0 },
+ { ocInfo, 244, 1, 1, V, { VR }, EXC_FUNCFLAG_VOLATILE, 0 }
};
/** Functions new in BIFF4. */
static const XclFunctionInfo saFuncTable_4[] =
{
- { ocFixed, 14, 1, 3, V, { V }, 0, 0 }, // BIFF2-3: 1-2, BIFF4: 1-3
- { ocAsc, 214, 1, 1, V, { V }, 0, 0 },
- { ocJis, 215, 1, 1, V, { V }, 0, 0 },
- { ocRank, 216, 2, 3, V, { V, R, V }, 0, 0 },
- { ocGDA2, 247, 4, 5, V, { V }, 0, 0 },
- { ocFrequency, 252, 2, 2, A, { R }, 0, 0 },
- { ocErrorType, 261, 1, 1, V, { V }, 0, 0 },
- { ocAveDev, 269, 1, 30, V, { R }, 0, 0 },
- { ocBetaDist, 270, 3, 5, V, { V }, 0, 0 },
- { ocGammaLn, 271, 1, 1, V, { V }, 0, 0 },
- { ocBetaInv, 272, 3, 5, V, { V }, 0, 0 },
- { ocBinomDist, 273, 4, 4, V, { V }, 0, 0 },
- { ocChiDist, 274, 2, 2, V, { V }, 0, 0 },
- { ocChiInv, 275, 2, 2, V, { V }, 0, 0 },
- { ocKombin, 276, 2, 2, V, { V }, 0, 0 },
- { ocConfidence, 277, 3, 3, V, { V }, 0, 0 },
- { ocKritBinom, 278, 3, 3, V, { V }, 0, 0 },
- { ocEven, 279, 1, 1, V, { V }, 0, 0 },
- { ocExpDist, 280, 3, 3, V, { V }, 0, 0 },
- { ocFDist, 281, 3, 3, V, { V }, 0, 0 },
- { ocFInv, 282, 3, 3, V, { V }, 0, 0 },
- { ocFisher, 283, 1, 1, V, { V }, 0, 0 },
- { ocFisherInv, 284, 1, 1, V, { V }, 0, 0 },
- { ocFloor, 285, 2, 2, V, { V, V, C, I }, 0, 0 },
- { ocGammaDist, 286, 4, 4, V, { V }, 0, 0 },
- { ocGammaInv, 287, 3, 3, V, { V }, 0, 0 },
- { ocCeil, 288, 2, 2, V, { V, V, C, I }, 0, 0 },
- { ocHypGeomDist, 289, 4, 4, V, { V }, 0, 0 },
- { ocLogNormDist, 290, 3, 3, V, { V }, 0, 0 },
- { ocLogInv, 291, 3, 3, V, { V }, 0, 0 },
- { ocNegBinomVert, 292, 3, 3, V, { V }, 0, 0 },
- { ocNormDist, 293, 4, 4, V, { V }, 0, 0 },
- { ocStdNormDist, 294, 1, 1, V, { V }, 0, 0 },
- { ocNormInv, 295, 3, 3, V, { V }, 0, 0 },
- { ocSNormInv, 296, 1, 1, V, { V }, 0, 0 },
- { ocStandard, 297, 3, 3, V, { V }, 0, 0 },
- { ocOdd, 298, 1, 1, V, { V }, 0, 0 },
- { ocVariationen, 299, 2, 2, V, { V }, 0, 0 },
- { ocPoissonDist, 300, 3, 3, V, { V }, 0, 0 },
- { ocTDist, 301, 3, 3, V, { V }, 0, 0 },
- { ocWeibull, 302, 4, 4, V, { V }, 0, 0 },
- { ocSumXMY2, 303, 2, 2, V, { A }, 0, 0 },
- { ocSumX2MY2, 304, 2, 2, V, { A }, 0, 0 },
- { ocSumX2DY2, 305, 2, 2, V, { A }, 0, 0 },
- { ocChiTest, 306, 2, 2, V, { A }, 0, 0 },
- { ocCorrel, 307, 2, 2, V, { A }, 0, 0 },
- { ocCovar, 308, 2, 2, V, { A }, 0, 0 },
- { ocForecast, 309, 3, 3, V, { V, A }, 0, 0 },
- { ocFTest, 310, 2, 2, V, { A }, 0, 0 },
- { ocIntercept, 311, 2, 2, V, { A }, 0, 0 },
- { ocPearson, 312, 2, 2, V, { A }, 0, 0 },
- { ocRSQ, 313, 2, 2, V, { A }, 0, 0 },
- { ocSTEYX, 314, 2, 2, V, { A }, 0, 0 },
- { ocSlope, 315, 2, 2, V, { A }, 0, 0 },
- { ocTTest, 316, 4, 4, V, { A, A, V }, 0, 0 },
- { ocProb, 317, 3, 4, V, { A, A, V }, 0, 0 },
- { ocDevSq, 318, 1, 30, V, { R }, 0, 0 },
- { ocGeoMean, 319, 1, 30, V, { R }, 0, 0 },
- { ocHarMean, 320, 1, 30, V, { R }, 0, 0 },
- { ocSumSQ, 321, 0, 30, V, { R }, 0, 0 },
- { ocKurt, 322, 1, 30, V, { R }, 0, 0 },
- { ocSchiefe, 323, 1, 30, V, { R }, 0, 0 },
- { ocZTest, 324, 2, 3, V, { R, V }, 0, 0 },
- { ocLarge, 325, 2, 2, V, { R, V }, 0, 0 },
- { ocSmall, 326, 2, 2, V, { R, V }, 0, 0 },
- { ocQuartile, 327, 2, 2, V, { R, V }, 0, 0 },
- { ocPercentile, 328, 2, 2, V, { R, V }, 0, 0 },
- { ocPercentrank, 329, 2, 3, V, { R, V }, 0, 0 },
- { ocModalValue, 330, 1, 30, V, { A }, 0, 0 },
- { ocTrimMean, 331, 2, 2, V, { R, V }, 0, 0 },
- { ocTInv, 332, 2, 2, V, { V }, 0, 0 }
+ { ocFixed, 14, 1, 3, V, { VR }, 0, 0 }, // BIFF2-3: 1-2, BIFF4: 1-3
+ { ocAsc, 214, 1, 1, V, { VR }, 0, 0 },
+ { ocJis, 215, 1, 1, V, { VR }, 0, 0 },
+ { ocRank, 216, 2, 3, V, { VR, RO, VR }, 0, 0 },
+ { ocGDA2, 247, 4, 5, V, { VR }, 0, 0 },
+ { ocFrequency, 252, 2, 2, A, { RA }, 0, 0 },
+ { ocErrorType, 261, 1, 1, V, { VR }, 0, 0 },
+ { ocAveDev, 269, 1, 30, V, { RX }, 0, 0 },
+ { ocBetaDist, 270, 3, 5, V, { VR }, 0, 0 },
+ { ocGammaLn, 271, 1, 1, V, { VR }, 0, 0 },
+ { ocBetaInv, 272, 3, 5, V, { VR }, 0, 0 },
+ { ocBinomDist, 273, 4, 4, V, { VR }, 0, 0 },
+ { ocChiDist, 274, 2, 2, V, { VR }, 0, 0 },
+ { ocChiInv, 275, 2, 2, V, { VR }, 0, 0 },
+ { ocKombin, 276, 2, 2, V, { VR }, 0, 0 },
+ { ocConfidence, 277, 3, 3, V, { VR }, 0, 0 },
+ { ocKritBinom, 278, 3, 3, V, { VR }, 0, 0 },
+ { ocEven, 279, 1, 1, V, { VR }, 0, 0 },
+ { ocExpDist, 280, 3, 3, V, { VR }, 0, 0 },
+ { ocFDist, 281, 3, 3, V, { VR }, 0, 0 },
+ { ocFInv, 282, 3, 3, V, { VR }, 0, 0 },
+ { ocFisher, 283, 1, 1, V, { VR }, 0, 0 },
+ { ocFisherInv, 284, 1, 1, V, { VR }, 0, 0 },
+ { ocFloor, 285, 2, 2, V, { VR, VR, C }, 0, 0 },
+ { ocGammaDist, 286, 4, 4, V, { VR }, 0, 0 },
+ { ocGammaInv, 287, 3, 3, V, { VR }, 0, 0 },
+ { ocCeil, 288, 2, 2, V, { VR, VR, C }, 0, 0 },
+ { ocHypGeomDist, 289, 4, 4, V, { VR }, 0, 0 },
+ { ocLogNormDist, 290, 3, 3, V, { VR }, 0, 0 },
+ { ocLogInv, 291, 3, 3, V, { VR }, 0, 0 },
+ { ocNegBinomVert, 292, 3, 3, V, { VR }, 0, 0 },
+ { ocNormDist, 293, 4, 4, V, { VR }, 0, 0 },
+ { ocStdNormDist, 294, 1, 1, V, { VR }, 0, 0 },
+ { ocNormInv, 295, 3, 3, V, { VR }, 0, 0 },
+ { ocSNormInv, 296, 1, 1, V, { VR }, 0, 0 },
+ { ocStandard, 297, 3, 3, V, { VR }, 0, 0 },
+ { ocOdd, 298, 1, 1, V, { VR }, 0, 0 },
+ { ocVariationen, 299, 2, 2, V, { VR }, 0, 0 },
+ { ocPoissonDist, 300, 3, 3, V, { VR }, 0, 0 },
+ { ocTDist, 301, 3, 3, V, { VR }, 0, 0 },
+ { ocWeibull, 302, 4, 4, V, { VR }, 0, 0 },
+ { ocSumXMY2, 303, 2, 2, V, { VA }, 0, 0 },
+ { ocSumX2MY2, 304, 2, 2, V, { VA }, 0, 0 },
+ { ocSumX2DY2, 305, 2, 2, V, { VA }, 0, 0 },
+ { ocChiTest, 306, 2, 2, V, { VA }, 0, 0 },
+ { ocCorrel, 307, 2, 2, V, { VA }, 0, 0 },
+ { ocCovar, 308, 2, 2, V, { VA }, 0, 0 },
+ { ocForecast, 309, 3, 3, V, { VR, VA }, 0, 0 },
+ { ocFTest, 310, 2, 2, V, { VA }, 0, 0 },
+ { ocIntercept, 311, 2, 2, V, { VA }, 0, 0 },
+ { ocPearson, 312, 2, 2, V, { VA }, 0, 0 },
+ { ocRSQ, 313, 2, 2, V, { VA }, 0, 0 },
+ { ocSTEYX, 314, 2, 2, V, { VA }, 0, 0 },
+ { ocSlope, 315, 2, 2, V, { VA }, 0, 0 },
+ { ocTTest, 316, 4, 4, V, { VA, VA, VR }, 0, 0 },
+ { ocProb, 317, 3, 4, V, { VA, VA, VR }, 0, 0 },
+ { ocDevSq, 318, 1, 30, V, { RX }, 0, 0 },
+ { ocGeoMean, 319, 1, 30, V, { RX }, 0, 0 },
+ { ocHarMean, 320, 1, 30, V, { RX }, 0, 0 },
+ { ocSumSQ, 321, 0, 30, V, { RX }, 0, 0 },
+ { ocKurt, 322, 1, 30, V, { RX }, 0, 0 },
+ { ocSchiefe, 323, 1, 30, V, { RX }, 0, 0 },
+ { ocZTest, 324, 2, 3, V, { RX, VR }, 0, 0 },
+ { ocLarge, 325, 2, 2, V, { RX, VR }, 0, 0 },
+ { ocSmall, 326, 2, 2, V, { RX, VR }, 0, 0 },
+ { ocQuartile, 327, 2, 2, V, { RX, VR }, 0, 0 },
+ { ocPercentile, 328, 2, 2, V, { RX, VR }, 0, 0 },
+ { ocPercentrank, 329, 2, 3, V, { RX, VR, VR_E }, 0, 0 },
+ { ocModalValue, 330, 1, 30, V, { VA }, 0, 0 },
+ { ocTrimMean, 331, 2, 2, V, { RX, VR }, 0, 0 },
+ { ocTInv, 332, 2, 2, V, { VR }, 0, 0 }
};
/** Functions new in BIFF5/BIFF7. Unsupported functions: DATEDIF, DATESTRING, NUMBERSTRING. */
static const XclFunctionInfo saFuncTable_5[] =
{
- { ocGetDayOfWeek, 70, 1, 2, V, { V }, 0, 0 }, // BIFF2-4: 1, BIFF5: 1-2
- { ocHLookup, 101, 3, 4, V, { V, R, R, V }, 0, 0 }, // BIFF2-4: 3, BIFF5: 3-4
- { ocVLookup, 102, 3, 4, V, { V, R, R, V }, 0, 0 }, // BIFF2-4: 3, BIFF5: 3-4
- { ocGetDiffDate360, 220, 2, 3, V, { V }, 0, 0 }, // BIFF3-4: 2, BIFF5: 2-3
- { ocMacro, 255, 1, 30, R, { E, R }, EXC_FUNCFLAG_EXPORTONLY, 0 },
- { ocExternal, 255, 1, 30, R, { E, R }, EXC_FUNCFLAG_EXPORTONLY, 0 },
- { ocConcat, 336, 0, 30, V, { V }, 0, 0 },
- { ocPower, 337, 2, 2, V, { V }, 0, 0 },
- { ocRad, 342, 1, 1, V, { V }, 0, 0 },
- { ocDeg, 343, 1, 1, V, { V }, 0, 0 },
- { ocSubTotal, 344, 2, 30, V, { V, R }, 0, 0 },
- { ocSumIf, 345, 2, 3, V, { R, V, R }, 0, 0 },
- { ocCountIf, 346, 2, 2, V, { R, V }, 0, 0 },
- { ocCountEmptyCells, 347, 1, 1, V, { R }, 0, 0 },
- { ocISPMT, 350, 4, 4, V, { V }, 0, 0 },
- { ocNoName, 351, 3, 3, V, { V }, EXC_FUNCFLAG_IMPORTONLY, 0 }, // DATEDIF
- { ocNoName, 352, 1, 1, V, { V }, EXC_FUNCFLAG_IMPORTONLY, 0 }, // DATESTRING
- { ocNoName, 353, 2, 2, V, { V }, EXC_FUNCFLAG_IMPORTONLY, 0 }, // NUMBERSTRING
- { ocRoman, 354, 1, 2, V, { V }, 0, 0 }
+ { ocGetDayOfWeek, 70, 1, 2, V, { VR }, 0, 0 }, // BIFF2-4: 1, BIFF5: 1-2
+ { ocHLookup, 101, 3, 4, V, { VV, RO, RO, VV }, 0, 0 }, // BIFF2-4: 3, BIFF5: 3-4
+ { ocVLookup, 102, 3, 4, V, { VV, RO, RO, VV }, 0, 0 }, // BIFF2-4: 3, BIFF5: 3-4
+ { ocGetDiffDate360, 220, 2, 3, V, { VR }, 0, 0 }, // BIFF3-4: 2, BIFF5: 2-3
+ { ocMacro, 255, 1, 30, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY, 0 },
+ { ocExternal, 255, 1, 30, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY, 0 },
+ { ocConcat, 336, 0, 30, V, { VR }, 0, 0 },
+ { ocPower, 337, 2, 2, V, { VR }, 0, 0 },
+ { ocRad, 342, 1, 1, V, { VR }, 0, 0 },
+ { ocDeg, 343, 1, 1, V, { VR }, 0, 0 },
+ { ocSubTotal, 344, 2, 30, V, { VR, RO }, 0, 0 },
+ { ocSumIf, 345, 2, 3, V, { RO, VR, RO }, 0, 0 },
+ { ocCountIf, 346, 2, 2, V, { RO, VR }, 0, 0 },
+ { ocCountEmptyCells, 347, 1, 1, V, { RO }, 0, 0 },
+ { ocISPMT, 350, 4, 4, V, { VR }, 0, 0 },
+ { ocNoName, 351, 3, 3, V, { VR }, EXC_FUNCFLAG_IMPORTONLY, 0 }, // DATEDIF
+ { ocNoName, 352, 1, 1, V, { VR }, EXC_FUNCFLAG_IMPORTONLY, 0 }, // DATESTRING
+ { ocNoName, 353, 2, 2, V, { VR }, EXC_FUNCFLAG_IMPORTONLY, 0 }, // NUMBERSTRING
+ { ocRoman, 354, 1, 2, V, { VR }, 0, 0 }
};
#define EXC_FUNCNAME_PREFIX "_xlfn."
@@ -330,19 +350,19 @@ const sal_Char* const EXC_FUNCNAME_BAHTTEXT = EXC_FUNCNAME_PREFIX "BAHTTEXT";
/** Functions new in BIFF8. Unsupported functions: PHONETIC. */
static const XclFunctionInfo saFuncTable_8[] =
{
- { ocGetPivotData, 358, 2, 30, V, { V, R, V }, 0, 0 },
- { ocHyperLink, 359, 1, 2, V, { V }, 0, 0 },
- { ocNoName, 360, 1, 1, V, { R }, EXC_FUNCFLAG_IMPORTONLY, 0 }, // PHONETIC
- { ocAverageA, 361, 1, 30, V, { R }, 0, 0 },
- { ocMaxA, 362, 1, 30, V, { R }, 0, 0 },
- { ocMinA, 363, 1, 30, V, { R }, 0, 0 },
- { ocStDevPA, 364, 1, 30, V, { R }, 0, 0 },
- { ocVarPA, 365, 1, 30, V, { R }, 0, 0 },
- { ocStDevA, 366, 1, 30, V, { R }, 0, 0 },
- { ocVarA, 367, 1, 30, V, { R }, 0, 0 },
- { ocBahtText, 368, 1, 1, V, { V }, EXC_FUNCFLAG_IMPORTONLY, EXC_FUNCNAME_BAHTTEXT },
- { ocBahtText, 255, 2, 2, V, { E, V }, EXC_FUNCFLAG_EXPORTONLY, EXC_FUNCNAME_BAHTTEXT },
- { ocEuroConvert, 255, 4, 6, V, { E, V }, EXC_FUNCFLAG_EXPORTONLY, "EUROCONVERT" }
+ { ocGetPivotData, 358, 2, 30, V, { RR, RR, VR }, 0, 0 },
+ { ocHyperLink, 359, 1, 2, V, { VV, VO }, 0, 0 },
+ { ocNoName, 360, 1, 1, V, { RO }, EXC_FUNCFLAG_IMPORTONLY, 0 }, // PHONETIC
+ { ocAverageA, 361, 1, 30, V, { RX }, 0, 0 },
+ { ocMaxA, 362, 1, 30, V, { RX }, 0, 0 },
+ { ocMinA, 363, 1, 30, V, { RX }, 0, 0 },
+ { ocStDevPA, 364, 1, 30, V, { RX }, 0, 0 },
+ { ocVarPA, 365, 1, 30, V, { RX }, 0, 0 },
+ { ocStDevA, 366, 1, 30, V, { RX }, 0, 0 },
+ { ocVarA, 367, 1, 30, V, { RX }, 0, 0 },
+ { ocBahtText, 368, 1, 1, V, { VR }, EXC_FUNCFLAG_IMPORTONLY, EXC_FUNCNAME_BAHTTEXT },
+ { ocBahtText, 255, 2, 2, V, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY, EXC_FUNCNAME_BAHTTEXT },
+ { ocEuroConvert, 255, 4, 6, V, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY, "EUROCONVERT" }
};
// ----------------------------------------------------------------------------
@@ -436,16 +456,17 @@ XclTokenArray::XclTokenArray( bool bVolatile ) :
{
}
-XclTokenArray::XclTokenArray( ScfUInt8Vec& rTokVec, bool bVolatile,
- ScfUInt8Vec* pExtensionTokens) :
+XclTokenArray::XclTokenArray( ScfUInt8Vec& rTokVec, bool bVolatile ) :
mbVolatile( bVolatile )
{
maTokVec.swap( rTokVec );
- if( NULL != pExtensionTokens)
- {
- DBG_ASSERT( maTokVec.size() <= 0xFFFF, "XclTokenArray::XclTokenArray - extension array too long" );
- maExtensions.swap( *pExtensionTokens );
- }
+}
+
+XclTokenArray::XclTokenArray( ScfUInt8Vec& rTokVec, ScfUInt8Vec& rExtDataVec, bool bVolatile ) :
+ mbVolatile( bVolatile )
+{
+ maTokVec.swap( rTokVec );
+ maExtDataVec.swap( rExtDataVec );
}
sal_uInt16 XclTokenArray::GetSize() const
@@ -482,8 +503,8 @@ void XclTokenArray::WriteArray( XclExpStream& rStrm ) const
{
if( !maTokVec.empty() )
rStrm.Write( &maTokVec.front(), GetSize() );
- if( !maExtensions.empty() )
- rStrm.Write( &maExtensions.front(), limit_cast< sal_uInt16 >(maExtensions.size() ) );
+ if( !maExtDataVec.empty() )
+ rStrm.Write( &maExtDataVec.front(), maExtDataVec.size() );
}
void XclTokenArray::Write( XclExpStream& rStrm ) const
@@ -494,7 +515,7 @@ void XclTokenArray::Write( XclExpStream& rStrm ) const
bool XclTokenArray::operator==( const XclTokenArray& rTokArr ) const
{
- return (mbVolatile == rTokArr.mbVolatile) && (maTokVec == rTokArr.maTokVec);
+ return (mbVolatile == rTokArr.mbVolatile) && (maTokVec == rTokArr.maTokVec) && (maExtDataVec == rTokArr.maExtDataVec);
}
XclImpStream& operator>>( XclImpStream& rStrm, XclTokenArray& rTokArr )
@@ -558,7 +579,7 @@ void XclTokenArrayIterator::Init()
void XclTokenArrayIterator::Init( const ScTokenArray& rScTokArr, bool bSkipSpaces )
{
USHORT nTokArrLen = rScTokArr.GetLen();
- mppScTokenBeg = static_cast< const formula::FormulaToken*const* >( nTokArrLen ? rScTokArr.GetArray() : 0 );
+ mppScTokenBeg = static_cast< const FormulaToken* const* >( nTokArrLen ? rScTokArr.GetArray() : 0 );
mppScTokenEnd = mppScTokenBeg ? (mppScTokenBeg + nTokArrLen) : 0;
mppScToken = (mppScTokenBeg != mppScTokenEnd) ? mppScTokenBeg : 0;
mbSkipSpaces = bSkipSpaces;
@@ -588,9 +609,9 @@ void XclTokenArrayIterator::SkipSpaces()
// strings and string lists ---------------------------------------------------
-bool XclTokenArrayHelper::GetTokenString( String& rString, const formula::FormulaToken& rScToken )
+bool XclTokenArrayHelper::GetTokenString( String& rString, const FormulaToken& rScToken )
{
- bool bIsStr = (rScToken.GetType() == formula::svString) && (rScToken.GetOpCode() == ocPush);
+ bool bIsStr = (rScToken.GetType() == svString) && (rScToken.GetOpCode() == ocPush);
if( bIsStr ) rString = rScToken.GetString();
return bIsStr;
}
@@ -653,7 +674,7 @@ void XclTokenArrayHelper::ConvertStringToList( ScTokenArray& rScTokArr, sal_Unic
const ScTokenArray* XclTokenArrayHelper::GetSharedFormula( const XclRoot& rRoot, const ScTokenArray& rScTokArr )
{
if( rScTokArr.GetLen() == 1 )
- if( const formula::FormulaToken* pScToken = rScTokArr.GetArray()[ 0 ] )
+ if( const FormulaToken* pScToken = rScTokArr.GetArray()[ 0 ] )
if( pScToken->GetOpCode() == ocName )
if( ScRangeData* pData = rRoot.GetNamedRanges().FindIndex( pScToken->GetIndex() ) )
if( pData->HasType( RT_SHARED ) )
@@ -665,7 +686,7 @@ const ScTokenArray* XclTokenArrayHelper::GetSharedFormula( const XclRoot& rRoot,
namespace {
-inline bool lclGetAddress( ScAddress& rAddress, const formula::FormulaToken& rToken )
+inline bool lclGetAddress( ScAddress& rAddress, const FormulaToken& rToken )
{
OpCode eOpCode = rToken.GetOpCode();
bool bIsSingleRef = (eOpCode == ocPush) && (rToken.GetType() == svSingleRef);
diff --git a/sc/source/filter/excel/xlroot.cxx b/sc/source/filter/excel/xlroot.cxx
index 8f5ddadd0370..29522f4f50ff 100644
--- a/sc/source/filter/excel/xlroot.cxx
+++ b/sc/source/filter/excel/xlroot.cxx
@@ -79,6 +79,7 @@ XclRootData::XclRootData( XclBiff eBiff, SfxMedium& rMedium,
mrMedium( rMedium ),
mxRootStrg( xRootStrg ),
mrDoc( rDoc ),
+ maDefPassword( CREATE_STRING( "VelvetSweatshop" ) ),
meTextEnc( eTextEnc ),
meSysLang( Application::GetSettings().GetLanguage() ),
meDocLang( Application::GetSettings().GetLanguage() ),
@@ -198,6 +199,13 @@ void XclRoot::SetCharWidth( const XclFontData& rFontData )
}
}
+String XclRoot::RequestPassword( ::comphelper::IDocPasswordVerifier& rVerifier ) const
+{
+ ::std::vector< OUString > aDefaultPasswords;
+ aDefaultPasswords.push_back( mrData.maDefPassword );
+ return ScfApiHelper::QueryPasswordForMedium( mrData.mrMedium, rVerifier, &aDefaultPasswords );
+}
+
bool XclRoot::HasVbaStorage() const
{
SotStorageRef xRootStrg = GetRootStorage();
diff --git a/sc/source/filter/excel/xlstream.cxx b/sc/source/filter/excel/xlstream.cxx
deleted file mode 100644
index 7340e073c51f..000000000000
--- a/sc/source/filter/excel/xlstream.cxx
+++ /dev/null
@@ -1,52 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: xlstream.cxx,v $
- * $Revision: 1.5 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_sc.hxx"
-
-// ============================================================================
-#include "xlstream.hxx"
-
-// Encryption/decryption ======================================================
-
-const ByteString XclCryptoHelper::GetBiff5WbProtPassword()
-{
- static const ByteString saPass( "VelvetSweatshop" );
- return saPass;
-}
-
-const String XclCryptoHelper::GetBiff8WbProtPassword()
-{
- static const String saPass( GetBiff5WbProtPassword(), RTL_TEXTENCODING_ASCII_US );
- return saPass;
-}
-
-// ============================================================================
-
diff --git a/sc/source/filter/excel/xltools.cxx b/sc/source/filter/excel/xltools.cxx
index ef38a0037ca0..a84aaba82b90 100644
--- a/sc/source/filter/excel/xltools.cxx
+++ b/sc/source/filter/excel/xltools.cxx
@@ -511,7 +511,8 @@ sal_Unicode XclTools::GetBuiltInDefNameIndex( const String& rDefName )
// built-in style names -------------------------------------------------------
-const String XclTools::maStyleNamePrefix( RTL_CONSTASCII_USTRINGPARAM( "Excel_BuiltIn_" ) );
+const String XclTools::maStyleNamePrefix1( RTL_CONSTASCII_USTRINGPARAM( "Excel_BuiltIn_" ) );
+const String XclTools::maStyleNamePrefix2( RTL_CONSTASCII_USTRINGPARAM( "Excel Built-in " ) );
static const sal_Char* const ppcStyleNames[] =
{
@@ -534,7 +535,7 @@ String XclTools::GetBuiltInStyleName( sal_uInt8 nStyleId, sal_uInt8 nLevel )
if( nStyleId == EXC_STYLE_NORMAL ) // "Normal" becomes "Default" style
aStyleName = ScGlobal::GetRscString( STR_STYLENAME_STANDARD );
else if( nStyleId < STATIC_TABLE_SIZE( ppcStyleNames ) )
- aStyleName.Assign( maStyleNamePrefix ).AppendAscii( ppcStyleNames[ nStyleId ] );
+ aStyleName.Assign( maStyleNamePrefix1 ).AppendAscii( ppcStyleNames[ nStyleId ] );
if( (nStyleId == EXC_STYLE_ROWLEVEL) || (nStyleId == EXC_STYLE_COLLEVEL) )
aStyleName.Append( String::CreateFromInt32( nLevel + 1 ) );
@@ -542,6 +543,11 @@ String XclTools::GetBuiltInStyleName( sal_uInt8 nStyleId, sal_uInt8 nLevel )
return aStyleName;
}
+String XclTools::GetBuiltInStyleName( const String& rStyleName )
+{
+ return String( maStyleNamePrefix1 ).Append( rStyleName );
+}
+
bool XclTools::IsBuiltInStyleName( const String& rStyleName, sal_uInt8* pnStyleId, xub_StrLen* pnNextChar )
{
// "Default" becomes "Normal"
@@ -553,10 +559,15 @@ bool XclTools::IsBuiltInStyleName( const String& rStyleName, sal_uInt8* pnStyleI
}
// try the other built-in styles
- xub_StrLen nPrefixLen = maStyleNamePrefix.Len();
sal_uInt8 nFoundId = 0;
xub_StrLen nNextChar = 0;
- if( rStyleName.EqualsIgnoreCaseAscii( maStyleNamePrefix, 0, nPrefixLen ) )
+
+ xub_StrLen nPrefixLen = 0;
+ if( rStyleName.EqualsIgnoreCaseAscii( maStyleNamePrefix1, 0, maStyleNamePrefix1.Len() ) )
+ nPrefixLen = maStyleNamePrefix1.Len();
+ else if( rStyleName.EqualsIgnoreCaseAscii( maStyleNamePrefix2, 0, maStyleNamePrefix2.Len() ) )
+ nPrefixLen = maStyleNamePrefix2.Len();
+ if( nPrefixLen > 0 )
{
String aShortName;
for( sal_uInt8 nId = 0; nId < STATIC_TABLE_SIZE( ppcStyleNames ); ++nId )
@@ -583,14 +594,14 @@ bool XclTools::IsBuiltInStyleName( const String& rStyleName, sal_uInt8* pnStyleI
if( pnStyleId ) *pnStyleId = EXC_STYLE_USERDEF;
if( pnNextChar ) *pnNextChar = 0;
- return false;
+ return nPrefixLen > 0; // also return true for unknown built-in styles
}
bool XclTools::GetBuiltInStyleId( sal_uInt8& rnStyleId, sal_uInt8& rnLevel, const String& rStyleName )
{
sal_uInt8 nStyleId;
xub_StrLen nNextChar;
- if( IsBuiltInStyleName( rStyleName, &nStyleId, &nNextChar ) )
+ if( IsBuiltInStyleName( rStyleName, &nStyleId, &nNextChar ) && (nStyleId != EXC_STYLE_USERDEF) )
{
if( (nStyleId == EXC_STYLE_ROWLEVEL) || (nStyleId == EXC_STYLE_COLLEVEL) )
{
@@ -617,24 +628,25 @@ bool XclTools::GetBuiltInStyleId( sal_uInt8& rnStyleId, sal_uInt8& rnLevel, cons
// conditional formatting style names -----------------------------------------
-const String XclTools::maCFStyleNamePrefix( RTL_CONSTASCII_USTRINGPARAM( "Excel_CondFormat_" ) );
+const String XclTools::maCFStyleNamePrefix1( RTL_CONSTASCII_USTRINGPARAM( "Excel_CondFormat_" ) );
+const String XclTools::maCFStyleNamePrefix2( RTL_CONSTASCII_USTRINGPARAM( "ConditionalStyle_" ) );
String XclTools::GetCondFormatStyleName( SCTAB nScTab, sal_Int32 nFormat, sal_uInt16 nCondition )
{
- return String( maCFStyleNamePrefix ).Append( String::CreateFromInt32( nScTab + 1 ) ).
+ return String( maCFStyleNamePrefix1 ).Append( String::CreateFromInt32( nScTab + 1 ) ).
Append( '_' ).Append( String::CreateFromInt32( nFormat + 1 ) ).
Append( '_' ).Append( String::CreateFromInt32( nCondition + 1 ) );
}
bool XclTools::IsCondFormatStyleName( const String& rStyleName, xub_StrLen* pnNextChar )
{
- xub_StrLen nPrefixLen = maCFStyleNamePrefix.Len();
- if( rStyleName.EqualsIgnoreCaseAscii( maCFStyleNamePrefix, 0, nPrefixLen ) )
- {
- if( pnNextChar ) *pnNextChar = nPrefixLen;
- return true;
- }
- return false;
+ xub_StrLen nPrefixLen = 0;
+ if( rStyleName.EqualsIgnoreCaseAscii( maCFStyleNamePrefix1, 0, maCFStyleNamePrefix1.Len() ) )
+ nPrefixLen = maCFStyleNamePrefix1.Len();
+ else if( rStyleName.EqualsIgnoreCaseAscii( maCFStyleNamePrefix2, 0, maCFStyleNamePrefix2.Len() ) )
+ nPrefixLen = maCFStyleNamePrefix2.Len();
+ if( pnNextChar ) *pnNextChar = nPrefixLen;
+ return nPrefixLen > 0;
}
// stream handling ------------------------------------------------------------
diff --git a/sc/source/filter/ftools/fapihelper.cxx b/sc/source/filter/ftools/fapihelper.cxx
index 3befbf4d866f..31190b6407b1 100644
--- a/sc/source/filter/ftools/fapihelper.cxx
+++ b/sc/source/filter/ftools/fapihelper.cxx
@@ -35,9 +35,8 @@
#include <algorithm>
#include <com/sun/star/lang/XServiceName.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/task/XInteractionHandler.hpp>
-#include <com/sun/star/task/XInteractionRequest.hpp>
#include <com/sun/star/beans/XPropertyState.hpp>
+#include <comphelper/docpasswordhelper.hxx>
#include <comphelper/processfactory.hxx>
#include <tools/urlobj.hxx>
#include <sfx2/objsh.hxx>
@@ -45,7 +44,6 @@
#include <sfx2/sfxsids.hrc>
#include <svtools/stritem.hxx>
#include <svtools/itemset.hxx>
-#include <svtools/docpasswdrequest.hxx>
#include "miscuno.hxx"
using ::rtl::OUString;
@@ -55,14 +53,14 @@ using ::com::sun::star::uno::Sequence;
using ::com::sun::star::uno::Exception;
using ::com::sun::star::uno::UNO_QUERY;
using ::com::sun::star::uno::UNO_QUERY_THROW;
+using ::com::sun::star::uno::UNO_SET_THROW;
using ::com::sun::star::uno::TypeClass_BOOLEAN;
using ::com::sun::star::uno::XInterface;
using ::com::sun::star::beans::XPropertySet;
using ::com::sun::star::beans::XPropertyState;
using ::com::sun::star::lang::XServiceName;
using ::com::sun::star::lang::XMultiServiceFactory;
-using ::com::sun::star::task::XInteractionHandler;
-using ::com::sun::star::task::XInteractionRequest;
+using ::com::sun::star::task::PasswordRequestMode_PASSWORD_ENTER;
// Static helper functions ====================================================
@@ -141,40 +139,25 @@ Reference< XInterface > ScfApiHelper::CreateInstanceWithArgs(
return CreateInstanceWithArgs( ::comphelper::getProcessServiceFactory(), rServiceName, rArgs );
}
-String ScfApiHelper::QueryPasswordForMedium( SfxMedium& rMedium )
+String ScfApiHelper::QueryPasswordForMedium( SfxMedium& rMedium,
+ ::comphelper::IDocPasswordVerifier& rVerifier, const ::std::vector< OUString >* pDefaultPasswords )
{
- String aPassw;
- const SfxItemSet* pSet = rMedium.GetItemSet();
+ OUString aMediaPassword;
+ SfxItemSet* pItemSet = rMedium.GetItemSet();
const SfxPoolItem *pPasswordItem;
+ if( pItemSet && (SFX_ITEM_SET == pItemSet->GetItemState( SID_PASSWORD, TRUE, &pPasswordItem )) )
+ aMediaPassword = static_cast< const SfxStringItem* >( pPasswordItem )->GetValue();
+ OUString aDocName = INetURLObject( rMedium.GetOrigURL() ).GetName( INetURLObject::DECODE_WITH_CHARSET );
- if( pSet && (SFX_ITEM_SET == pSet->GetItemState( SID_PASSWORD, TRUE, &pPasswordItem )) )
- {
- aPassw = static_cast< const SfxStringItem* >( pPasswordItem )->GetValue();
- }
- else
- {
- try
- {
- Reference< XInteractionHandler > xHandler( rMedium.GetInteractionHandler() );
- if( xHandler.is() )
- {
- RequestDocumentPassword* pRequest = new RequestDocumentPassword(
- ::com::sun::star::task::PasswordRequestMode_PASSWORD_ENTER,
- INetURLObject( rMedium.GetOrigURL() ).GetName( INetURLObject::DECODE_WITH_CHARSET ) );
- Reference< XInteractionRequest > xRequest( pRequest );
-
- xHandler->handle( xRequest );
-
- if( pRequest->isPassword() )
- aPassw = pRequest->getPassword();
- }
- }
- catch( Exception& )
- {
- }
- }
+ bool bIsDefaultPassword = false;
+ OUString aPassword = ::comphelper::DocPasswordHelper::requestAndVerifyDocPassword(
+ rVerifier, aMediaPassword, rMedium.GetInteractionHandler(), aDocName,
+ ::comphelper::DocPasswordRequestType_MS, pDefaultPasswords, &bIsDefaultPassword );
+
+ if( !bIsDefaultPassword && (aPassword.getLength() > 0) && pItemSet )
+ pItemSet->Put( SfxStringItem( SID_PASSWORD, aPassword ) );
- return aPassw;
+ return aPassword;
}
// Property sets ==============================================================
diff --git a/sc/source/filter/ftools/ftools.cxx b/sc/source/filter/ftools/ftools.cxx
index 98faeb9f03d4..2271a8f35d4d 100644
--- a/sc/source/filter/ftools/ftools.cxx
+++ b/sc/source/filter/ftools/ftools.cxx
@@ -160,13 +160,15 @@ Color ScfTools::GetMixedColor( const Color& rFore, const Color& rBack, sal_uInt8
// *** conversion of names *** ------------------------------------------------
+/* XXX As in sc/source/core/tool/rangenam.cxx ScRangeData::IsValidName() */
+
void ScfTools::ConvertToScDefinedName( String& rName )
{
xub_StrLen nLen = rName.Len();
- if( nLen && !ScCompiler::IsCharWordChar( rName, 0 ) )
+ if( nLen && !ScCompiler::IsCharFlagAllConventions( rName, 0, SC_COMPILER_C_CHAR_NAME ) )
rName.SetChar( 0, '_' );
for( xub_StrLen nPos = 1; nPos < nLen; ++nPos )
- if( !ScCompiler::IsWordChar( rName, nPos ) )
+ if( !ScCompiler::IsCharFlagAllConventions( rName, nPos, SC_COMPILER_C_NAME ) )
rName.SetChar( nPos, '_' );
}
diff --git a/sc/source/filter/inc/fapihelper.hxx b/sc/source/filter/inc/fapihelper.hxx
index d8881889e7fa..f3cdc782ee9c 100644
--- a/sc/source/filter/inc/fapihelper.hxx
+++ b/sc/source/filter/inc/fapihelper.hxx
@@ -45,6 +45,8 @@ namespace com { namespace sun { namespace star {
namespace lang { class XMultiServiceFactory; }
} } }
+namespace comphelper { class IDocPasswordVerifier; }
+
// Static helper functions ====================================================
class SfxMedium;
@@ -109,7 +111,9 @@ public:
/** Opens a password dialog and returns the entered password.
@return The entered password or an empty string on 'Cancel' or any error. */
- static String QueryPasswordForMedium( SfxMedium& rMedium );
+ static String QueryPasswordForMedium( SfxMedium& rMedium,
+ ::comphelper::IDocPasswordVerifier& rVerifier,
+ const ::std::vector< ::rtl::OUString >* pDefaultPasswords = 0 );
};
template< typename Type >
diff --git a/sc/source/filter/inc/fdumper.hxx b/sc/source/filter/inc/fdumper.hxx
deleted file mode 100644
index ea4aabf69009..000000000000
--- a/sc/source/filter/inc/fdumper.hxx
+++ /dev/null
@@ -1,1520 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: fdumper.hxx,v $
- * $Revision: 1.8.28.2 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#ifndef SC_FDUMPER_HXX
-#define SC_FDUMPER_HXX
-
-#define SCF_INCL_DUMPER (OSL_DEBUG_LEVEL > 0) && 0
-
-#include <map>
-// #include <math.h>
-#include "ftools.hxx"
-
-#if SCF_INCL_DUMPER
-
-class SvStream;
-class SfxMedium;
-class SfxObjectShell;
-class Color;
-class DateTime;
-
-namespace scf {
-namespace dump {
-
-#define SCF_DUMP_UNUSED "unused"
-#define SCF_DUMP_UNKNOWN "?unknown"
-
-#define SCF_DUMP_ERRASCII( ascii ) "?err:" ascii
-#define SCF_DUMP_ERRSTRING( ascii ) CREATE_STRING( SCF_DUMP_ERRASCII( ascii ) )
-
-#define SCF_DUMP_ERR_NOMAP SCF_DUMP_ERRSTRING( "no-map" )
-#define SCF_DUMP_ERR_NONAME SCF_DUMP_ERRSTRING( "no-name" )
-#define SCF_DUMP_ERR_STREAM SCF_DUMP_ERRSTRING( "stream-error" )
-
-// ============================================================================
-// ============================================================================
-
-/** Specifiers for atomic data types. */
-enum DataType
-{
- DATATYPE_VOID, /// No data type.
- DATATYPE_INT8, /// Signed 8-bit integer.
- DATATYPE_UINT8, /// Unsigned 8-bit integer.
- DATATYPE_INT16, /// Signed 16-bit integer.
- DATATYPE_UINT16, /// Unsigned 16-bit integer.
- DATATYPE_INT32, /// Signed 32-bit integer.
- DATATYPE_UINT32, /// Unsigned 32-bit integer.
- DATATYPE_INT64, /// Signed 64-bit integer.
- DATATYPE_UINT64, /// Unsigned 64-bit integer.
- DATATYPE_FLOAT, /// Floating-point, single precision.
- DATATYPE_DOUBLE /// Floating-point, double precision.
-};
-
-// ----------------------------------------------------------------------------
-
-/** Specifiers for the output format of values. */
-enum FormatType
-{
- FORMATTYPE_NONE, /// No numeric format (e.g. show name only).
- FORMATTYPE_DEC, /// Decimal.
- FORMATTYPE_HEX, /// Hexadecimal.
- FORMATTYPE_BIN, /// Binary.
- FORMATTYPE_FIX, /// Fixed-point.
- FORMATTYPE_BOOL /// Boolean ('true' or 'false').
-};
-
-// ----------------------------------------------------------------------------
-
-/** Describes the output format of a data item.
-
- Data items are written in the following format:
-
- <NAME>=<VALUE>=<NAME-FROM-LIST>
-
- NAME is the name of the data item. The name is contained in the members
- maItemName and maItemNameUtf8. If the name is empty, only the value is
- written (without a leading equality sign).
-
- VALUE is the numeric value of the data item. Its format is dependent on the
- output format given in the member meFmtType. If the format type is
- FORMATTYPE_NONE, no value is written.
-
- NAME-FROM-LIST is a symbolic name for the current value of the data item.
- Various types of name lists produce different names for values, which can
- be used for enumerations or names for single bits in bitfields (see class
- NameListBase and derived classes). The name of the list is given in the
- member maListName. If it is empty, no name is written for the value.
- */
-struct ItemFormat
-{
- DataType meDataType; /// Data type of the item.
- FormatType meFmtType; /// Output format for the value.
- String maItemName; /// Name of the item.
- ByteString maItemNameUtf8; /// Name of the item, converted to UTF-8.
- String maListName; /// Name of a name list to be used for this item.
-
- explicit ItemFormat();
-
- void Set( DataType eDataType, FormatType eFmtType, const String& rItemName );
- void Set( DataType eDataType, FormatType eFmtType, const String& rItemName, const String& rListName );
-
- /** Initializes the struct from a vector of strings containing the item format.
-
- The vector must contain at least 2 strings. The struct is filled from
- the strings in the vector in the following order:
- 1) Data type (one of: [u]int8, [u]int16, [u]int32, [u]int64, float, double).
- 2) Format type (one of: dec, hex, bin, fix, bool, unused, unknown).
- 3) Item name (optional).
- 4) Name list name (optional).
-
- @return Iterator pointing to the first unhandled string.
- */
- ScfStringVec::const_iterator Parse( const ScfStringVec& rFormatVec );
-
- /** Initializes the struct from a string containing the item format.
-
- The string must have the following format:
- DATATYPE,FORMATTYPE[,ITEMNAME[,LISTNAME]]
-
- DATATYPE is the data type of the item (see above for possible values).
- FORMATTYPE is the format type of the item (see above for possible values).
- ITEMNAME is the name of the item (optional).
- LISTNAME is the name of a name list (optional).
-
- @return List containing remaining unhandled format strings.
- */
- ScfStringVec Parse( const String& rFormatStr );
-};
-
-// ============================================================================
-// ============================================================================
-
-/** Static helper functions for formatted output to strings. */
-class StringHelper
-{
-public:
- // append string to string ------------------------------------------------
-
- static void AppendString( String& rStr, const String& rData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' );
-
- // append decimal ---------------------------------------------------------
-
- static void AppendDec( String& rStr, sal_uInt8 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' );
- static void AppendDec( String& rStr, sal_Int8 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' );
- static void AppendDec( String& rStr, sal_uInt16 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' );
- static void AppendDec( String& rStr, sal_Int16 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' );
- static void AppendDec( String& rStr, sal_uInt32 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' );
- static void AppendDec( String& rStr, sal_Int32 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' );
- static void AppendDec( String& rStr, sal_uInt64 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' );
- static void AppendDec( String& rStr, sal_Int64 nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' );
- static void AppendDec( String& rStr, double fData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' );
-
- // append hexadecimal -----------------------------------------------------
-
- static void AppendHex( String& rStr, sal_uInt8 nData, bool bPrefix = true );
- static void AppendHex( String& rStr, sal_Int8 nData, bool bPrefix = true );
- static void AppendHex( String& rStr, sal_uInt16 nData, bool bPrefix = true );
- static void AppendHex( String& rStr, sal_Int16 nData, bool bPrefix = true );
- static void AppendHex( String& rStr, sal_uInt32 nData, bool bPrefix = true );
- static void AppendHex( String& rStr, sal_Int32 nData, bool bPrefix = true );
- static void AppendHex( String& rStr, sal_uInt64 nData, bool bPrefix = true );
- static void AppendHex( String& rStr, sal_Int64 nData, bool bPrefix = true );
- static void AppendHex( String& rStr, double fData, bool bPrefix = true );
-
- // append shortened hexadecimal -------------------------------------------
-
- static void AppendShortHex( String& rStr, sal_uInt8 nData, bool bPrefix = true );
- static void AppendShortHex( String& rStr, sal_Int8 nData, bool bPrefix = true );
- static void AppendShortHex( String& rStr, sal_uInt16 nData, bool bPrefix = true );
- static void AppendShortHex( String& rStr, sal_Int16 nData, bool bPrefix = true );
- static void AppendShortHex( String& rStr, sal_uInt32 nData, bool bPrefix = true );
- static void AppendShortHex( String& rStr, sal_Int32 nData, bool bPrefix = true );
- static void AppendShortHex( String& rStr, sal_uInt64 nData, bool bPrefix = true );
- static void AppendShortHex( String& rStr, sal_Int64 nData, bool bPrefix = true );
-
- // append binary ----------------------------------------------------------
-
- static void AppendBin( String& rStr, sal_uInt8 nData, bool bDots = true );
- static void AppendBin( String& rStr, sal_Int8 nData, bool bDots = true );
- static void AppendBin( String& rStr, sal_uInt16 nData, bool bDots = true );
- static void AppendBin( String& rStr, sal_Int16 nData, bool bDots = true );
- static void AppendBin( String& rStr, sal_uInt32 nData, bool bDots = true );
- static void AppendBin( String& rStr, sal_Int32 nData, bool bDots = true );
- static void AppendBin( String& rStr, sal_uInt64 nData, bool bDots = true );
- static void AppendBin( String& rStr, sal_Int64 nData, bool bDots = true );
- static void AppendBin( String& rStr, double fData, bool bDots = true );
-
- // append fixed-point decimal ---------------------------------------------
-
- template< typename Type >
- static void AppendFix( String& rStr, Type nData, xub_StrLen nWidth = 0 );
-
- // append formatted value -------------------------------------------------
-
- static void AppendBool( String& rStr, bool bData );
- template< typename Type >
- static void AppendValue( String& rStr, Type nData, FormatType eFmtType );
-
- // encoded text output ----------------------------------------------------
-
- static void AppendCChar( String& rStr, sal_Unicode cChar, bool bPrefix = true );
- static void AppendEncChar( String& rStr, sal_Unicode cChar, xub_StrLen nCount = 1, bool bPrefix = true );
- static void AppendEncString( String& rStr, const String& rData, bool bPrefix = true );
-
- // token list -------------------------------------------------------------
-
- static void AppendToken( String& rStr, const String& rToken, sal_Unicode cSep = ',' );
- static void AppendToken( String& rStr, sal_Int64 nToken, sal_Unicode cSep = ',' );
- static void PrependToken( String& rStr, const String& rToken, sal_Unicode cSep = ',' );
- static void PrependToken( String& rStr, sal_Int64 nToken, sal_Unicode cSep = ',' );
-
- static void AppendIndex( String& rStr, const String& rIdx );
- static void AppendIndex( String& rStr, sal_Int64 nIdx );
- static void AppendIndexedText( String& rStr, const String& rData, const String& rIdx );
- static void AppendIndexedText( String& rStr, const String& rData, sal_Int64 nIdx );
-
- static String GetToken( const String& rData, xub_StrLen& rnPos, sal_Unicode cSep = ',' );
-
- // quoting and trimming ---------------------------------------------------
-
- /** Encloses the passed string with the passed characters. Uses cOpen, if cClose is NUL. */
- static void Enclose( String& rStr, sal_Unicode cOpen, sal_Unicode cClose = '\0' );
-
- static void TrimSpaces( String& rStr );
- static void TrimQuotes( String& rStr );
-
- // string conversion ------------------------------------------------------
-
- static ByteString ConvertToUtf8( const String& rStr );
- static DataType ConvertToDataType( const String& rStr );
- static FormatType ConvertToFormatType( const String& rStr );
-
- static bool ConvertFromDec( sal_Int64& rnData, const String& rData );
- static bool ConvertFromHex( sal_Int64& rnData, const String& rData );
-
- static bool ConvertStringToInt( sal_Int64& rnData, const String& rData );
- static bool ConvertStringToDouble( double& rfData, const String& rData );
- static bool ConvertStringToBool( const String& rData );
-
- // string to list conversion ----------------------------------------------
-
- static void ConvertStringToStringList( ScfStringVec& rVec, const String& rData, bool bIgnoreEmpty );
- static void ConvertStringToIntList( ScfInt64Vec& rVec, const String& rData, bool bIgnoreEmpty );
-
- // file names -------------------------------------------------------------
-
- static String ConvertFileNameToUrl( const String& rFileName );
- static xub_StrLen GetFileNamePos( const String& rFileUrl );
-};
-
-// ----------------------------------------------------------------------------
-
-template< typename Type >
-void StringHelper::AppendFix( String& rStr, Type nData, xub_StrLen nWidth )
-{
- AppendDec( rStr, static_cast< double >( nData ) / pow( 2.0, 4.0 * sizeof( Type ) ), nWidth );
-}
-
-template< typename Type >
-void StringHelper::AppendValue( String& rStr, Type nData, FormatType eFmtType )
-{
- switch( eFmtType )
- {
- case FORMATTYPE_DEC: AppendDec( rStr, nData ); break;
- case FORMATTYPE_HEX: AppendHex( rStr, nData ); break;
- case FORMATTYPE_BIN: AppendBin( rStr, nData ); break;
- case FORMATTYPE_FIX: AppendFix( rStr, nData ); break;
- case FORMATTYPE_BOOL: AppendBool( rStr, nData ); break;
- default:;
- }
-}
-
-// ============================================================================
-
-class StringWrapper
-{
-public:
- inline StringWrapper() {}
- inline /*implicit*/ StringWrapper( const String& rStr ) : maStr( rStr ) {}
- inline /*implicit*/ StringWrapper( const sal_Char* pcStr ) : maStr( String::CreateFromAscii( pcStr ? pcStr : "" ) ) {}
- inline /*implicit*/ StringWrapper( sal_Unicode cChar ) : maStr( cChar ) {}
-
- inline bool Empty() const { return maStr.Len() == 0; }
- inline const String& GetString() const { return maStr; }
-
-private:
- String maStr;
-};
-
-// ============================================================================
-// ============================================================================
-
-class Base;
-typedef ScfRef< Base > BaseRef;
-
-/** Base class for all dumper classes.
-
- Derived classes implement the virtual function ImplIsValid(). It should
- check all members the other functions rely on. If the function
- ImplIsValid() returns true, all references and pointers can be used without
- further checking.
-
- Overview of all classes in this header file based on this Base class:
-
- Base
- |
- +----> NameListBase
- | |
- | +----> ConstList ------> MultiList
- | +----> FlagsList ------> CombiList
- | +----> UnitConverter
- |
- +----> ConfigCoreData
- +----> Config
- +----> CoreData
- |
- +----> Input ------> SvStreamInput
- +----> Output
- |
- +----> ObjectBase
- |
- +----> InputObjectBase
- | |
- | +----> StreamObjectBase
- | | |
- | | +----> SvStreamObject
- | | +----> OleStreamObject
- | | +----> WrappedStreamObject
- | |
- | +----> RecordHeaderBase
- |
- +----> OleStorageObject
- +----> DumperBase
- */
-class Base
-{
-public:
- virtual ~Base();
-
- inline bool IsValid() const { return ImplIsValid(); }
- inline static bool IsValid( BaseRef xBase ) { return xBase.is() && xBase->IsValid(); }
-
-protected:
- inline explicit Base() {}
-
- virtual bool ImplIsValid() const = 0;
-};
-
-// ============================================================================
-// ============================================================================
-
-class ConfigItemBase
-{
-public:
- virtual ~ConfigItemBase();
- void ReadConfigBlock( SvStream& rStrm );
-
-protected:
- inline explicit ConfigItemBase() {}
-
- virtual void ImplProcessConfigItemStr( SvStream& rStrm, const String& rKey, const String& rData );
- virtual void ImplProcessConfigItemInt( SvStream& rStrm, sal_Int64 nKey, const String& rData );
-
- void ReadConfigBlockContents( SvStream& rStrm );
- void IgnoreConfigBlockContents( SvStream& rStrm );
-
-private:
- enum LineType { LINETYPE_DATA, LINETYPE_BEGIN, LINETYPE_END };
-
- LineType ReadConfigLine( SvStream& rStrm, String& rKey, String& rData ) const;
- LineType ReadConfigLine( SvStream& rStrm ) const;
- void ProcessConfigItem( SvStream& rStrm, const String& rKey, const String& rData );
-};
-
-// ============================================================================
-
-class ConfigCoreData;
-class Config;
-
-class NameListBase;
-typedef ScfRef< NameListBase > NameListRef;
-
-/** Base class of all classes providing names for specific values (name lists).
-
- The idea is to provide a unique interfase for all different methods to
- write specific names for any values. This can be enumerations (dedicated
- names for a subset of values), or names for bits in bit fields. Classes
- derived from this base class implement the specific behaviour for the
- desired purpose.
- */
-class NameListBase : public Base, public ConfigItemBase
-{
-public:
- typedef ::std::map< sal_Int64, String > StringMap;
- typedef StringMap::const_iterator const_iterator;
-
- virtual ~NameListBase();
-
- /** Sets a name for the specified key. */
- void SetName( sal_Int64 nKey, const StringWrapper& rNameWrp );
- /** Include all names of the passed list. */
- void IncludeList( NameListRef xList );
-
- /** Returns true, if the map contains an entry for the passed key. */
- template< typename Type >
- inline bool HasName( Type nKey ) const
- { return maMap.count( static_cast< sal_Int64 >( nKey ) ) != 0; }
- /** Returns the name for the passed key. */
- template< typename Type >
- inline String GetName( const Config& rCfg, Type nKey ) const
- { return ImplGetName( rCfg, static_cast< sal_Int64 >( nKey ) ); }
- /** Returns a display name for the passed double value. */
- inline String GetName( const Config& rCfg, double fValue ) const
- { return ImplGetNameDbl( rCfg, fValue ); }
-
- /** Returns a map iterator pointing to the first contained name. */
- inline const_iterator begin() const { return maMap.begin(); }
- /** Returns a map iterator pointing one past the last contained name. */
- inline const_iterator end() const { return maMap.end(); }
-
-protected:
- inline explicit NameListBase( const ConfigCoreData& rCoreData ) : mrCoreData( rCoreData ) {}
-
- virtual bool ImplIsValid() const;
- virtual void ImplProcessConfigItemStr( SvStream& rStrm, const String& rKey, const String& rData );
- virtual void ImplProcessConfigItemInt( SvStream& rStrm, sal_Int64 nKey, const String& rData );
-
- /** Derived classes set the name for the passed key. */
- virtual void ImplSetName( sal_Int64 nKey, const String& rName ) = 0;
- /** Derived classes generate and return the name for the passed key. */
- virtual String ImplGetName( const Config& rCfg, sal_Int64 nKey ) const = 0;
- /** Derived classes generate and return the name for the passed double value. */
- virtual String ImplGetNameDbl( const Config& rCfg, double fValue ) const = 0;
- /** Derived classes insert all names and other settings from the passed list. */
- virtual void ImplIncludeList( const NameListBase& rList ) = 0;
-
- /** Returns the configuration core data, which can be used to access other name lists. */
- inline const ConfigCoreData& GetCoreData() const { return mrCoreData; }
- /** Inserts the passed name into the internal map. */
- void InsertRawName( sal_Int64 nKey, const String& rName );
- /** Returns the name for the passed key, or 0, if nothing found. */
- const String* FindRawName( sal_Int64 nKey ) const;
-
-private:
- /** Includes name lists, given in a comma separated list of names of the lists. */
- void Include( const String& rListKeys );
- /** Excludes names from the list, given by a comma separated list of their keys. */
- void Exclude( const String& rKeys );
-
-private:
- StringMap maMap;
- const ConfigCoreData& mrCoreData;
-};
-
-// ============================================================================
-
-class ConstList : public NameListBase
-{
-public:
- explicit ConstList( const ConfigCoreData& rCoreData );
-
- /** Sets a default name for unknown keys. */
- inline void SetDefaultName( const StringWrapper& rDefName ) { maDefName = rDefName.GetString(); }
- /** Enables or disables automatic quotation of returned names. */
- inline void SetQuoteNames( bool bQuoteNames ) { mbQuoteNames = bQuoteNames; }
-
-protected:
- virtual void ImplProcessConfigItemStr( SvStream& rStrm, const String& rKey, const String& rData );
-
- /** Sets the name for the passed key. */
- virtual void ImplSetName( sal_Int64 nKey, const String& rName );
- /** Returns the name for the passed key, or the default name, if key is not contained. */
- virtual String ImplGetName( const Config& rCfg, sal_Int64 nKey ) const;
- /** Returns the name for the passed double value. */
- virtual String ImplGetNameDbl( const Config& rCfg, double fValue ) const;
- /** Inserts all names from the passed list. */
- virtual void ImplIncludeList( const NameListBase& rList );
-
-private:
- String maDefName;
- bool mbQuoteNames;
-};
-
-// ============================================================================
-
-class MultiList : public ConstList
-{
-public:
- explicit MultiList( const ConfigCoreData& rCoreData );
-
- void SetNamesFromVec( sal_Int64 nStartKey, const ScfStringVec& rNames );
-
-protected:
- virtual void ImplProcessConfigItemStr( SvStream& rStrm, const String& rKey, const String& rData );
- virtual void ImplSetName( sal_Int64 nKey, const String& rName );
-
-private:
- void InsertNames( sal_Int64 nStartKey, const String& rData );
-
-private:
- bool mbIgnoreEmpty;
-};
-
-// ============================================================================
-
-class FlagsList : public NameListBase
-{
-public:
- explicit FlagsList( const ConfigCoreData& rCoreData );
-
- /** Sets flags to be ignored on output. */
- template< typename Type >
- inline void SetIgnoreFlags( Type nIgnore )
- { mnIgnore = static_cast< sal_Int64 >( nIgnore ); }
-
-protected:
- virtual void ImplProcessConfigItemStr( SvStream& rStrm, const String& rKey, const String& rData );
-
- /** Sets the name for the passed key. */
- virtual void ImplSetName( sal_Int64 nKey, const String& rName );
- /** Returns the name for the passed key. */
- virtual String ImplGetName( const Config& rCfg, sal_Int64 nKey ) const;
- /** Returns the name for the passed double value. */
- virtual String ImplGetNameDbl( const Config& rCfg, double fValue ) const;
- /** Inserts all flags from the passed list. */
- virtual void ImplIncludeList( const NameListBase& rList );
-
-private:
- sal_Int64 mnIgnore;
-};
-
-// ============================================================================
-
-class CombiList : public FlagsList
-{
-public:
- explicit CombiList( const ConfigCoreData& rCoreData );
-
-protected:
- /** Sets the name for the passed key. */
- virtual void ImplSetName( sal_Int64 nKey, const String& rName );
- /** Returns the name for the passed key. */
- virtual String ImplGetName( const Config& rCfg, sal_Int64 nKey ) const;
- /** Inserts all flags from the passed list. */
- virtual void ImplIncludeList( const NameListBase& rList );
-
-private:
- struct ExtItemFormat : public ItemFormat
- {
- bool mbShiftValue;
- inline explicit ExtItemFormat() : mbShiftValue( true ) {}
- };
- typedef ::std::map< sal_Int64, ExtItemFormat > ExtItemFormatMap;
- ExtItemFormatMap maFmtMap;
-};
-
-// ============================================================================
-
-class UnitConverter : public NameListBase
-{
-public:
- explicit UnitConverter( const ConfigCoreData& rCoreData );
-
- inline void SetUnitName( const StringWrapper& rUnitName ) { maUnitName = rUnitName.GetString(); }
- inline void SetFactor( double fFactor ) { mfFactor = fFactor; }
-
-protected:
- /** Sets the name for the passed key. */
- virtual void ImplSetName( sal_Int64 nKey, const String& rName );
- /** Returns the converted value with appended unit name. */
- virtual String ImplGetName( const Config& rCfg, sal_Int64 nKey ) const;
- /** Returns the converted value with appended unit name. */
- virtual String ImplGetNameDbl( const Config& rCfg, double fValue ) const;
- /** Empty implementation. */
- virtual void ImplIncludeList( const NameListBase& rList );
-
-private:
- String maUnitName;
- double mfFactor;
-};
-
-// ============================================================================
-
-class NameListWrapper
-{
-public:
- inline NameListWrapper() {}
- inline /*implicit*/ NameListWrapper( const String& rListName ) : maNameWrp( rListName ) {}
- inline /*implicit*/ NameListWrapper( const sal_Char* pcListName ) : maNameWrp( pcListName ) {}
- inline /*implicit*/ NameListWrapper( NameListRef xList ) : mxList( xList ) {}
-
- inline bool Empty() const { return !mxList && maNameWrp.Empty(); }
- NameListRef GetNameList( const Config& rCfg ) const;
-
-private:
- StringWrapper maNameWrp;
- mutable NameListRef mxList;
-};
-
-static const NameListWrapper NO_LIST;
-
-// ============================================================================
-// ============================================================================
-
-class ConfigCoreData : public Base, public ConfigItemBase
-{
-public:
- explicit ConfigCoreData( const String& rFileName );
- virtual ~ConfigCoreData();
-
- void SetOption( const String& rKey, const String& rData );
- const String* GetOption( const String& rKey ) const;
-
- template< typename ListType >
- ScfRef< ListType > CreateNameList( const String& rListName );
- void SetNameList( const String& rListName, NameListRef xList );
- void EraseNameList( const String& rListName );
- NameListRef GetNameList( const String& rListName ) const;
-
-protected:
- inline explicit ConfigCoreData() : mbLoaded( false ) {}
- void Construct( const String& rFileName );
-
- virtual bool ImplIsValid() const;
- virtual void ImplProcessConfigItemStr( SvStream& rStrm, const String& rKey, const String& rData );
-
-private:
- void ConstructCfgCoreData();
-
- bool ReadConfigFile( const String& rFileUrl );
- template< typename ListType >
- void ReadNameList( SvStream& rStrm, const String& rListName );
- void CreateShortList( const String& rData );
- void CreateUnitConverter( const String& rData );
-
-private:
- typedef ::std::map< String, String > ConfigDataMap;
- typedef ::std::map< String, NameListRef > NameListMap;
-
- ConfigDataMap maConfigData;
- NameListMap maNameLists;
- String maConfigPath;
- bool mbLoaded;
-};
-
-// ----------------------------------------------------------------------------
-
-template< typename ListType >
-ScfRef< ListType > ConfigCoreData::CreateNameList( const String& rListName )
-{
- ScfRef< ListType > xList;
- if( rListName.Len() > 0 )
- {
- xList.reset( new ListType( *this ) );
- SetNameList( rListName, xList );
- }
- return xList;
-}
-
-template< typename ListType >
-void ConfigCoreData::ReadNameList( SvStream& rStrm, const String& rListName )
-{
- NameListRef xList = CreateNameList< ListType >( rListName );
- if( xList.is() )
- xList->ReadConfigBlock( rStrm );
-}
-
-// ============================================================================
-
-class Config : public Base
-{
-public:
- explicit Config( const Config& rParent );
- explicit Config( const String& rFileName );
- explicit Config( const sal_Char* pcEnvVar );
- virtual ~Config();
-
- void SetStringOption( const StringWrapper& rKey, const StringWrapper& rData );
-
- const String& GetStringOption( const StringWrapper& rKey, const String& rDefault ) const;
- bool GetBoolOption( const StringWrapper& rKey, bool bDefault ) const;
- template< typename Type >
- Type GetIntOption( const StringWrapper& rKey, Type nDefault ) const;
-
- bool IsDumperEnabled() const;
- bool IsImportEnabled() const;
-
- template< typename ListType >
- ScfRef< ListType > CreateNameList( const StringWrapper& rListName );
- void SetNameList( const StringWrapper& rListName, NameListRef xList );
- void EraseNameList( const StringWrapper& rListName );
- NameListRef GetNameList( const StringWrapper& rListName ) const;
-
- /** Returns the name for the passed key from the passed name list. */
- template< typename Type >
- String GetName( const NameListWrapper& rListWrp, Type nKey ) const;
- /** Returns true, if the passed name list contains an entry for the passed key. */
- template< typename Type >
- bool HasName( const NameListWrapper& rList, Type nKey ) const;
-
-protected:
- inline explicit Config() {}
- void Construct( const Config& rParent );
- void Construct( const String& rFileName );
- void Construct( const sal_Char* pcEnvVar );
-
- virtual bool ImplIsValid() const;
- virtual const String* ImplGetOption( const String& rKey ) const;
- virtual NameListRef ImplGetNameList( const String& rListName ) const;
-
-private:
- typedef ScfRef< ConfigCoreData > ConfigCoreDataRef;
- ConfigCoreDataRef mxCoreData;
-};
-
-typedef ScfRef< Config > ConfigRef;
-
-// ----------------------------------------------------------------------------
-
-template< typename Type >
-Type Config::GetIntOption( const StringWrapper& rKey, Type nDefault ) const
-{
- sal_Int64 nRawData;
- const String* pData = ImplGetOption( rKey.GetString() );
- return (pData && StringHelper::ConvertStringToInt( nRawData, *pData )) ?
- static_cast< Type >( nRawData ) : nDefault;
-}
-
-template< typename ListType >
-ScfRef< ListType > Config::CreateNameList( const StringWrapper& rListName )
-{
- return mxCoreData->CreateNameList< ListType >( rListName.GetString() );
-}
-
-template< typename Type >
-String Config::GetName( const NameListWrapper& rListWrp, Type nKey ) const
-{
- NameListRef xList = rListWrp.GetNameList( *this );
- return xList.is() ? xList->GetName( *this, nKey ) : SCF_DUMP_ERR_NOMAP;
-}
-
-template< typename Type >
-bool Config::HasName( const NameListWrapper& rListWrp, Type nKey ) const
-{
- NameListRef xList = rListWrp.GetNameList( *this );
- return xList.is() && xList->HasName( nKey );
-}
-
-// ============================================================================
-// ============================================================================
-
-class CoreData : public Base
-{
-public:
- explicit CoreData( SfxMedium& rMedium, SfxObjectShell* pDocShell );
-
- inline SfxMedium& GetMedium() { return mrMedium; }
- inline SfxObjectShell* GetDocShell() { return mpDocShell; }
- SvStream& GetCoreStream();
-
-protected:
- virtual bool ImplIsValid() const;
-
-private:
- SfxMedium& mrMedium;
- SfxObjectShell* mpDocShell;
-};
-
-typedef ScfRef< CoreData > CoreDataRef;
-
-// ============================================================================
-// ============================================================================
-
-class Input : public Base
-{
-public:
- virtual sal_Size GetSize() const = 0;
- virtual sal_Size Tell() const = 0;
- virtual void Seek( sal_Size nPos ) = 0;
- virtual void SeekRel( sal_sSize nRelPos ) = 0;
- virtual sal_Size Read( void* pBuffer, sal_Size nSize ) = 0;
- virtual void ReadLine( String& rLine, rtl_TextEncoding eEnc ) = 0;
-
- virtual Input& operator>>( sal_Int8& rnData ) = 0;
- virtual Input& operator>>( sal_uInt8& rnData ) = 0;
- virtual Input& operator>>( sal_Int16& rnData ) = 0;
- virtual Input& operator>>( sal_uInt16& rnData ) = 0;
- virtual Input& operator>>( sal_Int32& rnData ) = 0;
- virtual Input& operator>>( sal_uInt32& rnData ) = 0;
- virtual Input& operator>>( float& rfData ) = 0;
- virtual Input& operator>>( double& rfData ) = 0;
-
- inline bool IsValidPos() const { return Tell() < GetSize(); }
- template< typename Type >
- inline Type ReadValue() { Type nValue; *this >> nValue; return nValue; }
-
-protected:
- virtual bool ImplIsValid() const;
-};
-
-typedef ScfRef< Input > InputRef;
-
-Input& operator>>( Input& rIn, sal_Int64& rnData );
-Input& operator>>( Input& rIn, sal_uInt64& rnData );
-
-// ============================================================================
-
-class SvStreamInput : public Input
-{
-public:
- explicit SvStreamInput( SvStream& rStrm );
- virtual ~SvStreamInput();
-
- virtual sal_Size GetSize() const;
- virtual sal_Size Tell() const;
- virtual void Seek( sal_Size nPos );
- virtual void SeekRel( sal_sSize nRelPos );
- virtual sal_Size Read( void* pBuffer, sal_Size nSize );
- virtual void ReadLine( String& rLine, rtl_TextEncoding eEnc );
-
- virtual SvStreamInput& operator>>( sal_Int8& rnData );
- virtual SvStreamInput& operator>>( sal_uInt8& rnData );
- virtual SvStreamInput& operator>>( sal_Int16& rnData );
- virtual SvStreamInput& operator>>( sal_uInt16& rnData );
- virtual SvStreamInput& operator>>( sal_Int32& rnData );
- virtual SvStreamInput& operator>>( sal_uInt32& rnData );
- virtual SvStreamInput& operator>>( float& rfData );
- virtual SvStreamInput& operator>>( double& rfData );
-
-private:
- SvStream& mrStrm;
-};
-
-// ============================================================================
-// ============================================================================
-
-class Output : public Base
-{
-public:
- explicit Output( SvStream& rStrm );
-
- // ------------------------------------------------------------------------
-
- void NewLine();
- void EmptyLine( size_t nCount = 1 );
- inline String& GetLine() { return maLine; }
-
- void SetPrefix( const String& rPrefix );
- inline const String& GetPrefix() const { return maPrefix; }
-
- void IncIndent();
- void DecIndent();
- void ResetIndent();
-
- void StartTable( xub_StrLen nW1 );
- void StartTable( xub_StrLen nW1, xub_StrLen nW2 );
- void StartTable( xub_StrLen nW1, xub_StrLen nW2, xub_StrLen nW3 );
- void StartTable( xub_StrLen nW1, xub_StrLen nW2, xub_StrLen nW3, xub_StrLen nW4 );
- void StartTable( size_t nColCount, const xub_StrLen* pnColWidths );
- void Tab();
- void Tab( size_t nCol );
- void EndTable();
-
- void ResetItemIndex( sal_Int64 nIdx = 0 );
- void StartItem( const sal_Char* pcName = 0 );
- void ContItem();
- void EndItem();
- inline const String& GetLastItemValue() const { return maLastItem; }
-
- void StartMultiItems();
- void EndMultiItems();
-
- // ------------------------------------------------------------------------
-
- void WriteChar( sal_Unicode cChar, xub_StrLen nCount = 1 );
- void WriteAscii( const sal_Char* pcStr );
- void WriteString( const String& rStr );
- void WriteArray( const sal_uInt8* pnData, sal_Size nSize, sal_Unicode cSep = ',' );
- void WriteBool( bool bData );
- void WriteColor( const Color& rColor );
- void WriteDateTime( const DateTime& rDateTime );
-
-
- template< typename Type >
- inline void WriteDec( Type nData, xub_StrLen nWidth = 0, sal_Unicode cFill = ' ' )
- { StringHelper::AppendDec( maLine, nData, nWidth, cFill ); }
- template< typename Type >
- inline void WriteHex( Type nData, bool bPrefix = true )
- { StringHelper::AppendHex( maLine, nData, bPrefix ); }
- template< typename Type >
- inline void WriteBin( Type nData, bool bDots = true )
- { StringHelper::AppendBin( maLine, nData, bDots ); }
- template< typename Type >
- inline void WriteFix( Type nData, xub_StrLen nWidth = 0 )
- { StringHelper::AppendFix( maLine, nData, nWidth ); }
- template< typename Type >
- inline void WriteValue( Type nData, FormatType eFmtType )
- { StringHelper::AppendValue( maLine, nData, eFmtType ); }
- template< typename Type >
- inline void WriteName( const Config& rCfg, Type nData, const NameListWrapper& rListWrp )
- { WriteString( rCfg.GetName( rListWrp, nData ) ); }
-
- // ------------------------------------------------------------------------
-protected:
- virtual bool ImplIsValid() const;
-
-private:
- void WriteItemName( const sal_Char* pcName );
-
-private:
- typedef ::std::vector< xub_StrLen > StringLenVec;
-
- SvStream& mrStrm;
- String maPrefix;
- ByteString maPrefixUtf8;
- ByteString maIndent;
- String maLine;
- String maLastItem;
- StringLenVec maColPos;
- size_t mnCol;
- size_t mnItemLevel;
- size_t mnMultiLevel;
- sal_Int64 mnItemIdx;
- xub_StrLen mnLastItem;
-};
-
-typedef ScfRef< Output > OutputRef;
-
-// ============================================================================
-
-class PrefixGuard : private ScfNoCopy
-{
-public:
- inline explicit PrefixGuard( Output& rOut, const String& rPrefix ) :
- mrOut( rOut ), maOldPrefix( rOut.GetPrefix() ) { mrOut.SetPrefix( rPrefix ); }
- inline ~PrefixGuard() { mrOut.SetPrefix( maOldPrefix ); }
-private:
- Output& mrOut;
- String maOldPrefix;
-};
-
-// ----------------------------------------------------------------------------
-
-class IndentGuard : private ScfNoCopy
-{
-public:
- inline explicit IndentGuard( Output& rOut ) : mrOut( rOut ) { mrOut.IncIndent(); }
- inline ~IndentGuard() { mrOut.DecIndent(); }
-private:
- Output& mrOut;
-};
-
-// ----------------------------------------------------------------------------
-
-class TableGuard : private ScfNoCopy
-{
-public:
- inline explicit TableGuard( Output& rOut, xub_StrLen nW1 ) :
- mrOut( rOut ) { mrOut.StartTable( nW1 ); }
- inline explicit TableGuard( Output& rOut, xub_StrLen nW1, xub_StrLen nW2 ) :
- mrOut( rOut ) { mrOut.StartTable( nW1, nW2 ); }
- inline explicit TableGuard( Output& rOut, xub_StrLen nW1, xub_StrLen nW2, xub_StrLen nW3 ) :
- mrOut( rOut ) { mrOut.StartTable( nW1, nW2, nW3 ); }
- inline explicit TableGuard( Output& rOut, xub_StrLen nW1, xub_StrLen nW2, xub_StrLen nW3, xub_StrLen nW4 ) :
- mrOut( rOut ) { mrOut.StartTable( nW1, nW2, nW3, nW4 ); }
- inline explicit TableGuard( Output& rOut, size_t nColCount,
- const xub_StrLen* pnColWidths ) :
- mrOut( rOut ) { mrOut.StartTable( nColCount, pnColWidths ); }
- inline ~TableGuard() { mrOut.EndTable(); }
- inline void Tab() { mrOut.Tab(); }
- inline void Tab( size_t nCol ) { mrOut.Tab( nCol ); }
-private:
- Output& mrOut;
-};
-
-// ----------------------------------------------------------------------------
-
-class ItemGuard : private ScfNoCopy
-{
-public:
- inline explicit ItemGuard( Output& rOut, const sal_Char* pcName = 0 ) :
- mrOut( rOut ) { mrOut.StartItem( pcName ); }
- inline ~ItemGuard() { mrOut.EndItem(); }
- inline void Cont() { mrOut.ContItem(); }
-private:
- Output& mrOut;
-};
-
-// ----------------------------------------------------------------------------
-
-class MultiItemsGuard : private ScfNoCopy
-{
-public:
- inline explicit MultiItemsGuard( Output& rOut ) : mrOut( rOut ) { mrOut.StartMultiItems(); }
- inline ~MultiItemsGuard() { mrOut.EndMultiItems(); }
-private:
- Output& mrOut;
-};
-
-// ============================================================================
-// ============================================================================
-
-class ObjectBase : public Base
-{
-public:
- virtual ~ObjectBase();
-
- SfxMedium& GetCoreMedium() const;
- SvStream& GetCoreStream() const;
-
- void Dump();
-
- // ------------------------------------------------------------------------
-protected:
- inline explicit ObjectBase() {}
- void Construct( ConfigRef xConfig, CoreDataRef xCore, OutputRef xOut );
- void Construct( const ObjectBase& rParent );
-
- virtual bool ImplIsValid() const;
- virtual ConfigRef ImplReconstructConfig();
- virtual OutputRef ImplReconstructOutput();
- virtual void ImplDumpHeader();
- virtual void ImplDumpBody();
- virtual void ImplDumpFooter();
-
- // ------------------------------------------------------------------------
-
- void ReconstructConfig();
- void ReconstructOutput();
-
- inline Config& Cfg() const { return *mxConfig; }
- inline CoreData& Core() const { return *mxCore; }
- inline Output& Out() const { return *mxOut; }
-
- // ------------------------------------------------------------------------
-
- void WriteEmptyItem( const sal_Char* pcName );
- void WriteInfoItem( const sal_Char* pcName, const StringWrapper& rData );
- void WriteStringItem( const sal_Char* pcName, const String& rData );
- void WriteArrayItem( const sal_Char* pcName, const sal_uInt8* pnData, sal_Size nSize, sal_Unicode cSep = ',' );
- void WriteBoolItem( const sal_Char* pcName, bool bData );
- void WriteColorItem( const sal_Char* pcName, const Color& rColor );
- void WriteDateTimeItem( const sal_Char* pcName, const DateTime& rDateTime );
- void WriteGuidItem( const sal_Char* pcName, const String& rGuid );
-
- template< typename Type >
- void AddNameToItem( Type nData, const NameListWrapper& rListWrp );
-
- template< typename Type >
- void WriteNameItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp );
- template< typename Type >
- void WriteDecItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type >
- void WriteHexItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type >
- void WriteBinItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type >
- void WriteFixItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type >
- void WriteDecBoolItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type >
- void WriteValueItem( const sal_Char* pcName, Type nData, FormatType eFmtType, const NameListWrapper& rListWrp = NO_LIST );
-
- template< typename Type >
- void WriteValueItem( const ItemFormat& rItemFmt, Type nData );
-
-private:
- ConfigRef mxConfig;
- CoreDataRef mxCore;
- OutputRef mxOut;
-};
-
-typedef ScfRef< ObjectBase > ObjectRef;
-
-// ----------------------------------------------------------------------------
-
-template< typename Type >
-void ObjectBase::AddNameToItem( Type nData, const NameListWrapper& rListWrp )
-{
- if( !rListWrp.Empty() )
- {
- mxOut->ContItem();
- mxOut->WriteName( *mxConfig, nData, rListWrp );
- }
-}
-
-template< typename Type >
-void ObjectBase::WriteNameItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp )
-{
- ItemGuard aItem( *mxOut, pcName );
- mxOut->WriteName( *mxConfig, nData, rListWrp );
-}
-
-template< typename Type >
-void ObjectBase::WriteDecItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp )
-{
- ItemGuard aItem( *mxOut, pcName );
- mxOut->WriteDec( nData );
- AddNameToItem( nData, rListWrp );
-}
-
-template< typename Type >
-void ObjectBase::WriteHexItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp )
-{
- ItemGuard aItem( *mxOut, pcName );
- mxOut->WriteHex( nData );
- AddNameToItem( nData, rListWrp );
-}
-
-template< typename Type >
-void ObjectBase::WriteBinItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp )
-{
- ItemGuard aItem( *mxOut, pcName );
- mxOut->WriteBin( nData );
- AddNameToItem( nData, rListWrp );
-}
-
-template< typename Type >
-void ObjectBase::WriteFixItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp )
-{
- ItemGuard aItem( *mxOut, pcName );
- mxOut->WriteFix( nData );
- AddNameToItem( nData, rListWrp );
-}
-
-template< typename Type >
-void ObjectBase::WriteDecBoolItem( const sal_Char* pcName, Type nData, const NameListWrapper& rListWrp )
-{
- ItemGuard aItem( *mxOut, pcName );
- mxOut->WriteDec( nData );
- aItem.Cont();
- mxOut->WriteBool( nData != 0 );
- AddNameToItem( nData, rListWrp );
-}
-
-template< typename Type >
-void ObjectBase::WriteValueItem( const sal_Char* pcName, Type nData, FormatType eFmtType, const NameListWrapper& rListWrp )
-{
- if( eFmtType == FORMATTYPE_BOOL )
- WriteDecBoolItem( pcName, nData, rListWrp );
- else
- {
- ItemGuard aItem( *mxOut, pcName );
- mxOut->WriteValue( nData, eFmtType );
- AddNameToItem( nData, rListWrp );
- }
-}
-
-template< typename Type >
-void ObjectBase::WriteValueItem( const ItemFormat& rItemFmt, Type nData )
-{
- WriteValueItem( rItemFmt.maItemNameUtf8.GetBuffer(),
- nData, rItemFmt.meFmtType, rItemFmt.maListName );
-}
-
-// ============================================================================
-
-class InputObjectBase : public ObjectBase
-{
-public:
- virtual ~InputObjectBase();
-
- // ------------------------------------------------------------------------
-protected:
- inline explicit InputObjectBase() {}
- void Construct( const ObjectBase& rParent, InputRef xIn );
- void Construct( const InputObjectBase& rParent );
-
- virtual bool ImplIsValid() const;
- virtual InputRef ImplReconstructInput();
- virtual void ImplDumpBody();
-
- // ------------------------------------------------------------------------
-
- void ReconstructInput();
-
- inline Input& In() const { return *mxIn; }
-
- // ------------------------------------------------------------------------
-
- void SkipBlock( sal_Size nSize, bool bShowSize = true );
- void DumpRawBinary( sal_Size nSize, bool bShowOffset = true, bool bStream = false );
-
- void DumpBinary( const sal_Char* pcName, sal_Size nSize, bool bShowOffset = true );
- void DumpArray( const sal_Char* pcName, sal_Size nSize, sal_Unicode cSep = ',' );
- void DumpRemaining( sal_Size nSize );
- inline void DumpUnused( sal_Size nSize ) { DumpArray( SCF_DUMP_UNUSED, nSize ); }
- inline void DumpUnknown( sal_Size nSize ) { DumpArray( SCF_DUMP_UNKNOWN, nSize ); }
-
- void DumpBinaryStream( bool bShowOffset = true );
- void DumpTextStream( rtl_TextEncoding eEnc, bool bShowLines = true );
-
- String DumpGuid( const sal_Char* pcName );
- void DumpItem( const ItemFormat& rItemFmt );
-
- template< typename Type >
- Type DumpName( const sal_Char* pcName, const NameListWrapper& rListWrp );
- template< typename Type >
- Type DumpDec( const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type >
- Type DumpHex( const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type >
- Type DumpBin( const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type >
- Type DumpFix( const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type >
- Type DumpBool( const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type >
- Type DumpValue( const ItemFormat& rItemFmt );
-
- template< typename Type1, typename Type2 >
- Type1 DumpName( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type1, typename Type2 >
- Type1 DumpDec( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type1, typename Type2 >
- Type1 DumpHex( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type1, typename Type2 >
- Type1 DumpBin( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type1, typename Type2 >
- Type1 DumpFix( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type1, typename Type2 >
- Type1 DumpBool( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp = NO_LIST );
- template< typename Type1, typename Type2 >
- Type1 DumpValue( bool bType1, const ItemFormat& rItemFmt );
-
- // ------------------------------------------------------------------------
-
- using ObjectBase::Construct;
-
-private:
- InputRef mxIn;
-};
-
-typedef ScfRef< InputObjectBase > InputObjectRef;
-
-// ----------------------------------------------------------------------------
-
-template< typename Type >
-Type InputObjectBase::DumpName( const sal_Char* pcName, const NameListWrapper& rListWrp )
-{
- Type nData;
- *mxIn >> nData;
- WriteNameItem( pcName, nData, rListWrp );
- return nData;
-}
-
-template< typename Type >
-Type InputObjectBase::DumpDec( const sal_Char* pcName, const NameListWrapper& rListWrp )
-{
- Type nData;
- *mxIn >> nData;
- WriteDecItem( pcName, nData, rListWrp );
- return nData;
-}
-
-template< typename Type >
-Type InputObjectBase::DumpHex( const sal_Char* pcName, const NameListWrapper& rListWrp )
-{
- Type nData;
- *mxIn >> nData;
- WriteHexItem( pcName, nData, rListWrp );
- return nData;
-}
-
-template< typename Type >
-Type InputObjectBase::DumpBin( const sal_Char* pcName, const NameListWrapper& rListWrp )
-{
- Type nData;
- *mxIn >> nData;
- WriteBinItem( pcName, nData, rListWrp );
- return nData;
-}
-
-template< typename Type >
-Type InputObjectBase::DumpFix( const sal_Char* pcName, const NameListWrapper& rListWrp )
-{
- Type nData;
- *mxIn >> nData;
- WriteFixItem( pcName, nData, rListWrp );
- return nData;
-}
-
-template< typename Type >
-Type InputObjectBase::DumpBool( const sal_Char* pcName, const NameListWrapper& rListWrp )
-{
- Type nData;
- *mxIn >> nData;
- WriteDecBoolItem( pcName, nData, rListWrp );
- return nData;
-}
-
-template< typename Type >
-Type InputObjectBase::DumpValue( const ItemFormat& rItemFmt )
-{
- Type nData;
- *mxIn >> nData;
- WriteValueItem( rItemFmt, nData );
- return nData;
-}
-
-template< typename Type1, typename Type2 >
-Type1 InputObjectBase::DumpName( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp )
-{
- return bType1 ? DumpName< Type1 >( pcName, rListWrp ) : static_cast< Type1 >( DumpName< Type2 >( pcName, rListWrp ) );
-}
-
-template< typename Type1, typename Type2 >
-Type1 InputObjectBase::DumpDec( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp )
-{
- return bType1 ? DumpDec< Type1 >( pcName, rListWrp ) : static_cast< Type1 >( DumpDec< Type2 >( pcName, rListWrp ) );
-}
-
-template< typename Type1, typename Type2 >
-Type1 InputObjectBase::DumpHex( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp )
-{
- return bType1 ? DumpHex< Type1 >( pcName, rListWrp ) : static_cast< Type1 >( DumpHex< Type2 >( pcName, rListWrp ) );
-}
-
-template< typename Type1, typename Type2 >
-Type1 InputObjectBase::DumpBin( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp )
-{
- return bType1 ? DumpBin< Type1 >( pcName, rListWrp ) : static_cast< Type1 >( DumpBin< Type2 >( pcName, rListWrp ) );
-}
-
-template< typename Type1, typename Type2 >
-Type1 InputObjectBase::DumpFix( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp )
-{
- return bType1 ? DumpFix< Type1 >( pcName, rListWrp ) : static_cast< Type1 >( DumpFix< Type2 >( pcName, rListWrp ) );
-}
-
-template< typename Type1, typename Type2 >
-Type1 InputObjectBase::DumpBool( bool bType1, const sal_Char* pcName, const NameListWrapper& rListWrp )
-{
- return bType1 ? DumpBool< Type1 >( pcName, rListWrp ) : static_cast< Type1 >( DumpBool< Type2 >( pcName, rListWrp ) );
-}
-
-template< typename Type1, typename Type2 >
-Type1 InputObjectBase::DumpValue( bool bType1, const ItemFormat& rItemFmt )
-{
- return bType1 ? DumpValue< Type1 >( rItemFmt ) : static_cast< Type1 >( DumpValue< Type2 >( rItemFmt ) );
-}
-
-// ============================================================================
-// ============================================================================
-
-class StreamObjectBase : public InputObjectBase
-{
-public:
- virtual ~StreamObjectBase();
-
- inline SvStream& GetStream() { return *mpStrm; }
- inline const String& GetStreamName() const { return maName; }
- inline const String& GetStreamPath() const { return maPath; }
- String GetFullName() const;
- sal_Size GetStreamSize() const;
-
-protected:
- inline explicit StreamObjectBase() : mpStrm( 0 ) {}
- void Construct( const ObjectBase& rParent, SvStream& rStrm,
- const String& rPath, const String& rStrmName, InputRef xIn );
- void Construct( const ObjectBase& rParent, SvStream& rStrm,
- const String& rPath, const String& rStrmName );
- void Construct( const ObjectBase& rParent, SvStream& rStrm );
-
- virtual bool ImplIsValid() const;
- virtual void ImplDumpHeader();
- virtual void ImplDumpFooter();
- virtual void ImplDumpExtendedHeader();
-
- using InputObjectBase::Construct;
-
-private:
- void DumpStreamInfo( bool bExtended );
-
-private:
- SvStream* mpStrm;
- String maPath;
- String maName;
-};
-
-typedef ScfRef< StreamObjectBase > StreamObjectRef;
-
-// ============================================================================
-
-class SvStreamObject : public StreamObjectBase
-{
-public:
- explicit SvStreamObject( const ObjectBase& rParent, SvStream& rStrm );
- virtual ~SvStreamObject();
-
-protected:
- inline explicit SvStreamObject() {}
- void Construct( const ObjectBase& rParent, SvStream& rStrm );
-
- using StreamObjectBase::Construct;
-};
-
-typedef ScfRef< SvStreamObject > SvStreamObjectRef;
-
-// ============================================================================
-
-class WrappedStreamObject : public StreamObjectBase
-{
-public:
- explicit WrappedStreamObject( const ObjectBase& rParent, StreamObjectRef xStrmObj );
- virtual ~WrappedStreamObject();
-
-protected:
- inline explicit WrappedStreamObject() {}
- void Construct( const ObjectBase& rParent, StreamObjectRef xStrmObj );
-
- virtual bool ImplIsValid() const;
-
- using StreamObjectBase::Construct;
-
-private:
- StreamObjectRef mxStrmObj;
-};
-
-// ============================================================================
-// ============================================================================
-
-struct RecordHeaderConfigInfo
-{
- const sal_Char* mpcRecNames;
- const sal_Char* mpcShowRecPos;
- const sal_Char* mpcShowRecSize;
- const sal_Char* mpcShowRecId;
- const sal_Char* mpcShowRecName;
- const sal_Char* mpcShowRecBody;
-};
-
-// ----------------------------------------------------------------------------
-
-class RecordHeaderBase : public InputObjectBase
-{
-public:
- virtual ~RecordHeaderBase();
-
- inline NameListRef GetRecNames() const { return mxRecNames; }
- inline bool IsShowRecPos() const { return mbShowRecPos; }
- inline bool IsShowRecSize() const { return mbShowRecSize; }
- inline bool IsShowRecId() const { return mbShowRecId; }
- inline bool IsShowRecName() const { return mbShowRecName; }
- inline bool IsShowRecBody() const { return mbShowRecBody; }
-
-protected:
- inline explicit RecordHeaderBase() {}
- void Construct( const InputObjectBase& rParent, const RecordHeaderConfigInfo& rCfgInfo );
-
- virtual bool ImplIsValid() const;
-
- using InputObjectBase::Construct;
-
-private:
- NameListRef mxRecNames;
- bool mbShowRecPos;
- bool mbShowRecSize;
- bool mbShowRecId;
- bool mbShowRecName;
- bool mbShowRecBody;
-};
-
-// ============================================================================
-// ============================================================================
-
-class DumperBase : public ObjectBase
-{
-public:
- virtual ~DumperBase();
-
- bool IsImportEnabled() const;
-
-protected:
- inline explicit DumperBase() {}
- void Construct( ConfigRef xConfig, CoreDataRef xCore );
- void Construct( ConfigRef xConfig, SfxMedium& rMedium, SfxObjectShell* pDocShell );
-
- using ObjectBase::Construct;
-
-private:
- typedef ScfRef< SvStream > SvStreamRef;
- SvStreamRef mxOutStrm;
-};
-
-// ============================================================================
-// ============================================================================
-
-} // namespace dump
-} // namespace scf
-
-#endif
-#endif
-
diff --git a/sc/source/filter/inc/fdumperole.hxx b/sc/source/filter/inc/fdumperole.hxx
deleted file mode 100644
index ad6d1b0dedd9..000000000000
--- a/sc/source/filter/inc/fdumperole.hxx
+++ /dev/null
@@ -1,186 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: fdumperole.hxx,v $
- * $Revision: 1.7 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#ifndef SC_FDUMPEROLE_HXX
-#define SC_FDUMPEROLE_HXX
-
-#include <sot/storage.hxx>
-#include <sot/storinfo.hxx>
-#include "fdumper.hxx"
-
-#if SCF_INCL_DUMPER
-
-namespace scf {
-namespace dump {
-
-// ============================================================================
-// ============================================================================
-
-class OleStorageObject : public ObjectBase
-{
-public:
- explicit OleStorageObject( const OleStorageObject& rParentStrg, const String& rStrgName );
- explicit OleStorageObject( const ObjectBase& rParent, SotStorageRef xRootStrg );
- explicit OleStorageObject( const ObjectBase& rParent, SvStream& rRootStrm );
- explicit OleStorageObject( const ObjectBase& rParent );
- virtual ~OleStorageObject();
-
- inline SotStorageRef GetStorage() const { return mxStrg; }
- inline const String& GetStoragePath() const { return maPath; }
- inline const String& GetStorageName() const { return maName; }
- String GetFullName() const;
-
- void ExtractStorageToFileSystem();
-
-protected:
- inline explicit OleStorageObject() {}
- void Construct( const ObjectBase& rParent, SotStorageRef xStrg, const String& rPath );
- void Construct( const OleStorageObject& rParentStrg, const String& rStrgName );
- void Construct( const ObjectBase& rParent, SvStream& rRootStrm );
- void Construct( const ObjectBase& rParent );
-
- virtual bool ImplIsValid() const;
- virtual void ImplDumpHeader();
- virtual void ImplDumpFooter();
-
- using ObjectBase::Construct;
-
-private:
- void DumpStorageInfo( bool bExtended );
-
-private:
- SotStorageRef mxStrg;
- String maPath;
- String maName;
-};
-
-typedef ScfRef< OleStorageObject > OleStorageObjectRef;
-
-// ============================================================================
-
-class OleStorageIterator : public Base
-{
-public:
- explicit OleStorageIterator( const OleStorageObject& rStrg );
- explicit OleStorageIterator( SotStorageRef xStrg );
- ~OleStorageIterator();
-
- ULONG GetSize() const;
-
- OleStorageIterator& operator++();
- const SvStorageInfo* operator->() const;
-
-protected:
- void Construct( SotStorageRef xStrg );
-
-private:
- virtual bool ImplIsValid() const;
-
-private:
- typedef ScfRef< SvStorageInfoList > SvStorageInfoListRef;
- SvStorageInfoListRef mxInfoList;
- ULONG mnIndex;
-};
-
-// ============================================================================
-// ============================================================================
-
-class OleStreamObject : public StreamObjectBase
-{
-public:
- explicit OleStreamObject( const OleStorageObject& rParentStrg, const String& rStrmName );
- virtual ~OleStreamObject();
-
-protected:
- inline explicit OleStreamObject() {}
- void Construct( const OleStorageObject& rParentStrg, const String& rStrmName );
-
- virtual bool ImplIsValid() const;
-
- using StreamObjectBase::Construct;
-
-private:
- SotStorageStreamRef mxStrm;
-};
-
-typedef ScfRef< OleStreamObject > OleStreamObjectRef;
-
-// ============================================================================
-
-class OlePropertyStreamObject : public OleStreamObject
-{
-public:
- explicit OlePropertyStreamObject( const OleStorageObject& rParentStrg, const String& rStrmName );
-
-protected:
- inline explicit OlePropertyStreamObject() {}
- void Construct( const OleStorageObject& rParentStrg, const String& rStrmName );
-
- virtual void ImplDumpBody();
-
- using OleStreamObject::Construct;
-
-private:
- void DumpSection( const String& rGuid, sal_uInt32 nStartPos );
-
- void DumpProperty( sal_Int32 nPropId, sal_uInt32 nStartPos );
- void DumpCodePageProperty( sal_uInt32 nStartPos );
- void DumpDictionaryProperty( sal_uInt32 nStartPos );
-
- void DumpPropertyContents( sal_Int32 nPropId );
- void DumpPropertyValue( sal_Int32 nPropId, sal_Int32 nBaseType );
-
- sal_Int32 DumpPropertyType();
- void DumpBlob( const sal_Char* pcName );
- String DumpString8( const sal_Char* pcName );
- String DumpCharArray8( const sal_Char* pcName, sal_Int32 nCharCount );
- String DumpString16( const sal_Char* pcName );
- String DumpCharArray16( const sal_Char* pcName, sal_Int32 nCharCount );
- DateTime DumpFileTime( const sal_Char* pcName );
-
- bool StartElement( sal_uInt32 nStartPos );
- void WriteSectionHeader( const String& rGuid, sal_uInt32 nStartPos );
- void WritePropertyHeader( sal_Int32 nPropId, sal_uInt32 nStartPos );
-
-private:
- NameListRef mxPropIds;
- rtl_TextEncoding meTextEnc;
- bool mbIsUnicode;
-};
-
-// ============================================================================
-// ============================================================================
-
-} // namespace dump
-} // namespace scf
-
-#endif
-#endif
-
diff --git a/sc/source/filter/inc/imp_op.hxx b/sc/source/filter/inc/imp_op.hxx
index f8dad9a45c48..ab5513ead1ed 100644
--- a/sc/source/filter/inc/imp_op.hxx
+++ b/sc/source/filter/inc/imp_op.hxx
@@ -119,6 +119,8 @@ protected:
// Abschneiden von Zellen fuehrt
// Record-Funktionen
+ void ReadFileSharing();
+
sal_uInt16 ReadXFIndex( bool bBiff2 );
void ReadDimensions();
diff --git a/sc/source/filter/inc/xestream.hxx b/sc/source/filter/inc/xestream.hxx
index 676b0d550875..857d756e2133 100644
--- a/sc/source/filter/inc/xestream.hxx
+++ b/sc/source/filter/inc/xestream.hxx
@@ -211,9 +211,6 @@ private:
bool mbInRec; /// true = currently writing inside of a record.
};
-// ----------------------------------------------------------------------------
-
-
// ============================================================================
class XclExpBiff8Encrypter
@@ -336,7 +333,6 @@ public:
// only needed for import; ignore
virtual bool importDocument() throw();
- virtual sal_Int32 getSchemeClr( sal_Int32 nColorSchemeToken ) const;
virtual oox::vml::Drawing* getVmlDrawing();
virtual const oox::drawingml::Theme* getCurrentTheme() const;
virtual const oox::drawingml::table::TableStyleListPtr getTableStyles();
diff --git a/sc/source/filter/inc/xiroot.hxx b/sc/source/filter/inc/xiroot.hxx
index 915f9610a1f3..f331683988ab 100644
--- a/sc/source/filter/inc/xiroot.hxx
+++ b/sc/source/filter/inc/xiroot.hxx
@@ -117,9 +117,6 @@ struct XclImpRootData : public XclRootData
XclImpTabProtectRef mxTabProtect; /// Sheet protection options for current sheet.
XclImpDocProtectRef mxDocProtect; /// Document protection options.
- String maPassw; /// Entered password for stream decryption.
- bool mbPassQueried; /// true = Password already querried.
-
bool mbHasCodePage; /// true = CODEPAGE record exists.
explicit XclImpRootData( XclBiff eBiff, SfxMedium& rMedium,
@@ -205,9 +202,6 @@ public:
/** Returns the Calc add-in function name for an Excel function name. */
String GetScAddInName( const String& rXclName ) const;
- /** Queries a password from the user and returns it (empty string -> input cancelled). */
- const String& QueryPassword() const;
-
private:
mutable XclImpRootData& mrImpData; /// Reference to the global import data struct.
};
diff --git a/sc/source/filter/inc/xistream.hxx b/sc/source/filter/inc/xistream.hxx
index ccaaccdc0357..3ee461f163fe 100644
--- a/sc/source/filter/inc/xistream.hxx
+++ b/sc/source/filter/inc/xistream.hxx
@@ -31,6 +31,7 @@
#ifndef SC_XISTREAM_HXX
#define SC_XISTREAM_HXX
+#include <comphelper/docpasswordhelper.hxx>
#include <svx/mscodec.hxx>
#include "xlstream.hxx"
#include "xlconst.hxx"
@@ -52,7 +53,7 @@ class XclImpDecrypter;
typedef ScfRef< XclImpDecrypter > XclImpDecrypterRef;
/** Base class for BIFF stream decryption. */
-class XclImpDecrypter
+class XclImpDecrypter : public ::comphelper::IDocPasswordVerifier
{
public:
explicit XclImpDecrypter();
@@ -60,40 +61,39 @@ public:
/** Returns the current error code of the decrypter. */
inline ErrCode GetError() const { return mnError; }
- /** Returns true, if the decrypter has been constructed successfully.
- This means especially that construction happened with a valid password. */
+ /** Returns true, if the decoder has been initialized correctly. */
inline bool IsValid() const { return mnError == ERRCODE_NONE; }
/** Creates a (ref-counted) copy of this decrypter object. */
XclImpDecrypterRef Clone() const;
+ /** Implementation of the ::comphelper::IDocPasswordVerifier interface,
+ calls the new virtual function implVerify(). */
+ virtual ::comphelper::DocPasswordVerifierResult
+ verifyPassword( const ::rtl::OUString& rPassword );
+
/** Updates the decrypter on start of a new record or after seeking stream. */
void Update( SvStream& rStrm, sal_uInt16 nRecSize );
/** Reads and decrypts nBytes bytes and stores data into the existing(!) buffer pData.
@return Count of bytes really read. */
sal_uInt16 Read( SvStream& rStrm, void* pData, sal_uInt16 nBytes );
- const String GetPassword() const;
-
protected:
/** Protected copy c'tor for OnClone(). */
explicit XclImpDecrypter( const XclImpDecrypter& rSrc );
- /** Sets the decrypter to a state showing whether the password was correct. */
- void SetHasValidPassword( bool bValid );
-
- void SetPassword( const String& rPass );
-
private:
/** Implementation of cloning this object. */
virtual XclImpDecrypter* OnClone() const = 0;
+ /** Derived classes implement password verification and initialization of
+ the decoder. */
+ virtual bool OnVerify( const ::rtl::OUString& rPassword ) = 0;
/** Implementation of updating the decrypter. */
virtual void OnUpdate( sal_Size nOldStrmPos, sal_Size nNewStrmPos, sal_uInt16 nRecSize ) = 0;
/** Implementation of the decryption. */
virtual sal_uInt16 OnRead( SvStream& rStrm, sal_uInt8* pnData, sal_uInt16 nBytes ) = 0;
private:
- String maPass; /// Stored password (needed for export)
ErrCode mnError; /// Decrypter error code.
sal_Size mnOldPos; /// Last known stream position.
sal_uInt16 mnRecSize; /// Current record size.
@@ -105,12 +105,7 @@ private:
class XclImpBiff5Decrypter : public XclImpDecrypter
{
public:
- /** Constructs the decrypter.
- @descr Checks if the passed key and hash specify workbook protection.
- Asks for a password otherwise.
- @param nKey Password key from FILEPASS record to verify password.
- @param nHash Password hash value from FILEPASS record to verify password. */
- explicit XclImpBiff5Decrypter( const XclImpRoot& rRoot, sal_uInt16 nKey, sal_uInt16 nHash );
+ explicit XclImpBiff5Decrypter( sal_uInt16 nKey, sal_uInt16 nHash );
private:
/** Private copy c'tor for OnClone(). */
@@ -118,18 +113,18 @@ private:
/** Implementation of cloning this object. */
virtual XclImpBiff5Decrypter* OnClone() const;
+ /** Implements password verification and initialization of the decoder. */
+ virtual bool OnVerify( const ::rtl::OUString& rPassword );
/** Implementation of updating the decrypter. */
virtual void OnUpdate( sal_Size nOldStrmPos, sal_Size nNewStrmPos, sal_uInt16 nRecSize );
/** Implementation of the decryption. */
virtual sal_uInt16 OnRead( SvStream& rStrm, sal_uInt8* pnData, sal_uInt16 nBytes );
- /** Initializes the members.
- @postcond Internal status is set and can be querried with IsValid(). */
- void Init( const ByteString& rPass, sal_uInt16 nKey, sal_uInt16 nHash );
-
private:
::svx::MSCodec_XorXLS95 maCodec; /// Crypto algorithm implementation.
- sal_uInt8 mpnPassw[ 16 ]; /// Cached password data for copy construction.
+ ::std::vector< sal_uInt8 > maPassword;
+ sal_uInt16 mnKey;
+ sal_uInt16 mnHash;
};
// ----------------------------------------------------------------------------
@@ -138,14 +133,8 @@ private:
class XclImpBiff8Decrypter : public XclImpDecrypter
{
public:
- /** Constructs the decrypter.
- @descr Checks if the passed salt data specifies workbook protection.
- Asks for a password otherwise.
- @param pnDocId Unique document identifier from FILEPASS record.
- @param pnSaltData Salt data from FILEPASS record.
- @param pnSaltHash Salt hash value from FILEPASS record. */
- explicit XclImpBiff8Decrypter( const XclImpRoot& rRoot, sal_uInt8 pnDocId[ 16 ],
- sal_uInt8 pnSaltData[ 16 ], sal_uInt8 pnSaltHash[ 16 ] );
+ explicit XclImpBiff8Decrypter( sal_uInt8 pnSalt[ 16 ],
+ sal_uInt8 pnVerifier[ 16 ], sal_uInt8 pnVerifierHash[ 16 ] );
private:
/** Private copy c'tor for OnClone(). */
@@ -153,16 +142,13 @@ private:
/** Implementation of cloning this object. */
virtual XclImpBiff8Decrypter* OnClone() const;
+ /** Implements password verification and initialization of the decoder. */
+ virtual bool OnVerify( const ::rtl::OUString& rPassword );
/** Implementation of updating the decrypter. */
virtual void OnUpdate( sal_Size nOldStrmPos, sal_Size nNewStrmPos, sal_uInt16 nRecSize );
/** Implementation of the decryption. */
virtual sal_uInt16 OnRead( SvStream& rStrm, sal_uInt8* pnData, sal_uInt16 nBytes );
- /** Initializes the internal codec.
- @postcond Internal status is set and can be querried with IsValid(). */
- void Init( const String& rPass, sal_uInt8 pnDocId[ 16 ],
- sal_uInt8 pnSaltData[ 16 ], sal_uInt8 pnSaltHash[ 16 ] );
-
/** Returns the block number corresponding to the passed stream position. */
sal_uInt32 GetBlock( sal_Size nStrmPos ) const;
/** Returns the block offset corresponding to the passed stream position. */
@@ -170,8 +156,10 @@ private:
private:
::svx::MSCodec_Std97 maCodec; /// Crypto algorithm implementation.
- sal_uInt16 mpnPassw[ 16 ]; /// Cached password data for copy construction.
- sal_uInt8 mpnDocId[ 16 ]; /// Cached document ID for copy construction.
+ ::std::vector< sal_uInt16 > maPassword;
+ ::std::vector< sal_uInt8 > maSalt;
+ ::std::vector< sal_uInt8 > maVerifier;
+ ::std::vector< sal_uInt8 > maVerifierHash;
};
// ============================================================================
diff --git a/sc/source/filter/inc/xistyle.hxx b/sc/source/filter/inc/xistyle.hxx
index fe43aa75c331..2fe3a6ecbc15 100644
--- a/sc/source/filter/inc/xistyle.hxx
+++ b/sc/source/filter/inc/xistyle.hxx
@@ -397,15 +397,13 @@ public:
/** Reads an XF record. */
void ReadXF( XclImpStream& rStrm );
- /** Sets the style name of this XF, if it is a style XF.
- @descr Additionally creates this user-defined style in the Calc document. */
- void SetStyleName( const String& rStyleName );
- /** Sets the style name of this XF from a built-in Excel style, if it is a style XF.
- @descr Does not create the style in the Calc document. This is done on demand
- in CreatePattern(), if the style is really used. */
- void SetBuiltInStyleName( sal_uInt8 nStyleId, sal_uInt8 nLevel );
-
+ /** Sets the style name of this XF, if it is a style XF. */
+ void SetStyleName( const String& rStyleName, bool bBuiltIn, bool bForceCreate );
+ /** Changes the style name of this XF, if it is a style XF. */
+ void ChangeStyleName( const String& rStyleName );
+ /** Returns the style name of this XF, if it is a style XF. */
inline const String& GetStyleName() const { return maStyleName; }
+
inline sal_uInt8 GetHorAlign() const { return maAlignment.mnHorAlign; }
inline sal_uInt8 GetVerAlign() const { return maAlignment.mnVerAlign; }
inline sal_uInt16 GetFontIndex() const { return mnXclFont; }
@@ -501,7 +499,15 @@ public:
SCTAB nScTab, const XclImpXFIndex& rXFIndex );
private:
+ void CalcStyleName( XclImpXF& rXF, const String& rStyleName, bool bBuiltIn );
+ void CalcStyleName( XclImpXF& rXF, sal_uInt8 nStyleId, sal_uInt8 nLevel );
+ void SetStyleName( XclImpXF& rXF, const String& rStyleName, bool bBuiltIn, bool bForceCreate );
+
+private:
+ typedef ::std::map< String, XclImpXF* > XclImpStyleXFMap;
+
ScfDelList< XclImpXF > maXFList; /// List of contents of all XF record.
+ XclImpStyleXFMap maStyleXFs; /// Maps style names to style XF records.
};
// Buffer for XF indexes in cells =============================================
diff --git a/sc/source/filter/inc/xlcontent.hxx b/sc/source/filter/inc/xlcontent.hxx
index 32803987f5c4..6c86e0be68b7 100644
--- a/sc/source/filter/inc/xlcontent.hxx
+++ b/sc/source/filter/inc/xlcontent.hxx
@@ -35,6 +35,10 @@
// Constants ==================================================================
+// (0x005B) FILESHARING -------------------------------------------------------
+
+const sal_uInt16 EXC_ID_FILESHARING = 0x005B;
+
// (0x00E5) MERGEDCELLS -------------------------------------------------------
const sal_uInt16 EXC_ID_MERGEDCELLS = 0x00E5;
diff --git a/sc/source/filter/inc/xldumper.hxx b/sc/source/filter/inc/xldumper.hxx
deleted file mode 100644
index b35482955f71..000000000000
--- a/sc/source/filter/inc/xldumper.hxx
+++ /dev/null
@@ -1,683 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: xldumper.hxx,v $
- * $Revision: 1.12 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#ifndef SC_XLDUMPER_HXX
-#define SC_XLDUMPER_HXX
-
-#include "fdumper.hxx"
-
-#include <stack>
-#include "fdumperdff.hxx"
-#include "fdumperole.hxx"
-#include "xlconst.hxx"
-#include "xlstring.hxx"
-#include "xlstyle.hxx"
-
-#if SCF_INCL_DUMPER
-
-class SfxMedium;
-class SfxObjectShell;
-class ScDocument;
-struct XclImpRootData;
-class XclImpRoot;
-class XclImpStream;
-class XclFunctionProvider;
-
-namespace scf {
-namespace dump {
-namespace xls {
-
-// ============================================================================
-// ============================================================================
-
-struct Address
-{
- sal_Int32 mnCol;
- sal_Int32 mnRow;
- inline explicit Address() : mnCol( 0 ), mnRow( 0 ) {}
- void Read( XclImpStream& rStrm, bool bCol16Bit = true, bool bRow32Bit = false );
-};
-
-// ----------------------------------------------------------------------------
-
-struct Range
-{
- Address maFirst;
- Address maLast;
- inline explicit Range() {}
- void Read( XclImpStream& rStrm, bool bCol16Bit = true, bool bRow32Bit = false );
-};
-
-// ----------------------------------------------------------------------------
-
-struct RangeList : public ::std::vector< Range >
-{
- inline explicit RangeList() {}
- void Read( XclImpStream& rStrm, bool bCol16Bit = true, bool bRow32Bit = false );
-};
-
-// ============================================================================
-
-struct FormulaAddress : public Address
-{
- bool mbRelCol;
- bool mbRelRow;
- inline explicit FormulaAddress() : mbRelCol( false ), mbRelRow( false ) {}
-};
-
-// ----------------------------------------------------------------------------
-
-struct FormulaRange
-{
- FormulaAddress maFirst;
- FormulaAddress maLast;
- inline explicit FormulaRange() {}
-};
-
-// ============================================================================
-
-class StringHelper : public ::scf::dump::StringHelper
-{
-public:
- static void AppendAddrCol( String& rStr, sal_Int32 nCol, bool bRel );
- static void AppendAddrRow( String& rStr, sal_Int32 nRow, bool bRel );
- static void AppendAddrName( String& rStr, sal_Unicode cPrefix, sal_Int32 nColRow, bool bRel );
-
- static void AppendAddress( String& rStr, const Address& rPos );
- static void AppendRange( String& rStr, const Range& rRange );
- static void AppendRangeList( String& rStr, const RangeList& rRanges );
-
- static void AppendAddress( String& rStr, const FormulaAddress& rPos, bool bNameMode );
- static void AppendRange( String& rStr, const FormulaRange& rRange, bool bNameMode );
-};
-
-// ============================================================================
-// ============================================================================
-
-class RecordHeaderObject : public RecordHeaderBase
-{
-public:
- explicit RecordHeaderObject( const InputObjectBase& rParent );
-
- inline bool IsMergeContRec() const { return mbMergeContRec; }
- inline bool HasRecName( sal_uInt16 nRecId ) const { return GetRecNames()->HasName( nRecId ); }
-
- void DumpRecordHeader( XclImpStream& rStrm );
-
-protected:
- virtual bool ImplIsValid() const;
-
-private:
- bool mbMergeContRec;
-};
-
-typedef ScfRef< RecordHeaderObject > RecHeaderObjectRef;
-
-// ============================================================================
-// ============================================================================
-
-class BiffConfig : public Config
-{
-public:
- explicit BiffConfig( const Config& rParent, XclBiff eBiff );
-
-protected:
- virtual bool ImplIsValid() const;
- virtual NameListRef ImplGetNameList( const String& rKey ) const;
-
-private:
- XclBiff meBiff;
-};
-
-typedef ScfRef< BiffConfig > BiffConfigRef;
-
-// ============================================================================
-
-class RootData : public Base
-{
-public:
- explicit RootData( SfxMedium& rMedium, XclBiff eBiff );
- virtual ~RootData();
-
- inline const XclImpRoot& GetRoot() const { return *mxRoot; }
-
- rtl_TextEncoding GetTextEncoding() const;
- void SetTextEncoding( rtl_TextEncoding eTextEnc );
-
-protected:
- virtual bool ImplIsValid() const;
-
-private:
- typedef ScfRef< ScDocument > ScDocumentRef;
- typedef ScfRef< XclImpRootData > XclImpRootDataRef;
- typedef ScfRef< XclImpRoot > XclImpRootRef;
-
- ScDocumentRef mxDoc;
- XclImpRootDataRef mxRootData;
- XclImpRootRef mxRoot;
-};
-
-typedef ScfRef< RootData > RootDataRef;
-
-// ============================================================================
-
-class RootObjectBase : public WrappedStreamObject
-{
-public:
- virtual ~RootObjectBase();
-
- inline RootData& Root() const { return *mxRootData; }
- inline const XclImpRoot& GetXclRoot() const { return mxRootData->GetRoot(); }
- inline XclImpStream& GetXclStream() const { return *mxStrm; }
- inline XclBiff GetBiff() const { return meBiff; }
-
-protected:
- explicit RootObjectBase();
- void Construct( const ObjectBase& rParent, SvStream& rStrm, XclBiff eBiff );
- void Construct( const OleStorageObject& rParentStrg, const String& rStrmName, XclBiff eBiff );
- void Construct( const RootObjectBase& rParent );
-
- virtual bool ImplIsValid() const;
- virtual void ImplDumpExtendedHeader();
- virtual ConfigRef ImplReconstructConfig();
- virtual InputRef ImplReconstructInput();
-
- String GetErrorName( sal_uInt8 nErrCode ) const;
-
- // ------------------------------------------------------------------------
-
- double WriteRkItem( const sal_Char* pcName, sal_Int32 nRk );
- void WriteBooleanItem( const sal_Char* pcName, sal_uInt8 nBool );
- void WriteErrorCodeItem( const sal_Char* pcName, sal_uInt8 nErrCode );
-
- void WriteColIndexItem( const sal_Char* pcName, sal_Int32 nCol );
- void WriteColRangeItem( const sal_Char* pcName, sal_Int32 nCol1, sal_Int32 nCol2 );
- void WriteRowIndexItem( const sal_Char* pcName, sal_Int32 nRow );
- void WriteRowRangeItem( const sal_Char* pcName, sal_Int32 nRow1, sal_Int32 nRow2 );
-
- void WriteAddressItem( const sal_Char* pcName, const Address& rPos );
- void WriteRangeItem( const sal_Char* pcName, const Range& rRange );
- void WriteRangeListItem( const sal_Char* pcName, const RangeList& rRanges );
-
- template< typename Type >
- void WriteRectItem( const sal_Char* pcName,
- Type nLeft, Type nTop, Type nWidth, Type nHeight,
- const NameListWrapper& rListWrp = NO_LIST,
- FormatType eFmtType = FORMATTYPE_DEC );
-
- // ------------------------------------------------------------------------
-
- String DumpString( const sal_Char* pcName = 0, XclStrFlags nFlags = EXC_STR_DEFAULT );
- double DumpRk( const sal_Char* pcName = 0 );
- sal_uInt8 DumpBoolean( const sal_Char* pcName = 0 );
- sal_uInt8 DumpErrorCode( const sal_Char* pcName = 0 );
-
- Color DumpRgbColor( const sal_Char* pcName = 0 );
- rtl_TextEncoding DumpCodePage( const sal_Char* pcName = 0 );
- void DumpFormulaResult( const sal_Char* pcName = 0 );
-
- sal_Int32 DumpColIndex( const sal_Char* pcName = 0, bool bCol16Bit = true );
- sal_Int32 DumpColRange( const sal_Char* pcName = 0, bool bCol16Bit = true );
- sal_Int32 DumpRowIndex( const sal_Char* pcName = 0, bool bRow32Bit = false );
- sal_Int32 DumpRowRange( const sal_Char* pcName = 0, bool bRow32Bit = false );
-
- Address DumpAddress( const sal_Char* pcName = 0, bool bCol16Bit = true, bool bRow32Bit = false );
- Range DumpRange( const sal_Char* pcName = 0, bool bCol16Bit = true, bool bRow32Bit = false );
- void DumpRangeList( const sal_Char* pcName = 0, bool bCol16Bit = true, bool bRow32Bit = false );
-
- void DumpConstArrayHeader( sal_uInt32& rnCols, sal_uInt32& rnRows );
- String DumpConstValue();
-
- template< typename Type >
- void DumpRect( const sal_Char* pcName,
- const NameListWrapper& rListWrp = NO_LIST,
- FormatType eFmtType = FORMATTYPE_DEC );
-
- // ------------------------------------------------------------------------
-
- using WrappedStreamObject::Construct;
-
-private:
- void ConstructRootObjBase( XclBiff eBiff );
-
-private:
- typedef ScfRef< XclImpStream > XclImpStreamRef;
-
- RootDataRef mxRootData;
- BiffConfigRef mxBiffCfg;
- XclImpStreamRef mxStrm;
- XclBiff meBiff;
- NameListRef mxBoolean;
- NameListRef mxErrCodes;
- NameListRef mxConstType;
- NameListRef mxResultType;
-};
-
-// ----------------------------------------------------------------------------
-
-template< typename Type >
-void RootObjectBase::WriteRectItem( const sal_Char* pcName,
- Type nLeft, Type nTop, Type nWidth, Type nHeight,
- const NameListWrapper& rListWrp, FormatType eFmtType )
-{
- MultiItemsGuard aMultiGuard( Out() );
- WriteEmptyItem( pcName );
- WriteValueItem( "x-pos", nLeft, eFmtType, rListWrp );
- WriteValueItem( "y-pos", nTop, eFmtType, rListWrp );
- WriteValueItem( "x-size", nWidth, eFmtType, rListWrp );
- WriteValueItem( "y-size", nHeight, eFmtType, rListWrp );
-}
-
-template< typename Type >
-void RootObjectBase::DumpRect( const sal_Char* pcName,
- const NameListWrapper& rListWrp, FormatType eFmtType )
-{
- Type nLeft, nTop, nWidth, nHeight;
- *mxStrm >> nLeft >> nTop >> nWidth >> nHeight;
- WriteRectItem( pcName, nLeft, nTop, nWidth, nHeight, rListWrp, eFmtType );
-}
-
-// ============================================================================
-// ============================================================================
-
-class SimpleObjectBase : public RootObjectBase
-{
-public:
- virtual ~SimpleObjectBase();
-
-protected:
- inline explicit SimpleObjectBase() {}
- void Construct( const RootObjectBase& rParent );
-
- virtual void ImplDumpHeader();
- virtual void ImplDumpFooter();
-
- using RootObjectBase::Construct;
-};
-
-// ============================================================================
-// ============================================================================
-
-/** Stack to create a human readable formula string from a UPN token array. */
-class FormulaStack
-{
-public:
- explicit FormulaStack();
-
- inline const String& GetFormulaString() const { return GetString( maFmlaStack ); }
- inline const String& GetClassesString() const { return GetString( maClassStack ); }
-
- void PushOperand( const StringWrapper& rOp, const String& rTokClass );
- void PushOperand( const StringWrapper& rOp );
- void PushUnaryOp( const StringWrapper& rLOp, const StringWrapper& rROp );
- void PushBinaryOp( const StringWrapper& rOp );
- void PushFuncOp( const StringWrapper& rFunc, const String& rTokClass, sal_uInt8 nParamCount );
-
- inline void SetError() { mbError = true; }
- void ReplaceOnTop( const String& rOld, const String& rNew );
-
-private:
- typedef ::std::stack< String > StringStack;
-
- inline bool Check( bool bCond ) { return (mbError |= !bCond) == false; }
-
- const String& GetString( const StringStack& rStack ) const;
- void PushUnaryOp( StringStack& rStack, const String& rLOp, const String& rROp );
- void PushBinaryOp( StringStack& rStack, const String& rOp );
- void PushFuncOp( StringStack& rStack, const String& rOp, sal_uInt8 nParamCount );
-
-private:
- StringStack maFmlaStack;
- StringStack maClassStack;
- bool mbError;
-};
-
-// ============================================================================
-
-class FormulaObject : public SimpleObjectBase
-{
-public:
- explicit FormulaObject( const RootObjectBase& rParent );
- virtual ~FormulaObject();
-
- sal_uInt16 ReadFormulaSize();
- sal_uInt16 DumpFormulaSize( const sal_Char* pcName = 0 );
-
- void DumpCellFormula( const sal_Char* pcName, sal_uInt16 nSize );
- void DumpCellFormula( const sal_Char* pcName = 0 );
- void DumpNameFormula( const sal_Char* pcName, sal_uInt16 nSize );
- void DumpNameFormula( const sal_Char* pcName = 0 );
-
-protected:
- virtual void ImplDumpHeader();
- virtual void ImplDumpBody();
-
-private:
- void ConstructFmlaObj();
-
- void DumpFormula( const sal_Char* pcName, sal_uInt16 nSize, bool bNameMode );
- void DumpFormula( const sal_Char* pcName, bool bNameMode );
-
- FormulaAddress CreateTokenAddress( sal_uInt16 nCol, sal_uInt16 nRow, bool bRelC, bool bRelR, bool bNameMode ) const;
- String CreateFunc( sal_uInt16 nFuncIdx ) const;
- String CreateRef( const String& rData ) const;
- String CreateName( sal_uInt16 nNameIdx ) const;
- String CreatePlaceHolder( size_t nIdx ) const;
- String CreatePlaceHolder() const;
-
- void WriteTokenAddressItem( const sal_Char* pcName, const FormulaAddress& rPos, bool bNameMode );
- void WriteTokenAddress3dItem( const sal_Char* pcName, const String& rRef, const FormulaAddress& rPos, bool bNameMode );
- void WriteTokenRangeItem( const sal_Char* pcName, const FormulaRange& rRange, bool bNameMode );
- void WriteTokenRange3dItem( const sal_Char* pcName, const String& rRef, const FormulaRange& rRange, bool bNameMode );
-
- sal_uInt16 DumpTokenFuncIdx();
- sal_uInt16 DumpTokenCol( const sal_Char* pcName, bool& rbRelC, bool& rbRelR );
- sal_uInt16 DumpTokenRow( const sal_Char* pcName, bool& rbRelC, bool& rbRelR );
- FormulaAddress DumpTokenAddress( bool bNameMode );
- FormulaRange DumpTokenRange( bool bNameMode );
- String DumpTokenRefIdx();
- void DumpTokenRefTabIdxs();
-
- void DumpIntToken();
- void DumpDoubleToken();
- void DumpStringToken();
- void DumpBoolToken();
- void DumpErrorToken();
- void DumpMissArgToken();
-
- void DumpArrayToken( const String& rTokClass );
- void DumpNameToken( const String& rTokClass );
- void DumpNameXToken( const String& rTokClass );
- void DumpRefToken( const String& rTokClass, bool bNameMode );
- void DumpAreaToken( const String& rTokClass, bool bNameMode );
- void DumpRefErrToken( const String& rTokClass, bool bArea );
- void DumpRef3dToken( const String& rTokClass, bool bNameMode );
- void DumpArea3dToken( const String& rTokClass, bool bNameMode );
- void DumpRefErr3dToken( const String& rTokClass, bool bArea );
- void DumpMemFuncToken( const String& rTokClass );
- void DumpMemAreaToken( const String& rTokClass, bool bAddData );
-
- void DumpExpToken( const StringWrapper& rName );
- void DumpUnaryOpToken( const StringWrapper& rLOp, const StringWrapper& rROp );
- void DumpBinaryOpToken( const StringWrapper& rOp );
- void DumpFuncToken( const String& rTokClass );
- void DumpFuncVarToken( const String& rTokClass );
- void DumpCmdToken( const String& rTokClass );
-
- void DumpSheetToken();
- void DumpEndSheetToken();
- bool DumpAttrToken();
-
- bool DumpNlrToken();
- void DumpNlrErrToken();
- void DumpNlrColRowToken( const String& rTokClass, bool bAddData );
- void DumpNlrRangeToken( const String& rTokClass, bool bAddData );
- void DumpNlrRangeErrToken();
-
- void DumpAddTokenData();
- void DumpAddDataNlr( size_t nIdx );
- void DumpAddDataArray( size_t nIdx );
- void DumpAddDataMemArea( size_t nIdx );
-
-private:
- enum AddDataType { ADDDATA_NLR, ADDDATA_ARRAY, ADDDATA_MEMAREA };
-
- typedef ScfRef< FormulaStack > FormulaStackRef;
- typedef ScfRef< XclFunctionProvider > XclFuncProvRef;
- typedef ::std::vector< AddDataType > AddDataTypeVec;
-
- NameListRef mxTokens;
- NameListRef mxClasses;
- NameListRef mxFuncNames;
- NameListRef mxParamCnt;
- NameListRef mxRelFlags;
- NameListRef mxNlrTypes;
- NameListRef mxAttrTypes;
- NameListRef mxSpTypes;
-
- FormulaStackRef mxStack;
- XclFuncProvRef mxFuncProv;
- AddDataTypeVec maAddData;
- String maRefPrefix;
- const sal_Char* mpcName;
- sal_uInt16 mnSize;
- bool mbNameMode;
-};
-
-typedef ScfRef< FormulaObject > FormulaObjectRef;
-
-// ============================================================================
-// ============================================================================
-
-class RecordStreamObject : public RootObjectBase
-{
-public:
- explicit RecordStreamObject( const ObjectBase& rParent, SvStream& rStrm, XclBiff eBiff = EXC_BIFF_UNKNOWN );
- explicit RecordStreamObject( const OleStorageObject& rParentStrg, const String& rStrmName, XclBiff eBiff = EXC_BIFF_UNKNOWN );
- virtual ~RecordStreamObject();
-
-protected:
- inline explicit RecordStreamObject() {}
- void Construct( const ObjectBase& rParent, SvStream& rStrm, XclBiff eBiff );
- void Construct( const OleStorageObject& rParentStrg, const String& rStrmName, XclBiff eBiff );
-
- virtual bool ImplIsValid() const;
- virtual void ImplDumpBody();
-
- virtual void ImplPreProcessRecord();
- virtual void ImplDumpRecord();
- virtual void ImplPostProcessRecord();
-
- inline RecordHeaderObject& GetRecordHeader() const { return *mxHdrObj; }
- inline FormulaObject& GetFormulaDumper() const { return *mxFmlaObj; }
- inline DffDumpObject& GetDffDumper() const { return *mxDffObj; }
-
- void DumpRepeatedRecordId();
-
- using RootObjectBase::Construct;
-
-private:
- void ConstructRecStrmObj();
-
- void DumpRecordBody();
- void DumpSimpleRecord( const String& rRecData );
-
-private:
- String maProgressName;
- RecHeaderObjectRef mxHdrObj;
- FormulaObjectRef mxFmlaObj;
- DffDumpObjectRef mxDffObj;
- NameListRef mxSimpleRecs;
-};
-
-// ============================================================================
-
-class WorkbookStreamObject : public RecordStreamObject
-{
-public:
- explicit WorkbookStreamObject( const ObjectBase& rParent, SvStream& rStrm );
- explicit WorkbookStreamObject( const OleStorageObject& rParentStrg, const String& rStrmName );
- virtual ~WorkbookStreamObject();
-
-protected:
- virtual void ImplPreProcessRecord();
- virtual void ImplDumpRecord();
- virtual void ImplPostProcessRecord();
-
-private:
- void ConstructWbStrmObj();
-
- const XclFontData* GetFontData( sal_uInt16 nFontIdx ) const;
- sal_uInt16 GetXfData( sal_uInt16 nXfIdx ) const;
- rtl_TextEncoding GetFontEncoding( sal_uInt16 nXfIdx ) const;
- String CreateFontName( const XclFontData& rFontData ) const;
-
- template< typename Type >
- Type DumpPatternIdx( const sal_Char* pcName = 0 );
- template< typename Type >
- Type DumpColorIdx( const sal_Char* pcName = 0 );
-
- sal_uInt16 DumpFontIdx( const sal_Char* pcName = 0 );
- sal_uInt16 DumpFormatIdx( const sal_Char* pcName = 0 );
- sal_uInt16 DumpXfIdx( const sal_Char* pcName = 0, bool bBiff2Style = false );
-
- sal_uInt16 DumpCellHeader( bool bBiff2Style = false );
- void DumpBoolErr();
-
- void DumpFontRec();
- void DumpFormatRec();
- void DumpXfRec();
-
- void DumpObjRec();
- void DumpObjRec5();
- void DumpObjRec8();
-
-private:
- typedef ::std::vector< XclFontData > XclFontDataVec;
-
- NameListRef mxColors;
- NameListRef mxBorderStyles;
- NameListRef mxFillPatterns;
- NameListRef mxFontNames;
- NameListRef mxFormats;
- XclFontDataVec maFontDatas;
- ScfUInt16Vec maXfDatas;
- sal_uInt16 mnFormatIdx;
- sal_uInt16 mnPTRowFields;
- sal_uInt16 mnPTColFields;
- sal_uInt16 mnPTSxliIdx;
- bool mbHasCodePage;
-};
-
-// ----------------------------------------------------------------------------
-
-template< typename Type >
-Type WorkbookStreamObject::DumpPatternIdx( const sal_Char* pcName )
-{
- return DumpDec< Type >( pcName ? pcName : "fill-pattern", mxFillPatterns );
-}
-
-template< typename Type >
-Type WorkbookStreamObject::DumpColorIdx( const sal_Char* pcName )
-{
- return DumpDec< Type >( pcName ? pcName : "color-idx", mxColors );
-}
-
-// ============================================================================
-
-class PivotCacheStreamObject : public RecordStreamObject
-{
-public:
- explicit PivotCacheStreamObject( const ObjectBase& rParent, SvStream& rStrm );
- explicit PivotCacheStreamObject( const OleStorageObject& rParentStrg, const String& rStrmName );
- virtual ~PivotCacheStreamObject();
-
-protected:
- virtual void ImplDumpRecord();
-};
-
-// ============================================================================
-
-class VbaProjectStreamObject : public OleStreamObject
-{
-public:
- explicit VbaProjectStreamObject( const OleStorageObject& rParentStrg );
-
-protected:
- virtual void ImplDumpBody();
-};
-
-// ============================================================================
-// ============================================================================
-
-class PivotCacheStorageObject : public OleStorageObject
-{
-public:
- explicit PivotCacheStorageObject( const OleStorageObject& rParentStrg );
-
-protected:
- virtual void ImplDumpBody();
-};
-
-// ============================================================================
-
-class VbaProjectStorageObject : public OleStorageObject
-{
-public:
- explicit VbaProjectStorageObject( const OleStorageObject& rParentStrg );
-
-protected:
- virtual void ImplDumpBody();
-};
-
-// ============================================================================
-
-class VbaStorageObject : public OleStorageObject
-{
-public:
- explicit VbaStorageObject( const OleStorageObject& rParentStrg );
-
-protected:
- virtual void ImplDumpBody();
-};
-
-// ============================================================================
-
-class RootStorageObject : public OleStorageObject
-{
-public:
- explicit RootStorageObject( const ObjectBase& rParent );
-
-protected:
- virtual void ImplDumpBody();
-};
-
-// ============================================================================
-// ============================================================================
-
-class Dumper : public DumperBase
-{
-public:
- explicit Dumper( SfxMedium& rMedium, SfxObjectShell* pDocShell );
-
-protected:
- virtual void ImplDumpBody();
-};
-
-// ============================================================================
-// ============================================================================
-
-} // namespace xls
-} // namespace dump
-} // namespace scf
-
-#endif
-#endif
-
diff --git a/sc/source/filter/inc/xlformula.hxx b/sc/source/filter/inc/xlformula.hxx
index ef9274bc0338..aed77452b311 100644
--- a/sc/source/filter/inc/xlformula.hxx
+++ b/sc/source/filter/inc/xlformula.hxx
@@ -32,8 +32,8 @@
#define SC_XLFORMULA_HXX
#include <map>
+#include <formula/opcode.hxx>
#include "address.hxx"
-#include "formula/opcode.hxx"
#include "ftools.hxx"
// Constants ==================================================================
@@ -43,18 +43,11 @@ const size_t EXC_TOKARR_MAXLEN = 4096; /// Maximum size of a to
// Token class flags ----------------------------------------------------------
const sal_uInt8 EXC_TOKCLASS_MASK = 0x60;
-const sal_uInt8 EXC_TOKCLASS_INOP_FLAG = 0x80; /// Used in operators (internal flag).
-
const sal_uInt8 EXC_TOKCLASS_NONE = 0x00; /// 00-1F: Base tokens.
const sal_uInt8 EXC_TOKCLASS_REF = 0x20; /// 20-3F: Reference class tokens.
const sal_uInt8 EXC_TOKCLASS_VAL = 0x40; /// 40-5F: Value class tokens.
const sal_uInt8 EXC_TOKCLASS_ARR = 0x60; /// 60-7F: Array class tokens.
-const sal_uInt8 EXC_TOKCLASS_ANY_IN_REFOP = EXC_TOKCLASS_INOP_FLAG | EXC_TOKCLASS_NONE;
-const sal_uInt8 EXC_TOKCLASS_REF_IN_VALOP = EXC_TOKCLASS_INOP_FLAG | EXC_TOKCLASS_REF;
-const sal_uInt8 EXC_TOKCLASS_VAL_IN_VALOP = EXC_TOKCLASS_INOP_FLAG | EXC_TOKCLASS_VAL;
-const sal_uInt8 EXC_TOKCLASS_ARR_IN_VALOP = EXC_TOKCLASS_INOP_FLAG | EXC_TOKCLASS_ARR;
-
// Base tokens ----------------------------------------------------------------
const sal_uInt8 EXC_TOKID_MASK = 0x1F;
@@ -183,15 +176,120 @@ enum XclFormulaType
EXC_FMLATYPE_LISTVAL /// List (cell range) validation.
};
+// Function parameter info ====================================================
+
+/** Enumerates validity modes for a function parameter. */
+enum XclFuncParamValidity
+{
+ EXC_PARAM_NONE = 0, /// Default for an unspecified entry in a C-array.
+ EXC_PARAM_REGULAR, /// Parameter supported by Calc and Excel.
+ EXC_PARAM_CALCONLY, /// Parameter supported by Calc only.
+ EXC_PARAM_EXCELONLY /// Parameter supported by Excel only.
+};
+
+/** Enumerates different types of token class conversion in function parameters. */
+enum XclFuncParamConv
+{
+ EXC_PARAMCONV_ORG, /// Use original class of current token.
+ EXC_PARAMCONV_VAL, /// Convert tokens to VAL class.
+ EXC_PARAMCONV_ARR, /// Convert tokens to ARR class.
+ EXC_PARAMCONV_RPT, /// Repeat parent conversion in VALTYPE parameters.
+ EXC_PARAMCONV_RPX, /// Repeat parent conversion in REFTYPE parameters.
+ EXC_PARAMCONV_RPO /// Repeat parent conversion in operands of operators.
+};
+
+/** Structure that contains all needed information for a parameter in a
+ function.
+
+ The member meValid specifies which application supports the parameter. If
+ set to CALCONLY, import filters have to insert a default value for this
+ parameter, and export filters have to skip the parameter. If set to
+ EXCELONLY, import filters have to skip the parameter, and export filters
+ have to insert a default value for this parameter.
+
+ The member mbValType specifies whether the parameter requires tokens to be
+ of value type (VAL or ARR class).
+
+ If set to false, the parameter is called to be REFTYPE. Tokens with REF
+ default class can be inserted for the parameter (e.g. tAreaR tokens).
+
+ If set to true, the parameter is called to be VALTYPE. Tokens with REF
+ class need to be converted to VAL tokens first (e.g. tAreaR will be
+ converted to tAreaV), and further conversion is done according to this
+ new token class.
+
+ The member meConv specifies how to convert the current token class of the
+ token inserted for the parameter. If the token class is still REF this
+ means that the token has default REF class and the parameter is REFTYPE
+ (see member mbValType), the token will not be converted at all and remains
+ in REF class. Otherwise, token class conversion is depending on the actual
+ token class of the return value of the function containing this parameter.
+ The function may return REF class (tFuncR, tFuncVarR, tFuncCER), or it may
+ return VAL or ARR class (tFuncV, tFuncA, tFuncVarV, tFuncVarA, tFuncCEV,
+ tFuncCEA). Even if the function is able to return REF class, it may return
+ VAL or ARR class instead due to the VALTYPE data type of the parent
+ function parameter that calls the own function. Example: The INDIRECT
+ function returns REF class by default. But if called from a VALTYPE
+ function parameter, e.g. in the formula =ABS(INDIRECT("A1")), it returns
+ VAL or ARR class instead. Additionally, the repeating conversion types RPT
+ and RPX rely on the conversion executed for the function token class.
+
+ 1) ORG:
+ Use the original class of the token (VAL or ARR), regardless of any
+ conversion done for the function return class.
+
+ 2) VAL:
+ Convert ARR tokens to VAL class, regardless of any conversion done for
+ the function return class.
+
+ 3) ARR:
+ Convert VAL tokens to ARR class, regardless of any conversion done for
+ the function return class.
+
+ 4) RPT:
+ If the own function returns REF class (thus it is called from a REFTYPE
+ parameter, see above), and the parent conversion type (for the function
+ return class) was ORG, VAL, or ARR, ignore that conversion and always
+ use VAL conversion for the own token instead. If the parent conversion
+ type was RPT or RPX, repeat the conversion that would have been used if
+ the function would return value type.
+ If the own function returns value type (VAL or ARR class, see above),
+ and the parent conversion type (for the function return class) was ORG,
+ VAL, ARR, or RPT, repeat this conversion for the own token. If the
+ parent conversion type was RPX, always use ORG conversion type for the
+ own token instead.
+
+ 5) RPX:
+ This type of conversion only occurs in functions returning VAL class by
+ default. If the own token is value type, and the VAL return class of
+ the own function has been changed to ARR class (due to direct ARR
+ conversion, or due to ARR conversion repeated by RPT or RPX), set the
+ own token to ARR type. Otherwise use the original token type (VAL
+ conversion from parent parameter will not be repeated at all). If
+ nested functions have RPT or value-type RPX parameters, they will not
+ repeat this conversion type, but will use ORG conversion instead (see
+ description of RPT above).
+
+ 6) RPO:
+ This type of conversion is only used for the operands of all operators
+ (unary and binary arithmetic operators, comparison operators, and range
+ operators). It is not used for function parameters. On conversion, it
+ will be replaced by the last conversion type that was not the RPO
+ conversion. This leads to a slightly different behaviour than the RPT
+ conversion for operands in conjunction with a parent RPX conversion.
+ */
+struct XclFuncParamInfo
+{
+ XclFuncParamValidity meValid; /// Parameter validity.
+ XclFuncParamConv meConv; /// Token class conversion type.
+ bool mbValType; /// Data type (false = REFTYPE, true = VALTYPE).
+};
+
// Function data ==============================================================
const sal_uInt8 EXC_FUNC_MAXPARAM = 30; /// Maximum parameter count.
-const sal_uInt8 EXC_FUNC_PAR_CALCONLY = 0xFD; /// Placeholder for a parameter existing in Calc, but not in Excel.
-const sal_uInt8 EXC_FUNC_PAR_EXCELONLY = 0xFE; /// Placeholder for a parameter existing in Excel, but not in Calc.
-const sal_uInt8 EXC_FUNC_PAR_INVALID = 0xFF; /// Placeholder for an invalid token class.
-
-const sal_uInt8 EXC_FUNCINFO_CLASSCOUNT = 5; /// Number of token class entries.
+const size_t EXC_FUNCINFO_PARAMINFO_COUNT = 5; /// Number of parameter info entries.
const sal_uInt8 EXC_FUNCFLAG_VOLATILE = 0x01; /// Result is volatile (e.g. NOW() function).
const sal_uInt8 EXC_FUNCFLAG_IMPORTONLY = 0x02; /// Only used in import filter.
@@ -207,14 +305,11 @@ const sal_uInt16 EXC_FUNCID_EXTERNCALL = 255;
/** Represents information for a spreadsheet function for import and export.
- The member mpnParamClass contains an array of token classes for each
- parameter of the function. The last existing (non-null) value in this array
- is used for all following parameters used in a function. Additionally to
- the three actual token classes, this array may contain the special values
- EXC_FUNC_PAR_CALCONLY, EXC_FUNC_PAR_EXCELONLY, and EXC_FUNC_PAR_INVALID.
- The former two specify parameters only existing in one of the applications.
- EXC_FUNC_PAR_INVALID is simply a terminator for the array to prevent that
- the last token class or special value is repeated for additional parameters.
+ The member mpParamInfos points to an array of type information structures
+ for all parameters of the function. The last initialized structure
+ describing a regular parameter (member meValid == EXC_PARAMVALID_ALWAYS) in
+ this array is used repeatedly for all following parameters supported by a
+ function.
*/
struct XclFunctionInfo
{
@@ -223,12 +318,14 @@ struct XclFunctionInfo
sal_uInt8 mnMinParamCount; /// Minimum number of parameters.
sal_uInt8 mnMaxParamCount; /// Maximum number of parameters.
sal_uInt8 mnRetClass; /// Token class of the return value.
- sal_uInt8 mpnParamClass[ EXC_FUNCINFO_CLASSCOUNT ]; /// Expected token classes of parameters.
- sal_uInt8 mnFlags; /// Additional flags.
+ XclFuncParamInfo mpParamInfos[ EXC_FUNCINFO_PARAMINFO_COUNT ]; /// Information for all parameters.
+ sal_uInt8 mnFlags; /// Additional flags (EXC_FUNCFLAG_* constants).
const sal_Char* mpcMacroName; /// Function name, if simulated by a macro call (UTF-8).
/** Returns true, if the function is volatile. */
inline bool IsVolatile() const { return ::get_flag( mnFlags, EXC_FUNCFLAG_VOLATILE ); }
+ /** Returns true, if the function parameter count is fixed. */
+ inline bool IsFixedParamCount() const { return (mnXclFunc != EXC_FUNCID_EXTERNCALL) && (mnMinParamCount == mnMaxParamCount); }
/** Returns true, if the function is simulated by a macro call. */
inline bool IsMacroFunc() const { return mpcMacroName != 0; }
/** Returns the name of the external function as string. */
@@ -278,8 +375,9 @@ public:
/** Creates an empty token array. */
explicit XclTokenArray( bool bVolatile = false );
/** Creates a token array, swaps passed token vector into own data. */
- explicit XclTokenArray( ScfUInt8Vec& rTokVec, bool bVolatile = false,
- ScfUInt8Vec* pExtensionTokens = NULL);
+ explicit XclTokenArray( ScfUInt8Vec& rTokVec, bool bVolatile = false );
+ /** Creates a token array, swaps passed token vectors into own data. */
+ explicit XclTokenArray( ScfUInt8Vec& rTokVec, ScfUInt8Vec& rExtDataVec, bool bVolatile = false );
/** Returns true, if the token array is empty. */
inline bool Empty() const { return maTokVec.empty(); }
@@ -309,7 +407,7 @@ public:
private:
ScfUInt8Vec maTokVec; /// Byte vector containing token data.
- ScfUInt8Vec maExtensions; /// Byte vector of extensions (eg inline arrays)
+ ScfUInt8Vec maExtDataVec; /// Byte vector containing extended data (arrays, stacked NLRs).
bool mbVolatile; /// True = Formula contains volatile function.
};
@@ -326,10 +424,7 @@ XclExpStream& operator<<( XclExpStream& rStrm, const XclTokenArrayRef& rxTokArr
// ----------------------------------------------------------------------------
-namespace formula
-{
- class FormulaToken;
-}
+namespace formula { class FormulaToken; }
class ScTokenArray;
/** Special token array iterator for the Excel filters.
@@ -347,7 +442,7 @@ class XclTokenArrayIterator
public:
explicit XclTokenArrayIterator();
explicit XclTokenArrayIterator( const ScTokenArray& rScTokArr, bool bSkipSpaces );
- /** Copy constructor that allowa to change the skip-spaces mode. */
+ /** Copy constructor that allows to change the skip-spaces mode. */
explicit XclTokenArrayIterator( const XclTokenArrayIterator& rTokArrIt, bool bSkipSpaces );
void Init();
@@ -355,9 +450,9 @@ public:
inline bool Is() const { return mppScToken != 0; }
inline bool operator!() const { return !Is(); }
- inline const formula::FormulaToken* Get() const { return mppScToken ? *mppScToken : 0; }
- inline const formula::FormulaToken* operator->() const { return Get(); }
- inline const formula::FormulaToken& operator*() const { return *Get(); }
+ inline const ::formula::FormulaToken* Get() const { return mppScToken ? *mppScToken : 0; }
+ inline const ::formula::FormulaToken* operator->() const { return Get(); }
+ inline const ::formula::FormulaToken& operator*() const { return *Get(); }
XclTokenArrayIterator& operator++();
@@ -366,9 +461,9 @@ private:
void SkipSpaces();
private:
- const formula::FormulaToken*const* mppScTokenBeg; /// Pointer to first token pointer of token array.
- const formula::FormulaToken*const* mppScTokenEnd; /// Pointer behind last token pointer of token array.
- const formula::FormulaToken*const* mppScToken; /// Pointer to current token pointer of token array.
+ const ::formula::FormulaToken*const* mppScTokenBeg; /// Pointer to first token pointer of token array.
+ const ::formula::FormulaToken*const* mppScTokenEnd; /// Pointer behind last token pointer of token array.
+ const ::formula::FormulaToken*const* mppScToken; /// Pointer to current token pointer of token array.
bool mbSkipSpaces; /// true = Skip whitespace tokens.
};
@@ -407,14 +502,14 @@ public:
/** Returns the token class of the passed token ID. */
inline static sal_uInt8 GetTokenClass( sal_uInt8 nTokenId ) { return nTokenId & EXC_TOKCLASS_MASK; }
/** Changes the token class in the passed classified token ID. */
- inline static void ChangeTokenClass( sal_uInt8& rnTokenId, sal_uInt8 nTokenClass );
+ inline static void ChangeTokenClass( sal_uInt8& rnTokenId, sal_uInt8 nTokenClass );
// strings and string lists -----------------------------------------------
/** Tries to extract a string from the passed token.
@param rString (out-parameter) The string contained in the token.
@return true = Passed token is a string token, rString parameter is valid. */
- static bool GetTokenString( String& rString, const formula::FormulaToken& rScToken );
+ static bool GetTokenString( String& rString, const ::formula::FormulaToken& rScToken );
/** Parses the passed formula and tries to find a single string token, i.e. "abc".
@param rString (out-parameter) The string contained in the formula.
diff --git a/sc/source/filter/inc/xlroot.hxx b/sc/source/filter/inc/xlroot.hxx
index 36056ead2fe2..8571dafcbc74 100644
--- a/sc/source/filter/inc/xlroot.hxx
+++ b/sc/source/filter/inc/xlroot.hxx
@@ -36,6 +36,8 @@
#include "xlconst.hxx"
#include "xltools.hxx"
+namespace comphelper { class IDocPasswordVerifier; }
+
// Forward declarations of objects in public use ==============================
class DateTime;
@@ -92,6 +94,7 @@ struct XclRootData
ScDocument& mrDoc; /// The source or destination document.
String maDocUrl; /// Document URL of imported/exported file.
String maBasePath; /// Base path of imported/exported file (path of maDocUrl).
+ const String maDefPassword; /// The default password used for stream encryption.
rtl_TextEncoding meTextEnc; /// Text encoding to import/export byte strings.
LanguageType meSysLang; /// System language.
LanguageType meDocLang; /// Document language (import: from file, export: from system).
@@ -183,6 +186,11 @@ public:
/** Returns the base path of the imported/exported file. */
inline const String& GetBasePath() const { return mrData.maBasePath; }
+ /** Returns the default password used for stream encryption. */
+ inline const String& GetDefaultPassword() const { return mrData.maDefPassword; }
+ /** Requests and verifies a password from the medium or the user. */
+ String RequestPassword( ::comphelper::IDocPasswordVerifier& rVerifier ) const;
+
/** Returns the OLE2 root storage of the imported/exported file.
@return Pointer to root storage or 0, if the file is a simple stream. */
inline SotStorageRef GetRootStorage() const { return mrData.mxRootStrg; }
diff --git a/sc/source/filter/inc/xlstream.hxx b/sc/source/filter/inc/xlstream.hxx
index ffdd74d5f218..603a4cfab3fc 100644
--- a/sc/source/filter/inc/xlstream.hxx
+++ b/sc/source/filter/inc/xlstream.hxx
@@ -50,19 +50,6 @@ const sal_uInt16 EXC_ENCR_BLOCKSIZE = 1024;
const sal_uInt16 EXC_ID_UNKNOWN = SAL_MAX_UINT16;
const sal_uInt16 EXC_ID_CONT = 0x003C;
-// Encryption/decryption ======================================================
-
-/** Helper class for BIFF stream en-/decryption. */
-class XclCryptoHelper : ScfNoInstance
-{
-public:
- /** Returns the fixed password for workbook protection. */
- static const ByteString GetBiff5WbProtPassword();
-
- /** Returns the fixed password for workbook protection. */
- static const String GetBiff8WbProtPassword();
-};
-
// ============================================================================
#endif
diff --git a/sc/source/filter/inc/xlstyle.hxx b/sc/source/filter/inc/xlstyle.hxx
index 9d02f0720efc..ebb22c2cb05f 100644
--- a/sc/source/filter/inc/xlstyle.hxx
+++ b/sc/source/filter/inc/xlstyle.hxx
@@ -242,6 +242,12 @@ const sal_uInt8 EXC_STYLE_USERDEF = 0xFF; /// No built-in styl
const sal_uInt8 EXC_STYLE_LEVELCOUNT = 7; /// Number of outline level styles.
const sal_uInt8 EXC_STYLE_NOLEVEL = 0xFF; /// Default value for unused level.
+// (0x0892) STYLEEXT ----------------------------------------------------------
+
+const sal_uInt16 EXC_ID_STYLEEXT = 0x0892;
+
+const sal_uInt8 EXC_STYLEEXT_BUILTIN = 0x01;
+
// Structs and classes ========================================================
// Color data =================================================================
diff --git a/sc/source/filter/inc/xltools.hxx b/sc/source/filter/inc/xltools.hxx
index 459a5c9b3a78..d818fa9e0a89 100644
--- a/sc/source/filter/inc/xltools.hxx
+++ b/sc/source/filter/inc/xltools.hxx
@@ -197,6 +197,8 @@ public:
@param nLevel The zero-based outline level for RowLevel and ColLevel styles.
@return The style name or an empty string, if the parameters are not valid. */
static String GetBuiltInStyleName( sal_uInt8 nStyleId, sal_uInt8 nLevel );
+ /** Returns the passed style name with a special built-in prefix. */
+ static String GetBuiltInStyleName( const String& rStyleName );
/** Returns true, if the passed string is a name of an Excel built-in style.
@param pnStyleId If not 0, the found style identifier will be returned here.
@param pnNextChar If not 0, the index of the char after the evaluated substring will be returned here. */
@@ -230,8 +232,10 @@ public:
// ------------------------------------------------------------------------
private:
static const String maDefNamePrefix; /// Prefix for built-in defined names.
- static const String maStyleNamePrefix; /// Prefix for built-in cell style names.
- static const String maCFStyleNamePrefix; /// Prefix for cond. formatting style names.
+ static const String maStyleNamePrefix1; /// Prefix for built-in cell style names.
+ static const String maStyleNamePrefix2; /// Prefix for built-in cell style names from OOX filter.
+ static const String maCFStyleNamePrefix1; /// Prefix for cond. formatting style names.
+ static const String maCFStyleNamePrefix2; /// Prefix for cond. formatting style names from OOX filter.
};
// read/write colors ----------------------------------------------------------
diff --git a/sc/source/filter/xml/XMLDDELinksContext.cxx b/sc/source/filter/xml/XMLDDELinksContext.cxx
index c0872ae07668..ce77178500bb 100644
--- a/sc/source/filter/xml/XMLDDELinksContext.cxx
+++ b/sc/source/filter/xml/XMLDDELinksContext.cxx
@@ -163,9 +163,20 @@ void ScXMLDDELinkContext::EndElement()
{
if (nPosition > -1 && nColumns && nRows && GetScImport().GetDocument())
{
+ bool bSizeMatch = (static_cast<size_t>(nColumns * nRows) == aDDELinkTable.size());
+ DBG_ASSERT( bSizeMatch, "ScXMLDDELinkContext::EndElement: matrix dimension doesn't match cells count");
+ // Excel writes bad ODF in that it does not write the
+ // table:number-columns-repeated attribute of the
+ // <table:table-column> element, but apparently uses the number of
+ // <table:table-cell> elements within a <table:table-row> element to
+ // determine the column count instead. Be lenient ...
+ if (!bSizeMatch && nColumns == 1)
+ {
+ nColumns = aDDELinkTable.size() / nRows;
+ DBG_ASSERT( static_cast<size_t>(nColumns * nRows) == aDDELinkTable.size(),
+ "ScXMLDDELinkContext::EndElement: adapted matrix dimension doesn't match either");
+ }
ScMatrixRef pMatrix = new ScMatrix( static_cast<SCSIZE>(nColumns), static_cast<SCSIZE>(nRows) );
-
- DBG_ASSERT(static_cast<sal_uInt32>(nColumns * nRows) == aDDELinkTable.size(), "there is a wrong cells count");
sal_Int32 nCol(0);
sal_Int32 nRow(-1);
sal_Int32 nIndex(0);
diff --git a/sc/source/filter/xml/XMLExportIterator.cxx b/sc/source/filter/xml/XMLExportIterator.cxx
index 72194c8be11c..c0b50a06b45a 100644
--- a/sc/source/filter/xml/XMLExportIterator.cxx
+++ b/sc/source/filter/xml/XMLExportIterator.cxx
@@ -130,6 +130,13 @@ void ScMyShapesContainer::SetCellData( ScMyCell& rMyCell )
rMyCell.bHasShape = !rMyCell.aShapeList.empty();
}
+void ScMyShapesContainer::SkipTable(SCTAB nSkip)
+{
+ ScMyShapeList::iterator aItr = aShapeList.begin();
+ while( (aItr != aShapeList.end()) && (aItr->aAddress.Tab() == nSkip) )
+ aItr = aShapeList.erase(aItr);
+}
+
void ScMyShapesContainer::Sort()
{
aShapeList.sort();
@@ -184,6 +191,13 @@ void ScMyNoteShapesContainer::SetCellData( ScMyCell& rMyCell )
}
}
+void ScMyNoteShapesContainer::SkipTable(SCTAB nSkip)
+{
+ ScMyNoteShapeList::iterator aItr = aNoteShapeList.begin();
+ while( (aItr != aNoteShapeList.end()) && (aItr->aPos.Tab() == nSkip) )
+ aItr = aNoteShapeList.erase(aItr);
+}
+
void ScMyNoteShapesContainer::Sort()
{
aNoteShapeList.sort();
@@ -269,6 +283,13 @@ void ScMyMergedRangesContainer::SetCellData( ScMyCell& rMyCell )
}
}
+void ScMyMergedRangesContainer::SkipTable(SCTAB nSkip)
+{
+ ScMyMergedRangeList::iterator aItr = aRangeList.begin();
+ while( (aItr != aRangeList.end()) && (aItr->aCellRange.Sheet == nSkip) )
+ aItr = aRangeList.erase(aItr);
+}
+
void ScMyMergedRangesContainer::Sort()
{
aRangeList.sort();
@@ -344,6 +365,13 @@ void ScMyAreaLinksContainer::SetCellData( ScMyCell& rMyCell )
}
}
+void ScMyAreaLinksContainer::SkipTable(SCTAB nSkip)
+{
+ ScMyAreaLinkList::iterator aItr = aAreaLinkList.begin();
+ while( (aItr != aAreaLinkList.end()) && (aItr->aDestRange.Sheet == nSkip) )
+ aItr = aAreaLinkList.erase(aItr);
+}
+
void ScMyAreaLinksContainer::Sort()
{
aAreaLinkList.sort();
@@ -417,6 +445,13 @@ void ScMyEmptyDatabaseRangesContainer::SetCellData( ScMyCell& rMyCell )
}
}
+void ScMyEmptyDatabaseRangesContainer::SkipTable(SCTAB nSkip)
+{
+ ScMyEmptyDatabaseRangeList::iterator aItr = aDatabaseList.begin();
+ while( (aItr != aDatabaseList.end()) && (aItr->Sheet == nSkip) )
+ aItr = aDatabaseList.erase(aItr);
+}
+
void ScMyEmptyDatabaseRangesContainer::Sort()
{
aDatabaseList.sort();
@@ -498,6 +533,13 @@ void ScMyDetectiveObjContainer::SetCellData( ScMyCell& rMyCell )
rMyCell.bHasDetectiveObj = (rMyCell.aDetectiveObjVec.size() != 0);
}
+void ScMyDetectiveObjContainer::SkipTable(SCTAB nSkip)
+{
+ ScMyDetectiveObjList::iterator aItr = aDetectiveObjList.begin();
+ while( (aItr != aDetectiveObjList.end()) && (aItr->aPosition.Sheet == nSkip) )
+ aItr = aDetectiveObjList.erase(aItr);
+}
+
void ScMyDetectiveObjContainer::Sort()
{
aDetectiveObjList.sort();
@@ -557,6 +599,13 @@ void ScMyDetectiveOpContainer::SetCellData( ScMyCell& rMyCell )
rMyCell.bHasDetectiveOp = (rMyCell.aDetectiveOpVec.size() != 0);
}
+void ScMyDetectiveOpContainer::SkipTable(SCTAB nSkip)
+{
+ ScMyDetectiveOpList::iterator aItr = aDetectiveOpList.begin();
+ while( (aItr != aDetectiveOpList.end()) && (aItr->aPosition.Sheet == nSkip) )
+ aItr = aDetectiveOpList.erase(aItr);
+}
+
void ScMyDetectiveOpContainer::Sort()
{
aDetectiveOpList.sort();
@@ -766,6 +815,27 @@ void ScMyNotEmptyCellsIterator::SetCurrentTable(const SCTAB nTable,
}
}
+void ScMyNotEmptyCellsIterator::SkipTable(SCTAB nSkip)
+{
+ // Skip entries for a sheet that is copied instead of saving normally.
+ // Cells (including aAnnotations) are handled separately in SetCurrentTable.
+
+ if( pShapes )
+ pShapes->SkipTable(nSkip);
+ if( pNoteShapes )
+ pNoteShapes->SkipTable(nSkip);
+ if( pEmptyDatabaseRanges )
+ pEmptyDatabaseRanges->SkipTable(nSkip);
+ if( pMergedRanges )
+ pMergedRanges->SkipTable(nSkip);
+ if( pAreaLinks )
+ pAreaLinks->SkipTable(nSkip);
+ if( pDetectiveObj )
+ pDetectiveObj->SkipTable(nSkip);
+ if( pDetectiveOp )
+ pDetectiveOp->SkipTable(nSkip);
+}
+
sal_Bool ScMyNotEmptyCellsIterator::GetNext(ScMyCell& aCell, ScFormatRangeStyles* pCellStyles)
{
table::CellAddress aAddress( nCurrentTable, MAXCOL + 1, MAXROW + 1 );
diff --git a/sc/source/filter/xml/XMLExportIterator.hxx b/sc/source/filter/xml/XMLExportIterator.hxx
index d15ef94f99e6..92c61ca060e9 100644
--- a/sc/source/filter/xml/XMLExportIterator.hxx
+++ b/sc/source/filter/xml/XMLExportIterator.hxx
@@ -96,6 +96,7 @@ public:
const ScMyShapeList* GetShapes() { return &aShapeList; }
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort();
+ void SkipTable(SCTAB nSkip);
};
struct ScMyNoteShape
@@ -124,6 +125,7 @@ public:
const ScMyNoteShapeList* GetNotes() { return &aNoteShapeList; }
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort();
+ void SkipTable(SCTAB nSkip);
};
//==============================================================================
@@ -152,6 +154,7 @@ public:
using ScMyIteratorBase::UpdateAddress;
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort(); // + remove doublets
+ void SkipTable(SCTAB nSkip);
};
//==============================================================================
@@ -192,6 +195,7 @@ public:
using ScMyIteratorBase::UpdateAddress;
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort();
+ void SkipTable(SCTAB nSkip);
};
//==============================================================================
@@ -218,6 +222,7 @@ public:
using ScMyIteratorBase::UpdateAddress;
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort();
+ void SkipTable(SCTAB nSkip);
};
//==============================================================================
@@ -254,6 +259,7 @@ public:
using ScMyIteratorBase::UpdateAddress;
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort();
+ void SkipTable(SCTAB nSkip);
};
//==============================================================================
@@ -284,6 +290,7 @@ public:
using ScMyIteratorBase::UpdateAddress;
virtual void SetCellData( ScMyCell& rMyCell );
virtual void Sort();
+ void SkipTable(SCTAB nSkip);
};
//==============================================================================
@@ -400,6 +407,7 @@ public:
void SetCurrentTable(const SCTAB nTable,
com::sun::star::uno::Reference<com::sun::star::sheet::XSpreadsheet>& rxTable);
+ void SkipTable(SCTAB nSkip);
sal_Bool GetNext(ScMyCell& aCell, ScFormatRangeStyles* pCellStyles);
};
diff --git a/sc/source/filter/xml/XMLStylesExportHelper.cxx b/sc/source/filter/xml/XMLStylesExportHelper.cxx
index 6482fe571b62..98100f4b3646 100644
--- a/sc/source/filter/xml/XMLStylesExportHelper.cxx
+++ b/sc/source/filter/xml/XMLStylesExportHelper.cxx
@@ -878,7 +878,7 @@ sal_Int32 ScFormatRangeStyles::GetIndexOfStyleName(const rtl::OUString& rString,
sal_Int32 nPrefixLength(rPrefix.getLength());
rtl::OUString sTemp(rString.copy(nPrefixLength));
sal_Int32 nIndex(sTemp.toInt32());
- if (aAutoStyleNames.at(nIndex - 1)->equals(rString))
+ if (nIndex > 0 && static_cast<size_t>(nIndex-1) < aAutoStyleNames.size() && aAutoStyleNames.at(nIndex - 1)->equals(rString))
{
bIsAutoStyle = sal_True;
return nIndex - 1;
@@ -1111,7 +1111,7 @@ sal_Int32 ScColumnRowStylesBase::GetIndexOfStyleName(const rtl::OUString& rStrin
sal_Int32 nPrefixLength(rPrefix.getLength());
rtl::OUString sTemp(rString.copy(nPrefixLength));
sal_Int32 nIndex(sTemp.toInt32());
- if (aStyleNames.at(nIndex - 1)->equals(rString))
+ if (nIndex > 0 && static_cast<size_t>(nIndex-1) < aStyleNames.size() && aStyleNames.at(nIndex - 1)->equals(rString))
return nIndex - 1;
else
{
diff --git a/sc/source/filter/xml/XMLTableShapeImportHelper.cxx b/sc/source/filter/xml/XMLTableShapeImportHelper.cxx
index 48def752b038..f498faf93e5b 100644
--- a/sc/source/filter/xml/XMLTableShapeImportHelper.cxx
+++ b/sc/source/filter/xml/XMLTableShapeImportHelper.cxx
@@ -36,6 +36,8 @@
#include "drwlayer.hxx"
#include "xmlannoi.hxx"
#include "rangeutl.hxx"
+#include "docuno.hxx"
+#include "sheetdata.hxx"
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmlnmspe.hxx>
#include <xmloff/xmluconv.hxx>
@@ -80,9 +82,11 @@ void XMLTableShapeImportHelper::finishShape(
const uno::Reference< xml::sax::XAttributeList >& xAttrList,
uno::Reference< drawing::XShapes >& rShapes )
{
+ bool bNote = false;
XMLShapeImportHelper::finishShape( rShape, xAttrList, rShapes );
static_cast<ScXMLImport&>(mrImporter).LockSolarMutex();
- if (rShapes == static_cast<ScXMLImport&>(mrImporter).GetTables().GetCurrentXShapes())
+ ScMyTables& rTables = static_cast<ScXMLImport&>(mrImporter).GetTables();
+ if (rShapes == rTables.GetCurrentXShapes())
{
if (!pAnnotationContext)
{
@@ -126,7 +130,7 @@ void XMLTableShapeImportHelper::finishShape(
if (!bOnTable)
{
- static_cast<ScXMLImport&>(mrImporter).GetTables().AddShape(rShape,
+ rTables.AddShape(rShape,
pRangeList, aStartCell, aEndCell, nEndX, nEndY);
SvxShape* pShapeImp = SvxShape::getImplementation(rShape);
if (pShapeImp)
@@ -145,7 +149,7 @@ void XMLTableShapeImportHelper::finishShape(
// -> call AddShape with invalid cell position (checked in ScMyShapeResizer::ResizeShapes)
table::CellAddress aInvalidPos( -1, -1, -1 );
- static_cast<ScXMLImport&>(mrImporter).GetTables().AddShape(rShape,
+ rTables.AddShape(rShape,
pRangeList, aInvalidPos, aInvalidPos, 0, 0);
}
@@ -160,7 +164,26 @@ void XMLTableShapeImportHelper::finishShape(
}
else // shape is annotation
{
- pAnnotationContext->SetShape(rShape, rShapes);
+ // get the style names for stream copying
+ rtl::OUString aStyleName;
+ rtl::OUString aTextStyle;
+ sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
+ for( sal_Int16 i=0; i < nAttrCount; ++i )
+ {
+ const rtl::OUString& rAttrName(xAttrList->getNameByIndex( i ));
+ rtl::OUString aLocalName;
+ sal_uInt16 nPrefix(static_cast<ScXMLImport&>(mrImporter).GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName ));
+ if(nPrefix == XML_NAMESPACE_DRAW)
+ {
+ if (IsXMLToken(aLocalName, XML_STYLE_NAME))
+ aStyleName = xAttrList->getValueByIndex( i );
+ else if (IsXMLToken(aLocalName, XML_TEXT_STYLE_NAME))
+ aTextStyle = xAttrList->getValueByIndex( i );
+ }
+ }
+
+ pAnnotationContext->SetShape(rShape, rShapes, aStyleName, aTextStyle);
+ bNote = true;
}
}
else //#99532# this are grouped shapes which should also get the layerid
@@ -183,5 +206,13 @@ void XMLTableShapeImportHelper::finishShape(
}
SetLayer(rShape, nLayerID, rShape->getShapeType());
}
+
+ if (!bNote)
+ {
+ // any shape other than a note prevents copying the sheet
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(mrImporter.GetModel())->GetSheetSaveData();
+ pSheetData->BlockSheet( rTables.GetCurrentSheet() );
+ }
+
static_cast<ScXMLImport&>(mrImporter).UnlockSolarMutex();
}
diff --git a/sc/source/filter/xml/XMLTableShapeImportHelper.hxx b/sc/source/filter/xml/XMLTableShapeImportHelper.hxx
index 4299649427e4..06d49dc4beed 100644
--- a/sc/source/filter/xml/XMLTableShapeImportHelper.hxx
+++ b/sc/source/filter/xml/XMLTableShapeImportHelper.hxx
@@ -57,6 +57,8 @@ public:
void SetCell (const ::com::sun::star::table::CellAddress& rAddress) { aStartCell = rAddress; }
void SetOnTable (const sal_Bool bTempOnTable) { bOnTable = bTempOnTable; }
void SetAnnotation(ScXMLAnnotationContext* pAnnotation) { pAnnotationContext = pAnnotation; }
+
+ ScXMLAnnotationContext* GetAnnotationContext() const { return pAnnotationContext; }
};
diff --git a/sc/source/filter/xml/XMLTableShapeResizer.cxx b/sc/source/filter/xml/XMLTableShapeResizer.cxx
index 88c5fbf248b1..ca6d23a6459a 100644
--- a/sc/source/filter/xml/XMLTableShapeResizer.cxx
+++ b/sc/source/filter/xml/XMLTableShapeResizer.cxx
@@ -106,6 +106,12 @@ void ScMyShapeResizer::CreateChartListener(ScDocument* pDoc,
//otherwise the charts keep their first visual representation which was created at a moment where the calc itself was not loaded completly and is incorect therefor
if( (rImport.getImportFlags() & IMPORT_ALL) == IMPORT_ALL )
pCL->SetDirty( TRUE );
+ else
+ {
+ // #i104899# If a formula cell is already dirty, further changes aren't propagated.
+ // This can happen easily now that row heights aren't updated for all sheets.
+ pDoc->InterpretDirtyCells( *pCL->GetRangeList() );
+ }
pCollection->Insert( pCL );
pCL->StartListeningTo();
diff --git a/sc/source/filter/xml/makefile.mk b/sc/source/filter/xml/makefile.mk
index 19d8a99f789c..c1e7e215e199 100644
--- a/sc/source/filter/xml/makefile.mk
+++ b/sc/source/filter/xml/makefile.mk
@@ -51,57 +51,8 @@ PROJECTPCHSOURCE=..\pch\filt_pch
# --- Files --------------------------------------------------------
-CXXFILES = \
- xmlwrap.cxx \
- xmlimprt.cxx \
- xmlexprt.cxx \
- xmlbodyi.cxx \
- xmltabi.cxx \
- xmlexternaltabi.cxx \
- xmlrowi.cxx \
- xmlcelli.cxx \
- xmlconti.cxx \
- xmlcoli.cxx \
- xmlsubti.cxx \
- xmlnexpi.cxx \
- xmldrani.cxx \
- xmlfilti.cxx \
- xmlsorti.cxx \
- xmlstyle.cxx \
- xmlstyli.cxx \
- xmldpimp.cxx \
- xmlannoi.cxx \
- xmlsceni.cxx \
- xmlcvali.cxx \
- XMLTableMasterPageExport.cxx \
- xmllabri.cxx \
- XMLTableHeaderFooterContext.cxx \
- XMLDetectiveContext.cxx \
- XMLCellRangeSourceContext.cxx \
- XMLConsolidationContext.cxx \
- XMLConverter.cxx \
- XMLExportIterator.cxx \
- XMLColumnRowGroupExport.cxx \
- XMLStylesExportHelper.cxx \
- XMLStylesImportHelper.cxx \
- XMLExportDataPilot.cxx \
- XMLExportDatabaseRanges.cxx \
- XMLTableShapeImportHelper.cxx \
- XMLTableShapesContext.cxx \
- XMLExportDDELinks.cxx \
- XMLDDELinksContext.cxx \
- XMLCalculationSettingsContext.cxx \
- XMLTableSourceContext.cxx \
- XMLTextPContext.cxx \
- XMLTableShapeResizer.cxx \
- XMLChangeTrackingExportHelper.cxx \
- xmlfonte.cxx \
- XMLChangeTrackingImportHelper.cxx \
- XMLTrackedChangesContext.cxx \
- XMLExportSharedData.cxx \
- XMLEmptyContext.cxx
-
SLOFILES = \
+ $(SLO)$/sheetdata.obj \
$(SLO)$/xmlwrap.obj \
$(SLO)$/xmlimprt.obj \
$(SLO)$/xmlexprt.obj \
diff --git a/sc/source/filter/xml/sheetdata.cxx b/sc/source/filter/xml/sheetdata.cxx
new file mode 100644
index 000000000000..a8b96eb6d768
--- /dev/null
+++ b/sc/source/filter/xml/sheetdata.cxx
@@ -0,0 +1,275 @@
+/*************************************************************************
+ *
+ * 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: sheetdata.cxx,v $
+ * $Revision: 1.69.32.3 $
+ *
+ * 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 ---------------------------------------------------------------
+
+#include <xmloff/families.hxx>
+#include <xmloff/xmlaustp.hxx>
+#include <xmloff/nmspmap.hxx>
+#include <tools/string.hxx>
+#include <tools/debug.hxx>
+
+#include "sheetdata.hxx"
+
+// -----------------------------------------------------------------------
+
+ScSheetSaveData::ScSheetSaveData() :
+ mnStartTab( -1 ),
+ mnStartOffset( -1 ),
+ maPreviousNote( rtl::OUString(), rtl::OUString(), ScAddress(ScAddress::INITIALIZE_INVALID) )
+{
+}
+
+ScSheetSaveData::~ScSheetSaveData()
+{
+}
+
+void ScSheetSaveData::AddCellStyle( const rtl::OUString& rName, const ScAddress& rCellPos )
+{
+ maCellStyles.push_back( ScCellStyleEntry( rName, rCellPos ) );
+}
+
+void ScSheetSaveData::AddColumnStyle( const rtl::OUString& rName, const ScAddress& rCellPos )
+{
+ maColumnStyles.push_back( ScCellStyleEntry( rName, rCellPos ) );
+}
+
+void ScSheetSaveData::AddRowStyle( const rtl::OUString& rName, const ScAddress& rCellPos )
+{
+ maRowStyles.push_back( ScCellStyleEntry( rName, rCellPos ) );
+}
+
+void ScSheetSaveData::AddTableStyle( const rtl::OUString& rName, const ScAddress& rCellPos )
+{
+ maTableStyles.push_back( ScCellStyleEntry( rName, rCellPos ) );
+}
+
+void ScSheetSaveData::HandleNoteStyles( const rtl::OUString& rStyleName, const rtl::OUString& rTextName, const ScAddress& rCellPos )
+{
+ // only consecutive duplicates (most common case) are filtered out here,
+ // the others are found when the styles are created
+
+ if ( rStyleName == maPreviousNote.maStyleName &&
+ rTextName == maPreviousNote.maTextStyle &&
+ rCellPos.Tab() == maPreviousNote.maCellPos.Tab() )
+ {
+ // already stored for the same sheet - ignore
+ return;
+ }
+
+ ScNoteStyleEntry aNewEntry( rStyleName, rTextName, rCellPos );
+ maPreviousNote = aNewEntry;
+ maNoteStyles.push_back( aNewEntry );
+}
+
+void ScSheetSaveData::AddNoteContentStyle( sal_uInt16 nFamily, const rtl::OUString& rName, const ScAddress& rCellPos, const ESelection& rSelection )
+{
+ if ( nFamily == XML_STYLE_FAMILY_TEXT_PARAGRAPH )
+ maNoteParaStyles.push_back( ScTextStyleEntry( rName, rCellPos, rSelection ) );
+ else
+ maNoteTextStyles.push_back( ScTextStyleEntry( rName, rCellPos, rSelection ) );
+}
+
+void ScSheetSaveData::AddTextStyle( const rtl::OUString& rName, const ScAddress& rCellPos, const ESelection& rSelection )
+{
+ maTextStyles.push_back( ScTextStyleEntry( rName, rCellPos, rSelection ) );
+}
+
+void ScSheetSaveData::BlockSheet( sal_Int32 nTab )
+{
+ if ( nTab >= (sal_Int32)maBlocked.size() )
+ maBlocked.resize( nTab + 1, false ); // fill vector with "false" entries
+
+ maBlocked[nTab] = true;
+}
+
+bool ScSheetSaveData::IsSheetBlocked( sal_Int32 nTab ) const
+{
+ if ( nTab < (sal_Int32)maBlocked.size() )
+ return maBlocked[nTab];
+ else
+ return false;
+}
+
+void ScSheetSaveData::AddStreamPos( sal_Int32 nTab, sal_Int32 nStartOffset, sal_Int32 nEndOffset )
+{
+ if ( nTab >= (sal_Int32)maStreamEntries.size() )
+ maStreamEntries.resize( nTab + 1 );
+
+ maStreamEntries[nTab] = ScStreamEntry( nStartOffset, nEndOffset );
+}
+
+void ScSheetSaveData::StartStreamPos( sal_Int32 nTab, sal_Int32 nStartOffset )
+{
+ DBG_ASSERT( mnStartTab < 0, "StartStreamPos without EndStreamPos" );
+
+ mnStartTab = nTab;
+ mnStartOffset = nStartOffset;
+}
+
+void ScSheetSaveData::EndStreamPos( sal_Int32 nEndOffset )
+{
+ if ( mnStartTab >= 0 )
+ {
+ AddStreamPos( mnStartTab, mnStartOffset, nEndOffset );
+ mnStartTab = -1;
+ mnStartOffset = -1;
+ }
+}
+
+void ScSheetSaveData::GetStreamPos( sal_Int32 nTab, sal_Int32& rStartOffset, sal_Int32& rEndOffset ) const
+{
+ if ( nTab < (sal_Int32)maStreamEntries.size() )
+ {
+ const ScStreamEntry& rEntry = maStreamEntries[nTab];
+ rStartOffset = rEntry.mnStartOffset;
+ rEndOffset = rEntry.mnEndOffset;
+ }
+ else
+ rStartOffset = rEndOffset = -1;
+}
+
+bool ScSheetSaveData::HasStreamPos( sal_Int32 nTab ) const
+{
+ sal_Int32 nStartOffset = -1;
+ sal_Int32 nEndOffset = -1;
+ GetStreamPos( nTab, nStartOffset, nEndOffset );
+ return ( nStartOffset >= 0 && nEndOffset >= 0 );
+}
+
+void ScSheetSaveData::ResetSaveEntries()
+{
+ maSaveEntries.clear();
+}
+
+void ScSheetSaveData::AddSavePos( sal_Int32 nTab, sal_Int32 nStartOffset, sal_Int32 nEndOffset )
+{
+ if ( nTab >= (sal_Int32)maSaveEntries.size() )
+ maSaveEntries.resize( nTab + 1 );
+
+ maSaveEntries[nTab] = ScStreamEntry( nStartOffset, nEndOffset );
+}
+
+void ScSheetSaveData::UseSaveEntries()
+{
+ maStreamEntries = maSaveEntries;
+}
+
+void ScSheetSaveData::StoreInitialNamespaces( const SvXMLNamespaceMap& rNamespaces )
+{
+ // the initial namespaces are just removed from the list of loaded namespaces,
+ // so only a hash_set of the prefixes is needed.
+
+ const NameSpaceHash& rNameHash = rNamespaces.GetAllEntries();
+ NameSpaceHash::const_iterator aIter = rNameHash.begin(), aEnd = rNameHash.end();
+ while (aIter != aEnd)
+ {
+ maInitialPrefixes.insert( aIter->first );
+ ++aIter;
+ }
+}
+
+void ScSheetSaveData::StoreLoadedNamespaces( const SvXMLNamespaceMap& rNamespaces )
+{
+ // store the loaded namespaces, so the prefixes in copied stream fragments remain valid
+
+ const NameSpaceHash& rNameHash = rNamespaces.GetAllEntries();
+ NameSpaceHash::const_iterator aIter = rNameHash.begin(), aEnd = rNameHash.end();
+ while (aIter != aEnd)
+ {
+ // ignore the initial namespaces
+ if ( maInitialPrefixes.find( aIter->first ) == maInitialPrefixes.end() )
+ {
+ const NameSpaceEntry& rEntry = aIter->second.getBody();
+ maLoadedNamespaces.push_back( ScLoadedNamespaceEntry( rEntry.sPrefix, rEntry.sName, rEntry.nKey ) );
+ }
+ ++aIter;
+ }
+}
+
+bool lcl_NameInHash( const NameSpaceHash& rNameHash, const rtl::OUString& rName )
+{
+ NameSpaceHash::const_iterator aIter = rNameHash.begin(), aEnd = rNameHash.end();
+ while (aIter != aEnd)
+ {
+ if ( aIter->second->sName == rName )
+ return true;
+
+ ++aIter;
+ }
+ return false; // not found
+}
+
+bool ScSheetSaveData::AddLoadedNamespaces( SvXMLNamespaceMap& rNamespaces ) const
+{
+ // Add the loaded namespaces to the name space map.
+
+ // first loop: only look for conflicts
+ // (if the loaded namespaces were added first, this might not be necessary)
+ const NameSpaceHash& rNameHash = rNamespaces.GetAllEntries();
+ std::vector<ScLoadedNamespaceEntry>::const_iterator aIter = maLoadedNamespaces.begin();
+ std::vector<ScLoadedNamespaceEntry>::const_iterator aEnd = maLoadedNamespaces.end();
+ while (aIter != aEnd)
+ {
+ NameSpaceHash::const_iterator aHashIter = rNameHash.find( aIter->maPrefix );
+ if ( aHashIter == rNameHash.end() )
+ {
+ if ( lcl_NameInHash( rNameHash, aIter->maName ) )
+ {
+ // a second prefix for the same name would confuse SvXMLNamespaceMap lookup,
+ // so this is also considered a conflict
+ return false;
+ }
+ }
+ else if ( aHashIter->second->sName != aIter->maName )
+ {
+ // same prefix, but different name: loaded namespaces can't be used
+ return false;
+ }
+ ++aIter;
+ }
+
+ // only if there were no conflicts, add the entries that aren't in the map already
+ // (the key is needed if the same namespace is added later within an element)
+ aIter = maLoadedNamespaces.begin();
+ while (aIter != aEnd)
+ {
+ NameSpaceHash::const_iterator aHashIter = rNameHash.find( aIter->maPrefix );
+ if ( aHashIter == rNameHash.end() )
+ rNamespaces.Add( aIter->maPrefix, aIter->maName, aIter->mnKey );
+ ++aIter;
+ }
+
+ return true; // success
+}
+
diff --git a/sc/source/filter/xml/xmlannoi.cxx b/sc/source/filter/xml/xmlannoi.cxx
index f8081b7b8f48..294a335033c1 100644
--- a/sc/source/filter/xml/xmlannoi.cxx
+++ b/sc/source/filter/xml/xmlannoi.cxx
@@ -207,9 +207,17 @@ void ScXMLAnnotationContext::EndElement()
pTableShapeImport->SetAnnotation(NULL);
}
-void ScXMLAnnotationContext::SetShape( const uno::Reference< drawing::XShape >& rxShape, const uno::Reference< drawing::XShapes >& rxShapes )
+void ScXMLAnnotationContext::SetShape( const uno::Reference< drawing::XShape >& rxShape, const uno::Reference< drawing::XShapes >& rxShapes,
+ const rtl::OUString& rStyleName, const rtl::OUString& rTextStyle )
{
mrAnnotationData.mxShape = rxShape;
mrAnnotationData.mxShapes = rxShapes;
+ mrAnnotationData.maStyleName = rStyleName;
+ mrAnnotationData.maTextStyle = rTextStyle;
+}
+
+void ScXMLAnnotationContext::AddContentStyle( sal_uInt16 nFamily, const rtl::OUString& rName, const ESelection& rSelection )
+{
+ mrAnnotationData.maContentStyles.push_back( ScXMLAnnotationStyleEntry( nFamily, rName, rSelection ) );
}
diff --git a/sc/source/filter/xml/xmlannoi.hxx b/sc/source/filter/xml/xmlannoi.hxx
index c509b72124ed..41b206bd4380 100644
--- a/sc/source/filter/xml/xmlannoi.hxx
+++ b/sc/source/filter/xml/xmlannoi.hxx
@@ -34,12 +34,27 @@
#include <xmloff/xmlictxt.hxx>
#include <xmloff/xmlimp.hxx>
#include <rtl/ustrbuf.hxx>
+#include <svx/editdata.hxx>
#include <com/sun/star/drawing/XShape.hpp>
#include <com/sun/star/drawing/XShapes.hpp>
class ScXMLImport;
class ScXMLTableRowCellContext;
+struct ScXMLAnnotationStyleEntry
+{
+ sal_uInt16 mnFamily;
+ rtl::OUString maName;
+ ESelection maSelection;
+
+ ScXMLAnnotationStyleEntry( sal_uInt16 nFam, const rtl::OUString& rNam, const ESelection& rSel ) :
+ mnFamily( nFam ),
+ maName( rNam ),
+ maSelection( rSel )
+ {
+ }
+};
+
struct ScXMLAnnotationData
{
::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >
@@ -49,8 +64,11 @@ struct ScXMLAnnotationData
::rtl::OUString maAuthor;
::rtl::OUString maCreateDate;
::rtl::OUString maSimpleText;
+ ::rtl::OUString maStyleName;
+ ::rtl::OUString maTextStyle;
bool mbUseShapePos;
bool mbShown;
+ std::vector<ScXMLAnnotationStyleEntry> maContentStyles;
explicit ScXMLAnnotationData();
~ScXMLAnnotationData();
@@ -82,7 +100,10 @@ public:
void SetShape(
const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rxShape,
- const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes );
+ const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes,
+ const ::rtl::OUString& rStyleName, const ::rtl::OUString& rTextStyle );
+
+ void AddContentStyle( sal_uInt16 nFamily, const rtl::OUString& rName, const ESelection& rSelection );
private:
ScXMLAnnotationData& mrAnnotationData;
diff --git a/sc/source/filter/xml/xmlbodyi.cxx b/sc/source/filter/xml/xmlbodyi.cxx
index 048f1ec0c549..a301ddbf27e6 100644
--- a/sc/source/filter/xml/xmlbodyi.cxx
+++ b/sc/source/filter/xml/xmlbodyi.cxx
@@ -36,6 +36,8 @@
#include <cstdio>
#include "document.hxx"
+#include "docuno.hxx"
+#include "sheetdata.hxx"
#include "xmlbodyi.hxx"
#include "xmltabi.hxx"
@@ -136,6 +138,14 @@ SvXMLImportContext *ScXMLBodyContext::CreateChildContext( USHORT nPrefix,
const ::com::sun::star::uno::Reference<
::com::sun::star::xml::sax::XAttributeList>& xAttrList )
{
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetScImport().GetModel())->GetSheetSaveData();
+ if ( pSheetData && pSheetData->HasStartPos() )
+ {
+ // stream part to copy ends before the next child element
+ sal_Int32 nEndOffset = GetScImport().GetByteOffset();
+ pSheetData->EndStreamPos( nEndOffset );
+ }
+
SvXMLImportContext *pContext = 0;
const SvXMLTokenMap& rTokenMap = GetScImport().GetBodyElemTokenMap();
@@ -218,8 +228,36 @@ SvXMLImportContext *ScXMLBodyContext::CreateChildContext( USHORT nPrefix,
return pContext;
}
+void ScXMLBodyContext::Characters( const OUString& )
+{
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetScImport().GetModel())->GetSheetSaveData();
+ if ( pSheetData && pSheetData->HasStartPos() )
+ {
+ // stream part to copy ends before any content (whitespace) within the spreadsheet element
+ sal_Int32 nEndOffset = GetScImport().GetByteOffset();
+ pSheetData->EndStreamPos( nEndOffset );
+ }
+ // otherwise ignore
+}
+
void ScXMLBodyContext::EndElement()
{
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetScImport().GetModel())->GetSheetSaveData();
+ if ( pSheetData && pSheetData->HasStartPos() )
+ {
+ // stream part to copy ends before the closing tag of spreadsheet element
+ sal_Int32 nEndOffset = GetScImport().GetByteOffset();
+ pSheetData->EndStreamPos( nEndOffset );
+ }
+
+ if ( pSheetData )
+ {
+ // store the loaded namespaces (for the office:spreadsheet element),
+ // so the prefixes in copied stream fragments remain valid
+ const SvXMLNamespaceMap& rNamespaces = GetImport().GetNamespaceMap();
+ pSheetData->StoreLoadedNamespaces( rNamespaces );
+ }
+
if (!bHadCalculationSettings)
{
// #111055#; set calculation settings defaults if there is no calculation settings element
diff --git a/sc/source/filter/xml/xmlbodyi.hxx b/sc/source/filter/xml/xmlbodyi.hxx
index d57af40eaf25..2c489418bfff 100644
--- a/sc/source/filter/xml/xmlbodyi.hxx
+++ b/sc/source/filter/xml/xmlbodyi.hxx
@@ -57,6 +57,7 @@ public:
const ::com::sun::star::uno::Reference<
::com::sun::star::xml::sax::XAttributeList>& xAttrList );
virtual void EndElement();
+ virtual void Characters( const ::rtl::OUString& rChars );
};
#endif
diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx
index f0a4569cc86e..6a42d505cdc8 100644
--- a/sc/source/filter/xml/xmlcelli.cxx
+++ b/sc/source/filter/xml/xmlcelli.cxx
@@ -44,6 +44,7 @@
#include "docuno.hxx"
#include "unonames.hxx"
#include "postit.hxx"
+#include "sheetdata.hxx"
#include "XMLTableShapeImportHelper.hxx"
#include "XMLTextPContext.hxx"
@@ -550,6 +551,11 @@ void ScXMLTableRowCellContext::SetContentValidation(com::sun::star::uno::Referen
}
}
xPropSet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_VALIXML)), uno::makeAny(xPropertySet));
+
+ // For now, any sheet with validity is blocked from stream-copying.
+ // Later, the validation names could be stored along with the style names.
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetImport().GetModel())->GetSheetSaveData();
+ pSheetData->BlockSheet( GetScImport().GetTables().GetCurrentSheet() );
}
}
}
@@ -676,6 +682,18 @@ void ScXMLTableRowCellContext::SetAnnotation(const table::CellAddress& aCellAddr
uno::Reference< drawing::XShape > xShape;
rXMLImport.GetShapeImport()->shapeWithZIndexAdded( xShape, xShapesIA->getCount() );
}
+
+ // store the style names for stream copying
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(rXMLImport.GetModel())->GetSheetSaveData();
+ pSheetData->HandleNoteStyles( mxAnnotationData->maStyleName, mxAnnotationData->maTextStyle, aPos );
+
+ std::vector<ScXMLAnnotationStyleEntry>::const_iterator aIter = mxAnnotationData->maContentStyles.begin();
+ std::vector<ScXMLAnnotationStyleEntry>::const_iterator aEnd = mxAnnotationData->maContentStyles.end();
+ while (aIter != aEnd)
+ {
+ pSheetData->AddNoteContentStyle( aIter->mnFamily, aIter->maName, aPos, aIter->maSelection );
+ ++aIter;
+ }
}
// core implementation
diff --git a/sc/source/filter/xml/xmlcoli.cxx b/sc/source/filter/xml/xmlcoli.cxx
index 31662f4e68dd..73c06f23a7bf 100644
--- a/sc/source/filter/xml/xmlcoli.cxx
+++ b/sc/source/filter/xml/xmlcoli.cxx
@@ -42,6 +42,7 @@
#include "document.hxx"
#include "docuno.hxx"
#include "olinetab.hxx"
+#include "sheetdata.hxx"
#include "unonames.hxx"
#include <xmloff/xmltkmap.hxx>
@@ -145,7 +146,7 @@ SvXMLImportContext *ScXMLTableColContext::CreateChildContext( USHORT nPrefix,
void ScXMLTableColContext::EndElement()
{
ScXMLImport& rXMLImport = GetScImport();
- //sal_Int32 nSheet = rXMLImport.GetTables().GetCurrentSheet();
+ sal_Int32 nSheet = rXMLImport.GetTables().GetCurrentSheet();
sal_Int32 nCurrentColumn = rXMLImport.GetTables().GetCurrentColumn();
uno::Reference<sheet::XSpreadsheet> xSheet(rXMLImport.GetTables().GetCurrentXSheet());
if(xSheet.is())
@@ -169,7 +170,16 @@ void ScXMLTableColContext::EndElement()
XMLTableStyleContext* pStyle = (XMLTableStyleContext *)pStyles->FindStyleChildContext(
XML_STYLE_FAMILY_TABLE_COLUMN, sStyleName, sal_True);
if (pStyle)
+ {
pStyle->FillPropertySet(xColumnProperties);
+
+ if ( nSheet != pStyle->GetLastSheet() )
+ {
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(rXMLImport.GetModel())->GetSheetSaveData();
+ pSheetData->AddColumnStyle( sStyleName, ScAddress( (SCCOL)nCurrentColumn, 0, (SCTAB)nSheet ) );
+ pStyle->SetLastSheet(nSheet);
+ }
+ }
}
}
rtl::OUString sVisible(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_CELLVIS));
diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx
index 98965cba07bc..df7e99955bfd 100644
--- a/sc/source/filter/xml/xmlexprt.cxx
+++ b/sc/source/filter/xml/xmlexprt.cxx
@@ -53,10 +53,12 @@
#include "XMLColumnRowGroupExport.hxx"
#include "XMLStylesExportHelper.hxx"
#include "XMLChangeTrackingExportHelper.hxx"
+#include "sheetdata.hxx"
#include "docoptio.hxx"
#include "XMLExportSharedData.hxx"
#include "chgviset.hxx"
#include "docuno.hxx"
+#include "textuno.hxx"
#include "chartlis.hxx"
#include "unoguard.hxx"
#include "scitems.hxx"
@@ -80,6 +82,7 @@
#include <xmloff/xmluconv.hxx>
#include <xmloff/txtparae.hxx>
#include <xmloff/xmlcnitm.hxx>
+#include <xmloff/xmlerror.hxx>
#include <rtl/ustring.hxx>
@@ -122,6 +125,8 @@
#include <com/sun/star/container/XNamed.hpp>
#include <com/sun/star/sheet/XSheetLinkable.hpp>
#include <com/sun/star/form/XFormsSupplier2.hpp>
+#include <com/sun/star/io/XActiveDataSource.hpp>
+#include <com/sun/star/io/XSeekable.hpp>
#include <com/sun/star/chart2/XChartDocument.hpp>
#include <com/sun/star/chart2/data/XRangeXMLConversion.hpp>
@@ -452,6 +457,7 @@ ScXMLExport::ScXMLExport(
const sal_uInt16 nExportFlag)
: SvXMLExport( xServiceFactory, SvXMLUnitConverter::GetMapUnit(GetFieldUnit()), XML_SPREADSHEET, nExportFlag ),
pDoc(NULL),
+ nSourceStreamPos(0),
pNumberFormatAttributesExportHelper(NULL),
pSharedData(NULL),
pColumnStyles(NULL),
@@ -567,6 +573,45 @@ ScXMLExport::~ScXMLExport()
delete pNumberFormatAttributesExportHelper;
}
+void ScXMLExport::SetSourceStream( const uno::Reference<io::XInputStream>& xNewStream )
+{
+ xSourceStream = xNewStream;
+
+ if ( xSourceStream.is() )
+ {
+ // make sure it's a plain UTF-8 stream as written by OOo itself
+
+ const sal_Char pXmlHeader[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+ sal_Int32 nLen = strlen(pXmlHeader);
+
+ uno::Sequence<sal_Int8> aFileStart(nLen);
+ sal_Int32 nRead = xSourceStream->readBytes( aFileStart, nLen );
+
+ if ( nRead != nLen || rtl_compareMemory( aFileStart.getConstArray(), pXmlHeader, nLen ) != 0 )
+ {
+ // invalid - ignore stream, save normally
+ xSourceStream.clear();
+ }
+ else
+ {
+ // keep track of the bytes already read
+ nSourceStreamPos = nRead;
+
+ const ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetModel())->GetSheetSaveData();
+ if (pSheetData)
+ {
+ // add the loaded namespaces to the name space map
+
+ if ( !pSheetData->AddLoadedNamespaces( _GetNamespaceMap() ) )
+ {
+ // conflicts in the namespaces - ignore the stream, save normally
+ xSourceStream.clear();
+ }
+ }
+ }
+ }
+}
+
sal_Int32 ScXMLExport::GetNumberFormatStyleIndex(sal_Int32 nNumFmt) const
{
NumberFormatIndexMap::const_iterator itr = aNumFmtIndexMap.find(nNumFmt);
@@ -803,7 +848,7 @@ void ScXMLExport::_ExportFontDecls()
SvXMLExport::_ExportFontDecls();
}
-table::CellRangeAddress ScXMLExport::GetEndAddress(uno::Reference<sheet::XSpreadsheet>& xTable, const sal_Int32 /* nTable */)
+table::CellRangeAddress ScXMLExport::GetEndAddress(const uno::Reference<sheet::XSpreadsheet>& xTable, const sal_Int32 /* nTable */)
{
table::CellRangeAddress aCellAddress;
uno::Reference<sheet::XSheetCellCursor> xCursor(xTable->createCursor());
@@ -1481,6 +1526,95 @@ void ScXMLExport::SetBodyAttributes()
}
}
+static bool lcl_CopyStreamElement( const uno::Reference< io::XInputStream >& xInput,
+ const uno::Reference< io::XOutputStream >& xOutput,
+ sal_Int32 nCount )
+{
+ const sal_Int32 nBufSize = 16*1024;
+ uno::Sequence<sal_Int8> aSequence(nBufSize);
+
+ sal_Int32 nRemaining = nCount;
+ bool bFirst = true;
+
+ while ( nRemaining > 0 )
+ {
+ sal_Int32 nRead = xInput->readBytes( aSequence, std::min( nRemaining, nBufSize ) );
+ if (bFirst)
+ {
+ // safety check: Make sure the copied part actually points to the start of an element
+ if ( nRead < 1 || aSequence[0] != static_cast<sal_Int8>('<') )
+ {
+ return false; // abort and set an error
+ }
+ bFirst = false;
+ }
+ if (nRead == nRemaining)
+ {
+ // safety check: Make sure the copied part also ends at the end of an element
+ if ( aSequence[nRead-1] != static_cast<sal_Int8>('>') )
+ {
+ return false; // abort and set an error
+ }
+ }
+
+ if ( nRead == nBufSize )
+ {
+ xOutput->writeBytes( aSequence );
+ nRemaining -= nRead;
+ }
+ else
+ {
+ if ( nRead > 0 )
+ {
+ uno::Sequence<sal_Int8> aTempBuf( aSequence.getConstArray(), nRead );
+ xOutput->writeBytes( aTempBuf );
+ }
+ nRemaining = 0;
+ }
+ }
+ return true; // successful
+}
+
+void ScXMLExport::CopySourceStream( sal_Int32 nStartOffset, sal_Int32 nEndOffset, sal_Int32& rNewStart, sal_Int32& rNewEnd )
+{
+ uno::Reference<xml::sax::XDocumentHandler> xHandler = GetDocHandler();
+ uno::Reference<io::XActiveDataSource> xDestSource( xHandler, uno::UNO_QUERY );
+ if ( xDestSource.is() )
+ {
+ uno::Reference<io::XOutputStream> xDestStream = xDestSource->getOutputStream();
+ uno::Reference<io::XSeekable> xDestSeek( xDestStream, uno::UNO_QUERY );
+ if ( xDestSeek.is() )
+ {
+ // temporary: set same stream again to clear buffer
+ xDestSource->setOutputStream( xDestStream );
+
+ if ( getExportFlags() & EXPORT_PRETTY )
+ {
+ ByteString aOutStr("\n ");
+ uno::Sequence<sal_Int8> aOutSeq( (sal_Int8*)aOutStr.GetBuffer(), aOutStr.Len() );
+ xDestStream->writeBytes( aOutSeq );
+ }
+
+ rNewStart = (sal_Int32)xDestSeek->getPosition();
+
+ if ( nStartOffset > nSourceStreamPos )
+ xSourceStream->skipBytes( nStartOffset - nSourceStreamPos );
+
+ if ( !lcl_CopyStreamElement( xSourceStream, xDestStream, nEndOffset - nStartOffset ) )
+ {
+ // If copying went wrong, set an error.
+ // ScXMLImportWrapper then resets all stream flags, so the next save attempt will use normal saving.
+
+ uno::Sequence<OUString> aEmptySeq;
+ SetError(XMLERROR_CANCEL|XMLERROR_FLAG_SEVERE, aEmptySeq);
+ }
+ nSourceStreamPos = nEndOffset;
+
+ rNewEnd = (sal_Int32)xDestSeek->getPosition();
+ }
+ }
+}
+
void ScXMLExport::_ExportContent()
{
nCurrentTable = 0;
@@ -1500,6 +1634,10 @@ void ScXMLExport::_ExportContent()
if ( !xSpreadDoc.is() )
return;
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(xSpreadDoc)->GetSheetSaveData();
+ if (pSheetData)
+ pSheetData->ResetSaveEntries();
+
uno::Reference<container::XIndexAccess> xIndex( xSpreadDoc->getSheets(), uno::UNO_QUERY );
if ( xIndex.is() )
{
@@ -1531,6 +1669,27 @@ void ScXMLExport::_ExportContent()
WriteTheLabelRanges( xSpreadDoc );
for (sal_Int32 nTable = 0; nTable < nTableCount; ++nTable)
{
+ sal_Int32 nStartOffset = -1;
+ sal_Int32 nEndOffset = -1;
+ if (pSheetData && pDoc && pDoc->IsStreamValid((SCTAB)nTable))
+ pSheetData->GetStreamPos( nTable, nStartOffset, nEndOffset );
+
+ if ( nStartOffset >= 0 && nEndOffset >= 0 && xSourceStream.is() )
+ {
+ sal_Int32 nNewStart = -1;
+ sal_Int32 nNewEnd = -1;
+ CopySourceStream( nStartOffset, nEndOffset, nNewStart, nNewEnd );
+
+ // store position of copied sheet in output
+ pSheetData->AddSavePos( nTable, nNewStart, nNewEnd );
+
+ // skip iterator entries for this sheet
+ pCellsItr->SkipTable(static_cast<SCTAB>(nTable));
+ }
+ else
+ {
+ //! indent after rebasing to m52
+
uno::Reference<sheet::XSpreadsheet> xTable(xIndex->getByIndex(nTable), uno::UNO_QUERY);
if (xTable.is())
{
@@ -1653,6 +1812,8 @@ void ScXMLExport::_ExportContent()
nEqualCells = 0;
}
}
+
+ }
IncrementProgressBar(sal_False);
}
}
@@ -1729,6 +1890,245 @@ void ScXMLExport::_ExportStyles( sal_Bool bUsed )
SvXMLExport::_ExportStyles(bUsed);
}
+void ScXMLExport::AddStyleFromCells(const uno::Reference<beans::XPropertySet>& xProperties,
+ const uno::Reference<sheet::XSpreadsheet>& xTable,
+ sal_Int32 nTable, const rtl::OUString* pOldName)
+{
+ //! pass xCellRanges instead
+ uno::Reference<sheet::XSheetCellRanges> xCellRanges( xProperties, uno::UNO_QUERY );
+
+ rtl::OUString SC_SCELLPREFIX(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_CELL_STYLES_PREFIX));
+ rtl::OUString SC_NUMBERFORMAT(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_NUMFMT));
+
+ rtl::OUString sStyleName;
+ sal_Int32 nNumberFormat(-1);
+ sal_Int32 nValidationIndex(-1);
+ std::vector< XMLPropertyState > xPropStates(xCellStylesExportPropertySetMapper->Filter( xProperties ));
+ std::vector< XMLPropertyState >::iterator aItr(xPropStates.begin());
+ std::vector< XMLPropertyState >::iterator aEndItr(xPropStates.end());
+ sal_Int32 nCount(0);
+ while (aItr != aEndItr)
+ {
+ if (aItr->mnIndex != -1)
+ {
+ switch (xCellStylesPropertySetMapper->GetEntryContextId(aItr->mnIndex))
+ {
+ case CTF_SC_VALIDATION :
+ {
+ pValidationsContainer->AddValidation(aItr->maValue, nValidationIndex);
+ // this is not very slow, because it is most the last property or
+ // if it is not the last property it is the property before the last property,
+ // so in the worst case only one property has to be copied, but in the best case no
+ // property has to be copied
+ aItr = xPropStates.erase(aItr);
+ aEndItr = xPropStates.end(); // #120346# old aEndItr is invalidated!
+ }
+ break;
+ case CTF_SC_CELLSTYLE :
+ {
+ aItr->maValue >>= sStyleName;
+ aItr->mnIndex = -1;
+ ++aItr;
+ ++nCount;
+ }
+ break;
+ case CTF_SC_NUMBERFORMAT :
+ {
+ if (aItr->maValue >>= nNumberFormat)
+ addDataStyle(nNumberFormat);
+ ++aItr;
+ ++nCount;
+ }
+ break;
+ default:
+ {
+ ++aItr;
+ ++nCount;
+ }
+ break;
+ }
+ }
+ else
+ {
+ ++aItr;
+ ++nCount;
+ }
+ }
+ if (nCount == 1) // this is the CellStyle and should be removed if alone
+ xPropStates.clear();
+ if (nNumberFormat == -1)
+ xProperties->getPropertyValue(SC_NUMBERFORMAT) >>= nNumberFormat;
+ if (sStyleName.getLength())
+ {
+ if (xPropStates.size())
+ {
+ sal_Int32 nIndex;
+ if (pOldName)
+ {
+ if (GetAutoStylePool()->AddNamed(*pOldName, XML_STYLE_FAMILY_TABLE_CELL, sStyleName, xPropStates))
+ {
+ GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TABLE_CELL, *pOldName);
+ // add to pCellStyles, so the name is found for normal sheets
+ rtl::OUString* pTemp(new rtl::OUString(*pOldName));
+ if (!pCellStyles->AddStyleName(pTemp, nIndex))
+ delete pTemp;
+ }
+ }
+ else
+ {
+ rtl::OUString sName;
+ sal_Bool bIsAutoStyle(sal_True);
+ if (GetAutoStylePool()->Add(sName, XML_STYLE_FAMILY_TABLE_CELL, sStyleName, xPropStates))
+ {
+ rtl::OUString* pTemp(new rtl::OUString(sName));
+ if (!pCellStyles->AddStyleName(pTemp, nIndex))
+ delete pTemp;
+ }
+ else
+ nIndex = pCellStyles->GetIndexOfStyleName(sName, SC_SCELLPREFIX, bIsAutoStyle);
+
+ uno::Sequence<table::CellRangeAddress> aAddresses(xCellRanges->getRangeAddresses());
+ table::CellRangeAddress* pAddresses(aAddresses.getArray());
+ sal_Bool bGetMerge(sal_True);
+ for (sal_Int32 i = 0; i < aAddresses.getLength(); ++i, ++pAddresses)
+ {
+ pSharedData->SetLastColumn(nTable, pAddresses->EndColumn);
+ pSharedData->SetLastRow(nTable, pAddresses->EndRow);
+ pCellStyles->AddRangeStyleName(*pAddresses, nIndex, bIsAutoStyle, nValidationIndex, nNumberFormat);
+ if (bGetMerge)
+ bGetMerge = GetMerged(pAddresses, xTable);
+ }
+ }
+ }
+ else
+ {
+ rtl::OUString* pTemp(new rtl::OUString(EncodeStyleName(sStyleName)));
+ sal_Int32 nIndex(0);
+ if (!pCellStyles->AddStyleName(pTemp, nIndex, sal_False))
+ {
+ delete pTemp;
+ pTemp = NULL;
+ }
+ if ( !pOldName )
+ {
+ uno::Sequence<table::CellRangeAddress> aAddresses(xCellRanges->getRangeAddresses());
+ table::CellRangeAddress* pAddresses(aAddresses.getArray());
+ sal_Bool bGetMerge(sal_True);
+ for (sal_Int32 i = 0; i < aAddresses.getLength(); ++i, ++pAddresses)
+ {
+ if (bGetMerge)
+ bGetMerge = GetMerged(pAddresses, xTable);
+ pCellStyles->AddRangeStyleName(*pAddresses, nIndex, sal_False, nValidationIndex, nNumberFormat);
+ if (!sStyleName.equalsAsciiL("Default", 7) || nValidationIndex != -1)
+ {
+ pSharedData->SetLastColumn(nTable, pAddresses->EndColumn);
+ pSharedData->SetLastRow(nTable, pAddresses->EndRow);
+ }
+ }
+ }
+ }
+ }
+}
+
+void ScXMLExport::AddStyleFromColumn(const uno::Reference<beans::XPropertySet>& xColumnProperties,
+ const rtl::OUString* pOldName, sal_Int32& rIndex, sal_Bool& rIsVisible)
+{
+ rtl::OUString SC_SCOLUMNPREFIX(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_PREFIX));
+
+ std::vector<XMLPropertyState> xPropStates(xColumnStylesExportPropertySetMapper->Filter(xColumnProperties));
+ if(xPropStates.size())
+ {
+ std::vector< XMLPropertyState >::iterator aItr(xPropStates.begin());
+ std::vector< XMLPropertyState >::iterator aEndItr(xPropStates.end());
+ while (aItr != aEndItr)
+ {
+ if (xColumnStylesPropertySetMapper->GetEntryContextId(aItr->mnIndex) == CTF_SC_ISVISIBLE)
+ {
+ aItr->maValue >>= rIsVisible;
+ break;
+ }
+ ++aItr;
+ }
+
+ rtl::OUString sParent;
+ if (pOldName)
+ {
+ if (GetAutoStylePool()->AddNamed(*pOldName, XML_STYLE_FAMILY_TABLE_COLUMN, sParent, xPropStates))
+ {
+ GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TABLE_COLUMN, *pOldName);
+ // add to pColumnStyles, so the name is found for normal sheets
+ rtl::OUString* pTemp(new rtl::OUString(*pOldName));
+ rIndex = pColumnStyles->AddStyleName(pTemp);
+ }
+ }
+ else
+ {
+ rtl::OUString sName;
+ if (GetAutoStylePool()->Add(sName, XML_STYLE_FAMILY_TABLE_COLUMN, sParent, xPropStates))
+ {
+ rtl::OUString* pTemp(new rtl::OUString(sName));
+ rIndex = pColumnStyles->AddStyleName(pTemp);
+ }
+ else
+ rIndex = pColumnStyles->GetIndexOfStyleName(sName, SC_SCOLUMNPREFIX);
+ }
+ }
+}
+
+void ScXMLExport::AddStyleFromRow(const uno::Reference<beans::XPropertySet>& xRowProperties,
+ const rtl::OUString* pOldName, sal_Int32& rIndex)
+{
+ rtl::OUString SC_SROWPREFIX(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_ROW_STYLES_PREFIX));
+
+ std::vector<XMLPropertyState> xPropStates(xRowStylesExportPropertySetMapper->Filter(xRowProperties));
+ if(xPropStates.size())
+ {
+ rtl::OUString sParent;
+ if (pOldName)
+ {
+ if (GetAutoStylePool()->AddNamed(*pOldName, XML_STYLE_FAMILY_TABLE_ROW, sParent, xPropStates))
+ {
+ GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TABLE_ROW, *pOldName);
+ // add to pRowStyles, so the name is found for normal sheets
+ rtl::OUString* pTemp(new rtl::OUString(*pOldName));
+ rIndex = pRowStyles->AddStyleName(pTemp);
+ }
+ }
+ else
+ {
+ rtl::OUString sName;
+ if (GetAutoStylePool()->Add(sName, XML_STYLE_FAMILY_TABLE_ROW, sParent, xPropStates))
+ {
+ rtl::OUString* pTemp(new rtl::OUString(sName));
+ rIndex = pRowStyles->AddStyleName(pTemp);
+ }
+ else
+ rIndex = pRowStyles->GetIndexOfStyleName(sName, SC_SROWPREFIX);
+ }
+ }
+}
+
+uno::Any lcl_GetEnumerated( uno::Reference<container::XEnumerationAccess> xEnumAccess, sal_Int32 nIndex )
+{
+ uno::Any aRet;
+ uno::Reference<container::XEnumeration> xEnum( xEnumAccess->createEnumeration() );
+ try
+ {
+ sal_Int32 nSkip = nIndex;
+ while ( nSkip > 0 )
+ {
+ (void) xEnum->nextElement();
+ --nSkip;
+ }
+ aRet = xEnum->nextElement();
+ }
+ catch (container::NoSuchElementException&)
+ {
+ // leave aRet empty
+ }
+ return aRet;
+}
+
void ScXMLExport::_ExportAutoStyles()
{
if (GetModel().is())
@@ -1741,6 +2141,272 @@ void ScXMLExport::_ExportAutoStyles()
{
if (getExportFlags() & EXPORT_CONTENT)
{
+ // re-create automatic styles with old names from stored data
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(xSpreadDoc)->GetSheetSaveData();
+ if (pSheetData && pDoc)
+ {
+ // formulas have to be calculated now, to detect changed results
+ // (during normal save, they will be calculated anyway)
+ SCTAB nTabCount = pDoc->GetTableCount();
+ for (SCTAB nTab=0; nTab<nTabCount; ++nTab)
+ if (pDoc->IsStreamValid(nTab))
+ {
+ ScCellIterator aIter( pDoc, 0,0,nTab, MAXCOL,MAXROW,nTab );
+ ScBaseCell* pCell = aIter.GetFirst();
+ while (pCell)
+ {
+ if (pCell->GetCellType() == CELLTYPE_FORMULA)
+ static_cast<ScFormulaCell*>(pCell)->IsValue(); // interpret if dirty
+ pCell = aIter.GetNext();
+ }
+ }
+
+ // stored cell styles
+ const std::vector<ScCellStyleEntry>& rCellEntries = pSheetData->GetCellStyles();
+ std::vector<ScCellStyleEntry>::const_iterator aCellIter = rCellEntries.begin();
+ std::vector<ScCellStyleEntry>::const_iterator aCellEnd = rCellEntries.end();
+ while (aCellIter != aCellEnd)
+ {
+ ScAddress aPos = aCellIter->maCellPos;
+ sal_Int32 nTable = aPos.Tab();
+ bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) );
+ if (bCopySheet)
+ {
+ uno::Reference <sheet::XSpreadsheet> xTable(xIndex->getByIndex(nTable), uno::UNO_QUERY);
+ uno::Reference <beans::XPropertySet> xProperties(
+ xTable->getCellByPosition( aPos.Col(), aPos.Row() ), uno::UNO_QUERY );
+
+ AddStyleFromCells(xProperties, xTable, nTable, &aCellIter->maName);
+ }
+ ++aCellIter;
+ }
+
+ // stored column styles
+ const std::vector<ScCellStyleEntry>& rColumnEntries = pSheetData->GetColumnStyles();
+ std::vector<ScCellStyleEntry>::const_iterator aColumnIter = rColumnEntries.begin();
+ std::vector<ScCellStyleEntry>::const_iterator aColumnEnd = rColumnEntries.end();
+ while (aColumnIter != aColumnEnd)
+ {
+ ScAddress aPos = aColumnIter->maCellPos;
+ sal_Int32 nTable = aPos.Tab();
+ bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) );
+ if (bCopySheet)
+ {
+ uno::Reference<table::XColumnRowRange> xColumnRowRange(xIndex->getByIndex(nTable), uno::UNO_QUERY);
+ uno::Reference<table::XTableColumns> xTableColumns(xColumnRowRange->getColumns());
+ uno::Reference<beans::XPropertySet> xColumnProperties(xTableColumns->getByIndex( aPos.Col() ), uno::UNO_QUERY);
+
+ sal_Int32 nIndex(-1);
+ sal_Bool bIsVisible(sal_True);
+ AddStyleFromColumn( xColumnProperties, &aColumnIter->maName, nIndex, bIsVisible );
+ }
+ ++aColumnIter;
+ }
+
+ // stored row styles
+ const std::vector<ScCellStyleEntry>& rRowEntries = pSheetData->GetRowStyles();
+ std::vector<ScCellStyleEntry>::const_iterator aRowIter = rRowEntries.begin();
+ std::vector<ScCellStyleEntry>::const_iterator aRowEnd = rRowEntries.end();
+ while (aRowIter != aRowEnd)
+ {
+ ScAddress aPos = aRowIter->maCellPos;
+ sal_Int32 nTable = aPos.Tab();
+ bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) );
+ if (bCopySheet)
+ {
+ uno::Reference<table::XColumnRowRange> xColumnRowRange(xIndex->getByIndex(nTable), uno::UNO_QUERY);
+ uno::Reference<table::XTableRows> xTableRows(xColumnRowRange->getRows());
+ uno::Reference<beans::XPropertySet> xRowProperties(xTableRows->getByIndex( aPos.Row() ), uno::UNO_QUERY);
+
+ sal_Int32 nIndex(-1);
+ AddStyleFromRow( xRowProperties, &aRowIter->maName, nIndex );
+ }
+ ++aRowIter;
+ }
+
+ // stored table styles
+ const std::vector<ScCellStyleEntry>& rTableEntries = pSheetData->GetTableStyles();
+ std::vector<ScCellStyleEntry>::const_iterator aTableIter = rTableEntries.begin();
+ std::vector<ScCellStyleEntry>::const_iterator aTableEnd = rTableEntries.end();
+ while (aTableIter != aTableEnd)
+ {
+ ScAddress aPos = aTableIter->maCellPos;
+ sal_Int32 nTable = aPos.Tab();
+ bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) );
+ if (bCopySheet)
+ {
+ //! separate method AddStyleFromTable needed?
+ uno::Reference<beans::XPropertySet> xTableProperties(xIndex->getByIndex(nTable), uno::UNO_QUERY);
+ if (xTableProperties.is())
+ {
+ std::vector<XMLPropertyState> xPropStates(xTableStylesExportPropertySetMapper->Filter(xTableProperties));
+ rtl::OUString sParent;
+ rtl::OUString sName( aTableIter->maName );
+ GetAutoStylePool()->AddNamed(sName, XML_STYLE_FAMILY_TABLE_TABLE, sParent, xPropStates);
+ GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TABLE_TABLE, sName);
+ }
+ }
+ ++aTableIter;
+ }
+
+ // stored styles for notes
+
+ UniReference<SvXMLExportPropertyMapper> xShapeMapper = XMLShapeExport::CreateShapePropMapper( *this );
+ GetShapeExport(); // make sure the graphics styles family is added
+
+ const std::vector<ScNoteStyleEntry>& rNoteEntries = pSheetData->GetNoteStyles();
+ std::vector<ScNoteStyleEntry>::const_iterator aNoteIter = rNoteEntries.begin();
+ std::vector<ScNoteStyleEntry>::const_iterator aNoteEnd = rNoteEntries.end();
+ while (aNoteIter != aNoteEnd)
+ {
+ ScAddress aPos = aNoteIter->maCellPos;
+ sal_Int32 nTable = aPos.Tab();
+ bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) );
+ if (bCopySheet)
+ {
+ //! separate method AddStyleFromNote needed?
+
+ ScPostIt* pNote = pDoc->GetNote( aPos );
+ DBG_ASSERT( pNote, "note not found" );
+ if (pNote)
+ {
+ SdrCaptionObj* pDrawObj = pNote->GetOrCreateCaption( aPos );
+ // all uno shapes are created anyway in CollectSharedData
+ uno::Reference<beans::XPropertySet> xShapeProperties( pDrawObj->getUnoShape(), uno::UNO_QUERY );
+ if (xShapeProperties.is())
+ {
+ if ( aNoteIter->maStyleName.getLength() )
+ {
+ std::vector<XMLPropertyState> xPropStates(xShapeMapper->Filter(xShapeProperties));
+ rtl::OUString sParent;
+ rtl::OUString sName( aNoteIter->maStyleName );
+ GetAutoStylePool()->AddNamed(sName, XML_STYLE_FAMILY_SD_GRAPHICS_ID, sParent, xPropStates);
+ GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_SD_GRAPHICS_ID, sName);
+ }
+ if ( aNoteIter->maTextStyle.getLength() )
+ {
+ std::vector<XMLPropertyState> xPropStates(
+ GetTextParagraphExport()->GetParagraphPropertyMapper()->Filter(xShapeProperties));
+ rtl::OUString sParent;
+ rtl::OUString sName( aNoteIter->maTextStyle );
+ GetAutoStylePool()->AddNamed(sName, XML_STYLE_FAMILY_TEXT_PARAGRAPH, sParent, xPropStates);
+ GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TEXT_PARAGRAPH, sName);
+ }
+ }
+ }
+ }
+ ++aNoteIter;
+ }
+
+ // note paragraph styles
+
+ //UniReference<SvXMLExportPropertyMapper> xParaPropMapper = XMLTextParagraphExport::CreateParaExtPropMapper( *this );
+ UniReference<SvXMLExportPropertyMapper> xParaPropMapper = GetTextParagraphExport()->GetParagraphPropertyMapper();
+
+ const std::vector<ScTextStyleEntry>& rNoteParaEntries = pSheetData->GetNoteParaStyles();
+ std::vector<ScTextStyleEntry>::const_iterator aNoteParaIter = rNoteParaEntries.begin();
+ std::vector<ScTextStyleEntry>::const_iterator aNoteParaEnd = rNoteParaEntries.end();
+ while (aNoteParaIter != aNoteParaEnd)
+ {
+ ScAddress aPos = aNoteParaIter->maCellPos;
+ sal_Int32 nTable = aPos.Tab();
+ bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) );
+ if (bCopySheet)
+ {
+ ScPostIt* pNote = pDoc->GetNote( aPos );
+ DBG_ASSERT( pNote, "note not found" );
+ if (pNote)
+ {
+ SdrCaptionObj* pDrawObj = pNote->GetOrCreateCaption( aPos );
+ uno::Reference<container::XEnumerationAccess> xCellText(pDrawObj->getUnoShape(), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xParaProp(
+ lcl_GetEnumerated( xCellText, aNoteParaIter->maSelection.nStartPara ), uno::UNO_QUERY );
+ if ( xParaProp.is() )
+ {
+ std::vector<XMLPropertyState> xPropStates(xParaPropMapper->Filter(xParaProp));
+ rtl::OUString sParent;
+ rtl::OUString sName( aNoteParaIter->maName );
+ GetAutoStylePool()->AddNamed(sName, XML_STYLE_FAMILY_TEXT_PARAGRAPH, sParent, xPropStates);
+ GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TEXT_PARAGRAPH, sName);
+ }
+ }
+ }
+ ++aNoteParaIter;
+ }
+
+ // note text styles
+
+ UniReference<SvXMLExportPropertyMapper> xTextPropMapper = XMLTextParagraphExport::CreateCharExtPropMapper( *this );
+
+ const std::vector<ScTextStyleEntry>& rNoteTextEntries = pSheetData->GetNoteTextStyles();
+ std::vector<ScTextStyleEntry>::const_iterator aNoteTextIter = rNoteTextEntries.begin();
+ std::vector<ScTextStyleEntry>::const_iterator aNoteTextEnd = rNoteTextEntries.end();
+ while (aNoteTextIter != aNoteTextEnd)
+ {
+ ScAddress aPos = aNoteTextIter->maCellPos;
+ sal_Int32 nTable = aPos.Tab();
+ bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) );
+ if (bCopySheet)
+ {
+ ScPostIt* pNote = pDoc->GetNote( aPos );
+ DBG_ASSERT( pNote, "note not found" );
+ if (pNote)
+ {
+ SdrCaptionObj* pDrawObj = pNote->GetOrCreateCaption( aPos );
+ uno::Reference<text::XSimpleText> xCellText(pDrawObj->getUnoShape(), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xCursorProp(xCellText->createTextCursor(), uno::UNO_QUERY);
+ ScDrawTextCursor* pCursor = ScDrawTextCursor::getImplementation( xCursorProp );
+ if (pCursor)
+ {
+ pCursor->SetSelection( aNoteTextIter->maSelection );
+
+ std::vector<XMLPropertyState> xPropStates(xTextPropMapper->Filter(xCursorProp));
+ rtl::OUString sParent;
+ rtl::OUString sName( aNoteTextIter->maName );
+ GetAutoStylePool()->AddNamed(sName, XML_STYLE_FAMILY_TEXT_TEXT, sParent, xPropStates);
+ GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TEXT_TEXT, sName);
+ }
+ }
+ }
+ ++aNoteTextIter;
+ }
+
+ // stored text styles
+
+ //UniReference<SvXMLExportPropertyMapper> xTextPropMapper = XMLTextParagraphExport::CreateCharExtPropMapper( *this );
+
+ const std::vector<ScTextStyleEntry>& rTextEntries = pSheetData->GetTextStyles();
+ std::vector<ScTextStyleEntry>::const_iterator aTextIter = rTextEntries.begin();
+ std::vector<ScTextStyleEntry>::const_iterator aTextEnd = rTextEntries.end();
+ while (aTextIter != aTextEnd)
+ {
+ ScAddress aPos = aTextIter->maCellPos;
+ sal_Int32 nTable = aPos.Tab();
+ bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) );
+ if (bCopySheet)
+ {
+ //! separate method AddStyleFromText needed?
+ //! cache sheet object
+
+ uno::Reference<table::XCellRange> xCellRange(xIndex->getByIndex(nTable), uno::UNO_QUERY);
+ uno::Reference<text::XSimpleText> xCellText(xCellRange->getCellByPosition(aPos.Col(), aPos.Row()), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xCursorProp(xCellText->createTextCursor(), uno::UNO_QUERY);
+ ScCellTextCursor* pCursor = ScCellTextCursor::getImplementation( xCursorProp );
+ if (pCursor)
+ {
+ pCursor->SetSelection( aTextIter->maSelection );
+
+ std::vector<XMLPropertyState> xPropStates(xTextPropMapper->Filter(xCursorProp));
+ rtl::OUString sParent;
+ rtl::OUString sName( aTextIter->maName );
+ GetAutoStylePool()->AddNamed(sName, XML_STYLE_FAMILY_TEXT_TEXT, sParent, xPropStates);
+ GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TEXT_TEXT, sName);
+ }
+ }
+ ++aTextIter;
+ }
+ }
+
ExportExternalRefCacheStyles();
if (!pSharedData)
@@ -1751,18 +2417,18 @@ void ScXMLExport::_ExportAutoStyles()
CollectSharedData(nTableCount, nShapesCount, nCellCount);
//DBG_ERROR("no shared data setted");
}
- rtl::OUString SC_SCOLUMNPREFIX(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_PREFIX));
- rtl::OUString SC_SROWPREFIX(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_ROW_STYLES_PREFIX));
- rtl::OUString SC_SCELLPREFIX(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_CELL_STYLES_PREFIX));
- rtl::OUString SC_NUMBERFORMAT(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_NUMFMT));
sal_Int32 nTableCount(xIndex->getCount());
pCellStyles->AddNewTable(nTableCount - 1);
CollectShapesAutoStyles(nTableCount);
for (sal_Int32 nTable = 0; nTable < nTableCount; ++nTable)
{
+ bool bUseStream = pSheetData && pDoc && pDoc->IsStreamValid((SCTAB)nTable) &&
+ pSheetData->HasStreamPos(nTable) && xSourceStream.is();
+
uno::Reference <sheet::XSpreadsheet> xTable(xIndex->getByIndex(nTable), uno::UNO_QUERY);
if (xTable.is())
{
+ // table styles array must be complete, including copied tables - Add should find the stored style
uno::Reference<beans::XPropertySet> xTableProperties(xTable, uno::UNO_QUERY);
if (xTableProperties.is())
{
@@ -1775,7 +2441,11 @@ void ScXMLExport::_ExportAutoStyles()
aTableStyles.push_back(sName);
}
}
- uno::Reference<sheet::XUniqueCellFormatRangesSupplier> xCellFormatRanges ( xTableProperties, uno::UNO_QUERY );
+ }
+ // collect other auto-styles only for non-copied sheets
+ if (xTable.is() && !bUseStream)
+ {
+ uno::Reference<sheet::XUniqueCellFormatRangesSupplier> xCellFormatRanges ( xTable, uno::UNO_QUERY );
if ( xCellFormatRanges.is() )
{
uno::Reference<container::XIndexAccess> xFormatRangesIndex(xCellFormatRanges->getUniqueCellFormatRanges());
@@ -1791,123 +2461,14 @@ void ScXMLExport::_ExportAutoStyles()
uno::Reference <beans::XPropertySet> xProperties (xCellRanges, uno::UNO_QUERY);
if (xProperties.is())
{
- rtl::OUString sStyleName;
- sal_Int32 nNumberFormat(-1);
- sal_Int32 nValidationIndex(-1);
- std::vector< XMLPropertyState > xPropStates(xCellStylesExportPropertySetMapper->Filter( xProperties ));
- std::vector< XMLPropertyState >::iterator aItr(xPropStates.begin());
- std::vector< XMLPropertyState >::iterator aEndItr(xPropStates.end());
- sal_Int32 nCount(0);
- while (aItr != aEndItr)
- {
- if (aItr->mnIndex != -1)
- {
- switch (xCellStylesPropertySetMapper->GetEntryContextId(aItr->mnIndex))
- {
- case CTF_SC_VALIDATION :
- {
- pValidationsContainer->AddValidation(aItr->maValue, nValidationIndex);
- // this is not very slow, because it is most the last property or
- // if it is not the last property it is the property before the last property,
- // so in the worst case only one property has to be copied, but in the best case no
- // property has to be copied
- aItr = xPropStates.erase(aItr);
- aEndItr = xPropStates.end(); // #120346# old aEndItr is invalidated!
- }
- break;
- case CTF_SC_CELLSTYLE :
- {
- aItr->maValue >>= sStyleName;
- aItr->mnIndex = -1;
- ++aItr;
- ++nCount;
- }
- break;
- case CTF_SC_NUMBERFORMAT :
- {
- if (aItr->maValue >>= nNumberFormat)
- addDataStyle(nNumberFormat);
- ++aItr;
- ++nCount;
- }
- break;
- default:
- {
- ++aItr;
- ++nCount;
- }
- break;
- }
- }
- else
- {
- ++aItr;
- ++nCount;
- }
- }
- if (nCount == 1) // this is the CellStyle and should be removed if alone
- xPropStates.clear();
- if (nNumberFormat == -1)
- xProperties->getPropertyValue(SC_NUMBERFORMAT) >>= nNumberFormat;
- if (sStyleName.getLength())
- {
- if (xPropStates.size())
- {
- sal_Int32 nIndex;
- rtl::OUString sName;
- sal_Bool bIsAutoStyle(sal_True);
- if (GetAutoStylePool()->Add(sName, XML_STYLE_FAMILY_TABLE_CELL, sStyleName, xPropStates))
- {
- rtl::OUString* pTemp(new rtl::OUString(sName));
- if (!pCellStyles->AddStyleName(pTemp, nIndex))
- delete pTemp;
- }
- else
- nIndex = pCellStyles->GetIndexOfStyleName(sName, SC_SCELLPREFIX, bIsAutoStyle);
- uno::Sequence<table::CellRangeAddress> aAddresses(xCellRanges->getRangeAddresses());
- table::CellRangeAddress* pAddresses(aAddresses.getArray());
- sal_Bool bGetMerge(sal_True);
- for (sal_Int32 i = 0; i < aAddresses.getLength(); ++i, ++pAddresses)
- {
- pSharedData->SetLastColumn(nTable, pAddresses->EndColumn);
- pSharedData->SetLastRow(nTable, pAddresses->EndRow);
- pCellStyles->AddRangeStyleName(*pAddresses, nIndex, bIsAutoStyle, nValidationIndex, nNumberFormat);
- if (bGetMerge)
- bGetMerge = GetMerged(pAddresses, xTable);
- }
- }
- else
- {
- rtl::OUString* pTemp(new rtl::OUString(EncodeStyleName(sStyleName)));
- sal_Int32 nIndex(0);
- if (!pCellStyles->AddStyleName(pTemp, nIndex, sal_False))
- {
- delete pTemp;
- pTemp = NULL;
- }
- uno::Sequence<table::CellRangeAddress> aAddresses(xCellRanges->getRangeAddresses());
- table::CellRangeAddress* pAddresses(aAddresses.getArray());
- sal_Bool bGetMerge(sal_True);
- for (sal_Int32 i = 0; i < aAddresses.getLength(); ++i, ++pAddresses)
- {
- if (bGetMerge)
- bGetMerge = GetMerged(pAddresses, xTable);
- pCellStyles->AddRangeStyleName(*pAddresses, nIndex, sal_False, nValidationIndex, nNumberFormat);
- if (!sStyleName.equalsAsciiL("Default", 7) || nValidationIndex != -1)
- {
- pSharedData->SetLastColumn(nTable, pAddresses->EndColumn);
- pSharedData->SetLastRow(nTable, pAddresses->EndRow);
- }
- }
- }
- }
+ AddStyleFromCells(xProperties, xTable, nTable, NULL);
IncrementProgressBar(sal_False);
}
}
}
}
}
- uno::Reference<table::XColumnRowRange> xColumnRowRange (xTableProperties, uno::UNO_QUERY);
+ uno::Reference<table::XColumnRowRange> xColumnRowRange (xTable, uno::UNO_QUERY);
if (xColumnRowRange.is())
{
if (pDoc)
@@ -1935,31 +2496,9 @@ void ScXMLExport::_ExportAutoStyles()
uno::Reference <beans::XPropertySet> xColumnProperties(xTableColumns->getByIndex(nColumn), uno::UNO_QUERY);
if (xColumnProperties.is())
{
- std::vector<XMLPropertyState> xPropStates(xColumnStylesExportPropertySetMapper->Filter(xColumnProperties));
- if(xPropStates.size())
- {
- std::vector< XMLPropertyState >::iterator aItr(xPropStates.begin());
- std::vector< XMLPropertyState >::iterator aEndItr(xPropStates.end());
- while (aItr != aEndItr)
- {
- if (xColumnStylesPropertySetMapper->GetEntryContextId(aItr->mnIndex) == CTF_SC_ISVISIBLE)
- {
- aItr->maValue >>= bIsVisible;
- break;
- }
- ++aItr;
- }
- rtl::OUString sParent;
- rtl::OUString sName;
- if (GetAutoStylePool()->Add(sName, XML_STYLE_FAMILY_TABLE_COLUMN, sParent, xPropStates))
- {
- rtl::OUString* pTemp(new rtl::OUString(sName));
- nIndex = pColumnStyles->AddStyleName(pTemp);
- }
- else
- nIndex = pColumnStyles->GetIndexOfStyleName(sName, SC_SCOLUMNPREFIX);
- pColumnStyles->AddFieldStyleName(nTable, nColumn, nIndex, bIsVisible);
- }
+ AddStyleFromColumn( xColumnProperties, NULL, nIndex, bIsVisible );
+ //if(xPropStates.size())
+ pColumnStyles->AddFieldStyleName(nTable, nColumn, nIndex, bIsVisible);
}
sal_Int32 nOld(nColumn);
nColumn = pDoc->GetNextDifferentChangedCol(sal::static_int_cast<SCTAB>(nTable), static_cast<USHORT>(nColumn));
@@ -1996,20 +2535,9 @@ void ScXMLExport::_ExportAutoStyles()
uno::Reference <beans::XPropertySet> xRowProperties(xTableRows->getByIndex(nRow), uno::UNO_QUERY);
if(xRowProperties.is())
{
- std::vector<XMLPropertyState> xPropStates(xRowStylesExportPropertySetMapper->Filter(xRowProperties));
- if(xPropStates.size())
- {
- rtl::OUString sParent;
- rtl::OUString sName;
- if (GetAutoStylePool()->Add(sName, XML_STYLE_FAMILY_TABLE_ROW, sParent, xPropStates))
- {
- rtl::OUString* pTemp(new rtl::OUString(sName));
- nIndex = pRowStyles->AddStyleName(pTemp);
- }
- else
- nIndex = pRowStyles->GetIndexOfStyleName(sName, SC_SROWPREFIX);
- pRowStyles->AddFieldStyleName(nTable, nRow, nIndex);
- }
+ AddStyleFromRow( xRowProperties, NULL, nIndex );
+ //if(xPropStates.size())
+ pRowStyles->AddFieldStyleName(nTable, nRow, nIndex);
}
sal_Int32 nOld(nRow);
nRow = pDoc->GetNextDifferentChangedRow(sal::static_int_cast<SCTAB>(nTable), static_cast<USHORT>(nRow), false);
@@ -2025,7 +2553,7 @@ void ScXMLExport::_ExportAutoStyles()
}
}
}
- uno::Reference<sheet::XCellRangesQuery> xCellRangesQuery (xTableProperties, uno::UNO_QUERY);
+ uno::Reference<sheet::XCellRangesQuery> xCellRangesQuery (xTable, uno::UNO_QUERY);
if (xCellRangesQuery.is())
{
uno::Reference<sheet::XSheetCellRanges> xSheetCellRanges(xCellRangesQuery->queryContentCells(sheet::CellFlags::FORMATTED));
@@ -3374,7 +3902,7 @@ void ScXMLExport::WriteExternalRefCaches()
return;
ScExternalRefManager* pRefMgr = pDoc->GetExternalRefManager();
- pRefMgr->resetSrcFileData();
+ pRefMgr->resetSrcFileData(GetOrigFileName());
sal_uInt16 nCount = pRefMgr->getExternalFileCount();
for (sal_uInt16 nFileId = 0; nFileId < nCount; ++nFileId)
{
diff --git a/sc/source/filter/xml/xmlexprt.hxx b/sc/source/filter/xml/xmlexprt.hxx
index d38bd7b23970..b71886c1871e 100644
--- a/sc/source/filter/xml/xmlexprt.hxx
+++ b/sc/source/filter/xml/xmlexprt.hxx
@@ -38,6 +38,10 @@
#include <com/sun/star/drawing/XShapes.hpp>
#include <com/sun/star/table/XCellRange.hpp>
+namespace com { namespace sun { namespace star {
+ namespace beans { class XPropertySet; }
+} } }
+
#include <hash_map>
class ScOutlineArray;
@@ -72,6 +76,9 @@ class ScXMLExport : public SvXMLExport
com::sun::star::uno::Reference <com::sun::star::sheet::XSpreadsheet> xCurrentTable;
com::sun::star::uno::Reference <com::sun::star::table::XCellRange> xCurrentTableCellRange;
+ com::sun::star::uno::Reference<com::sun::star::io::XInputStream> xSourceStream;
+ sal_Int32 nSourceStreamPos;
+
UniReference < XMLPropertyHandlerFactory > xScPropHdlFactory;
UniReference < XMLPropertySetMapper > xCellStylesPropertySetMapper;
UniReference < XMLPropertySetMapper > xColumnStylesPropertySetMapper;
@@ -139,7 +146,7 @@ class ScXMLExport : public SvXMLExport
void CollectInternalShape( ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape );
- com::sun::star::table::CellRangeAddress GetEndAddress(com::sun::star::uno::Reference<com::sun::star::sheet::XSpreadsheet>& xTable,
+ com::sun::star::table::CellRangeAddress GetEndAddress(const com::sun::star::uno::Reference<com::sun::star::sheet::XSpreadsheet>& xTable,
const sal_Int32 nTable);
// ScMyEmptyDatabaseRangesContainer GetEmptyDatabaseRanges();
void GetAreaLinks( com::sun::star::uno::Reference< com::sun::star::sheet::XSpreadsheetDocument>& xSpreadDoc, ScMyAreaLinksContainer& rAreaLinks );
@@ -207,7 +214,21 @@ class ScXMLExport : public SvXMLExport
void CollectUserDefinedNamespaces(const SfxItemPool* pPool, sal_uInt16 nAttrib);
+ void AddStyleFromCells(
+ const com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet >& xProperties,
+ const com::sun::star::uno::Reference< com::sun::star::sheet::XSpreadsheet >& xTable,
+ sal_Int32 nTable, const rtl::OUString* pOldName );
+ void AddStyleFromColumn(
+ const com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet >& xColumnProperties,
+ const rtl::OUString* pOldName, sal_Int32& rIndex, sal_Bool& rIsVisible );
+ void AddStyleFromRow(
+ const com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet >& xRowProperties,
+ const rtl::OUString* pOldName, sal_Int32& rIndex );
+
void IncrementProgressBar(sal_Bool bEditCell, sal_Int32 nInc = 1);
+
+ void CopySourceStream( sal_Int32 nStartOffset, sal_Int32 nEndOffset, sal_Int32& rNewStart, sal_Int32& rNewEnd );
+
protected:
virtual SvXMLAutoStylePoolP* CreateAutoStylePool();
virtual XMLPageExport* CreatePageExport();
@@ -234,6 +255,8 @@ public:
UniReference < XMLPropertySetMapper > GetCellStylesPropertySetMapper() { return xCellStylesPropertySetMapper; }
UniReference < XMLPropertySetMapper > GetTableStylesPropertySetMapper() { return xTableStylesPropertySetMapper; }
+ void SetSourceStream( const com::sun::star::uno::Reference<com::sun::star::io::XInputStream>& xNewStream );
+
void GetChangeTrackViewSettings(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& rProps);
virtual void GetViewSettings(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& rProps);
virtual void GetConfigurationSettings(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& rProps);
diff --git a/sc/source/filter/xml/xmlexternaltabi.cxx b/sc/source/filter/xml/xmlexternaltabi.cxx
index 7eabdff07b9b..b53431843a57 100644
--- a/sc/source/filter/xml/xmlexternaltabi.cxx
+++ b/sc/source/filter/xml/xmlexternaltabi.cxx
@@ -100,6 +100,32 @@ SvXMLImportContext* ScXMLExternalRefTabSourceContext::CreateChildContext(
return new SvXMLImportContext(GetImport(), nPrefix, rLocalName);
}
+/**
+ * Make sure the URL is a valid relative URL, mainly to avoid storing
+ * absolute URL as relative URL by accident. For now, we only check the first
+ * three characters which are assumed to be always '../', because the relative
+ * URL for an external document is always in reference to the content.xml
+ * fragment of the original document.
+ */
+static bool lcl_isValidRelativeURL(const OUString& rUrl)
+{
+ sal_Int32 n = ::std::min( rUrl.getLength(), static_cast<sal_Int32>(3));
+ if (n < 3)
+ return false;
+ const sal_Unicode* p = rUrl.getStr();
+ for (sal_Int32 i = 0; i < n; ++i)
+ {
+ sal_Unicode c = p[i];
+ if (i < 2 && c != '.')
+ // the path must begin with '..'
+ return false;
+ else if (i == 2 && c != '/')
+ // a '/' path separator must follow
+ return false;
+ }
+ return true;
+}
+
void ScXMLExternalRefTabSourceContext::EndElement()
{
ScDocument* pDoc = mrScImport.GetDocument();
@@ -107,7 +133,7 @@ void ScXMLExternalRefTabSourceContext::EndElement()
return;
ScExternalRefManager* pRefMgr = pDoc->GetExternalRefManager();
- if (!maRelativeUrl.equals(mrExternalRefInfo.maFileUrl))
+ if (lcl_isValidRelativeURL(maRelativeUrl))
pRefMgr->setRelativeFileName(mrExternalRefInfo.mnFileId, maRelativeUrl);
pRefMgr->setFilterData(mrExternalRefInfo.mnFileId, maFilterName, maFilterOptions);
}
diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx
index f5662efd43b8..cfb91dd51856 100644
--- a/sc/source/filter/xml/xmlimprt.cxx
+++ b/sc/source/filter/xml/xmlimprt.cxx
@@ -71,6 +71,7 @@
#include "XMLChangeTrackingImportHelper.hxx"
#include "chgviset.hxx"
#include "XMLStylesImportHelper.hxx"
+#include "sheetdata.hxx"
#include "unonames.hxx"
#include "rangeutl.hxx"
#include "postit.hxx"
@@ -93,6 +94,7 @@
#include <com/sun/star/sheet/NamedRangeFlag.hpp>
#include <com/sun/star/sheet/XNamedRange.hpp>
#include <com/sun/star/sheet/XLabelRanges.hpp>
+#include <com/sun/star/io/XSeekable.hpp>
#define SC_LOCALE "Locale"
#define SC_STANDARDFORMAT "StandardFormat"
@@ -2439,6 +2441,20 @@ void ScXMLImport::SetStyleToRanges()
pStyle->FillPropertySet(xProperties);
sal_Int32 nNumberFormat(pStyle->GetNumberFormat());
SetType(xProperties, nNumberFormat, nPrevCellType, sPrevCurrency);
+
+ // store first cell of first range for each style, once per sheet
+ uno::Sequence<table::CellRangeAddress> aAddresses(xSheetCellRanges->getRangeAddresses());
+ if ( aAddresses.getLength() > 0 )
+ {
+ const table::CellRangeAddress& rRange = aAddresses[0];
+ if ( rRange.Sheet != pStyle->GetLastSheet() )
+ {
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetModel())->GetSheetSaveData();
+ pSheetData->AddCellStyle( sPrevStyleName,
+ ScAddress( (SCCOL)rRange.StartColumn, (SCROW)rRange.StartRow, (SCTAB)rRange.Sheet ) );
+ pStyle->SetLastSheet(rRange.Sheet);
+ }
+ }
}
else
{
@@ -2592,6 +2608,17 @@ throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeE
if ( ( nFlags & IMPORT_CONTENT ) && !( nFlags & IMPORT_STYLES ) )
ExamineDefaultStyle();
+ if (getImportFlags() & IMPORT_CONTENT)
+ {
+ if (GetModel().is())
+ {
+ // store initial namespaces, to find the ones that were added from the file later
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetModel())->GetSheetSaveData();
+ const SvXMLNamespaceMap& rNamespaces = GetNamespaceMap();
+ pSheetData->StoreInitialNamespaces(rNamespaces);
+ }
+ }
+
UnlockSolarMutex();
}
@@ -2795,6 +2822,19 @@ throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeE
GetProgressBarHelper()->End(); // make room for subsequent SfxProgressBars
if (pDoc)
pDoc->CompileXML();
+
+ if (pDoc && GetModel().is())
+ {
+ // set "valid stream" flags after loading (before UpdateRowHeights, so changed formula results
+ // in UpdateRowHeights can already clear the flags again)
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetModel())->GetSheetSaveData();
+
+ SCTAB nTabCount = pDoc->GetTableCount();
+ for (SCTAB nTab=0; nTab<nTabCount; ++nTab)
+ if (!pSheetData->IsSheetBlocked( nTab ))
+ pDoc->SetStreamValid( nTab, TRUE );
+ }
+
aTables.UpdateRowHeights();
aTables.ResizeShapes();
}
@@ -2854,6 +2894,16 @@ void ScXMLImport::UnlockSolarMutex()
}
}
+sal_Int32 ScXMLImport::GetByteOffset()
+{
+ sal_Int32 nOffset = -1;
+ uno::Reference<xml::sax::XLocator> xLocator = GetLocator();
+ uno::Reference<io::XSeekable> xSeek( xLocator, uno::UNO_QUERY ); //! should use different interface
+ if ( xSeek.is() )
+ nOffset = (sal_Int32)xSeek->getPosition();
+ return nOffset;
+}
+
void ScXMLImport::SetRangeOverflowType(sal_uInt32 nType)
{
// #i31130# Overflow is stored in the document, because the ScXMLImport object
diff --git a/sc/source/filter/xml/xmlimprt.hxx b/sc/source/filter/xml/xmlimprt.hxx
index d6851f41705c..0fb9aead0e4f 100644
--- a/sc/source/filter/xml/xmlimprt.hxx
+++ b/sc/source/filter/xml/xmlimprt.hxx
@@ -993,6 +993,8 @@ public:
void LockSolarMutex();
void UnlockSolarMutex();
+ sal_Int32 GetByteOffset();
+
void SetRangeOverflowType(sal_uInt32 nType);
sal_Int32 GetRangeType(const rtl::OUString sRangeType) const;
diff --git a/sc/source/filter/xml/xmlrowi.cxx b/sc/source/filter/xml/xmlrowi.cxx
index 079691944481..f62208cdd2ff 100644
--- a/sc/source/filter/xml/xmlrowi.cxx
+++ b/sc/source/filter/xml/xmlrowi.cxx
@@ -43,6 +43,7 @@
#include "document.hxx"
#include "docuno.hxx"
#include "olinetab.hxx"
+#include "sheetdata.hxx"
#include <xmloff/xmltkmap.hxx>
#include <xmloff/nmspmap.hxx>
@@ -170,6 +171,7 @@ void ScXMLTableRowContext::EndElement()
GetScImport().GetTables().AddRow();
DBG_ERRORFILE("it seems here is a nonvalid file; possible missing of table:table-cell element");
}
+ sal_Int32 nSheet = rXMLImport.GetTables().GetCurrentSheet();
sal_Int32 nCurrentRow(rXMLImport.GetTables().GetCurrentRow());
uno::Reference<sheet::XSpreadsheet> xSheet(rXMLImport.GetTables().GetCurrentXSheet());
if(xSheet.is())
@@ -196,7 +198,16 @@ void ScXMLTableRowContext::EndElement()
XMLTableStyleContext* pStyle((XMLTableStyleContext *)pStyles->FindStyleChildContext(
XML_STYLE_FAMILY_TABLE_ROW, sStyleName, sal_True));
if (pStyle)
+ {
pStyle->FillPropertySet(xRowProperties);
+
+ if ( nSheet != pStyle->GetLastSheet() )
+ {
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(rXMLImport.GetModel())->GetSheetSaveData();
+ pSheetData->AddRowStyle( sStyleName, ScAddress( 0, (SCROW)nFirstRow, (SCTAB)nSheet ) );
+ pStyle->SetLastSheet(nSheet);
+ }
+ }
}
}
sal_Bool bVisible (sal_True);
diff --git a/sc/source/filter/xml/xmlstyli.cxx b/sc/source/filter/xml/xmlstyli.cxx
index 79ba79f0e689..20158d1f13db 100644
--- a/sc/source/filter/xml/xmlstyli.cxx
+++ b/sc/source/filter/xml/xmlstyli.cxx
@@ -50,6 +50,11 @@
#include <tools/debug.hxx>
#include "XMLTableHeaderFooterContext.hxx"
#include "XMLConverter.hxx"
+#include "XMLTableShapeImportHelper.hxx"
+#include "sheetdata.hxx"
+#include "xmlannoi.hxx"
+#include "textuno.hxx"
+#include "cellsuno.hxx"
#include "docuno.hxx"
#include "unonames.hxx"
@@ -461,6 +466,7 @@ XMLTableStyleContext::XMLTableStyleContext( ScXMLImport& rImport,
sNumberFormat(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NumberFormat"))),
pStyles(&rStyles),
nNumberFormat(-1),
+ nLastSheet(-1),
bConditionalFormatCreated(sal_False),
bParentSet(sal_False)
{
@@ -609,15 +615,22 @@ sal_Int32 XMLTableStyleContext::GetNumberFormat()
}
return nNumberFormat;
}
+
// ----------------------------------------------------------------------------
SvXMLStyleContext *XMLTableStylesContext::CreateStyleStyleChildContext(
sal_uInt16 nFamily, sal_uInt16 nPrefix, const OUString& rLocalName,
const uno::Reference< xml::sax::XAttributeList > & xAttrList )
{
- SvXMLStyleContext *pStyle(SvXMLStylesContext::CreateStyleStyleChildContext( nFamily, nPrefix,
- rLocalName,
- xAttrList ));
+ SvXMLStyleContext *pStyle;
+ // use own wrapper for text and paragraph, to record style usage
+ if (nFamily == XML_STYLE_FAMILY_TEXT_PARAGRAPH || nFamily == XML_STYLE_FAMILY_TEXT_TEXT)
+ pStyle = new ScCellTextStyleContext( GetImport(), nPrefix, rLocalName,
+ xAttrList, *this, nFamily );
+ else
+ pStyle = SvXMLStylesContext::CreateStyleStyleChildContext(
+ nFamily, nPrefix, rLocalName, xAttrList );
+
if (!pStyle)
{
switch( nFamily )
@@ -1013,3 +1026,56 @@ void ScMasterPageContext::Finish( sal_Bool bOverwrite )
ClearContent(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_PAGE_RIGHTHDRCON)));
}
+// ---------------------------------------------------------------------------
+
+ScCellTextStyleContext::ScCellTextStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
+ const rtl::OUString& rLName, const uno::Reference<xml::sax::XAttributeList> & xAttrList,
+ SvXMLStylesContext& rStyles, sal_uInt16 nFamily, sal_Bool bDefaultStyle ) :
+ XMLTextStyleContext( rImport, nPrfx, rLName, xAttrList, rStyles, nFamily, bDefaultStyle ),
+ nLastSheet(-1)
+{
+}
+
+ScCellTextStyleContext::~ScCellTextStyleContext()
+{
+}
+
+void ScCellTextStyleContext::FillPropertySet( const uno::Reference<beans::XPropertySet>& xPropSet )
+{
+ XMLTextStyleContext::FillPropertySet( xPropSet );
+
+ ScXMLImport& rXMLImport = GetScImport();
+
+ ScCellTextCursor* pCellImp = ScCellTextCursor::getImplementation( xPropSet );
+ if (pCellImp)
+ {
+ ScAddress aPos = pCellImp->GetCellObj().GetPosition();
+ if ( static_cast<sal_Int32>(aPos.Tab()) != nLastSheet )
+ {
+ ESelection aSel = pCellImp->GetSelection();
+
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetImport().GetModel())->GetSheetSaveData();
+ pSheetData->AddTextStyle( GetName(), aPos, aSel );
+
+ nLastSheet = static_cast<sal_Int32>(aPos.Tab());
+ }
+ }
+ else if ( rXMLImport.GetTables().GetCurrentSheet() != nLastSheet )
+ {
+ ScDrawTextCursor* pDrawImp = ScDrawTextCursor::getImplementation( xPropSet );
+ if (pDrawImp)
+ {
+ XMLTableShapeImportHelper* pTableShapeImport = (XMLTableShapeImportHelper*)GetScImport().GetShapeImport().get();
+ ScXMLAnnotationContext* pAnnotationContext = pTableShapeImport->GetAnnotationContext();
+ if (pAnnotationContext)
+ {
+ pAnnotationContext->AddContentStyle( GetFamily(), GetName(), pDrawImp->GetSelection() );
+ nLastSheet = rXMLImport.GetTables().GetCurrentSheet();
+ }
+ }
+
+ // if it's a different shape, BlockSheet is called from XMLTableShapeImportHelper::finishShape
+ // formatted text in page headers/footers can be ignored
+ }
+}
+
diff --git a/sc/source/filter/xml/xmlstyli.hxx b/sc/source/filter/xml/xmlstyli.hxx
index 272ec0151134..c80ea8b5c92d 100644
--- a/sc/source/filter/xml/xmlstyli.hxx
+++ b/sc/source/filter/xml/xmlstyli.hxx
@@ -40,9 +40,12 @@
#include <xmloff/xmlimppr.hxx>
#include <xmloff/XMLTextMasterPageContext.hxx>
#include <xmloff/XMLTextMasterStylesContext.hxx>
+#include <xmloff/txtstyli.hxx>
#include <com/sun/star/sheet/ConditionOperator.hpp>
#include "xmlimprt.hxx"
+class ScSheetSaveData;
+
class ScXMLCellImportPropertyMapper : public SvXMLImportPropertyMapper
{
protected:
@@ -101,6 +104,7 @@ class XMLTableStyleContext : public XMLPropStyleContext
std::vector<ScXMLMapContent> aMaps;
com::sun::star::uno::Any aConditionalFormat;
sal_Int32 nNumberFormat;
+ sal_Int32 nLastSheet;
sal_Bool bConditionalFormatCreated;
sal_Bool bParentSet;
@@ -158,6 +162,9 @@ public:
sal_Int32 GetNumberFormat();// { return nNumberFormat; }
+ sal_Int32 GetLastSheet() const { return nLastSheet; }
+ void SetLastSheet(sal_Int32 nNew) { nLastSheet = nNew; }
+
private:
using XMLPropStyleContext::SetStyle;
};
@@ -298,5 +305,28 @@ public:
virtual void Finish( sal_Bool bOverwrite );
};
+class ScCellTextStyleContext : public XMLTextStyleContext
+{
+ sal_Int32 nLastSheet;
+
+ const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); }
+ ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); }
+
+public:
+ ScCellTextStyleContext( SvXMLImport& rImport, sal_uInt16 nPrfx,
+ const ::rtl::OUString& rLName,
+ const ::com::sun::star::uno::Reference<
+ ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
+ SvXMLStylesContext& rStyles, sal_uInt16 nFamily,
+ sal_Bool bDefaultStyle = sal_False );
+ virtual ~ScCellTextStyleContext();
+
+ // overload FillPropertySet to store style information
+ virtual void FillPropertySet(
+ const ::com::sun::star::uno::Reference<
+ ::com::sun::star::beans::XPropertySet > & rPropSet );
+};
+
+
#endif
diff --git a/sc/source/filter/xml/xmlsubti.cxx b/sc/source/filter/xml/xmlsubti.cxx
index 231839b9f946..0f980c4a9608 100644
--- a/sc/source/filter/xml/xmlsubti.cxx
+++ b/sc/source/filter/xml/xmlsubti.cxx
@@ -43,6 +43,7 @@
#include "docuno.hxx"
#include "cellsuno.hxx"
#include "XMLStylesImportHelper.hxx"
+#include "sheetdata.hxx"
#include "tabprotection.hxx"
#include <svx/svdpage.hxx>
@@ -269,7 +270,12 @@ void ScMyTables::NewSheet(const rtl::OUString& sTableName, const rtl::OUString&
XMLTableStyleContext* pStyle = (XMLTableStyleContext *)pStyles->FindStyleChildContext(
XML_STYLE_FAMILY_TABLE_TABLE, sStyleName, sal_True);
if (pStyle)
+ {
pStyle->FillPropertySet(xProperties);
+
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(rImport.GetModel())->GetSheetSaveData();
+ pSheetData->AddTableStyle( sStyleName, ScAddress( 0, 0, (SCTAB)nCurrentSheet ) );
+ }
}
}
}
@@ -609,7 +615,11 @@ void ScMyTables::UpdateRowHeights()
}
if (aUpdateSheets.GetSelectCount())
+ {
+ pDoc->LockStreamValid( true ); // ignore draw page size (but not formula results)
ScModelObj::getImplementation(rImport.GetModel())->UpdateAllRowHeights(&aUpdateSheets);
+ pDoc->LockStreamValid( false );
+ }
}
rImport.UnlockSolarMutex();
diff --git a/sc/source/filter/xml/xmltabi.cxx b/sc/source/filter/xml/xmltabi.cxx
index cc95e01be821..8ea9701ecd32 100644
--- a/sc/source/filter/xml/xmltabi.cxx
+++ b/sc/source/filter/xml/xmltabi.cxx
@@ -50,6 +50,7 @@
#include "XMLStylesImportHelper.hxx"
#include "rangeutl.hxx"
#include "externalrefmgr.hxx"
+#include "sheetdata.hxx"
#include <xmloff/xmltkmap.hxx>
#include <xmloff/nmspmap.hxx>
@@ -147,9 +148,13 @@ ScXMLTableContext::ScXMLTableContext( ScXMLImport& rImport,
const sal_Int32 nSpannedCols) :
SvXMLImportContext( rImport, nPrfx, rLName ),
pExternalRefInfo(NULL),
+ nStartOffset(-1),
bStartFormPage(sal_False),
bPrintEntireSheet(sal_True)
{
+ // get start offset in file (if available)
+ nStartOffset = GetScImport().GetByteOffset();
+
if (!bTempIsSubTable)
{
sal_Bool bProtection(sal_False);
@@ -326,6 +331,9 @@ SvXMLImportContext *ScXMLTableContext::CreateChildContext( USHORT nPrefix,
void ScXMLTableContext::EndElement()
{
+ // get end offset in file (if available)
+// sal_Int32 nEndOffset = GetScImport().GetByteOffset();
+
GetScImport().LockSolarMutex();
GetScImport().GetStylesImportHelper()->EndTable();
ScDocument* pDoc(GetScImport().GetDocument());
@@ -386,6 +394,15 @@ void ScXMLTableContext::EndElement()
GetScImport().GetTables().DeleteTable();
GetScImport().ProgressBarIncrement(sal_False);
+
+ // store stream positions
+ if (!pExternalRefInfo.get() && nStartOffset >= 0 /* && nEndOffset >= 0 */)
+ {
+ ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetScImport().GetModel())->GetSheetSaveData();
+ sal_Int32 nTab = GetScImport().GetTables().GetCurrentSheet();
+ // pSheetData->AddStreamPos( nTab, nStartOffset, nEndOffset );
+ pSheetData->StartStreamPos( nTab, nStartOffset );
+ }
}
GetScImport().UnlockSolarMutex();
}
diff --git a/sc/source/filter/xml/xmltabi.hxx b/sc/source/filter/xml/xmltabi.hxx
index 7b8c9878f2d5..1a4438b28955 100644
--- a/sc/source/filter/xml/xmltabi.hxx
+++ b/sc/source/filter/xml/xmltabi.hxx
@@ -52,6 +52,7 @@ class ScXMLTableContext : public SvXMLImportContext
{
rtl::OUString sPrintRanges;
::std::auto_ptr<ScXMLExternalTabData> pExternalRefInfo;
+ sal_Int32 nStartOffset;
sal_Bool bStartFormPage;
sal_Bool bPrintEntireSheet;
diff --git a/sc/source/filter/xml/xmlwrap.cxx b/sc/source/filter/xml/xmlwrap.cxx
index 960d78ada163..7bc5396fcb5b 100644
--- a/sc/source/filter/xml/xmlwrap.cxx
+++ b/sc/source/filter/xml/xmlwrap.cxx
@@ -265,7 +265,24 @@ sal_uInt32 ScXMLImportWrapper::ImportFromComponent(uno::Reference<lang::XMultiSe
}
catch( xml::sax::SAXParseException& r )
{
- if( bEncrypted )
+ // sax parser sends wrapped exceptions,
+ // try to find the original one
+ xml::sax::SAXException aSaxEx = *(xml::sax::SAXException*)(&r);
+ sal_Bool bTryChild = sal_True;
+
+ while( bTryChild )
+ {
+ xml::sax::SAXException aTmp;
+ if ( aSaxEx.WrappedException >>= aTmp )
+ aSaxEx = aTmp;
+ else
+ bTryChild = sal_False;
+ }
+
+ packages::zip::ZipIOException aBrokenPackage;
+ if ( aSaxEx.WrappedException >>= aBrokenPackage )
+ return ERRCODE_IO_BROKENPACKAGE;
+ else if( bEncrypted )
nReturn = ERRCODE_SFX_WRONGPASSWORD;
else
{
@@ -298,7 +315,10 @@ sal_uInt32 ScXMLImportWrapper::ImportFromComponent(uno::Reference<lang::XMultiSe
}
catch( xml::sax::SAXException& r )
{
- if( bEncrypted )
+ packages::zip::ZipIOException aBrokenPackage;
+ if ( r.WrappedException >>= aBrokenPackage )
+ return ERRCODE_IO_BROKENPACKAGE;
+ else if( bEncrypted )
nReturn = ERRCODE_SFX_WRONGPASSWORD;
else
{
@@ -624,6 +644,25 @@ sal_Bool ScXMLImportWrapper::Import(sal_Bool bStylesOnly, ErrCode& nError)
return sal_False;
}
+bool lcl_HasValidStream(ScDocument& rDoc)
+{
+ SfxObjectShell* pObjSh = rDoc.GetDocumentShell();
+ if ( pObjSh->IsDocShared() )
+ return false; // never copy stream from shared file
+
+ // don't read remote file again
+ // (could instead re-use medium directly in that case)
+ SfxMedium* pSrcMed = rDoc.GetDocumentShell()->GetMedium();
+ if ( !pSrcMed || pSrcMed->IsRemote() )
+ return false;
+
+ SCTAB nTabCount = rDoc.GetTableCount();
+ for (SCTAB nTab=0; nTab<nTabCount; ++nTab)
+ if (rDoc.IsStreamValid(nTab))
+ return true;
+ return false;
+}
+
sal_Bool ScXMLImportWrapper::ExportToComponent(uno::Reference<lang::XMultiServiceFactory>& xServiceFactory,
uno::Reference<frame::XModel>& xModel, uno::Reference<uno::XInterface>& xWriter,
uno::Sequence<beans::PropertyValue>& aDescriptor, const rtl::OUString& sName,
@@ -691,7 +730,49 @@ sal_Bool ScXMLImportWrapper::ExportToComponent(uno::Reference<lang::XMultiServic
{
ScXMLExport* pExport = static_cast<ScXMLExport*>(SvXMLExport::getImplementation(xFilter));
pExport->SetSharedData(pSharedData);
- bRet = xFilter->filter( aDescriptor );
+
+ // if there are sheets to copy, get the source stream
+ if ( sName.equalsAscii("content.xml") && lcl_HasValidStream(rDoc) &&
+ ( pExport->getExportFlags() & EXPORT_OASIS ) )
+ {
+ // old stream is still in this file's storage - open read-only
+
+ SfxMedium* pSrcMed = rDoc.GetDocumentShell()->GetMedium();
+ String aSrcURL = pSrcMed->GetOrigURL();
+
+ // SfxMedium must not be read-only, or it will create a temp file in GetStorage
+ SfxMedium aTmpMedium( aSrcURL, STREAM_READWRITE, FALSE, NULL, NULL );
+ uno::Reference<embed::XStorage> xTmpStorage = aTmpMedium.GetStorage();
+ uno::Reference<io::XStream> xSrcStream;
+ uno::Reference<io::XInputStream> xSrcInput;
+ try
+ {
+ if (xTmpStorage.is())
+ xSrcStream = xTmpStorage->openStreamElement( sName, embed::ElementModes::READ );
+ if (xSrcStream.is())
+ xSrcInput = xSrcStream->getInputStream();
+ }
+ catch (uno::Exception&)
+ {
+ // stream not available (for example, password protected) - save normally (xSrcInput is null)
+ }
+
+ pExport->SetSourceStream( xSrcInput );
+ bRet = xFilter->filter( aDescriptor );
+ pExport->SetSourceStream( uno::Reference<io::XInputStream>() );
+
+ // If there was an error, reset all stream flags, so the next save attempt will use normal saving.
+ if (!bRet)
+ {
+ SCTAB nTabCount = rDoc.GetTableCount();
+ for (SCTAB nTab=0; nTab<nTabCount; nTab++)
+ if (rDoc.IsStreamValid(nTab))
+ rDoc.SetStreamValid(nTab, FALSE);
+ }
+ }
+ else
+ bRet = xFilter->filter( aDescriptor );
+
pSharedData = pExport->GetSharedData();
//stream is closed by SAX parser