1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir #include "oox/xls/excelhandlers.hxx" 29*cdf0e10cSrcweir 30*cdf0e10cSrcweir #include "oox/core/filterbase.hxx" 31*cdf0e10cSrcweir #include "oox/xls/biffinputstream.hxx" 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir namespace oox { 34*cdf0e10cSrcweir namespace xls { 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir // ============================================================================ 37*cdf0e10cSrcweir 38*cdf0e10cSrcweir using ::oox::core::FilterBase; 39*cdf0e10cSrcweir using ::oox::core::FragmentHandler2; 40*cdf0e10cSrcweir using ::rtl::OUString; 41*cdf0e10cSrcweir 42*cdf0e10cSrcweir // ============================================================================ 43*cdf0e10cSrcweir // ============================================================================ 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir WorkbookFragmentBase::WorkbookFragmentBase( 46*cdf0e10cSrcweir const WorkbookHelper& rHelper, const OUString& rFragmentPath ) : 47*cdf0e10cSrcweir FragmentHandler2( rHelper.getOoxFilter(), rFragmentPath ), 48*cdf0e10cSrcweir WorkbookHelper( rHelper ) 49*cdf0e10cSrcweir { 50*cdf0e10cSrcweir } 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir // ============================================================================ 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir WorksheetFragmentBase::WorksheetFragmentBase( 55*cdf0e10cSrcweir const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : 56*cdf0e10cSrcweir FragmentHandler2( rHelper.getOoxFilter(), rFragmentPath ), 57*cdf0e10cSrcweir WorksheetHelper( rHelper ) 58*cdf0e10cSrcweir { 59*cdf0e10cSrcweir } 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir // ============================================================================ 62*cdf0e10cSrcweir // ============================================================================ 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir BiffContextHandler::~BiffContextHandler() 65*cdf0e10cSrcweir { 66*cdf0e10cSrcweir } 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir BiffWorkbookContextBase::BiffWorkbookContextBase( const WorkbookHelper& rHelper ) : 71*cdf0e10cSrcweir WorkbookHelper( rHelper ) 72*cdf0e10cSrcweir { 73*cdf0e10cSrcweir } 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir BiffWorksheetContextBase::BiffWorksheetContextBase( const WorksheetHelper& rHelper ) : 78*cdf0e10cSrcweir WorksheetHelper( rHelper ) 79*cdf0e10cSrcweir { 80*cdf0e10cSrcweir } 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir // ============================================================================ 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir namespace { 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir const sal_uInt16 BIFF_BOF_GLOBALS = 0x0005; /// BIFF5-BIFF8 workbook globals. 87*cdf0e10cSrcweir const sal_uInt16 BIFF_BOF_MODULE = 0x0006; /// BIFF5-BIFF8 Visual Basic module. 88*cdf0e10cSrcweir const sal_uInt16 BIFF_BOF_SHEET = 0x0010; /// BIFF2-BIFF8 worksheet/dialog sheet. 89*cdf0e10cSrcweir const sal_uInt16 BIFF_BOF_CHART = 0x0020; /// BIFF2-BIFF8 chart sheet. 90*cdf0e10cSrcweir const sal_uInt16 BIFF_BOF_MACRO = 0x0040; /// BIFF4-BIFF8 macro sheet. 91*cdf0e10cSrcweir const sal_uInt16 BIFF_BOF_WORKSPACE = 0x0100; /// BIFF3-BIFF8 workspace. 92*cdf0e10cSrcweir 93*cdf0e10cSrcweir } // namespace 94*cdf0e10cSrcweir 95*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir BiffFragmentHandler::BiffFragmentHandler( const FilterBase& rFilter, const OUString& rStrmName ) 98*cdf0e10cSrcweir { 99*cdf0e10cSrcweir // do not automatically close the root stream (indicated by empty stream name) 100*cdf0e10cSrcweir bool bRootStrm = rStrmName.getLength() == 0; 101*cdf0e10cSrcweir mxXInStrm.reset( new BinaryXInputStream( rFilter.openInputStream( rStrmName ), !bRootStrm ) ); 102*cdf0e10cSrcweir mxBiffStrm.reset( new BiffInputStream( *mxXInStrm ) ); 103*cdf0e10cSrcweir } 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir BiffFragmentHandler::~BiffFragmentHandler() 106*cdf0e10cSrcweir { 107*cdf0e10cSrcweir } 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir BiffFragmentType BiffFragmentHandler::startFragment( BiffType eBiff ) 110*cdf0e10cSrcweir { 111*cdf0e10cSrcweir BiffFragmentType eFragment = BIFF_FRAGMENT_UNKNOWN; 112*cdf0e10cSrcweir /* #i23425# Don't rely on BOF record ID to read BOF contents, but on 113*cdf0e10cSrcweir the detected BIFF version. */ 114*cdf0e10cSrcweir if( mxBiffStrm->startNextRecord() && BiffHelper::isBofRecord( *mxBiffStrm ) ) 115*cdf0e10cSrcweir { 116*cdf0e10cSrcweir // BOF is always written unencrypted 117*cdf0e10cSrcweir mxBiffStrm->enableDecoder( false ); 118*cdf0e10cSrcweir mxBiffStrm->skip( 2 ); 119*cdf0e10cSrcweir sal_uInt16 nType = mxBiffStrm->readuInt16(); 120*cdf0e10cSrcweir 121*cdf0e10cSrcweir // decide which fragment types are valid for current BIFF version 122*cdf0e10cSrcweir switch( eBiff ) 123*cdf0e10cSrcweir { 124*cdf0e10cSrcweir case BIFF2: switch( nType ) 125*cdf0e10cSrcweir { 126*cdf0e10cSrcweir case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break; 127*cdf0e10cSrcweir case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break; 128*cdf0e10cSrcweir // #i51490# Excel interprets invalid types as worksheet 129*cdf0e10cSrcweir default: eFragment = BIFF_FRAGMENT_WORKSHEET; 130*cdf0e10cSrcweir } 131*cdf0e10cSrcweir break; 132*cdf0e10cSrcweir 133*cdf0e10cSrcweir case BIFF3: switch( nType ) 134*cdf0e10cSrcweir { 135*cdf0e10cSrcweir case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break; 136*cdf0e10cSrcweir case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break; 137*cdf0e10cSrcweir case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_UNKNOWN; break; 138*cdf0e10cSrcweir // #i51490# Excel interprets invalid types as worksheet 139*cdf0e10cSrcweir default: eFragment = BIFF_FRAGMENT_WORKSHEET; 140*cdf0e10cSrcweir }; 141*cdf0e10cSrcweir break; 142*cdf0e10cSrcweir 143*cdf0e10cSrcweir case BIFF4: switch( nType ) 144*cdf0e10cSrcweir { 145*cdf0e10cSrcweir case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_EMPTYSHEET; break; 146*cdf0e10cSrcweir case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break; 147*cdf0e10cSrcweir case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_WORKSPACE; break; 148*cdf0e10cSrcweir // #i51490# Excel interprets invalid types as worksheet 149*cdf0e10cSrcweir default: eFragment = BIFF_FRAGMENT_WORKSHEET; 150*cdf0e10cSrcweir }; 151*cdf0e10cSrcweir break; 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir case BIFF5: 154*cdf0e10cSrcweir case BIFF8: switch( nType ) 155*cdf0e10cSrcweir { 156*cdf0e10cSrcweir case BIFF_BOF_GLOBALS: eFragment = BIFF_FRAGMENT_GLOBALS; break; 157*cdf0e10cSrcweir case BIFF_BOF_CHART: eFragment = BIFF_FRAGMENT_CHARTSHEET; break; 158*cdf0e10cSrcweir case BIFF_BOF_MACRO: eFragment = BIFF_FRAGMENT_MACROSHEET; break; 159*cdf0e10cSrcweir case BIFF_BOF_MODULE: eFragment = BIFF_FRAGMENT_MODULESHEET; break; 160*cdf0e10cSrcweir case BIFF_BOF_WORKSPACE:eFragment = BIFF_FRAGMENT_UNKNOWN; break; 161*cdf0e10cSrcweir // #i51490# Excel interprets invalid types as worksheet 162*cdf0e10cSrcweir default: eFragment = BIFF_FRAGMENT_WORKSHEET; 163*cdf0e10cSrcweir }; 164*cdf0e10cSrcweir break; 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir case BIFF_UNKNOWN: break; 167*cdf0e10cSrcweir } 168*cdf0e10cSrcweir } 169*cdf0e10cSrcweir return eFragment; 170*cdf0e10cSrcweir } 171*cdf0e10cSrcweir 172*cdf0e10cSrcweir bool BiffFragmentHandler::skipFragment() 173*cdf0e10cSrcweir { 174*cdf0e10cSrcweir while( mxBiffStrm->startNextRecord() && (mxBiffStrm->getRecId() != BIFF_ID_EOF) ) 175*cdf0e10cSrcweir if( BiffHelper::isBofRecord( *mxBiffStrm ) ) 176*cdf0e10cSrcweir skipFragment(); 177*cdf0e10cSrcweir return !mxBiffStrm->isEof() && (mxBiffStrm->getRecId() == BIFF_ID_EOF); 178*cdf0e10cSrcweir } 179*cdf0e10cSrcweir 180*cdf0e10cSrcweir // ============================================================================ 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir BiffWorkbookFragmentBase::BiffWorkbookFragmentBase( const WorkbookHelper& rHelper, const OUString& rStrmName, bool bCloneDecoder ) : 183*cdf0e10cSrcweir BiffFragmentHandler( rHelper.getBaseFilter(), rStrmName ), 184*cdf0e10cSrcweir WorkbookHelper( rHelper ) 185*cdf0e10cSrcweir { 186*cdf0e10cSrcweir if( bCloneDecoder ) 187*cdf0e10cSrcweir getCodecHelper().cloneDecoder( getInputStream() ); 188*cdf0e10cSrcweir } 189*cdf0e10cSrcweir 190*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 191*cdf0e10cSrcweir 192*cdf0e10cSrcweir BiffWorksheetFragmentBase::BiffWorksheetFragmentBase( const WorksheetHelper& rHelper, const BiffWorkbookFragmentBase& rParent ) : 193*cdf0e10cSrcweir BiffFragmentHandler( rParent ), 194*cdf0e10cSrcweir WorksheetHelper( rHelper ) 195*cdf0e10cSrcweir { 196*cdf0e10cSrcweir } 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 199*cdf0e10cSrcweir 200*cdf0e10cSrcweir BiffSkipWorksheetFragment::BiffSkipWorksheetFragment( const WorksheetHelper& rHelper, const BiffWorkbookFragmentBase& rParent ) : 201*cdf0e10cSrcweir BiffWorksheetFragmentBase( rHelper, rParent ) 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir } 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir bool BiffSkipWorksheetFragment::importFragment() 206*cdf0e10cSrcweir { 207*cdf0e10cSrcweir return skipFragment(); 208*cdf0e10cSrcweir } 209*cdf0e10cSrcweir 210*cdf0e10cSrcweir // ============================================================================ 211*cdf0e10cSrcweir // ============================================================================ 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir } // namespace xls 214*cdf0e10cSrcweir } // namespace oox 215