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_tools.hxx" 26 27 #include <tools/debug.hxx> 28 #include <tools/stream.hxx> 29 #include <tools/cachestr.hxx> 30 #include <tools/tempfile.hxx> 31 32 /************************************************************************* 33 |* 34 |* SvCacheStream::SvCacheStream() 35 |* 36 |* Beschreibung STREAM.SDW 37 |* Ersterstellung OV 27.09.94 38 |* Letzte Aenderung OV 27.09.94 39 |* 40 *************************************************************************/ 41 42 SvCacheStream::SvCacheStream( sal_uIntPtr nMaxMemSize ) 43 { 44 if( !nMaxMemSize ) 45 nMaxMemSize = 20480; 46 SvStream::bIsWritable = sal_True; 47 nMaxSize = nMaxMemSize; 48 bPersistent = sal_False; 49 pSwapStream = 0; 50 pCurrentStream = new SvMemoryStream( nMaxMemSize ); 51 pTempFile = 0; 52 } 53 54 /************************************************************************* 55 |* 56 |* SvCacheStream::SvCacheStream() 57 |* 58 |* Beschreibung STREAM.SDW 59 |* Ersterstellung OV 27.09.94 60 |* Letzte Aenderung OV 27.09.94 61 |* 62 *************************************************************************/ 63 64 SvCacheStream::SvCacheStream( const String &rFileName, 65 sal_uIntPtr nExpectedSize, 66 sal_uIntPtr nMaxMemSize ) 67 { 68 if( !nMaxMemSize ) 69 nMaxMemSize = 20480; 70 71 if( nExpectedSize > nMaxMemSize ) 72 nExpectedSize = nMaxMemSize; // oder gleich in File schreiben 73 else if( !nExpectedSize ) 74 nExpectedSize = 4096; 75 76 SvStream::bIsWritable = sal_True; 77 nMaxSize = nMaxMemSize; 78 bPersistent = sal_True; 79 aFileName = rFileName; 80 pSwapStream = 0; 81 pCurrentStream = new SvMemoryStream( nExpectedSize ); 82 pTempFile = 0; 83 } 84 85 /************************************************************************* 86 |* 87 |* SvCacheStream::~SvCacheStream() 88 |* 89 |* Beschreibung STREAM.SDW 90 |* Ersterstellung OV 27.09.94 91 |* Letzte Aenderung OV 27.09.94 92 |* 93 *************************************************************************/ 94 95 SvCacheStream::~SvCacheStream() 96 { 97 if( pCurrentStream != pSwapStream ) 98 delete pSwapStream; 99 delete pCurrentStream; 100 101 if( pSwapStream && !bPersistent && pTempFile ) 102 { 103 // temporaeres File loeschen 104 pTempFile->EnableKillingFile( sal_True ); 105 } 106 107 delete pTempFile; 108 } 109 110 /************************************************************************* 111 |* 112 |* SvCacheStream::SwapOut() 113 |* 114 |* Beschreibung STREAM.SDW 115 |* Ersterstellung OV 27.09.94 116 |* Letzte Aenderung OV 27.09.94 117 |* 118 *************************************************************************/ 119 120 void SvCacheStream::SwapOut() 121 { 122 if( pCurrentStream != pSwapStream ) 123 { 124 if( !pSwapStream && !aFileName.Len() ) 125 { 126 if (aFilenameLinkHdl.IsSet()) 127 { 128 // pSwapStream wird zum Schutz gegen Reentranz genutzt 129 pSwapStream = pCurrentStream; 130 Link aLink( aFilenameLinkHdl ); 131 aFilenameLinkHdl = Link(); 132 aLink.Call(this); 133 // pSwapStream nur zuruecksetzen, wenn nicht ueber 134 // SetSwapStream geaendert 135 if( pSwapStream == pCurrentStream ) pSwapStream = 0; 136 } 137 else 138 { 139 pTempFile = new TempFile; 140 aFileName = pTempFile->GetName(); 141 } 142 } 143 144 sal_uIntPtr nPos = pCurrentStream->Tell(); 145 pCurrentStream->Seek( 0 ); 146 if( !pSwapStream ) 147 pSwapStream = new SvFileStream( aFileName, STREAM_READWRITE | STREAM_TRUNC ); 148 *pSwapStream << *pCurrentStream; 149 pSwapStream->Flush(); 150 delete pCurrentStream; 151 pCurrentStream = pSwapStream; 152 pCurrentStream->Seek( nPos ); 153 } 154 } 155 156 /************************************************************************* 157 |* 158 |* SvCacheStream::GetData() 159 |* 160 |* Beschreibung STREAM.SDW 161 |* Ersterstellung OV 27.09.94 162 |* Letzte Aenderung OV 27.09.94 163 |* 164 *************************************************************************/ 165 166 sal_uIntPtr SvCacheStream::GetData( void* pData, sal_uIntPtr nSize ) 167 { 168 return pCurrentStream->Read( pData, nSize ); 169 } 170 171 /************************************************************************* 172 |* 173 |* SvCacheStream::PutData() 174 |* 175 |* Beschreibung STREAM.SDW 176 |* Ersterstellung OV 27.09.94 177 |* Letzte Aenderung OV 27.09.94 178 |* 179 *************************************************************************/ 180 181 sal_uIntPtr SvCacheStream::PutData( const void* pData, sal_uIntPtr nSize ) 182 { 183 // lieber unnoetig auslagern als unnoetig umkopieren 184 if( pCurrentStream != pSwapStream 185 && pCurrentStream->Tell() + nSize > nMaxSize ) 186 SwapOut(); 187 return pCurrentStream->Write( pData, nSize ); 188 } 189 190 /************************************************************************* 191 |* 192 |* SvCacheStream::SeekPos() 193 |* 194 |* Beschreibung STREAM.SDW 195 |* Ersterstellung OV 27.09.94 196 |* Letzte Aenderung OV 27.09.94 197 |* 198 *************************************************************************/ 199 200 sal_uIntPtr SvCacheStream::SeekPos( sal_uIntPtr nPos ) 201 { 202 return pCurrentStream->Seek( nPos ); 203 } 204 205 /************************************************************************* 206 |* 207 |* SvCacheStream::FlushData() 208 |* 209 |* Beschreibung STREAM.SDW 210 |* Ersterstellung OV 27.09.94 211 |* Letzte Aenderung OV 27.09.94 212 |* 213 *************************************************************************/ 214 215 void SvCacheStream::FlushData() 216 { 217 pCurrentStream->Flush(); 218 if( pCurrentStream != pSwapStream 219 && ((SvMemoryStream*)pCurrentStream)->GetSize() > nMaxSize ) 220 SwapOut(); 221 } 222 223 /************************************************************************* 224 |* 225 |* SvCacheStream::GetStr() 226 |* 227 |* Beschreibung STREAM.SDW 228 |* Ersterstellung OV 27.09.94 229 |* Letzte Aenderung OV 27.09.94 230 |* 231 *************************************************************************/ 232 233 const void* SvCacheStream::GetBuffer() 234 { 235 Flush(); 236 if( pCurrentStream != pSwapStream ) 237 return ((SvMemoryStream*)pCurrentStream)->GetData(); 238 else 239 return 0; 240 } 241 242 /************************************************************************* 243 |* 244 |* SvCacheStream::SetSize() 245 |* 246 |* Beschreibung STREAM.SDW 247 |* Ersterstellung OV 27.09.94 248 |* Letzte Aenderung OV 27.09.94 249 |* 250 *************************************************************************/ 251 252 void SvCacheStream::SetSize( sal_uIntPtr nSize ) 253 { 254 pCurrentStream->SetStreamSize( nSize ); 255 } 256 257 /************************************************************************* 258 |* 259 |* SvCacheStream::GetSize() 260 |* 261 |* Beschreibung STREAM.SDW 262 |* Ersterstellung OV 27.09.94 263 |* Letzte Aenderung OV 27.09.94 264 |* 265 *************************************************************************/ 266 267 sal_uIntPtr SvCacheStream::GetSize() 268 { 269 // ACHTUNG: SvMemoryStream::GetSize() gibt Groesse 270 // des allozierten Buffers zurueck 271 Flush(); 272 sal_uIntPtr nTemp = Tell(); 273 sal_uIntPtr nLength = Seek( STREAM_SEEK_TO_END ); 274 Seek( nTemp ); 275 return nLength; 276 } 277 278 void SvCacheStream::SetFilenameHdl( const Link& rLink) 279 { 280 aFilenameLinkHdl = rLink; 281 } 282 283 const Link& SvCacheStream::GetFilenameHdl() const 284 { 285 return aFilenameLinkHdl; 286 } 287