in main/oox/source/xls/workbookfragment.cxx [489:670]
bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgressBar )
{
WorkbookSettings& rWorkbookSett = getWorkbookSettings();
ViewSettings& rViewSett = getViewSettings();
SharedStringsBuffer& rSharedStrings = getSharedStrings();
StylesBuffer& rStyles = getStyles();
WorksheetBuffer& rWorksheets = getWorksheets();
PivotCacheBuffer& rPivotCaches = getPivotCaches();
bool bHasVbaProject = false;
bool bEmptyVbaProject = false;
// collect records that need to be loaded in a second pass
typedef ::std::vector< sal_Int64 > RecordHandleVec;
RecordHandleVec aExtLinkRecs;
bool bRet = true;
bool bLoop = true;
BiffInputStream& rStrm = getInputStream();
while( bRet && bLoop && rStrm.startNextRecord() )
{
sal_uInt16 nRecId = rStrm.getRecId();
bool bExtLinkRec = false;
/* #i56376# BIFF5-BIFF8: If an EOF record for globals is missing,
simulate it. The issue is about a document where the sheet fragment
starts directly after the EXTSST record, without terminating the
globals fragment with an EOF record. */
if( BiffHelper::isBofRecord( rStrm ) || (nRecId == BIFF_ID_EOF) )
{
bLoop = false;
}
else switch( nRecId )
{
// records in all BIFF versions
case BIFF_ID_CODEPAGE: setCodePage( rStrm.readuInt16() ); break;
case BIFF_ID_DATEMODE: rWorkbookSett.importDateMode( rStrm ); break;
case BIFF_ID_FILEPASS: bRet = getCodecHelper().importFilePass( rStrm ); break;
case BIFF_ID_PRECISION: rWorkbookSett.importPrecision( rStrm ); break;
case BIFF_ID_WINDOW1: rViewSett.importWindow1( rStrm ); break;
// BIFF specific records
default: switch( getBiff() )
{
case BIFF2: switch( nRecId )
{
case BIFF2_ID_DEFINEDNAME: bExtLinkRec = true; break;
case BIFF2_ID_EXTERNALNAME: bExtLinkRec = true; break;
case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break;
case BIFF2_ID_FONT: rStyles.importFont( rStrm ); break;
case BIFF_ID_FONTCOLOR: rStyles.importFontColor( rStrm ); break;
case BIFF2_ID_FORMAT: rStyles.importFormat( rStrm ); break;
case BIFF2_ID_XF: rStyles.importXf( rStrm ); break;
}
break;
case BIFF3: switch( nRecId )
{
case BIFF_ID_CRN: bExtLinkRec = true; break;
case BIFF3_ID_DEFINEDNAME: bExtLinkRec = true; break;
case BIFF3_ID_EXTERNALNAME: bExtLinkRec = true; break;
case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break;
case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( rStrm ); break;
case BIFF3_ID_FONT: rStyles.importFont( rStrm ); break;
case BIFF2_ID_FORMAT: rStyles.importFormat( rStrm ); break;
case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( rStrm ); break;
case BIFF_ID_PALETTE: rStyles.importPalette( rStrm ); break;
case BIFF_ID_STYLE: rStyles.importStyle( rStrm ); break;
case BIFF_ID_XCT: bExtLinkRec = true; break;
case BIFF3_ID_XF: rStyles.importXf( rStrm ); break;
}
break;
case BIFF4: switch( nRecId )
{
case BIFF_ID_CRN: bExtLinkRec = true; break;
case BIFF3_ID_DEFINEDNAME: bExtLinkRec = true; break;
case BIFF3_ID_EXTERNALNAME: bExtLinkRec = true; break;
case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break;
case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( rStrm ); break;
case BIFF3_ID_FONT: rStyles.importFont( rStrm ); break;
case BIFF4_ID_FORMAT: rStyles.importFormat( rStrm ); break;
case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( rStrm ); break;
case BIFF_ID_PALETTE: rStyles.importPalette( rStrm ); break;
case BIFF_ID_STYLE: rStyles.importStyle( rStrm ); break;
case BIFF_ID_XCT: bExtLinkRec = true; break;
case BIFF4_ID_XF: rStyles.importXf( rStrm ); break;
}
break;
case BIFF5: switch( nRecId )
{
case BIFF_ID_BOOKBOOL: rWorkbookSett.importBookBool( rStrm ); break;
case BIFF_ID_CRN: bExtLinkRec = true; break;
case BIFF5_ID_DEFINEDNAME: bExtLinkRec = true; break;
case BIFF5_ID_EXTERNALNAME: bExtLinkRec = true; break;
case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break;
case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( rStrm ); break;
case BIFF5_ID_FONT: rStyles.importFont( rStrm ); break;
case BIFF4_ID_FORMAT: rStyles.importFormat( rStrm ); break;
case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( rStrm ); break;
case BIFF_ID_OLESIZE: rViewSett.importOleSize( rStrm ); break;
case BIFF_ID_PALETTE: rStyles.importPalette( rStrm ); break;
case BIFF_ID_PIVOTCACHE: rPivotCaches.importPivotCacheRef( rStrm ); break;
case BIFF_ID_SHEET: rWorksheets.importSheet( rStrm ); break;
case BIFF_ID_STYLE: rStyles.importStyle( rStrm ); break;
case BIFF_ID_XCT: bExtLinkRec = true; break;
case BIFF5_ID_XF: rStyles.importXf( rStrm ); break;
}
break;
case BIFF8: switch( nRecId )
{
case BIFF_ID_BOOKBOOL: rWorkbookSett.importBookBool( rStrm ); break;
case BIFF_ID_CODENAME: rWorkbookSett.importCodeName( rStrm ); break;
case BIFF_ID_CRN: bExtLinkRec = true; break;
case BIFF5_ID_DEFINEDNAME: bExtLinkRec = true; break;
case BIFF_ID_EXTERNALBOOK: bExtLinkRec = true; break;
case BIFF5_ID_EXTERNALNAME: bExtLinkRec = true; break;
case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break;
case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( rStrm ); break;
case BIFF5_ID_FONT: rStyles.importFont( rStrm ); break;
case BIFF4_ID_FORMAT: rStyles.importFormat( rStrm ); break;
case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( rStrm ); break;
case BIFF_ID_OLESIZE: rViewSett.importOleSize( rStrm ); break;
case BIFF_ID_PALETTE: rStyles.importPalette( rStrm ); break;
case BIFF_ID_PIVOTCACHE: rPivotCaches.importPivotCacheRef( rStrm ); break;
case BIFF_ID_SHEET: rWorksheets.importSheet( rStrm ); break;
case BIFF_ID_SST: rSharedStrings.importSst( rStrm ); break;
case BIFF_ID_STYLE: rStyles.importStyle( rStrm ); break;
case BIFF_ID_USESELFS: rWorkbookSett.importUsesElfs( rStrm ); break;
case BIFF_ID_VBAPROJECT: bHasVbaProject = true; break;
case BIFF_ID_VBAPROJECTEMPTY: bEmptyVbaProject = true; break;
case BIFF_ID_XCT: bExtLinkRec = true; break;
case BIFF5_ID_XF: rStyles.importXf( rStrm ); break;
}
break;
case BIFF_UNKNOWN: break;
}
}
if( bExtLinkRec )
aExtLinkRecs.push_back( rStrm.getRecHandle() );
}
// finalize global buffers
rProgressBar.setPosition( 0.5 );
if( bRet )
{
rSharedStrings.finalizeImport();
rStyles.finalizeImport();
}
/* Import external link data (EXTERNSHEET, EXTERNALNAME, DEFINEDNAME)
which need existing internal sheets (SHEET records). The SHEET records
may follow the external links records in some BIFF versions. */
if( bRet && !aExtLinkRecs.empty() )
{
// remember current stream position (the EOF record)
sal_Int64 nEofHandle = rStrm.getRecHandle();
// context handler implementing import of external link records
BiffExternalSheetDataContext aSheetContext( *this, true );
// import all records by using their cached record handle
for( RecordHandleVec::const_iterator aIt = aExtLinkRecs.begin(), aEnd = aExtLinkRecs.end(); (aIt != aEnd) && rStrm.startRecordByHandle( *aIt ); ++aIt )
aSheetContext.importRecord( rStrm );
// finalize global buffers
getDefinedNames().finalizeImport();
// seek back to the EOF record of the workbook globals fragment
bRet = rStrm.startRecordByHandle( nEofHandle );
}
// open the VBA project storage
if( bHasVbaProject && !bEmptyVbaProject )
setVbaProjectStorage( getBaseFilter().openSubStorage( CREATE_OUSTRING( "_VBA_PROJECT_CUR" ), false ) );
// #i56376# missing EOF - rewind before worksheet BOF record (see above)
if( bRet && BiffHelper::isBofRecord( rStrm ) )
rStrm.rewindRecord();
rProgressBar.setPosition( 1.0 );
return bRet;
}