bool BiffWorkbookFragment::importGlobalsFragment()

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;
}