1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sc.hxx" 26 27 28 29 // INCLUDE --------------------------------------------------------------- 30 31 #include <tools/debug.hxx> 32 33 #include "rechead.hxx" 34 #include "scerrors.hxx" 35 36 // STATIC DATA ----------------------------------------------------------- 37 38 // ======================================================================= 39 40 ScMultipleReadHeader::ScMultipleReadHeader(SvStream& rNewStream) : 41 rStream( rNewStream ) 42 { 43 sal_uInt32 nDataSize; 44 rStream >> nDataSize; 45 sal_uLong nDataPos = rStream.Tell(); 46 nTotalEnd = nDataPos + nDataSize; 47 nEntryEnd = nTotalEnd; 48 49 rStream.SeekRel(nDataSize); 50 sal_uInt16 nID; 51 rStream >> nID; 52 if (nID != SCID_SIZES) 53 { 54 DBG_ERROR("SCID_SIZES nicht gefunden"); 55 if ( rStream.GetError() == SVSTREAM_OK ) 56 rStream.SetError( SVSTREAM_FILEFORMAT_ERROR ); 57 58 // alles auf 0, damit BytesLeft() wenigstens abbricht 59 pBuf = NULL; pMemStream = NULL; 60 nEntryEnd = nDataPos; 61 } 62 else 63 { 64 sal_uInt32 nSizeTableLen; 65 rStream >> nSizeTableLen; 66 pBuf = new sal_uInt8[nSizeTableLen]; 67 rStream.Read( pBuf, nSizeTableLen ); 68 pMemStream = new SvMemoryStream( (char*)pBuf, nSizeTableLen, STREAM_READ ); 69 } 70 71 nEndPos = rStream.Tell(); 72 rStream.Seek( nDataPos ); 73 } 74 75 ScMultipleReadHeader::~ScMultipleReadHeader() 76 { 77 if ( pMemStream && pMemStream->Tell() != pMemStream->GetEndOfData() ) 78 { 79 DBG_ERRORFILE( "Sizes nicht vollstaendig gelesen" ); 80 if ( rStream.GetError() == SVSTREAM_OK ) 81 rStream.SetError( SCWARN_IMPORT_INFOLOST ); 82 } 83 delete pMemStream; 84 delete[] pBuf; 85 86 rStream.Seek(nEndPos); 87 } 88 89 void ScMultipleReadHeader::EndEntry() 90 { 91 sal_uLong nPos = rStream.Tell(); 92 DBG_ASSERT( nPos <= nEntryEnd, "zuviel gelesen" ); 93 if ( nPos != nEntryEnd ) 94 { 95 if ( rStream.GetError() == SVSTREAM_OK ) 96 rStream.SetError( SCWARN_IMPORT_INFOLOST ); 97 rStream.Seek( nEntryEnd ); // Rest ueberspringen 98 } 99 100 nEntryEnd = nTotalEnd; // den ganzen Rest, wenn kein StartEntry kommt 101 } 102 103 void ScMultipleReadHeader::StartEntry() 104 { 105 sal_uLong nPos = rStream.Tell(); 106 sal_uInt32 nEntrySize; 107 (*pMemStream) >> nEntrySize; 108 109 nEntryEnd = nPos + nEntrySize; 110 DBG_ASSERT( nEntryEnd <= nTotalEnd, "zuviele Eintraege gelesen" ); 111 } 112 113 sal_uLong ScMultipleReadHeader::BytesLeft() const 114 { 115 sal_uLong nReadEnd = rStream.Tell(); 116 if (nReadEnd <= nEntryEnd) 117 return nEntryEnd-nReadEnd; 118 119 DBG_ERROR("Fehler bei ScMultipleReadHeader::BytesLeft"); 120 return 0; 121 } 122 123 // ----------------------------------------------------------------------- 124 125 ScMultipleWriteHeader::ScMultipleWriteHeader(SvStream& rNewStream, sal_uInt32 nDefault) : 126 rStream( rNewStream ), 127 aMemStream( 4096, 4096 ) 128 { 129 nDataSize = nDefault; 130 rStream << nDataSize; 131 132 nDataPos = rStream.Tell(); 133 nEntryStart = nDataPos; 134 } 135 136 ScMultipleWriteHeader::~ScMultipleWriteHeader() 137 { 138 sal_uLong nDataEnd = rStream.Tell(); 139 140 rStream << (sal_uInt16) SCID_SIZES; 141 rStream << static_cast<sal_uInt32>(aMemStream.Tell()); 142 rStream.Write( aMemStream.GetData(), aMemStream.Tell() ); 143 144 if ( nDataEnd - nDataPos != nDataSize ) // Default getroffen? 145 { 146 nDataSize = nDataEnd - nDataPos; 147 sal_uLong nPos = rStream.Tell(); 148 rStream.Seek(nDataPos-sizeof(sal_uInt32)); 149 rStream << nDataSize; // Groesse am Anfang eintragen 150 rStream.Seek(nPos); 151 } 152 } 153 154 void ScMultipleWriteHeader::EndEntry() 155 { 156 sal_uLong nPos = rStream.Tell(); 157 aMemStream << static_cast<sal_uInt32>(nPos - nEntryStart); 158 } 159 160 void ScMultipleWriteHeader::StartEntry() 161 { 162 sal_uLong nPos = rStream.Tell(); 163 nEntryStart = nPos; 164 } 165 166 167 168 169 170