/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" // INCLUDE --------------------------------------------------------------- #include #include "rechead.hxx" #include "scerrors.hxx" // STATIC DATA ----------------------------------------------------------- // ======================================================================= ScMultipleReadHeader::ScMultipleReadHeader(SvStream& rNewStream) : rStream( rNewStream ) { sal_uInt32 nDataSize; rStream >> nDataSize; sal_uLong nDataPos = rStream.Tell(); nTotalEnd = nDataPos + nDataSize; nEntryEnd = nTotalEnd; rStream.SeekRel(nDataSize); sal_uInt16 nID; rStream >> nID; if (nID != SCID_SIZES) { DBG_ERROR("SCID_SIZES nicht gefunden"); if ( rStream.GetError() == SVSTREAM_OK ) rStream.SetError( SVSTREAM_FILEFORMAT_ERROR ); // alles auf 0, damit BytesLeft() wenigstens abbricht pBuf = NULL; pMemStream = NULL; nEntryEnd = nDataPos; } else { sal_uInt32 nSizeTableLen; rStream >> nSizeTableLen; pBuf = new sal_uInt8[nSizeTableLen]; rStream.Read( pBuf, nSizeTableLen ); pMemStream = new SvMemoryStream( (char*)pBuf, nSizeTableLen, STREAM_READ ); } nEndPos = rStream.Tell(); rStream.Seek( nDataPos ); } ScMultipleReadHeader::~ScMultipleReadHeader() { if ( pMemStream && pMemStream->Tell() != pMemStream->GetEndOfData() ) { DBG_ERRORFILE( "Sizes nicht vollstaendig gelesen" ); if ( rStream.GetError() == SVSTREAM_OK ) rStream.SetError( SCWARN_IMPORT_INFOLOST ); } delete pMemStream; delete[] pBuf; rStream.Seek(nEndPos); } void ScMultipleReadHeader::EndEntry() { sal_uLong nPos = rStream.Tell(); DBG_ASSERT( nPos <= nEntryEnd, "zuviel gelesen" ); if ( nPos != nEntryEnd ) { if ( rStream.GetError() == SVSTREAM_OK ) rStream.SetError( SCWARN_IMPORT_INFOLOST ); rStream.Seek( nEntryEnd ); // Rest ueberspringen } nEntryEnd = nTotalEnd; // den ganzen Rest, wenn kein StartEntry kommt } void ScMultipleReadHeader::StartEntry() { sal_uLong nPos = rStream.Tell(); sal_uInt32 nEntrySize; (*pMemStream) >> nEntrySize; nEntryEnd = nPos + nEntrySize; DBG_ASSERT( nEntryEnd <= nTotalEnd, "zuviele Eintraege gelesen" ); } sal_uLong ScMultipleReadHeader::BytesLeft() const { sal_uLong nReadEnd = rStream.Tell(); if (nReadEnd <= nEntryEnd) return nEntryEnd-nReadEnd; DBG_ERROR("Fehler bei ScMultipleReadHeader::BytesLeft"); return 0; } // ----------------------------------------------------------------------- ScMultipleWriteHeader::ScMultipleWriteHeader(SvStream& rNewStream, sal_uInt32 nDefault) : rStream( rNewStream ), aMemStream( 4096, 4096 ) { nDataSize = nDefault; rStream << nDataSize; nDataPos = rStream.Tell(); nEntryStart = nDataPos; } ScMultipleWriteHeader::~ScMultipleWriteHeader() { sal_uLong nDataEnd = rStream.Tell(); rStream << (sal_uInt16) SCID_SIZES; rStream << static_cast(aMemStream.Tell()); rStream.Write( aMemStream.GetData(), aMemStream.Tell() ); if ( nDataEnd - nDataPos != nDataSize ) // Default getroffen? { nDataSize = nDataEnd - nDataPos; sal_uLong nPos = rStream.Tell(); rStream.Seek(nDataPos-sizeof(sal_uInt32)); rStream << nDataSize; // Groesse am Anfang eintragen rStream.Seek(nPos); } } void ScMultipleWriteHeader::EndEntry() { sal_uLong nPos = rStream.Tell(); aMemStream << static_cast(nPos - nEntryStart); } void ScMultipleWriteHeader::StartEntry() { sal_uLong nPos = rStream.Tell(); nEntryStart = nPos; }