xref: /trunk/main/tools/source/stream/stream.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
189b56da7SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
389b56da7SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
489b56da7SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
589b56da7SAndrew Rist  * distributed with this work for additional information
689b56da7SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
789b56da7SAndrew Rist  * to you under the Apache License, Version 2.0 (the
889b56da7SAndrew Rist  * "License"); you may not use this file except in compliance
989b56da7SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
1189b56da7SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
1389b56da7SAndrew Rist  * Unless required by applicable law or agreed to in writing,
1489b56da7SAndrew Rist  * software distributed under the License is distributed on an
1589b56da7SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1689b56da7SAndrew Rist  * KIND, either express or implied.  See the License for the
1789b56da7SAndrew Rist  * specific language governing permissions and limitations
1889b56da7SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
2089b56da7SAndrew Rist  *************************************************************/
2189b56da7SAndrew Rist 
2289b56da7SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_tools.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir // ToDo:
28cdf0e10cSrcweir //  - Read->RefreshBuffer->Auf Aenderungen von nBufActualLen reagieren
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include <cstddef>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include <string.h>
33cdf0e10cSrcweir #include <stdio.h>
34cdf0e10cSrcweir #include <ctype.h>  // isspace
35cdf0e10cSrcweir #include <stdlib.h> // strtol, _crotl
36cdf0e10cSrcweir 
37cdf0e10cSrcweir #include "boost/static_assert.hpp"
38cdf0e10cSrcweir 
39cdf0e10cSrcweir /*
40cdf0e10cSrcweir #if defined( DBG_UTIL ) && (OSL_DEBUG_LEVEL > 1)
41cdf0e10cSrcweir // prueft Synchronisation des Buffers nach allen Read, Write, Seek
42cdf0e10cSrcweir #define OV_DEBUG
43cdf0e10cSrcweir #endif
44cdf0e10cSrcweir */
45cdf0e10cSrcweir 
46cdf0e10cSrcweir #include <tools/solar.h>
47cdf0e10cSrcweir 
48cdf0e10cSrcweir #if defined(BLC)
49cdf0e10cSrcweir #define SWAPNIBBLES(c) c=_crotl(c,4);
50cdf0e10cSrcweir #else
51cdf0e10cSrcweir #define SWAPNIBBLES(c)      \
52cdf0e10cSrcweir unsigned char nSwapTmp=c;   \
53cdf0e10cSrcweir nSwapTmp <<= 4;             \
54cdf0e10cSrcweir c >>= 4;                    \
55cdf0e10cSrcweir c |= nSwapTmp;
56cdf0e10cSrcweir #endif
57cdf0e10cSrcweir 
58cdf0e10cSrcweir #include <tools/debug.hxx>
59cdf0e10cSrcweir #define ENABLE_BYTESTRING_STREAM_OPERATORS
60cdf0e10cSrcweir #include <tools/stream.hxx>
61cdf0e10cSrcweir #include <osl/thread.h>
62cdf0e10cSrcweir #include <algorithm>
63cdf0e10cSrcweir 
64cdf0e10cSrcweir // -----------------------------------------------------------------------
65cdf0e10cSrcweir 
DBG_NAME(Stream)66cdf0e10cSrcweir DBG_NAME( Stream )
67cdf0e10cSrcweir 
68cdf0e10cSrcweir // -----------------------------------------------------------------------
69cdf0e10cSrcweir 
70cdf0e10cSrcweir // sprintf Param-Mode
71cdf0e10cSrcweir #define SPECIAL_PARAM_NONE 0        // Format-Str, Number
72cdf0e10cSrcweir #define SPECIAL_PARAM_WIDTH 1       // Format-Str, Width, Number
73cdf0e10cSrcweir #define SPECIAL_PARAM_PRECISION 2   // Format-Str, Precision, Number
74cdf0e10cSrcweir #define SPECIAL_PARAM_BOTH 3        // Format-Str, Width, Precision, Number
75cdf0e10cSrcweir 
76cdf0e10cSrcweir // -----------------------------------------------------------------------
77cdf0e10cSrcweir 
78cdf0e10cSrcweir // !!! Nicht inline, wenn Operatoren <<,>> inline sind
79cdf0e10cSrcweir inline static void SwapUShort( sal_uInt16& r )
80cdf0e10cSrcweir     {   r = SWAPSHORT(r);   }
SwapShort(short & r)81cdf0e10cSrcweir inline static void SwapShort( short& r )
82cdf0e10cSrcweir     {   r = SWAPSHORT(r);   }
SwapLong(long & r)83cdf0e10cSrcweir inline static void SwapLong( long& r )
84cdf0e10cSrcweir     {   r = SWAPLONG(r);   }
SwapULong(sal_uInt32 & r)85cdf0e10cSrcweir inline static void SwapULong( sal_uInt32& r )
86cdf0e10cSrcweir     {   r = SWAPLONG(r);   }
SwapLongInt(int & r)87cdf0e10cSrcweir inline static void SwapLongInt( int& r )
88cdf0e10cSrcweir     {   r = SWAPLONG(r);   }
SwapLongUInt(unsigned int & r)89cdf0e10cSrcweir inline static void SwapLongUInt( unsigned int& r )
90cdf0e10cSrcweir     {   r = SWAPLONG(r);   }
91cdf0e10cSrcweir #ifdef UNX
SwapFloat(float & r)92cdf0e10cSrcweir inline static void SwapFloat( float& r )
93cdf0e10cSrcweir     {
940618ff6bSPedro Giffuni           union
950618ff6bSPedro Giffuni           {
960618ff6bSPedro Giffuni               float f;
970618ff6bSPedro Giffuni               sal_uInt32 c;
980618ff6bSPedro Giffuni           } s;
990618ff6bSPedro Giffuni 
1000618ff6bSPedro Giffuni           s.f = r;
1010618ff6bSPedro Giffuni           s.c = SWAPLONG( s.c );
1020618ff6bSPedro Giffuni           r = s.f;
103cdf0e10cSrcweir     }
SwapDouble(double & r)104cdf0e10cSrcweir inline static void SwapDouble( double& r )
105cdf0e10cSrcweir     {
106cdf0e10cSrcweir         if( sizeof(double) != 8 )
107cdf0e10cSrcweir         {
108cdf0e10cSrcweir           DBG_ASSERT( sal_False, "Can only swap 8-Byte-doubles\n" );
109cdf0e10cSrcweir         }
110cdf0e10cSrcweir         else
111cdf0e10cSrcweir         {
1120618ff6bSPedro Giffuni           union
1130618ff6bSPedro Giffuni           {
1140618ff6bSPedro Giffuni               double d;
1150618ff6bSPedro Giffuni               sal_uInt32 c[2];
1160618ff6bSPedro Giffuni           } s;
1170618ff6bSPedro Giffuni 
1180618ff6bSPedro Giffuni           s.d = r;
1190618ff6bSPedro Giffuni           s.c[0] ^= s.c[1]; // zwei 32-Bit-Werte in situ vertauschen
1200618ff6bSPedro Giffuni           s.c[1] ^= s.c[0];
1210618ff6bSPedro Giffuni           s.c[0] ^= s.c[1];
1220618ff6bSPedro Giffuni           s.c[0] = SWAPLONG(s.c[0]); // und die beiden 32-Bit-Werte selbst in situ drehen
1230618ff6bSPedro Giffuni           s.c[1] = SWAPLONG(s.c[1]);
1240618ff6bSPedro Giffuni           r = s.d;
125cdf0e10cSrcweir         }
126cdf0e10cSrcweir     }
127cdf0e10cSrcweir #endif
128cdf0e10cSrcweir 
129cdf0e10cSrcweir //SDO
130cdf0e10cSrcweir 
131cdf0e10cSrcweir #define READNUMBER_WITHOUT_SWAP(datatype,value) \
132cdf0e10cSrcweir {\
133cdf0e10cSrcweir int tmp = eIOMode; \
134cdf0e10cSrcweir if( (tmp == STREAM_IO_READ) && sizeof(datatype)<=nBufFree) \
135cdf0e10cSrcweir {\
136cdf0e10cSrcweir     for (std::size_t i = 0; i < sizeof(datatype); i++)\
137cdf0e10cSrcweir         ((char *)&value)[i] = pBufPos[i];\
138cdf0e10cSrcweir     nBufActualPos += sizeof(datatype);\
139cdf0e10cSrcweir     pBufPos += sizeof(datatype);\
140cdf0e10cSrcweir     nBufFree -= sizeof(datatype);\
141cdf0e10cSrcweir }\
142cdf0e10cSrcweir else\
143cdf0e10cSrcweir     Read( (char*)&value, sizeof(datatype) );\
144cdf0e10cSrcweir }
145cdf0e10cSrcweir 
146cdf0e10cSrcweir #define WRITENUMBER_WITHOUT_SWAP(datatype,value) \
147cdf0e10cSrcweir {\
148cdf0e10cSrcweir int tmp = eIOMode; \
149cdf0e10cSrcweir if( (tmp==STREAM_IO_WRITE) && sizeof(datatype) <= nBufFree)\
150cdf0e10cSrcweir {\
151cdf0e10cSrcweir     for (std::size_t i = 0; i < sizeof(datatype); i++)\
152cdf0e10cSrcweir         pBufPos[i] = ((char *)&value)[i];\
153cdf0e10cSrcweir     nBufFree -= sizeof(datatype);\
154cdf0e10cSrcweir     nBufActualPos += sizeof(datatype);\
155cdf0e10cSrcweir     if( nBufActualPos > nBufActualLen )\
156cdf0e10cSrcweir         nBufActualLen = nBufActualPos;\
157cdf0e10cSrcweir     pBufPos += sizeof(datatype);\
158cdf0e10cSrcweir     bIsDirty = sal_True;\
159cdf0e10cSrcweir }\
160cdf0e10cSrcweir else\
161cdf0e10cSrcweir     Write( (char*)&value, sizeof(datatype) );\
162cdf0e10cSrcweir }
163cdf0e10cSrcweir 
164cdf0e10cSrcweir //============================================================================
165cdf0e10cSrcweir //
166cdf0e10cSrcweir //  class SvLockBytes
167cdf0e10cSrcweir //
168cdf0e10cSrcweir //============================================================================
169cdf0e10cSrcweir 
close()170cdf0e10cSrcweir void SvLockBytes::close()
171cdf0e10cSrcweir {
172cdf0e10cSrcweir     if (m_bOwner)
173cdf0e10cSrcweir         delete m_pStream;
174cdf0e10cSrcweir     m_pStream = 0;
175cdf0e10cSrcweir }
176cdf0e10cSrcweir 
177cdf0e10cSrcweir //============================================================================
178cdf0e10cSrcweir TYPEINIT0(SvLockBytes);
179cdf0e10cSrcweir 
180cdf0e10cSrcweir //============================================================================
181cdf0e10cSrcweir // virtual
ReadAt(sal_Size nPos,void * pBuffer,sal_Size nCount,sal_Size * pRead) const182cdf0e10cSrcweir ErrCode SvLockBytes::ReadAt(sal_Size nPos, void * pBuffer, sal_Size nCount,
183cdf0e10cSrcweir                             sal_Size * pRead) const
184cdf0e10cSrcweir {
185cdf0e10cSrcweir     if (!m_pStream)
186cdf0e10cSrcweir     {
187cdf0e10cSrcweir         DBG_ERROR("SvLockBytes::ReadAt(): Bad stream");
188cdf0e10cSrcweir         return ERRCODE_NONE;
189cdf0e10cSrcweir     }
190cdf0e10cSrcweir 
191cdf0e10cSrcweir     m_pStream->Seek(nPos);
192cdf0e10cSrcweir     sal_Size nTheRead = m_pStream->Read(pBuffer, nCount);
193cdf0e10cSrcweir     if (pRead)
194cdf0e10cSrcweir         *pRead = nTheRead;
195cdf0e10cSrcweir     return m_pStream->GetErrorCode();
196cdf0e10cSrcweir }
197cdf0e10cSrcweir 
198cdf0e10cSrcweir //============================================================================
199cdf0e10cSrcweir // virtual
WriteAt(sal_Size nPos,const void * pBuffer,sal_Size nCount,sal_Size * pWritten)200cdf0e10cSrcweir ErrCode SvLockBytes::WriteAt(sal_Size nPos, const void * pBuffer, sal_Size nCount,
201cdf0e10cSrcweir                              sal_Size * pWritten)
202cdf0e10cSrcweir {
203cdf0e10cSrcweir     if (!m_pStream)
204cdf0e10cSrcweir     {
205cdf0e10cSrcweir         DBG_ERROR("SvLockBytes::WriteAt(): Bad stream");
206cdf0e10cSrcweir         return ERRCODE_NONE;
207cdf0e10cSrcweir     }
208cdf0e10cSrcweir 
209cdf0e10cSrcweir     m_pStream->Seek(nPos);
210cdf0e10cSrcweir     sal_Size nTheWritten = m_pStream->Write(pBuffer, nCount);
211cdf0e10cSrcweir     if (pWritten)
212cdf0e10cSrcweir         *pWritten = nTheWritten;
213cdf0e10cSrcweir     return m_pStream->GetErrorCode();
214cdf0e10cSrcweir }
215cdf0e10cSrcweir 
216cdf0e10cSrcweir //============================================================================
217cdf0e10cSrcweir // virtual
Flush() const218cdf0e10cSrcweir ErrCode SvLockBytes::Flush() const
219cdf0e10cSrcweir {
220cdf0e10cSrcweir     if (!m_pStream)
221cdf0e10cSrcweir     {
222cdf0e10cSrcweir         DBG_ERROR("SvLockBytes::Flush(): Bad stream");
223cdf0e10cSrcweir         return ERRCODE_NONE;
224cdf0e10cSrcweir     }
225cdf0e10cSrcweir 
226cdf0e10cSrcweir     m_pStream->Flush();
227cdf0e10cSrcweir     return m_pStream->GetErrorCode();
228cdf0e10cSrcweir }
229cdf0e10cSrcweir 
230cdf0e10cSrcweir //============================================================================
231cdf0e10cSrcweir // virtual
SetSize(sal_Size nSize)232cdf0e10cSrcweir ErrCode SvLockBytes::SetSize(sal_Size nSize)
233cdf0e10cSrcweir {
234cdf0e10cSrcweir     if (!m_pStream)
235cdf0e10cSrcweir     {
236cdf0e10cSrcweir         DBG_ERROR("SvLockBytes::SetSize(): Bad stream");
237cdf0e10cSrcweir         return ERRCODE_NONE;
238cdf0e10cSrcweir     }
239cdf0e10cSrcweir 
240cdf0e10cSrcweir     m_pStream->SetStreamSize(nSize);
241cdf0e10cSrcweir     return m_pStream->GetErrorCode();
242cdf0e10cSrcweir }
243cdf0e10cSrcweir 
244cdf0e10cSrcweir //============================================================================
LockRegion(sal_Size,sal_Size,LockType)245cdf0e10cSrcweir ErrCode SvLockBytes::LockRegion(sal_Size, sal_Size, LockType)
246cdf0e10cSrcweir {
247cdf0e10cSrcweir     DBG_ERROR("SvLockBytes::LockRegion(): Not implemented");
248cdf0e10cSrcweir     return ERRCODE_NONE;
249cdf0e10cSrcweir }
250cdf0e10cSrcweir 
251cdf0e10cSrcweir //============================================================================
252cdf0e10cSrcweir 
UnlockRegion(sal_Size,sal_Size,LockType)253cdf0e10cSrcweir ErrCode SvLockBytes::UnlockRegion(sal_Size, sal_Size, LockType)
254cdf0e10cSrcweir {
255cdf0e10cSrcweir     DBG_ERROR("SvLockBytes::UnlockRegion(): Not implemented");
256cdf0e10cSrcweir     return ERRCODE_NONE;
257cdf0e10cSrcweir }
258cdf0e10cSrcweir 
259cdf0e10cSrcweir //============================================================================
Stat(SvLockBytesStat * pStat,SvLockBytesStatFlag) const260cdf0e10cSrcweir ErrCode SvLockBytes::Stat(SvLockBytesStat * pStat, SvLockBytesStatFlag) const
261cdf0e10cSrcweir {
262cdf0e10cSrcweir     if (!m_pStream)
263cdf0e10cSrcweir     {
264cdf0e10cSrcweir         DBG_ERROR("SvLockBytes::Stat(): Bad stream");
265cdf0e10cSrcweir         return ERRCODE_NONE;
266cdf0e10cSrcweir     }
267cdf0e10cSrcweir 
268cdf0e10cSrcweir     if (pStat)
269cdf0e10cSrcweir     {
270cdf0e10cSrcweir         sal_Size nPos = m_pStream->Tell();
271cdf0e10cSrcweir         pStat->nSize = m_pStream->Seek(STREAM_SEEK_TO_END);
272cdf0e10cSrcweir         m_pStream->Seek(nPos);
273cdf0e10cSrcweir     }
274cdf0e10cSrcweir     return ERRCODE_NONE;
275cdf0e10cSrcweir }
276cdf0e10cSrcweir 
277cdf0e10cSrcweir //============================================================================
278cdf0e10cSrcweir //
279cdf0e10cSrcweir //  class SvOpenLockBytes
280cdf0e10cSrcweir //
281cdf0e10cSrcweir //============================================================================
282cdf0e10cSrcweir 
283cdf0e10cSrcweir TYPEINIT1(SvOpenLockBytes, SvLockBytes);
284cdf0e10cSrcweir 
285cdf0e10cSrcweir //============================================================================
286cdf0e10cSrcweir //
287cdf0e10cSrcweir //  class SvAsyncLockBytes
288cdf0e10cSrcweir //
289cdf0e10cSrcweir //============================================================================
290cdf0e10cSrcweir 
291cdf0e10cSrcweir TYPEINIT1(SvAsyncLockBytes, SvOpenLockBytes);
292cdf0e10cSrcweir 
293cdf0e10cSrcweir //============================================================================
294cdf0e10cSrcweir // virtual
ReadAt(sal_Size nPos,void * pBuffer,sal_Size nCount,sal_Size * pRead) const295cdf0e10cSrcweir ErrCode SvAsyncLockBytes::ReadAt(sal_Size nPos, void * pBuffer, sal_Size nCount,
296cdf0e10cSrcweir                                  sal_Size * pRead) const
297cdf0e10cSrcweir {
298cdf0e10cSrcweir     if (m_bTerminated)
299cdf0e10cSrcweir         return SvOpenLockBytes::ReadAt(nPos, pBuffer, nCount, pRead);
300cdf0e10cSrcweir     else
301cdf0e10cSrcweir     {
302cdf0e10cSrcweir         sal_Size nTheCount = std::min(nPos < m_nSize ? m_nSize - nPos : 0, nCount);
303cdf0e10cSrcweir         ErrCode nError = SvOpenLockBytes::ReadAt(nPos, pBuffer, nTheCount,
304cdf0e10cSrcweir                                                  pRead);
305cdf0e10cSrcweir         return !nCount || nTheCount == nCount || nError ? nError :
306cdf0e10cSrcweir                                                           ERRCODE_IO_PENDING;
307cdf0e10cSrcweir     }
308cdf0e10cSrcweir }
309cdf0e10cSrcweir 
310cdf0e10cSrcweir //============================================================================
311cdf0e10cSrcweir // virtual
WriteAt(sal_Size nPos,const void * pBuffer,sal_Size nCount,sal_Size * pWritten)312cdf0e10cSrcweir ErrCode SvAsyncLockBytes::WriteAt(sal_Size nPos, const void * pBuffer,
313cdf0e10cSrcweir                                   sal_Size nCount, sal_Size * pWritten)
314cdf0e10cSrcweir {
315cdf0e10cSrcweir     if (m_bTerminated)
316cdf0e10cSrcweir         return SvOpenLockBytes::WriteAt(nPos, pBuffer, nCount, pWritten);
317cdf0e10cSrcweir     else
318cdf0e10cSrcweir     {
319cdf0e10cSrcweir         sal_Size nTheCount = std::min(nPos < m_nSize ? m_nSize - nPos : 0, nCount);
320cdf0e10cSrcweir         ErrCode nError = SvOpenLockBytes::WriteAt(nPos, pBuffer, nTheCount,
321cdf0e10cSrcweir                                                   pWritten);
322cdf0e10cSrcweir         return !nCount || nTheCount == nCount || nError ? nError :
323cdf0e10cSrcweir                                                           ERRCODE_IO_PENDING;
324cdf0e10cSrcweir     }
325cdf0e10cSrcweir }
326cdf0e10cSrcweir 
327cdf0e10cSrcweir //============================================================================
328cdf0e10cSrcweir // virtual
FillAppend(const void * pBuffer,sal_Size nCount,sal_Size * pWritten)329cdf0e10cSrcweir ErrCode SvAsyncLockBytes::FillAppend(const void * pBuffer, sal_Size nCount,
330cdf0e10cSrcweir                                      sal_Size * pWritten)
331cdf0e10cSrcweir {
332cdf0e10cSrcweir     sal_Size nTheWritten;
333cdf0e10cSrcweir     ErrCode nError = SvOpenLockBytes::WriteAt(m_nSize, pBuffer, nCount,
334cdf0e10cSrcweir                                               &nTheWritten);
335cdf0e10cSrcweir     if (!nError)
336cdf0e10cSrcweir         m_nSize += nTheWritten;
337cdf0e10cSrcweir     if (pWritten)
338cdf0e10cSrcweir         *pWritten = nTheWritten;
339cdf0e10cSrcweir     return nError;
340cdf0e10cSrcweir }
341cdf0e10cSrcweir 
342cdf0e10cSrcweir //============================================================================
343cdf0e10cSrcweir // virtual
Seek(sal_Size nPos)344cdf0e10cSrcweir sal_Size SvAsyncLockBytes::Seek(sal_Size nPos)
345cdf0e10cSrcweir {
346cdf0e10cSrcweir     if (nPos != STREAM_SEEK_TO_END)
347cdf0e10cSrcweir         m_nSize = nPos;
348cdf0e10cSrcweir     return m_nSize;
349cdf0e10cSrcweir }
350cdf0e10cSrcweir 
351cdf0e10cSrcweir //============================================================================
352cdf0e10cSrcweir //
353cdf0e10cSrcweir //  class SvStream
354cdf0e10cSrcweir //
355cdf0e10cSrcweir //============================================================================
356cdf0e10cSrcweir 
GetData(void * pData,sal_Size nSize)357cdf0e10cSrcweir sal_Size SvStream::GetData( void* pData, sal_Size nSize )
358cdf0e10cSrcweir {
359cdf0e10cSrcweir     if( !GetError() )
360cdf0e10cSrcweir     {
361cdf0e10cSrcweir         DBG_ASSERT( xLockBytes.Is(), "pure virtual function" );
362cdf0e10cSrcweir         sal_Size nRet;
363cdf0e10cSrcweir         nError = xLockBytes->ReadAt( nActPos, pData, nSize, &nRet );
364cdf0e10cSrcweir         nActPos += nRet;
365cdf0e10cSrcweir         return nRet;
366cdf0e10cSrcweir     }
367cdf0e10cSrcweir     else return 0;
368cdf0e10cSrcweir }
369cdf0e10cSrcweir 
SetLockBytes(SvLockBytesRef & rLB)370cdf0e10cSrcweir ErrCode SvStream::SetLockBytes( SvLockBytesRef& rLB )
371cdf0e10cSrcweir {
372cdf0e10cSrcweir     xLockBytes = rLB;
373cdf0e10cSrcweir     RefreshBuffer();
374cdf0e10cSrcweir     return ERRCODE_NONE;
375cdf0e10cSrcweir }
376cdf0e10cSrcweir 
377cdf0e10cSrcweir //========================================================================
378cdf0e10cSrcweir 
PutData(const void * pData,sal_Size nSize)379cdf0e10cSrcweir sal_Size SvStream::PutData( const void* pData, sal_Size nSize )
380cdf0e10cSrcweir {
381cdf0e10cSrcweir     if( !GetError() )
382cdf0e10cSrcweir     {
383cdf0e10cSrcweir         DBG_ASSERT( xLockBytes.Is(), "pure virtual function" );
384cdf0e10cSrcweir         sal_Size nRet;
385cdf0e10cSrcweir         nError = xLockBytes->WriteAt( nActPos, pData, nSize, &nRet );
386cdf0e10cSrcweir         nActPos += nRet;
387cdf0e10cSrcweir         return nRet;
388cdf0e10cSrcweir     }
389cdf0e10cSrcweir     else return 0;
390cdf0e10cSrcweir }
391cdf0e10cSrcweir 
392cdf0e10cSrcweir //========================================================================
393cdf0e10cSrcweir 
SeekPos(sal_Size nPos)394cdf0e10cSrcweir sal_Size SvStream::SeekPos( sal_Size nPos )
395cdf0e10cSrcweir {
396cdf0e10cSrcweir     if( !GetError() && nPos == STREAM_SEEK_TO_END )
397cdf0e10cSrcweir     {
398cdf0e10cSrcweir         DBG_ASSERT( xLockBytes.Is(), "pure virtual function" );
399cdf0e10cSrcweir         SvLockBytesStat aStat;
400cdf0e10cSrcweir         xLockBytes->Stat( &aStat, SVSTATFLAG_DEFAULT );
401cdf0e10cSrcweir         nActPos = aStat.nSize;
402cdf0e10cSrcweir     }
403cdf0e10cSrcweir     else
404cdf0e10cSrcweir         nActPos = nPos;
405cdf0e10cSrcweir     return nActPos;
406cdf0e10cSrcweir }
407cdf0e10cSrcweir 
408cdf0e10cSrcweir //========================================================================
409cdf0e10cSrcweir 
FlushData()410cdf0e10cSrcweir void SvStream::FlushData()
411cdf0e10cSrcweir {
412cdf0e10cSrcweir     if( !GetError() )
413cdf0e10cSrcweir     {
414cdf0e10cSrcweir         DBG_ASSERT( xLockBytes.Is(), "pure virtual function" );
415cdf0e10cSrcweir         nError = xLockBytes->Flush();
416cdf0e10cSrcweir     }
417cdf0e10cSrcweir }
418cdf0e10cSrcweir 
419cdf0e10cSrcweir //========================================================================
420cdf0e10cSrcweir 
SetSize(sal_Size nSize)421cdf0e10cSrcweir void SvStream::SetSize( sal_Size nSize )
422cdf0e10cSrcweir {
423cdf0e10cSrcweir     DBG_ASSERT( xLockBytes.Is(), "pure virtual function" );
424cdf0e10cSrcweir     nError = xLockBytes->SetSize( nSize );
425cdf0e10cSrcweir }
426cdf0e10cSrcweir 
ImpInit()427cdf0e10cSrcweir void SvStream::ImpInit()
428cdf0e10cSrcweir {
429cdf0e10cSrcweir     nActPos             = 0;
430cdf0e10cSrcweir     nCompressMode       = COMPRESSMODE_NONE;
431cdf0e10cSrcweir     eStreamCharSet      = osl_getThreadTextEncoding();
432cdf0e10cSrcweir //  eTargetCharSet      = osl_getThreadTextEncoding();
433cdf0e10cSrcweir     nCryptMask          = 0;
434cdf0e10cSrcweir     bIsEof              = sal_False;
435cdf0e10cSrcweir #if defined UNX
436cdf0e10cSrcweir     eLineDelimiter      = LINEEND_LF;   // UNIX-Format
437cdf0e10cSrcweir #else
438cdf0e10cSrcweir     eLineDelimiter      = LINEEND_CRLF; // DOS-Format
439cdf0e10cSrcweir #endif
440cdf0e10cSrcweir 
441cdf0e10cSrcweir     SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
442cdf0e10cSrcweir 
443cdf0e10cSrcweir     nBufFilePos         = 0;
444cdf0e10cSrcweir     nBufActualPos       = 0;
445cdf0e10cSrcweir     bIsDirty            = sal_False;
446cdf0e10cSrcweir     bIsConsistent       = sal_True;
447cdf0e10cSrcweir     bIsWritable         = sal_True;
448cdf0e10cSrcweir 
449cdf0e10cSrcweir     pRWBuf              = 0;
450cdf0e10cSrcweir     pBufPos             = 0;
451cdf0e10cSrcweir     nBufSize            = 0;
452cdf0e10cSrcweir     nBufActualLen       = 0;
453cdf0e10cSrcweir     eIOMode             = STREAM_IO_DONTKNOW;
454cdf0e10cSrcweir     nBufFree            = 0;
455cdf0e10cSrcweir 
456cdf0e10cSrcweir     nRadix              = 10;
457cdf0e10cSrcweir     nPrecision          = 0;  // all significant digits
458cdf0e10cSrcweir     nWidth              = 0; // default width
459cdf0e10cSrcweir     cFiller             = ' ';
460cdf0e10cSrcweir     nJustification      = JUSTIFY_RIGHT;
461cdf0e10cSrcweir     eStreamMode         = 0;
462cdf0e10cSrcweir     CreateFormatString();
463cdf0e10cSrcweir 
464cdf0e10cSrcweir     nVersion           = 0;
465cdf0e10cSrcweir 
466cdf0e10cSrcweir     ClearError();
467cdf0e10cSrcweir }
468cdf0e10cSrcweir 
469cdf0e10cSrcweir /*************************************************************************
470cdf0e10cSrcweir |*
471cdf0e10cSrcweir |*    Stream::Stream()
472cdf0e10cSrcweir |*
473cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
474cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
475cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
476cdf0e10cSrcweir |*
477cdf0e10cSrcweir *************************************************************************/
478cdf0e10cSrcweir 
SvStream(SvLockBytes * pLockBytesP)479cdf0e10cSrcweir SvStream::SvStream( SvLockBytes* pLockBytesP )
480cdf0e10cSrcweir {
481cdf0e10cSrcweir     DBG_CTOR( Stream, NULL );
482cdf0e10cSrcweir 
483cdf0e10cSrcweir     ImpInit();
484cdf0e10cSrcweir     xLockBytes = pLockBytesP;
485cdf0e10cSrcweir     const SvStream* pStrm;
486cdf0e10cSrcweir     if( pLockBytesP ) {
487cdf0e10cSrcweir         pStrm = pLockBytesP->GetStream();
488cdf0e10cSrcweir         if( pStrm ) {
489cdf0e10cSrcweir             SetError( pStrm->GetErrorCode() );
490cdf0e10cSrcweir         }
491cdf0e10cSrcweir     }
492cdf0e10cSrcweir     SetBufferSize( 256 );
493cdf0e10cSrcweir }
494cdf0e10cSrcweir 
SvStream()495cdf0e10cSrcweir SvStream::SvStream()
496cdf0e10cSrcweir {
497cdf0e10cSrcweir     DBG_CTOR( Stream, NULL );
498cdf0e10cSrcweir 
499cdf0e10cSrcweir     ImpInit();
500cdf0e10cSrcweir }
501cdf0e10cSrcweir 
502cdf0e10cSrcweir /*************************************************************************
503cdf0e10cSrcweir |*
504cdf0e10cSrcweir |*    Stream::~Stream()
505cdf0e10cSrcweir |*
506cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
507cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
508cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
509cdf0e10cSrcweir |*
510cdf0e10cSrcweir *************************************************************************/
511cdf0e10cSrcweir 
~SvStream()512cdf0e10cSrcweir SvStream::~SvStream()
513cdf0e10cSrcweir {
514cdf0e10cSrcweir     DBG_DTOR( Stream, NULL );
515cdf0e10cSrcweir 
516cdf0e10cSrcweir     if ( xLockBytes.Is() )
517cdf0e10cSrcweir         Flush();
518cdf0e10cSrcweir 
519cdf0e10cSrcweir     if( pRWBuf )
520cdf0e10cSrcweir         delete[] pRWBuf;
521cdf0e10cSrcweir }
522cdf0e10cSrcweir 
523cdf0e10cSrcweir /*************************************************************************
524cdf0e10cSrcweir |*
525cdf0e10cSrcweir |*    Stream::IsA()
526cdf0e10cSrcweir |*
527cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
528cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
529cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
530cdf0e10cSrcweir |*
531cdf0e10cSrcweir *************************************************************************/
532cdf0e10cSrcweir 
IsA() const533cdf0e10cSrcweir sal_uInt16 SvStream::IsA() const
534cdf0e10cSrcweir {
535cdf0e10cSrcweir     return (sal_uInt16)ID_STREAM;
536cdf0e10cSrcweir }
537cdf0e10cSrcweir 
538cdf0e10cSrcweir /*************************************************************************
539cdf0e10cSrcweir |*
540cdf0e10cSrcweir |*    Stream::ClearError()
541cdf0e10cSrcweir |*
542cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
543cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
544cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
545cdf0e10cSrcweir |*
546cdf0e10cSrcweir *************************************************************************/
547cdf0e10cSrcweir 
ClearError()548cdf0e10cSrcweir void SvStream::ClearError()
549cdf0e10cSrcweir {
550cdf0e10cSrcweir     bIsEof = sal_False;
551cdf0e10cSrcweir     nError = SVSTREAM_OK;
552cdf0e10cSrcweir }
553cdf0e10cSrcweir 
554cdf0e10cSrcweir /*************************************************************************
555cdf0e10cSrcweir |*
556cdf0e10cSrcweir |*    Stream::SetError()
557cdf0e10cSrcweir |*
558cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
559cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
560cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
561cdf0e10cSrcweir |*
562cdf0e10cSrcweir *************************************************************************/
563cdf0e10cSrcweir 
SetError(sal_uInt32 nErrorCode)564cdf0e10cSrcweir void SvStream::SetError( sal_uInt32 nErrorCode )
565cdf0e10cSrcweir {
566cdf0e10cSrcweir     if ( nError == SVSTREAM_OK )
567cdf0e10cSrcweir         nError = nErrorCode;
568cdf0e10cSrcweir }
569cdf0e10cSrcweir 
570cdf0e10cSrcweir 
571cdf0e10cSrcweir /*************************************************************************
572cdf0e10cSrcweir |*
573cdf0e10cSrcweir |*    Stream::SetNumberFormatInt()
574cdf0e10cSrcweir |*
575cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
576cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
577cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
578cdf0e10cSrcweir |*
579cdf0e10cSrcweir *************************************************************************/
580cdf0e10cSrcweir 
SetNumberFormatInt(sal_uInt16 nNewFormat)581cdf0e10cSrcweir void SvStream::SetNumberFormatInt( sal_uInt16 nNewFormat )
582cdf0e10cSrcweir {
583cdf0e10cSrcweir     nNumberFormatInt = nNewFormat;
584cdf0e10cSrcweir     bSwap = sal_False;
585cdf0e10cSrcweir #ifdef OSL_BIGENDIAN
586cdf0e10cSrcweir     if( nNumberFormatInt == NUMBERFORMAT_INT_LITTLEENDIAN )
587cdf0e10cSrcweir         bSwap = sal_True;
588cdf0e10cSrcweir #else
589cdf0e10cSrcweir     if( nNumberFormatInt == NUMBERFORMAT_INT_BIGENDIAN )
590cdf0e10cSrcweir         bSwap = sal_True;
591cdf0e10cSrcweir #endif
592cdf0e10cSrcweir }
593cdf0e10cSrcweir 
594cdf0e10cSrcweir /*************************************************************************
595cdf0e10cSrcweir |*
596cdf0e10cSrcweir |*    Stream::SetBufferSize()
597cdf0e10cSrcweir |*
598cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
599cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
600cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
601cdf0e10cSrcweir |*
602cdf0e10cSrcweir *************************************************************************/
603cdf0e10cSrcweir 
SetBufferSize(sal_uInt16 nBufferSize)604cdf0e10cSrcweir void SvStream::SetBufferSize( sal_uInt16 nBufferSize )
605cdf0e10cSrcweir {
606cdf0e10cSrcweir     sal_Size nActualFilePos = Tell();
607cdf0e10cSrcweir     sal_Bool bDontSeek = (sal_Bool)(pRWBuf == 0);
608cdf0e10cSrcweir 
609cdf0e10cSrcweir     if( bIsDirty && bIsConsistent && bIsWritable )  // wg. Windows NT: Access denied
610cdf0e10cSrcweir         Flush();
611cdf0e10cSrcweir 
612cdf0e10cSrcweir     if( nBufSize )
613cdf0e10cSrcweir     {
614cdf0e10cSrcweir         delete[] pRWBuf;
615cdf0e10cSrcweir         nBufFilePos += nBufActualPos;
616cdf0e10cSrcweir     }
617cdf0e10cSrcweir 
618cdf0e10cSrcweir     pRWBuf          = 0;
619cdf0e10cSrcweir     nBufActualLen   = 0;
620cdf0e10cSrcweir     nBufActualPos   = 0;
621cdf0e10cSrcweir     nBufSize        = nBufferSize;
622cdf0e10cSrcweir     if( nBufSize )
623cdf0e10cSrcweir         pRWBuf = new sal_uInt8[ nBufSize ];
624cdf0e10cSrcweir     bIsConsistent   = sal_True;
625cdf0e10cSrcweir     pBufPos         = pRWBuf;
626cdf0e10cSrcweir     eIOMode = STREAM_IO_DONTKNOW;
627cdf0e10cSrcweir     if( !bDontSeek )
628cdf0e10cSrcweir         SeekPos( nActualFilePos );
629cdf0e10cSrcweir }
630cdf0e10cSrcweir 
631cdf0e10cSrcweir /*************************************************************************
632cdf0e10cSrcweir |*
633cdf0e10cSrcweir |*    Stream::ClearBuffer()
634cdf0e10cSrcweir |*
635cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
636cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
637cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
638cdf0e10cSrcweir |*
639cdf0e10cSrcweir *************************************************************************/
640cdf0e10cSrcweir 
ClearBuffer()641cdf0e10cSrcweir void SvStream::ClearBuffer()
642cdf0e10cSrcweir {
643cdf0e10cSrcweir     nBufActualLen   = 0;
644cdf0e10cSrcweir     nBufActualPos   = 0;
645cdf0e10cSrcweir     nBufFilePos     = 0;
646cdf0e10cSrcweir     pBufPos         = pRWBuf;
647cdf0e10cSrcweir     bIsDirty        = sal_False;
648cdf0e10cSrcweir     bIsConsistent   = sal_True;
649cdf0e10cSrcweir     eIOMode         = STREAM_IO_DONTKNOW;
650cdf0e10cSrcweir 
651cdf0e10cSrcweir     bIsEof          = sal_False;
652cdf0e10cSrcweir }
653cdf0e10cSrcweir 
654cdf0e10cSrcweir /*************************************************************************
655cdf0e10cSrcweir |*
656cdf0e10cSrcweir |*    Stream::ResetError()
657cdf0e10cSrcweir |*
658cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
659cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
660cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
661cdf0e10cSrcweir |*
662cdf0e10cSrcweir *************************************************************************/
663cdf0e10cSrcweir 
ResetError()664cdf0e10cSrcweir void SvStream::ResetError()
665cdf0e10cSrcweir {
666cdf0e10cSrcweir     ClearError();
667cdf0e10cSrcweir }
668cdf0e10cSrcweir 
669cdf0e10cSrcweir /*************************************************************************
670cdf0e10cSrcweir |*
671cdf0e10cSrcweir |*    Stream::ReadLine()
672cdf0e10cSrcweir |*
673cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
674cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
675cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
676cdf0e10cSrcweir |*
677cdf0e10cSrcweir *************************************************************************/
678cdf0e10cSrcweir 
ReadByteStringLine(::rtl::OUString & rStr,rtl_TextEncoding eSrcCharSet)679*7b2bc0e6SDamjan Jovanovic sal_Bool SvStream::ReadByteStringLine( ::rtl::OUString& rStr, rtl_TextEncoding eSrcCharSet )
680*7b2bc0e6SDamjan Jovanovic {
681*7b2bc0e6SDamjan Jovanovic     sal_Bool bRet;
682*7b2bc0e6SDamjan Jovanovic     ::rtl::OStringBuffer stringBuffer;
683*7b2bc0e6SDamjan Jovanovic 
684*7b2bc0e6SDamjan Jovanovic     bRet = ReadLine( stringBuffer );
685*7b2bc0e6SDamjan Jovanovic     rStr = ::rtl::OStringToOUString( stringBuffer.makeStringAndClear(), eSrcCharSet );
686*7b2bc0e6SDamjan Jovanovic     return bRet;
687*7b2bc0e6SDamjan Jovanovic }
688*7b2bc0e6SDamjan Jovanovic 
ReadByteStringLine(String & rStr,rtl_TextEncoding eSrcCharSet)689cdf0e10cSrcweir sal_Bool SvStream::ReadByteStringLine( String& rStr, rtl_TextEncoding eSrcCharSet )
690cdf0e10cSrcweir {
691cdf0e10cSrcweir     sal_Bool bRet;
692cdf0e10cSrcweir     ByteString aStr;
693cdf0e10cSrcweir 
694cdf0e10cSrcweir     bRet = ReadLine(aStr);
695cdf0e10cSrcweir     rStr = UniString( aStr, eSrcCharSet );
696cdf0e10cSrcweir     return bRet;
697cdf0e10cSrcweir }
698cdf0e10cSrcweir 
ReadLine(::rtl::OStringBuffer & rStr)699*7b2bc0e6SDamjan Jovanovic sal_Bool SvStream::ReadLine( ::rtl::OStringBuffer& rStr )
700*7b2bc0e6SDamjan Jovanovic {
701*7b2bc0e6SDamjan Jovanovic     sal_Char    buf[256+1];
702*7b2bc0e6SDamjan Jovanovic     sal_Bool    bEnd = sal_False;
703*7b2bc0e6SDamjan Jovanovic     sal_Size    nOldFilePos = Tell();
704*7b2bc0e6SDamjan Jovanovic     sal_Char    c = 0;
705*7b2bc0e6SDamjan Jovanovic     sal_Size    nTotalLen = 0;
706*7b2bc0e6SDamjan Jovanovic 
707*7b2bc0e6SDamjan Jovanovic     rStr.setLength( 0 );
708*7b2bc0e6SDamjan Jovanovic     while( !bEnd && !GetError() )   // !!! do not test for EOF,
709*7b2bc0e6SDamjan Jovanovic                                     // !!! because we read in blocks
710*7b2bc0e6SDamjan Jovanovic     {
711*7b2bc0e6SDamjan Jovanovic         sal_uInt16 nLen = (sal_uInt16)Read( buf, sizeof(buf)-1 );
712*7b2bc0e6SDamjan Jovanovic         if ( !nLen )
713*7b2bc0e6SDamjan Jovanovic         {
714*7b2bc0e6SDamjan Jovanovic             if ( rStr.getLength() == 0 )
715*7b2bc0e6SDamjan Jovanovic             {
716*7b2bc0e6SDamjan Jovanovic                 // the very first block read failed -> abort
717*7b2bc0e6SDamjan Jovanovic                 bIsEof = sal_True;
718*7b2bc0e6SDamjan Jovanovic                 return sal_False;
719*7b2bc0e6SDamjan Jovanovic             }
720*7b2bc0e6SDamjan Jovanovic             else
721*7b2bc0e6SDamjan Jovanovic                 break;
722*7b2bc0e6SDamjan Jovanovic         }
723*7b2bc0e6SDamjan Jovanovic 
724*7b2bc0e6SDamjan Jovanovic         sal_uInt16 j, n;
725*7b2bc0e6SDamjan Jovanovic         for( j = n = 0; j < nLen ; ++j )
726*7b2bc0e6SDamjan Jovanovic         {
727*7b2bc0e6SDamjan Jovanovic             c = buf[j];
728*7b2bc0e6SDamjan Jovanovic             if ( c == '\n' || c == '\r' )
729*7b2bc0e6SDamjan Jovanovic             {
730*7b2bc0e6SDamjan Jovanovic                 bEnd = sal_True;
731*7b2bc0e6SDamjan Jovanovic                 break;
732*7b2bc0e6SDamjan Jovanovic             }
733*7b2bc0e6SDamjan Jovanovic             // erAck 26.02.01: Old behavior was no special treatment of '\0'
734*7b2bc0e6SDamjan Jovanovic             // character here, but a following rStr+=c did ignore it. Is this
735*7b2bc0e6SDamjan Jovanovic             // really intended? Or should a '\0' better terminate a line?
736*7b2bc0e6SDamjan Jovanovic             // The nOldFilePos stuff wasn't correct then anyways.
737*7b2bc0e6SDamjan Jovanovic             if ( c )
738*7b2bc0e6SDamjan Jovanovic             {
739*7b2bc0e6SDamjan Jovanovic                 if ( n < j )
740*7b2bc0e6SDamjan Jovanovic                     buf[n] = c;
741*7b2bc0e6SDamjan Jovanovic                 ++n;
742*7b2bc0e6SDamjan Jovanovic             }
743*7b2bc0e6SDamjan Jovanovic         }
744*7b2bc0e6SDamjan Jovanovic         if ( n )
745*7b2bc0e6SDamjan Jovanovic             rStr.append( buf, n );
746*7b2bc0e6SDamjan Jovanovic         nTotalLen += j;
747*7b2bc0e6SDamjan Jovanovic     }
748*7b2bc0e6SDamjan Jovanovic 
749*7b2bc0e6SDamjan Jovanovic     if ( !bEnd && !GetError() && rStr.getLength() )
750*7b2bc0e6SDamjan Jovanovic         bEnd = sal_True;
751*7b2bc0e6SDamjan Jovanovic 
752*7b2bc0e6SDamjan Jovanovic     nOldFilePos += nTotalLen;
753*7b2bc0e6SDamjan Jovanovic     if( Tell() > nOldFilePos )
754*7b2bc0e6SDamjan Jovanovic         nOldFilePos++;
755*7b2bc0e6SDamjan Jovanovic     Seek( nOldFilePos );  // seek because of the above BlockRead!
756*7b2bc0e6SDamjan Jovanovic 
757*7b2bc0e6SDamjan Jovanovic     if ( bEnd && (c=='\r' || c=='\n') )  // Special treatment of DOS files
758*7b2bc0e6SDamjan Jovanovic     {
759*7b2bc0e6SDamjan Jovanovic         char cTemp;
760*7b2bc0e6SDamjan Jovanovic         sal_Size nLen = Read((char*)&cTemp , sizeof(cTemp) );
761*7b2bc0e6SDamjan Jovanovic         if ( nLen ) {
762*7b2bc0e6SDamjan Jovanovic             if( cTemp == c || (cTemp != '\n' && cTemp != '\r') )
763*7b2bc0e6SDamjan Jovanovic                 Seek( nOldFilePos );
764*7b2bc0e6SDamjan Jovanovic         }
765*7b2bc0e6SDamjan Jovanovic     }
766*7b2bc0e6SDamjan Jovanovic 
767*7b2bc0e6SDamjan Jovanovic     if ( bEnd )
768*7b2bc0e6SDamjan Jovanovic         bIsEof = sal_False;
769*7b2bc0e6SDamjan Jovanovic     return bEnd;
770*7b2bc0e6SDamjan Jovanovic }
771*7b2bc0e6SDamjan Jovanovic 
ReadLine(ByteString & rStr)772cdf0e10cSrcweir sal_Bool SvStream::ReadLine( ByteString& rStr )
773cdf0e10cSrcweir {
774cdf0e10cSrcweir     sal_Char    buf[256+1];
775cdf0e10cSrcweir     sal_Bool        bEnd        = sal_False;
776cdf0e10cSrcweir     sal_Size       nOldFilePos = Tell();
777cdf0e10cSrcweir     sal_Char    c           = 0;
778cdf0e10cSrcweir     sal_Size       nTotalLen   = 0;
779cdf0e10cSrcweir 
780cdf0e10cSrcweir     rStr.Erase();
781cdf0e10cSrcweir     while( !bEnd && !GetError() )   // !!! nicht auf EOF testen,
782cdf0e10cSrcweir                                     // !!! weil wir blockweise
783cdf0e10cSrcweir                                     // !!! lesen
784cdf0e10cSrcweir     {
785cdf0e10cSrcweir         sal_uInt16 nLen = (sal_uInt16)Read( buf, sizeof(buf)-1 );
786cdf0e10cSrcweir         if ( !nLen )
787cdf0e10cSrcweir         {
788cdf0e10cSrcweir             if ( rStr.Len() == 0 )
789cdf0e10cSrcweir             {
790cdf0e10cSrcweir                 // der allererste Blockread hat fehlgeschlagen -> Abflug
791cdf0e10cSrcweir                 bIsEof = sal_True;
792cdf0e10cSrcweir                 return sal_False;
793cdf0e10cSrcweir             }
794cdf0e10cSrcweir             else
795cdf0e10cSrcweir                 break;
796cdf0e10cSrcweir         }
797cdf0e10cSrcweir 
798cdf0e10cSrcweir         sal_uInt16 j, n;
799cdf0e10cSrcweir         for( j = n = 0; j < nLen ; ++j )
800cdf0e10cSrcweir         {
801cdf0e10cSrcweir             c = buf[j];
802cdf0e10cSrcweir             if ( c == '\n' || c == '\r' )
803cdf0e10cSrcweir             {
804cdf0e10cSrcweir                 bEnd = sal_True;
805cdf0e10cSrcweir                 break;
806cdf0e10cSrcweir             }
807cdf0e10cSrcweir             // erAck 26.02.01: Old behavior was no special treatment of '\0'
808cdf0e10cSrcweir             // character here, but a following rStr+=c did ignore it. Is this
809cdf0e10cSrcweir             // really intended? Or should a '\0' better terminate a line?
810cdf0e10cSrcweir             // The nOldFilePos stuff wasn't correct then anyways.
811cdf0e10cSrcweir             if ( c )
812cdf0e10cSrcweir             {
813cdf0e10cSrcweir                 if ( n < j )
814cdf0e10cSrcweir                     buf[n] = c;
815cdf0e10cSrcweir                 ++n;
816cdf0e10cSrcweir             }
817cdf0e10cSrcweir         }
818cdf0e10cSrcweir         if ( n )
819cdf0e10cSrcweir             rStr.Append( buf, n );
820cdf0e10cSrcweir         nTotalLen += j;
821cdf0e10cSrcweir     }
822cdf0e10cSrcweir 
823cdf0e10cSrcweir     if ( !bEnd && !GetError() && rStr.Len() )
824cdf0e10cSrcweir         bEnd = sal_True;
825cdf0e10cSrcweir 
826cdf0e10cSrcweir     nOldFilePos += nTotalLen;
827cdf0e10cSrcweir     if( Tell() > nOldFilePos )
828cdf0e10cSrcweir         nOldFilePos++;
829cdf0e10cSrcweir     Seek( nOldFilePos );  // seeken wg. obigem BlockRead!
830cdf0e10cSrcweir 
831cdf0e10cSrcweir     if ( bEnd && (c=='\r' || c=='\n') )  // Sonderbehandlung DOS-Dateien
832cdf0e10cSrcweir     {
833cdf0e10cSrcweir         char cTemp;
834cdf0e10cSrcweir         sal_Size nLen = Read((char*)&cTemp , sizeof(cTemp) );
835cdf0e10cSrcweir         if ( nLen ) {
836cdf0e10cSrcweir             if( cTemp == c || (cTemp != '\n' && cTemp != '\r') )
837cdf0e10cSrcweir                 Seek( nOldFilePos );
838cdf0e10cSrcweir         }
839cdf0e10cSrcweir     }
840cdf0e10cSrcweir 
841cdf0e10cSrcweir     if ( bEnd )
842cdf0e10cSrcweir         bIsEof = sal_False;
843cdf0e10cSrcweir     return bEnd;
844cdf0e10cSrcweir }
845cdf0e10cSrcweir 
ReadUniStringLine(String & rStr)846cdf0e10cSrcweir sal_Bool SvStream::ReadUniStringLine( String& rStr )
847cdf0e10cSrcweir {
848cdf0e10cSrcweir     sal_Unicode buf[256+1];
849cdf0e10cSrcweir     sal_Bool        bEnd        = sal_False;
850cdf0e10cSrcweir     sal_Size       nOldFilePos = Tell();
851cdf0e10cSrcweir     sal_Unicode c           = 0;
852cdf0e10cSrcweir     sal_Size       nTotalLen   = 0;
853cdf0e10cSrcweir 
854cdf0e10cSrcweir     DBG_ASSERT( sizeof(sal_Unicode) == sizeof(sal_uInt16), "ReadUniStringLine: swapping sizeof(sal_Unicode) not implemented" );
855cdf0e10cSrcweir 
856cdf0e10cSrcweir     rStr.Erase();
857cdf0e10cSrcweir     while( !bEnd && !GetError() )   // !!! nicht auf EOF testen,
858cdf0e10cSrcweir                                     // !!! weil wir blockweise
859cdf0e10cSrcweir                                     // !!! lesen
860cdf0e10cSrcweir     {
861cdf0e10cSrcweir         sal_uInt16 nLen = (sal_uInt16)Read( (char*)buf, sizeof(buf)-sizeof(sal_Unicode) );
862cdf0e10cSrcweir         nLen /= sizeof(sal_Unicode);
863cdf0e10cSrcweir         if ( !nLen )
864cdf0e10cSrcweir         {
865cdf0e10cSrcweir             if ( rStr.Len() == 0 )
866cdf0e10cSrcweir             {
867cdf0e10cSrcweir                 // der allererste Blockread hat fehlgeschlagen -> Abflug
868cdf0e10cSrcweir                 bIsEof = sal_True;
869cdf0e10cSrcweir                 return sal_False;
870cdf0e10cSrcweir             }
871cdf0e10cSrcweir             else
872cdf0e10cSrcweir                 break;
873cdf0e10cSrcweir         }
874cdf0e10cSrcweir 
875cdf0e10cSrcweir         sal_uInt16 j, n;
876cdf0e10cSrcweir         for( j = n = 0; j < nLen ; ++j )
877cdf0e10cSrcweir         {
878cdf0e10cSrcweir             if ( bSwap )
879cdf0e10cSrcweir                 SwapUShort( buf[n] );
880cdf0e10cSrcweir             c = buf[j];
881cdf0e10cSrcweir             if ( c == '\n' || c == '\r' )
882cdf0e10cSrcweir             {
883cdf0e10cSrcweir                 bEnd = sal_True;
884cdf0e10cSrcweir                 break;
885cdf0e10cSrcweir             }
886cdf0e10cSrcweir             // erAck 26.02.01: Old behavior was no special treatment of '\0'
887cdf0e10cSrcweir             // character here, but a following rStr+=c did ignore it. Is this
888cdf0e10cSrcweir             // really intended? Or should a '\0' better terminate a line?
889cdf0e10cSrcweir             // The nOldFilePos stuff wasn't correct then anyways.
890cdf0e10cSrcweir             if ( c )
891cdf0e10cSrcweir             {
892cdf0e10cSrcweir                 if ( n < j )
893cdf0e10cSrcweir                     buf[n] = c;
894cdf0e10cSrcweir                 ++n;
895cdf0e10cSrcweir             }
896cdf0e10cSrcweir         }
897cdf0e10cSrcweir         if ( n )
898cdf0e10cSrcweir             rStr.Append( buf, n );
899cdf0e10cSrcweir         nTotalLen += j;
900cdf0e10cSrcweir     }
901cdf0e10cSrcweir 
902cdf0e10cSrcweir     if ( !bEnd && !GetError() && rStr.Len() )
903cdf0e10cSrcweir         bEnd = sal_True;
904cdf0e10cSrcweir 
905cdf0e10cSrcweir     nOldFilePos += nTotalLen * sizeof(sal_Unicode);
906cdf0e10cSrcweir     if( Tell() > nOldFilePos )
907cdf0e10cSrcweir         nOldFilePos += sizeof(sal_Unicode);
908cdf0e10cSrcweir     Seek( nOldFilePos );  // seeken wg. obigem BlockRead!
909cdf0e10cSrcweir 
910cdf0e10cSrcweir     if ( bEnd && (c=='\r' || c=='\n') )  // Sonderbehandlung DOS-Dateien
911cdf0e10cSrcweir     {
912cdf0e10cSrcweir         sal_Unicode cTemp;
913cdf0e10cSrcweir         Read( (char*)&cTemp, sizeof(cTemp) );
914cdf0e10cSrcweir         if ( bSwap )
915cdf0e10cSrcweir             SwapUShort( cTemp );
916cdf0e10cSrcweir         if( cTemp == c || (cTemp != '\n' && cTemp != '\r') )
917cdf0e10cSrcweir             Seek( nOldFilePos );
918cdf0e10cSrcweir     }
919cdf0e10cSrcweir 
920cdf0e10cSrcweir     if ( bEnd )
921cdf0e10cSrcweir         bIsEof = sal_False;
922cdf0e10cSrcweir     return bEnd;
923cdf0e10cSrcweir }
924cdf0e10cSrcweir 
ReadUniOrByteStringLine(String & rStr,rtl_TextEncoding eSrcCharSet)925cdf0e10cSrcweir sal_Bool SvStream::ReadUniOrByteStringLine( String& rStr, rtl_TextEncoding eSrcCharSet )
926cdf0e10cSrcweir {
927cdf0e10cSrcweir     if ( eSrcCharSet == RTL_TEXTENCODING_UNICODE )
928cdf0e10cSrcweir         return ReadUniStringLine( rStr );
929cdf0e10cSrcweir     else
930cdf0e10cSrcweir         return ReadByteStringLine( rStr, eSrcCharSet );
931cdf0e10cSrcweir }
932cdf0e10cSrcweir 
933cdf0e10cSrcweir /*************************************************************************
934cdf0e10cSrcweir |*
935cdf0e10cSrcweir |*    Stream::ReadCString
936cdf0e10cSrcweir |*
937cdf0e10cSrcweir *************************************************************************/
938cdf0e10cSrcweir 
ReadCString(ByteString & rStr)939cdf0e10cSrcweir sal_Bool SvStream::ReadCString( ByteString& rStr )
940cdf0e10cSrcweir {
941cdf0e10cSrcweir     if( rStr.Len() )
942cdf0e10cSrcweir         rStr.Erase();
943cdf0e10cSrcweir 
944cdf0e10cSrcweir     sal_Char buf[ 256 + 1 ];
945cdf0e10cSrcweir     sal_Bool bEnd = sal_False;
946cdf0e10cSrcweir     sal_Size nFilePos = Tell();
947cdf0e10cSrcweir 
948cdf0e10cSrcweir     while( !bEnd && !GetError() )
949cdf0e10cSrcweir     {
950cdf0e10cSrcweir         sal_uInt16 nLen = (sal_uInt16)Read( buf, sizeof(buf)-1 );
951cdf0e10cSrcweir         sal_uInt16 nReallyRead = nLen;
952cdf0e10cSrcweir         if( !nLen )
953cdf0e10cSrcweir             break;
954cdf0e10cSrcweir 
955cdf0e10cSrcweir         const sal_Char* pPtr = buf;
956cdf0e10cSrcweir         while( *pPtr && nLen )
957cdf0e10cSrcweir             ++pPtr, --nLen;
958cdf0e10cSrcweir 
959cdf0e10cSrcweir         bEnd =  ( nReallyRead < sizeof(buf)-1 )         // read less than attempted to read
960cdf0e10cSrcweir                 ||  (  ( nLen > 0 )                    // OR it is inside the block we read
961cdf0e10cSrcweir                     &&  ( 0 == *pPtr )                  //    AND found a string terminator
962cdf0e10cSrcweir                     );
963cdf0e10cSrcweir 
964cdf0e10cSrcweir         rStr.Append( buf, ::sal::static_int_cast< xub_StrLen >( pPtr - buf ) );
965cdf0e10cSrcweir     }
966cdf0e10cSrcweir 
967cdf0e10cSrcweir     nFilePos += rStr.Len();
968cdf0e10cSrcweir     if( Tell() > nFilePos )
969cdf0e10cSrcweir         nFilePos++;
970cdf0e10cSrcweir     Seek( nFilePos );  // seeken wg. obigem BlockRead!
971cdf0e10cSrcweir     return bEnd;
972cdf0e10cSrcweir }
973cdf0e10cSrcweir 
ReadCString(String & rStr,rtl_TextEncoding eToEncode)974cdf0e10cSrcweir sal_Bool SvStream::ReadCString( String& rStr, rtl_TextEncoding eToEncode )
975cdf0e10cSrcweir {
976cdf0e10cSrcweir     ByteString sStr;
977cdf0e10cSrcweir     sal_Bool bRet = ReadCString( sStr );
978cdf0e10cSrcweir     rStr = String( sStr, eToEncode );
979cdf0e10cSrcweir     return bRet;
980cdf0e10cSrcweir }
981cdf0e10cSrcweir 
982cdf0e10cSrcweir 
983cdf0e10cSrcweir /*************************************************************************
984cdf0e10cSrcweir |*
985cdf0e10cSrcweir |*    Stream::WriteUnicodeText()
986cdf0e10cSrcweir |*
987cdf0e10cSrcweir *************************************************************************/
988cdf0e10cSrcweir 
WriteUnicodeText(const String & rStr)989cdf0e10cSrcweir sal_Bool SvStream::WriteUnicodeText( const String& rStr )
990cdf0e10cSrcweir {
991cdf0e10cSrcweir     DBG_ASSERT( sizeof(sal_Unicode) == sizeof(sal_uInt16), "WriteUnicodeText: swapping sizeof(sal_Unicode) not implemented" );
992cdf0e10cSrcweir     if ( bSwap )
993cdf0e10cSrcweir     {
994cdf0e10cSrcweir         xub_StrLen nLen = rStr.Len();
995cdf0e10cSrcweir         sal_Unicode aBuf[384];
996cdf0e10cSrcweir         sal_Unicode* const pTmp = ( nLen > 384 ? new sal_Unicode[nLen] : aBuf);
997cdf0e10cSrcweir         memcpy( pTmp, rStr.GetBuffer(), nLen * sizeof(sal_Unicode) );
998cdf0e10cSrcweir         sal_Unicode* p = pTmp;
999cdf0e10cSrcweir         const sal_Unicode* const pStop = pTmp + nLen;
1000cdf0e10cSrcweir         while ( p < pStop )
1001cdf0e10cSrcweir         {
1002cdf0e10cSrcweir             SwapUShort( *p );
1003cdf0e10cSrcweir             p++;
1004cdf0e10cSrcweir         }
1005cdf0e10cSrcweir         Write( (char*)pTmp, nLen * sizeof(sal_Unicode) );
1006cdf0e10cSrcweir         if ( pTmp != aBuf )
1007cdf0e10cSrcweir             delete [] pTmp;
1008cdf0e10cSrcweir     }
1009cdf0e10cSrcweir     else
1010cdf0e10cSrcweir         Write( (char*)rStr.GetBuffer(), rStr.Len() * sizeof(sal_Unicode) );
1011cdf0e10cSrcweir     return nError == SVSTREAM_OK;
1012cdf0e10cSrcweir }
1013cdf0e10cSrcweir 
WriteUnicodeOrByteText(const String & rStr,rtl_TextEncoding eDestCharSet)1014cdf0e10cSrcweir sal_Bool SvStream::WriteUnicodeOrByteText( const String& rStr, rtl_TextEncoding eDestCharSet )
1015cdf0e10cSrcweir {
1016cdf0e10cSrcweir     if ( eDestCharSet == RTL_TEXTENCODING_UNICODE )
1017cdf0e10cSrcweir         return WriteUnicodeText( rStr );
1018cdf0e10cSrcweir     else
1019cdf0e10cSrcweir     {
1020cdf0e10cSrcweir         ByteString aStr( rStr, eDestCharSet );
1021cdf0e10cSrcweir         Write( aStr.GetBuffer(), aStr.Len() );
1022cdf0e10cSrcweir         return nError == SVSTREAM_OK;
1023cdf0e10cSrcweir     }
1024cdf0e10cSrcweir }
1025cdf0e10cSrcweir 
1026cdf0e10cSrcweir /*************************************************************************
1027cdf0e10cSrcweir |*
1028cdf0e10cSrcweir |*    Stream::WriteLine()
1029cdf0e10cSrcweir |*
1030cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
1031cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
1032cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
1033cdf0e10cSrcweir |*
1034cdf0e10cSrcweir *************************************************************************/
1035cdf0e10cSrcweir 
WriteByteStringLine(const String & rStr,rtl_TextEncoding eDestCharSet)1036cdf0e10cSrcweir sal_Bool SvStream::WriteByteStringLine( const String& rStr, rtl_TextEncoding eDestCharSet )
1037cdf0e10cSrcweir {
1038cdf0e10cSrcweir     return WriteLine( ByteString( rStr, eDestCharSet ) );
1039cdf0e10cSrcweir }
1040cdf0e10cSrcweir 
WriteLine(const ByteString & rStr)1041cdf0e10cSrcweir sal_Bool SvStream::WriteLine( const ByteString& rStr )
1042cdf0e10cSrcweir {
1043cdf0e10cSrcweir     Write( rStr.GetBuffer(), rStr.Len() );
1044cdf0e10cSrcweir     endl(*this);
1045cdf0e10cSrcweir     return nError == SVSTREAM_OK;
1046cdf0e10cSrcweir }
1047cdf0e10cSrcweir 
WriteUniStringLine(const String & rStr)1048cdf0e10cSrcweir sal_Bool SvStream::WriteUniStringLine( const String& rStr )
1049cdf0e10cSrcweir {
1050cdf0e10cSrcweir     WriteUnicodeText( rStr );
1051cdf0e10cSrcweir     endlu(*this);
1052cdf0e10cSrcweir     return nError == SVSTREAM_OK;
1053cdf0e10cSrcweir }
1054cdf0e10cSrcweir 
WriteUniOrByteStringLine(const String & rStr,rtl_TextEncoding eDestCharSet)1055cdf0e10cSrcweir sal_Bool SvStream::WriteUniOrByteStringLine( const String& rStr, rtl_TextEncoding eDestCharSet )
1056cdf0e10cSrcweir {
1057cdf0e10cSrcweir     if ( eDestCharSet == RTL_TEXTENCODING_UNICODE )
1058cdf0e10cSrcweir         return WriteUniStringLine( rStr );
1059cdf0e10cSrcweir     else
1060cdf0e10cSrcweir         return WriteByteStringLine( rStr, eDestCharSet );
1061cdf0e10cSrcweir }
1062cdf0e10cSrcweir 
1063cdf0e10cSrcweir /*************************************************************************
1064cdf0e10cSrcweir |*
1065cdf0e10cSrcweir |*    Stream::WriteLines()
1066cdf0e10cSrcweir |*
1067cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
1068cdf0e10cSrcweir |*    Ersterstellung    OV 17.07.95
1069cdf0e10cSrcweir |*    Letzte Aenderung  OV 17.07.95
1070cdf0e10cSrcweir |*
1071cdf0e10cSrcweir *************************************************************************/
1072cdf0e10cSrcweir 
WriteByteStringLines(const String & rStr,rtl_TextEncoding eDestCharSet)1073cdf0e10cSrcweir sal_Bool SvStream::WriteByteStringLines( const String& rStr, rtl_TextEncoding eDestCharSet )
1074cdf0e10cSrcweir {
1075cdf0e10cSrcweir     return WriteLines( ByteString( rStr, eDestCharSet ) );
1076cdf0e10cSrcweir }
1077cdf0e10cSrcweir 
WriteLines(const ByteString & rStr)1078cdf0e10cSrcweir sal_Bool SvStream::WriteLines( const ByteString& rStr )
1079cdf0e10cSrcweir {
1080cdf0e10cSrcweir     ByteString aStr( rStr );
1081cdf0e10cSrcweir     aStr.ConvertLineEnd( eLineDelimiter );
1082cdf0e10cSrcweir     Write( aStr.GetBuffer(), aStr.Len() );
1083cdf0e10cSrcweir     endl( *this );
1084cdf0e10cSrcweir     return (sal_Bool)(nError == SVSTREAM_OK);
1085cdf0e10cSrcweir }
1086cdf0e10cSrcweir 
WriteUniStringLines(const String & rStr)1087cdf0e10cSrcweir sal_Bool SvStream::WriteUniStringLines( const String& rStr )
1088cdf0e10cSrcweir {
1089cdf0e10cSrcweir     String aStr( rStr );
1090cdf0e10cSrcweir     aStr.ConvertLineEnd( eLineDelimiter );
1091cdf0e10cSrcweir     WriteUniStringLine( aStr );
1092cdf0e10cSrcweir     return nError == SVSTREAM_OK;
1093cdf0e10cSrcweir }
1094cdf0e10cSrcweir 
WriteUniOrByteStringLines(const String & rStr,rtl_TextEncoding eDestCharSet)1095cdf0e10cSrcweir sal_Bool SvStream::WriteUniOrByteStringLines( const String& rStr, rtl_TextEncoding eDestCharSet )
1096cdf0e10cSrcweir {
1097cdf0e10cSrcweir     if ( eDestCharSet == RTL_TEXTENCODING_UNICODE )
1098cdf0e10cSrcweir         return WriteUniStringLines( rStr );
1099cdf0e10cSrcweir     else
1100cdf0e10cSrcweir         return WriteByteStringLines( rStr, eDestCharSet );
1101cdf0e10cSrcweir }
1102cdf0e10cSrcweir 
1103cdf0e10cSrcweir /*************************************************************************
1104cdf0e10cSrcweir |*
1105cdf0e10cSrcweir |*    Stream::WriteUniOrByteChar()
1106cdf0e10cSrcweir |*
1107cdf0e10cSrcweir *************************************************************************/
1108cdf0e10cSrcweir 
WriteUniOrByteChar(sal_Unicode ch,rtl_TextEncoding eDestCharSet)1109cdf0e10cSrcweir sal_Bool SvStream::WriteUniOrByteChar( sal_Unicode ch, rtl_TextEncoding eDestCharSet )
1110cdf0e10cSrcweir {
1111cdf0e10cSrcweir     if ( eDestCharSet == RTL_TEXTENCODING_UNICODE )
1112cdf0e10cSrcweir         *this << ch;
1113cdf0e10cSrcweir     else
1114cdf0e10cSrcweir     {
1115cdf0e10cSrcweir         ByteString aStr( ch, eDestCharSet );
1116cdf0e10cSrcweir         Write( aStr.GetBuffer(), aStr.Len() );
1117cdf0e10cSrcweir     }
1118cdf0e10cSrcweir     return nError == SVSTREAM_OK;
1119cdf0e10cSrcweir }
1120cdf0e10cSrcweir 
1121cdf0e10cSrcweir /*************************************************************************
1122cdf0e10cSrcweir |*
1123cdf0e10cSrcweir |*    Stream::StartWritingUnicodeText()
1124cdf0e10cSrcweir |*
1125cdf0e10cSrcweir *************************************************************************/
1126cdf0e10cSrcweir 
StartWritingUnicodeText()1127cdf0e10cSrcweir sal_Bool SvStream::StartWritingUnicodeText()
1128cdf0e10cSrcweir {
1129cdf0e10cSrcweir     SetEndianSwap( sal_False );     // write native format
1130cdf0e10cSrcweir     // BOM, Byte Order Mark, U+FEFF, see
1131cdf0e10cSrcweir     // http://www.unicode.org/faq/utf_bom.html#BOM
1132cdf0e10cSrcweir     // Upon read: 0xfeff(-257) => no swap; 0xfffe(-2) => swap
1133cdf0e10cSrcweir     *this << sal_uInt16( 0xfeff );
1134cdf0e10cSrcweir     return nError == SVSTREAM_OK;
1135cdf0e10cSrcweir }
1136cdf0e10cSrcweir 
1137cdf0e10cSrcweir /*************************************************************************
1138cdf0e10cSrcweir |*
1139cdf0e10cSrcweir |*    Stream::StartReadingUnicodeText()
1140cdf0e10cSrcweir |*
1141cdf0e10cSrcweir *************************************************************************/
1142cdf0e10cSrcweir 
StartReadingUnicodeText(rtl_TextEncoding eReadBomCharSet)1143cdf0e10cSrcweir sal_Bool SvStream::StartReadingUnicodeText( rtl_TextEncoding eReadBomCharSet )
1144cdf0e10cSrcweir {
1145cdf0e10cSrcweir     if (!(  eReadBomCharSet == RTL_TEXTENCODING_DONTKNOW ||
1146cdf0e10cSrcweir             eReadBomCharSet == RTL_TEXTENCODING_UNICODE ||
1147cdf0e10cSrcweir             eReadBomCharSet == RTL_TEXTENCODING_UTF8))
1148cdf0e10cSrcweir         return sal_True;    // nothing to read
1149cdf0e10cSrcweir 
1150cdf0e10cSrcweir     bool bTryUtf8 = false;
1151cdf0e10cSrcweir     sal_uInt16 nFlag;
1152cdf0e10cSrcweir     sal_sSize nBack = sizeof(nFlag);
1153cdf0e10cSrcweir     *this >> nFlag;
1154cdf0e10cSrcweir     switch ( nFlag )
1155cdf0e10cSrcweir     {
1156cdf0e10cSrcweir         case 0xfeff :
1157cdf0e10cSrcweir             // native UTF-16
1158cdf0e10cSrcweir             if (    eReadBomCharSet == RTL_TEXTENCODING_DONTKNOW ||
1159cdf0e10cSrcweir                     eReadBomCharSet == RTL_TEXTENCODING_UNICODE)
1160cdf0e10cSrcweir                 nBack = 0;
1161cdf0e10cSrcweir         break;
1162cdf0e10cSrcweir         case 0xfffe :
1163cdf0e10cSrcweir             // swapped UTF-16
1164cdf0e10cSrcweir             if (    eReadBomCharSet == RTL_TEXTENCODING_DONTKNOW ||
1165cdf0e10cSrcweir                     eReadBomCharSet == RTL_TEXTENCODING_UNICODE)
1166cdf0e10cSrcweir             {
1167cdf0e10cSrcweir                 SetEndianSwap( !bSwap );
1168cdf0e10cSrcweir                 nBack = 0;
1169cdf0e10cSrcweir             }
1170cdf0e10cSrcweir         break;
1171cdf0e10cSrcweir         case 0xefbb :
1172cdf0e10cSrcweir             if (nNumberFormatInt == NUMBERFORMAT_INT_BIGENDIAN &&
1173cdf0e10cSrcweir                     (eReadBomCharSet == RTL_TEXTENCODING_DONTKNOW ||
1174cdf0e10cSrcweir                      eReadBomCharSet == RTL_TEXTENCODING_UTF8))
1175cdf0e10cSrcweir                 bTryUtf8 = true;
1176cdf0e10cSrcweir         break;
1177cdf0e10cSrcweir         case 0xbbef :
1178cdf0e10cSrcweir             if (nNumberFormatInt == NUMBERFORMAT_INT_LITTLEENDIAN &&
1179cdf0e10cSrcweir                     (eReadBomCharSet == RTL_TEXTENCODING_DONTKNOW ||
1180cdf0e10cSrcweir                      eReadBomCharSet == RTL_TEXTENCODING_UTF8))
1181cdf0e10cSrcweir                 bTryUtf8 = true;
1182cdf0e10cSrcweir         break;
1183cdf0e10cSrcweir         default:
1184cdf0e10cSrcweir             ;   // nothing
1185cdf0e10cSrcweir     }
1186cdf0e10cSrcweir     if (bTryUtf8)
1187cdf0e10cSrcweir     {
1188cdf0e10cSrcweir         sal_uChar nChar;
1189cdf0e10cSrcweir         nBack += sizeof(nChar);
1190cdf0e10cSrcweir         *this >> nChar;
1191cdf0e10cSrcweir         if (nChar == 0xbf)
1192cdf0e10cSrcweir             nBack = 0;      // it is UTF-8
1193cdf0e10cSrcweir     }
1194cdf0e10cSrcweir     if (nBack)
1195cdf0e10cSrcweir         SeekRel( -nBack );      // no BOM, pure data
1196cdf0e10cSrcweir     return nError == SVSTREAM_OK;
1197cdf0e10cSrcweir }
1198cdf0e10cSrcweir 
1199cdf0e10cSrcweir /*************************************************************************
1200cdf0e10cSrcweir |*
1201cdf0e10cSrcweir |*    Stream::ReadCsvLine()
1202cdf0e10cSrcweir |*
1203cdf0e10cSrcweir *************************************************************************/
1204cdf0e10cSrcweir 
1205cdf0e10cSrcweir // Precondition: pStr is guaranteed to be non-NULL and points to a 0-terminated
1206cdf0e10cSrcweir // array.
lcl_UnicodeStrChr(const sal_Unicode * pStr,sal_Unicode c)1207cdf0e10cSrcweir inline const sal_Unicode* lcl_UnicodeStrChr( const sal_Unicode* pStr,
1208cdf0e10cSrcweir         sal_Unicode c )
1209cdf0e10cSrcweir {
1210cdf0e10cSrcweir     while (*pStr)
1211cdf0e10cSrcweir     {
1212cdf0e10cSrcweir         if (*pStr == c)
1213cdf0e10cSrcweir             return pStr;
1214cdf0e10cSrcweir         ++pStr;
1215cdf0e10cSrcweir     }
1216cdf0e10cSrcweir     return 0;
1217cdf0e10cSrcweir }
1218cdf0e10cSrcweir 
ReadCsvLine(String & rStr,sal_Bool bEmbeddedLineBreak,const String & rFieldSeparators,sal_Unicode cFieldQuote,sal_Bool bAllowBackslashEscape)1219cdf0e10cSrcweir sal_Bool SvStream::ReadCsvLine( String& rStr, sal_Bool bEmbeddedLineBreak,
1220cdf0e10cSrcweir         const String& rFieldSeparators, sal_Unicode cFieldQuote,
1221cdf0e10cSrcweir         sal_Bool bAllowBackslashEscape)
1222cdf0e10cSrcweir {
1223cdf0e10cSrcweir     ReadUniOrByteStringLine( rStr);
1224cdf0e10cSrcweir 
1225cdf0e10cSrcweir     if (bEmbeddedLineBreak)
1226cdf0e10cSrcweir     {
1227cdf0e10cSrcweir         const sal_Unicode* pSeps = rFieldSeparators.GetBuffer();
1228cdf0e10cSrcweir         xub_StrLen nLastOffset = 0;
1229bc1fc15fSdamjan         bool isQuoted = false;
1230bc1fc15fSdamjan         bool isFieldStarting = true;
1231cdf0e10cSrcweir         while (!IsEof() && rStr.Len() < STRING_MAXLEN)
1232cdf0e10cSrcweir         {
1233bc1fc15fSdamjan             bool wasQuote = false;
1234cdf0e10cSrcweir             bool bBackslashEscaped = false;
1235bc1fc15fSdamjan             const sal_Unicode *p;
1236bc1fc15fSdamjan             p = rStr.GetBuffer();
1237cdf0e10cSrcweir             p += nLastOffset;
1238cdf0e10cSrcweir             while (*p)
1239cdf0e10cSrcweir             {
1240bc1fc15fSdamjan                 if (isQuoted)
1241cdf0e10cSrcweir                 {
1242cdf0e10cSrcweir                     if (*p == cFieldQuote && !bBackslashEscaped)
1243bc1fc15fSdamjan                         wasQuote = !wasQuote;
1244bc1fc15fSdamjan                     else
1245bc1fc15fSdamjan                     {
1246bc1fc15fSdamjan                         if (bAllowBackslashEscape)
1247cdf0e10cSrcweir                         {
1248cdf0e10cSrcweir                             if (*p == '\\')
1249cdf0e10cSrcweir                                 bBackslashEscaped = !bBackslashEscaped;
1250cdf0e10cSrcweir                             else
1251cdf0e10cSrcweir                                 bBackslashEscaped = false;
1252cdf0e10cSrcweir                         }
1253bc1fc15fSdamjan                         if (wasQuote)
1254bc1fc15fSdamjan                         {
1255bc1fc15fSdamjan                             wasQuote = false;
1256bc1fc15fSdamjan                             isQuoted = false;
1257bc1fc15fSdamjan                             if (lcl_UnicodeStrChr( pSeps, *p ))
1258bc1fc15fSdamjan                                 isFieldStarting = true;
1259cdf0e10cSrcweir                         }
1260bc1fc15fSdamjan                     }
1261bc1fc15fSdamjan                 }
1262bc1fc15fSdamjan                 else
1263bc1fc15fSdamjan                 {
1264bc1fc15fSdamjan                     if (isFieldStarting)
1265bc1fc15fSdamjan                     {
1266bc1fc15fSdamjan                         isFieldStarting = false;
1267bc1fc15fSdamjan                         if (*p == cFieldQuote)
1268bc1fc15fSdamjan                             isQuoted = true;
1269bc1fc15fSdamjan                         else if (lcl_UnicodeStrChr( pSeps, *p ))
1270bc1fc15fSdamjan                             isFieldStarting = true;
1271bc1fc15fSdamjan                     }
1272bc1fc15fSdamjan                     else if (lcl_UnicodeStrChr( pSeps, *p ))
1273bc1fc15fSdamjan                         isFieldStarting = true;
1274bc1fc15fSdamjan                 }
1275cdf0e10cSrcweir                 ++p;
1276cdf0e10cSrcweir             }
1277cdf0e10cSrcweir 
1278bc1fc15fSdamjan             if (wasQuote)
1279bc1fc15fSdamjan                 isQuoted = false;
1280bc1fc15fSdamjan 
1281bc1fc15fSdamjan             if (isQuoted)
1282cdf0e10cSrcweir             {
1283cdf0e10cSrcweir                 nLastOffset = rStr.Len();
1284cdf0e10cSrcweir                 String aNext;
1285cdf0e10cSrcweir                 ReadUniOrByteStringLine( aNext);
1286cdf0e10cSrcweir                 rStr += sal_Unicode(_LF);
1287cdf0e10cSrcweir                 rStr += aNext;
1288cdf0e10cSrcweir             }
1289bc1fc15fSdamjan             else
1290bc1fc15fSdamjan                 break;
1291cdf0e10cSrcweir         }
1292cdf0e10cSrcweir     }
1293cdf0e10cSrcweir     return nError == SVSTREAM_OK;
1294cdf0e10cSrcweir }
1295cdf0e10cSrcweir 
1296cdf0e10cSrcweir /*************************************************************************
1297cdf0e10cSrcweir |*
1298cdf0e10cSrcweir |*    Stream::SeekRel()
1299cdf0e10cSrcweir |*
1300cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
1301cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
1302cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
1303cdf0e10cSrcweir |*
1304cdf0e10cSrcweir *************************************************************************/
1305cdf0e10cSrcweir 
SeekRel(sal_sSize nPos)1306cdf0e10cSrcweir sal_Size SvStream::SeekRel( sal_sSize nPos )
1307cdf0e10cSrcweir {
1308cdf0e10cSrcweir     sal_Size nActualPos = Tell();
1309cdf0e10cSrcweir 
1310cdf0e10cSrcweir     if ( nPos >= 0 )
1311cdf0e10cSrcweir     {
1312cdf0e10cSrcweir         if ( SAL_MAX_SIZE - nActualPos > (sal_Size)nPos )
1313cdf0e10cSrcweir             nActualPos += nPos;
1314cdf0e10cSrcweir     }
1315cdf0e10cSrcweir     else
1316cdf0e10cSrcweir     {
1317cdf0e10cSrcweir         sal_Size nAbsPos = (sal_Size)-nPos;
1318cdf0e10cSrcweir         if ( nActualPos >= nAbsPos )
1319cdf0e10cSrcweir             nActualPos -= nAbsPos;
1320cdf0e10cSrcweir     }
1321cdf0e10cSrcweir 
1322cdf0e10cSrcweir     pBufPos = pRWBuf + nActualPos;
1323cdf0e10cSrcweir     return Seek( nActualPos );
1324cdf0e10cSrcweir }
1325cdf0e10cSrcweir 
1326cdf0e10cSrcweir /*************************************************************************
1327cdf0e10cSrcweir |*
1328cdf0e10cSrcweir |*    Stream::operator>>()
1329cdf0e10cSrcweir |*
1330cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
1331cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
1332cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
1333cdf0e10cSrcweir |*
1334cdf0e10cSrcweir *************************************************************************/
1335cdf0e10cSrcweir 
operator >>(sal_uInt16 & r)1336cdf0e10cSrcweir SvStream& SvStream::operator >> ( sal_uInt16& r )
1337cdf0e10cSrcweir {
1338cdf0e10cSrcweir     READNUMBER_WITHOUT_SWAP(sal_uInt16,r)
1339cdf0e10cSrcweir     if( bSwap )
1340cdf0e10cSrcweir         SwapUShort(r);
1341cdf0e10cSrcweir     return *this;
1342cdf0e10cSrcweir }
1343cdf0e10cSrcweir 
operator >>(sal_uInt32 & r)1344cdf0e10cSrcweir SvStream& SvStream::operator>> ( sal_uInt32& r )
1345cdf0e10cSrcweir {
1346cdf0e10cSrcweir     READNUMBER_WITHOUT_SWAP(sal_uInt32,r)
1347cdf0e10cSrcweir     if( bSwap )
1348cdf0e10cSrcweir         SwapULong(r);
1349cdf0e10cSrcweir     return *this;
1350cdf0e10cSrcweir }
1351cdf0e10cSrcweir 
operator >>(long & r)1352cdf0e10cSrcweir SvStream& SvStream::operator >> ( long& r )
1353cdf0e10cSrcweir {
1354cdf0e10cSrcweir #if(SAL_TYPES_SIZEOFLONG != 4)
1355cdf0e10cSrcweir     int tmp = r;
1356cdf0e10cSrcweir     *this >> tmp;
1357cdf0e10cSrcweir     r = tmp;
1358cdf0e10cSrcweir #else
1359cdf0e10cSrcweir     READNUMBER_WITHOUT_SWAP(long,r)
1360cdf0e10cSrcweir     if( bSwap )
1361cdf0e10cSrcweir         SwapLong(r);
1362cdf0e10cSrcweir #endif
1363cdf0e10cSrcweir     return *this;
1364cdf0e10cSrcweir }
1365cdf0e10cSrcweir 
operator >>(short & r)1366cdf0e10cSrcweir SvStream& SvStream::operator >> ( short& r )
1367cdf0e10cSrcweir {
1368cdf0e10cSrcweir     READNUMBER_WITHOUT_SWAP(short,r)
1369cdf0e10cSrcweir     if( bSwap )
1370cdf0e10cSrcweir         SwapShort(r);
1371cdf0e10cSrcweir     return *this;
1372cdf0e10cSrcweir }
1373cdf0e10cSrcweir 
operator >>(int & r)1374cdf0e10cSrcweir SvStream& SvStream::operator >> ( int& r )
1375cdf0e10cSrcweir {
1376cdf0e10cSrcweir     READNUMBER_WITHOUT_SWAP(int,r)
1377cdf0e10cSrcweir     if( bSwap )
1378cdf0e10cSrcweir         SwapLongInt(r);
1379cdf0e10cSrcweir     return *this;
1380cdf0e10cSrcweir }
1381cdf0e10cSrcweir 
operator >>(signed char & r)1382cdf0e10cSrcweir SvStream& SvStream::operator>>( signed char& r )
1383cdf0e10cSrcweir {
1384cdf0e10cSrcweir     if( (eIOMode == STREAM_IO_READ || !bIsConsistent) &&
1385cdf0e10cSrcweir         sizeof(signed char) <= nBufFree )
1386cdf0e10cSrcweir     {
1387cdf0e10cSrcweir         r = *pBufPos;
1388cdf0e10cSrcweir         nBufActualPos += sizeof(signed char);
1389cdf0e10cSrcweir         pBufPos += sizeof(signed char);
1390cdf0e10cSrcweir         nBufFree -= sizeof(signed char);
1391cdf0e10cSrcweir     }
1392cdf0e10cSrcweir     else
1393cdf0e10cSrcweir         Read( (char*)&r, sizeof(signed char) );
1394cdf0e10cSrcweir     return *this;
1395cdf0e10cSrcweir }
1396cdf0e10cSrcweir 
1397cdf0e10cSrcweir // Sonderbehandlung fuer Chars wegen PutBack
1398cdf0e10cSrcweir 
operator >>(char & r)1399cdf0e10cSrcweir SvStream& SvStream::operator>>( char& r )
1400cdf0e10cSrcweir {
1401cdf0e10cSrcweir     if( (eIOMode == STREAM_IO_READ || !bIsConsistent) &&
1402cdf0e10cSrcweir         sizeof(char) <= nBufFree )
1403cdf0e10cSrcweir     {
1404cdf0e10cSrcweir         r = *pBufPos;
1405cdf0e10cSrcweir         nBufActualPos += sizeof(char);
1406cdf0e10cSrcweir         pBufPos += sizeof(char);
1407cdf0e10cSrcweir         nBufFree -= sizeof(char);
1408cdf0e10cSrcweir     }
1409cdf0e10cSrcweir     else
1410cdf0e10cSrcweir         Read( (char*)&r, sizeof(char) );
1411cdf0e10cSrcweir     return *this;
1412cdf0e10cSrcweir }
1413cdf0e10cSrcweir 
operator >>(unsigned char & r)1414cdf0e10cSrcweir SvStream& SvStream::operator>>( unsigned char& r )
1415cdf0e10cSrcweir {
1416cdf0e10cSrcweir     if( (eIOMode == STREAM_IO_READ || !bIsConsistent) &&
1417cdf0e10cSrcweir         sizeof(char) <= nBufFree )
1418cdf0e10cSrcweir     {
1419cdf0e10cSrcweir         r = *pBufPos;
1420cdf0e10cSrcweir         nBufActualPos += sizeof(char);
1421cdf0e10cSrcweir         pBufPos += sizeof(char);
1422cdf0e10cSrcweir         nBufFree -= sizeof(char);
1423cdf0e10cSrcweir     }
1424cdf0e10cSrcweir     else
1425cdf0e10cSrcweir         Read( (char*)&r, sizeof(char) );
1426cdf0e10cSrcweir     return *this;
1427cdf0e10cSrcweir }
1428cdf0e10cSrcweir 
operator >>(float & r)1429cdf0e10cSrcweir SvStream& SvStream::operator>>( float& r )
1430cdf0e10cSrcweir {
1431cdf0e10cSrcweir     // Read( (char*)&r, sizeof(float) );
1432cdf0e10cSrcweir     READNUMBER_WITHOUT_SWAP(float,r)
1433cdf0e10cSrcweir #if defined UNX
1434cdf0e10cSrcweir     if( bSwap )
1435cdf0e10cSrcweir       SwapFloat(r);
1436cdf0e10cSrcweir #endif
1437cdf0e10cSrcweir     return *this;
1438cdf0e10cSrcweir }
1439cdf0e10cSrcweir 
operator >>(double & r)1440cdf0e10cSrcweir SvStream& SvStream::operator>>( double& r )
1441cdf0e10cSrcweir {
1442cdf0e10cSrcweir     // Read( (char*)&r, sizeof(double) );
1443cdf0e10cSrcweir     READNUMBER_WITHOUT_SWAP(double,r)
1444cdf0e10cSrcweir #if defined UNX
1445cdf0e10cSrcweir     if( bSwap )
1446cdf0e10cSrcweir       SwapDouble(r);
1447cdf0e10cSrcweir #endif
1448cdf0e10cSrcweir     return *this;
1449cdf0e10cSrcweir }
1450cdf0e10cSrcweir 
operator >>(SvStream & rStream)1451cdf0e10cSrcweir SvStream& SvStream::operator>> ( SvStream& rStream )
1452cdf0e10cSrcweir {
1453cdf0e10cSrcweir     const sal_uInt32 cBufLen = 0x8000;
1454cdf0e10cSrcweir     char* pBuf = new char[ cBufLen ];
1455cdf0e10cSrcweir 
1456cdf0e10cSrcweir     sal_uInt32 nCount;
1457cdf0e10cSrcweir     do {
1458cdf0e10cSrcweir         nCount = Read( pBuf, cBufLen );
1459cdf0e10cSrcweir         rStream.Write( pBuf, nCount );
1460cdf0e10cSrcweir     } while( nCount == cBufLen );
1461cdf0e10cSrcweir 
1462cdf0e10cSrcweir     delete[] pBuf;
1463cdf0e10cSrcweir     return *this;
1464cdf0e10cSrcweir }
1465cdf0e10cSrcweir 
1466cdf0e10cSrcweir /*************************************************************************
1467cdf0e10cSrcweir |*
1468cdf0e10cSrcweir |*    Stream::operator<<()
1469cdf0e10cSrcweir |*
1470cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
1471cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
1472cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
1473cdf0e10cSrcweir |*
1474cdf0e10cSrcweir *************************************************************************/
1475cdf0e10cSrcweir 
operator <<(sal_uInt16 v)1476cdf0e10cSrcweir SvStream& SvStream::operator<< ( sal_uInt16 v )
1477cdf0e10cSrcweir {
1478cdf0e10cSrcweir     if( bSwap )
1479cdf0e10cSrcweir         SwapUShort(v);
1480cdf0e10cSrcweir     WRITENUMBER_WITHOUT_SWAP(sal_uInt16,v)
1481cdf0e10cSrcweir     return *this;
1482cdf0e10cSrcweir }
1483cdf0e10cSrcweir 
operator <<(sal_uInt32 v)1484cdf0e10cSrcweir SvStream& SvStream::operator<<  ( sal_uInt32 v )
1485cdf0e10cSrcweir {
1486cdf0e10cSrcweir     if( bSwap )
1487cdf0e10cSrcweir         SwapULong(v);
1488cdf0e10cSrcweir     WRITENUMBER_WITHOUT_SWAP(sal_uInt32,v)
1489cdf0e10cSrcweir     return *this;
1490cdf0e10cSrcweir }
1491cdf0e10cSrcweir 
operator <<(long v)1492cdf0e10cSrcweir SvStream& SvStream::operator<< ( long v )
1493cdf0e10cSrcweir {
1494cdf0e10cSrcweir #if(SAL_TYPES_SIZEOFLONG != 4)
1495cdf0e10cSrcweir     int tmp = v;
1496cdf0e10cSrcweir     *this << tmp;
1497cdf0e10cSrcweir #else
1498cdf0e10cSrcweir     if( bSwap )
1499cdf0e10cSrcweir         SwapLong(v);
1500cdf0e10cSrcweir     WRITENUMBER_WITHOUT_SWAP(long,v)
1501cdf0e10cSrcweir #endif
1502cdf0e10cSrcweir     return *this;
1503cdf0e10cSrcweir }
1504cdf0e10cSrcweir 
operator <<(short v)1505cdf0e10cSrcweir SvStream& SvStream::operator<<  ( short v )
1506cdf0e10cSrcweir {
1507cdf0e10cSrcweir     if( bSwap )
1508cdf0e10cSrcweir         SwapShort(v);
1509cdf0e10cSrcweir     WRITENUMBER_WITHOUT_SWAP(short,v)
1510cdf0e10cSrcweir     return *this;
1511cdf0e10cSrcweir }
1512cdf0e10cSrcweir 
operator <<(int v)1513cdf0e10cSrcweir SvStream& SvStream::operator<<( int v )
1514cdf0e10cSrcweir {
1515cdf0e10cSrcweir     if( bSwap )
1516cdf0e10cSrcweir         SwapLongInt( v );
1517cdf0e10cSrcweir     WRITENUMBER_WITHOUT_SWAP(int,v)
1518cdf0e10cSrcweir     return *this;
1519cdf0e10cSrcweir }
1520cdf0e10cSrcweir 
operator <<(signed char v)1521cdf0e10cSrcweir SvStream& SvStream::operator<<  ( signed char v )
1522cdf0e10cSrcweir {
1523cdf0e10cSrcweir     //SDO
1524cdf0e10cSrcweir     int tmp = eIOMode;
1525cdf0e10cSrcweir     if(tmp == STREAM_IO_WRITE && sizeof(signed char) <= nBufFree )
1526cdf0e10cSrcweir     {
1527cdf0e10cSrcweir         *pBufPos = v;
1528cdf0e10cSrcweir         pBufPos++; // sizeof(char);
1529cdf0e10cSrcweir         nBufActualPos++;
1530cdf0e10cSrcweir         if( nBufActualPos > nBufActualLen )  // Append ?
1531cdf0e10cSrcweir             nBufActualLen = nBufActualPos;
1532cdf0e10cSrcweir         nBufFree--; // = sizeof(char);
1533cdf0e10cSrcweir         bIsDirty = sal_True;
1534cdf0e10cSrcweir     }
1535cdf0e10cSrcweir     else
1536cdf0e10cSrcweir         Write( (char*)&v, sizeof(signed char) );
1537cdf0e10cSrcweir     return *this;
1538cdf0e10cSrcweir }
1539cdf0e10cSrcweir 
1540cdf0e10cSrcweir // Sonderbehandlung fuer chars wegen PutBack
1541cdf0e10cSrcweir 
operator <<(char v)1542cdf0e10cSrcweir SvStream& SvStream::operator<<  ( char v )
1543cdf0e10cSrcweir {
1544cdf0e10cSrcweir     //SDO
1545cdf0e10cSrcweir     int tmp = eIOMode;
1546cdf0e10cSrcweir     if(tmp == STREAM_IO_WRITE && sizeof(char) <= nBufFree )
1547cdf0e10cSrcweir     {
1548cdf0e10cSrcweir         *pBufPos = v;
1549cdf0e10cSrcweir         pBufPos++; // sizeof(char);
1550cdf0e10cSrcweir         nBufActualPos++;
1551cdf0e10cSrcweir         if( nBufActualPos > nBufActualLen )  // Append ?
1552cdf0e10cSrcweir             nBufActualLen = nBufActualPos;
1553cdf0e10cSrcweir         nBufFree--; // = sizeof(char);
1554cdf0e10cSrcweir         bIsDirty = sal_True;
1555cdf0e10cSrcweir     }
1556cdf0e10cSrcweir     else
1557cdf0e10cSrcweir         Write( (char*)&v, sizeof(char) );
1558cdf0e10cSrcweir     return *this;
1559cdf0e10cSrcweir }
1560cdf0e10cSrcweir 
operator <<(unsigned char v)1561cdf0e10cSrcweir SvStream& SvStream::operator<<  ( unsigned char v )
1562cdf0e10cSrcweir {
1563cdf0e10cSrcweir //SDO
1564cdf0e10cSrcweir     int tmp = eIOMode;
1565cdf0e10cSrcweir     if(tmp == STREAM_IO_WRITE && sizeof(char) <= nBufFree )
1566cdf0e10cSrcweir     {
1567cdf0e10cSrcweir         *(unsigned char*)pBufPos = v;
1568cdf0e10cSrcweir         pBufPos++; // = sizeof(char);
1569cdf0e10cSrcweir         nBufActualPos++; // = sizeof(char);
1570cdf0e10cSrcweir         if( nBufActualPos > nBufActualLen )  // Append ?
1571cdf0e10cSrcweir             nBufActualLen = nBufActualPos;
1572cdf0e10cSrcweir         nBufFree--;
1573cdf0e10cSrcweir         bIsDirty = sal_True;
1574cdf0e10cSrcweir     }
1575cdf0e10cSrcweir     else
1576cdf0e10cSrcweir         Write( (char*)&v, sizeof(char) );
1577cdf0e10cSrcweir     return *this;
1578cdf0e10cSrcweir }
1579cdf0e10cSrcweir 
operator <<(float v)1580cdf0e10cSrcweir SvStream& SvStream::operator<< ( float v )
1581cdf0e10cSrcweir {
1582cdf0e10cSrcweir #ifdef UNX
1583cdf0e10cSrcweir     if( bSwap )
1584cdf0e10cSrcweir       SwapFloat(v);
1585cdf0e10cSrcweir #endif
1586cdf0e10cSrcweir     WRITENUMBER_WITHOUT_SWAP(float,v)
1587cdf0e10cSrcweir     return *this;
1588cdf0e10cSrcweir }
1589cdf0e10cSrcweir 
operator <<(const double & r)1590cdf0e10cSrcweir SvStream& SvStream::operator<< ( const double& r )
1591cdf0e10cSrcweir {
1592cdf0e10cSrcweir //    Write( (char*)&r, sizeof( double ) );
1593cdf0e10cSrcweir #if defined UNX
1594cdf0e10cSrcweir     if( bSwap )
1595cdf0e10cSrcweir     {
1596cdf0e10cSrcweir       double nHelp = r;
1597cdf0e10cSrcweir       SwapDouble(nHelp);
1598cdf0e10cSrcweir       WRITENUMBER_WITHOUT_SWAP(double,nHelp)
1599cdf0e10cSrcweir       return *this;
1600cdf0e10cSrcweir     }
1601cdf0e10cSrcweir     else
1602cdf0e10cSrcweir #endif
1603cdf0e10cSrcweir     WRITENUMBER_WITHOUT_SWAP(double,r)
1604cdf0e10cSrcweir 
1605cdf0e10cSrcweir     return *this;
1606cdf0e10cSrcweir }
1607cdf0e10cSrcweir 
operator <<(const char * pBuf)1608cdf0e10cSrcweir SvStream& SvStream::operator<<  ( const char* pBuf )
1609cdf0e10cSrcweir {
1610cdf0e10cSrcweir     Write( pBuf, strlen( pBuf ) );
1611cdf0e10cSrcweir     return *this;
1612cdf0e10cSrcweir }
1613cdf0e10cSrcweir 
operator <<(const unsigned char * pBuf)1614cdf0e10cSrcweir SvStream& SvStream::operator<<  ( const unsigned char* pBuf )
1615cdf0e10cSrcweir {
1616cdf0e10cSrcweir     Write( (char*)pBuf, strlen( (char*)pBuf ) );
1617cdf0e10cSrcweir     return *this;
1618cdf0e10cSrcweir }
1619cdf0e10cSrcweir 
operator <<(SvStream & rStream)1620cdf0e10cSrcweir SvStream& SvStream::operator<< ( SvStream& rStream )
1621cdf0e10cSrcweir {
1622cdf0e10cSrcweir     const sal_uInt32 cBufLen = 0x8000;
1623cdf0e10cSrcweir     char* pBuf = new char[ cBufLen ];
1624cdf0e10cSrcweir     sal_uInt32 nCount;
1625cdf0e10cSrcweir     do {
1626cdf0e10cSrcweir         nCount = rStream.Read( pBuf, cBufLen );
1627cdf0e10cSrcweir         Write( pBuf, nCount );
1628cdf0e10cSrcweir     } while( nCount == cBufLen );
1629cdf0e10cSrcweir 
1630cdf0e10cSrcweir     delete[] pBuf;
1631cdf0e10cSrcweir     return *this;
1632cdf0e10cSrcweir }
1633cdf0e10cSrcweir 
1634cdf0e10cSrcweir // -----------------------------------------------------------------------
1635cdf0e10cSrcweir 
ReadByteString(UniString & rStr,rtl_TextEncoding eSrcCharSet)1636cdf0e10cSrcweir SvStream& SvStream::ReadByteString( UniString& rStr, rtl_TextEncoding eSrcCharSet )
1637cdf0e10cSrcweir {
1638cdf0e10cSrcweir     // read UTF-16 string directly from stream ?
1639cdf0e10cSrcweir     if (eSrcCharSet == RTL_TEXTENCODING_UNICODE)
1640cdf0e10cSrcweir     {
1641cdf0e10cSrcweir         sal_uInt32 nLen;
1642cdf0e10cSrcweir         operator>> (nLen);
1643cdf0e10cSrcweir         if (nLen)
1644cdf0e10cSrcweir         {
1645cdf0e10cSrcweir             if (nLen > STRING_MAXLEN) {
1646cdf0e10cSrcweir                 SetError(SVSTREAM_GENERALERROR);
1647cdf0e10cSrcweir                 return *this;
1648cdf0e10cSrcweir             }
1649cdf0e10cSrcweir             sal_Unicode *pStr = rStr.AllocBuffer(
1650cdf0e10cSrcweir                 static_cast< xub_StrLen >(nLen));
1651cdf0e10cSrcweir             BOOST_STATIC_ASSERT(STRING_MAXLEN <= SAL_MAX_SIZE / 2);
1652cdf0e10cSrcweir             Read( pStr, nLen << 1 );
1653cdf0e10cSrcweir 
1654cdf0e10cSrcweir             if (bSwap)
1655cdf0e10cSrcweir                 for (sal_Unicode *pEnd = pStr + nLen; pStr < pEnd; pStr++)
1656cdf0e10cSrcweir                     SwapUShort(*pStr);
1657cdf0e10cSrcweir         }
1658cdf0e10cSrcweir         else
1659cdf0e10cSrcweir             rStr.Erase();
1660cdf0e10cSrcweir 
1661cdf0e10cSrcweir         return *this;
1662cdf0e10cSrcweir     }
1663cdf0e10cSrcweir 
1664cdf0e10cSrcweir     ByteString aStr;
1665cdf0e10cSrcweir     ReadByteString( aStr );
1666cdf0e10cSrcweir     rStr = UniString( aStr, eSrcCharSet );
1667cdf0e10cSrcweir     return *this;
1668cdf0e10cSrcweir }
1669cdf0e10cSrcweir 
1670cdf0e10cSrcweir // -----------------------------------------------------------------------
1671cdf0e10cSrcweir 
ReadByteString(ByteString & rStr)1672cdf0e10cSrcweir SvStream& SvStream::ReadByteString( ByteString& rStr )
1673cdf0e10cSrcweir {
1674cdf0e10cSrcweir     sal_uInt16 nLen = 0;
1675cdf0e10cSrcweir     operator>>( nLen );
1676cdf0e10cSrcweir     if( nLen )
1677cdf0e10cSrcweir     {
1678cdf0e10cSrcweir         char* pTmp = rStr.AllocBuffer( nLen );
1679cdf0e10cSrcweir         nLen = (sal_uInt16)Read( pTmp, nLen );
1680cdf0e10cSrcweir     }
1681cdf0e10cSrcweir     else
1682cdf0e10cSrcweir         rStr.Erase();
1683cdf0e10cSrcweir     return *this;
1684cdf0e10cSrcweir }
1685cdf0e10cSrcweir 
1686cdf0e10cSrcweir // -----------------------------------------------------------------------
1687cdf0e10cSrcweir 
WriteByteString(const UniString & rStr,rtl_TextEncoding eDestCharSet)1688cdf0e10cSrcweir SvStream& SvStream::WriteByteString( const UniString& rStr, rtl_TextEncoding eDestCharSet )
1689cdf0e10cSrcweir {
1690cdf0e10cSrcweir     // write UTF-16 string directly into stream ?
1691cdf0e10cSrcweir     if (eDestCharSet == RTL_TEXTENCODING_UNICODE)
1692cdf0e10cSrcweir     {
1693cdf0e10cSrcweir         sal_uInt32 nLen = rStr.Len();
1694cdf0e10cSrcweir         operator<< (nLen);
1695cdf0e10cSrcweir         if (nLen)
1696cdf0e10cSrcweir         {
1697cdf0e10cSrcweir             if (bSwap)
1698cdf0e10cSrcweir             {
1699cdf0e10cSrcweir                 const sal_Unicode *pStr = rStr.GetBuffer();
1700cdf0e10cSrcweir                 const sal_Unicode *pEnd = pStr + nLen;
1701cdf0e10cSrcweir 
1702cdf0e10cSrcweir                 for (; pStr < pEnd; pStr++)
1703cdf0e10cSrcweir                 {
1704cdf0e10cSrcweir                     sal_Unicode c = *pStr;
1705cdf0e10cSrcweir                     SwapUShort(c);
1706cdf0e10cSrcweir                     WRITENUMBER_WITHOUT_SWAP(sal_uInt16,c)
1707cdf0e10cSrcweir                 }
1708cdf0e10cSrcweir             }
1709cdf0e10cSrcweir             else
1710cdf0e10cSrcweir                 Write( rStr.GetBuffer(), nLen << 1 );
1711cdf0e10cSrcweir         }
1712cdf0e10cSrcweir 
1713cdf0e10cSrcweir         return *this;
1714cdf0e10cSrcweir     }
1715cdf0e10cSrcweir 
1716cdf0e10cSrcweir     return WriteByteString(ByteString( rStr, eDestCharSet ));
1717cdf0e10cSrcweir }
1718cdf0e10cSrcweir 
1719cdf0e10cSrcweir // -----------------------------------------------------------------------
1720cdf0e10cSrcweir 
WriteByteString(const ByteString & rStr)1721cdf0e10cSrcweir SvStream& SvStream::WriteByteString( const ByteString& rStr)
1722cdf0e10cSrcweir {
1723cdf0e10cSrcweir     sal_uInt16 nLen = rStr.Len();
1724cdf0e10cSrcweir     operator<< ( nLen );
1725cdf0e10cSrcweir     if( nLen != 0 )
1726cdf0e10cSrcweir         Write( rStr.GetBuffer(), nLen );
1727cdf0e10cSrcweir     return *this;
1728cdf0e10cSrcweir }
1729cdf0e10cSrcweir 
1730cdf0e10cSrcweir /*************************************************************************
1731cdf0e10cSrcweir |*
1732cdf0e10cSrcweir |*    Stream::Read()
1733cdf0e10cSrcweir |*
1734cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
1735cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
1736cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
1737cdf0e10cSrcweir |*
1738cdf0e10cSrcweir *************************************************************************/
1739cdf0e10cSrcweir 
Read(void * pData,sal_Size nCount)1740cdf0e10cSrcweir sal_Size SvStream::Read( void* pData, sal_Size nCount )
1741cdf0e10cSrcweir {
1742cdf0e10cSrcweir     sal_Size nSaveCount = nCount;
1743cdf0e10cSrcweir     if( !bIsConsistent )
1744cdf0e10cSrcweir         RefreshBuffer();
1745cdf0e10cSrcweir 
1746cdf0e10cSrcweir     if( !pRWBuf )
1747cdf0e10cSrcweir     {
1748cdf0e10cSrcweir         nCount = GetData( (char*)pData,nCount);
1749cdf0e10cSrcweir         if( nCryptMask )
1750cdf0e10cSrcweir             EncryptBuffer(pData, nCount);
1751cdf0e10cSrcweir         nBufFilePos += nCount;
1752cdf0e10cSrcweir     }
1753cdf0e10cSrcweir     else
1754cdf0e10cSrcweir     {
1755cdf0e10cSrcweir         // ist Block komplett im Puffer
1756cdf0e10cSrcweir         eIOMode = STREAM_IO_READ;
1757cdf0e10cSrcweir         if( nCount <= (sal_Size)(nBufActualLen - nBufActualPos ) )
1758cdf0e10cSrcweir         {
1759cdf0e10cSrcweir             // Ja!
1760cdf0e10cSrcweir             memcpy(pData, pBufPos, (size_t) nCount);
1761cdf0e10cSrcweir             nBufActualPos = nBufActualPos + (sal_uInt16)nCount;
1762cdf0e10cSrcweir             pBufPos += nCount;
1763cdf0e10cSrcweir             nBufFree = nBufFree - (sal_uInt16)nCount;
1764cdf0e10cSrcweir         }
1765cdf0e10cSrcweir         else
1766cdf0e10cSrcweir         {
1767cdf0e10cSrcweir             if( bIsDirty ) // Flushen ?
1768cdf0e10cSrcweir             {
1769cdf0e10cSrcweir                 SeekPos( nBufFilePos );
1770cdf0e10cSrcweir                 if( nCryptMask )
1771cdf0e10cSrcweir                     CryptAndWriteBuffer(pRWBuf, nBufActualLen);
1772cdf0e10cSrcweir                 else
1773cdf0e10cSrcweir                     PutData( pRWBuf, nBufActualLen );
1774cdf0e10cSrcweir                 bIsDirty = sal_False;
1775cdf0e10cSrcweir             }
1776cdf0e10cSrcweir 
1777cdf0e10cSrcweir             // passt der Datenblock in den Puffer ?
1778cdf0e10cSrcweir             if( nCount > nBufSize )
1779cdf0e10cSrcweir             {
1780cdf0e10cSrcweir                 // Nein! Deshalb ohne Umweg ueber den Puffer direkt
1781cdf0e10cSrcweir                 // in den Zielbereich einlesen
1782cdf0e10cSrcweir 
1783cdf0e10cSrcweir                 eIOMode = STREAM_IO_DONTKNOW;
1784cdf0e10cSrcweir 
1785cdf0e10cSrcweir                 SeekPos( nBufFilePos + nBufActualPos );
1786cdf0e10cSrcweir                 nBufActualLen = 0;
1787cdf0e10cSrcweir                 pBufPos       = pRWBuf;
1788cdf0e10cSrcweir                 nCount = GetData( (char*)pData, nCount );
1789cdf0e10cSrcweir                 if( nCryptMask )
1790cdf0e10cSrcweir                     EncryptBuffer(pData, nCount);
1791cdf0e10cSrcweir                 nBufFilePos += nCount;
1792cdf0e10cSrcweir                 nBufFilePos += nBufActualPos;
1793cdf0e10cSrcweir                 nBufActualPos = 0;
1794cdf0e10cSrcweir             }
1795cdf0e10cSrcweir             else
1796cdf0e10cSrcweir             {
1797cdf0e10cSrcweir                 // Der Datenblock passt komplett in den Puffer. Deshalb
1798cdf0e10cSrcweir                 // Puffer fuellen und dann die angeforderten Daten in den
1799cdf0e10cSrcweir                 // Zielbereich kopieren.
1800cdf0e10cSrcweir 
1801cdf0e10cSrcweir                 nBufFilePos += nBufActualPos;
1802cdf0e10cSrcweir                 SeekPos( nBufFilePos );
1803cdf0e10cSrcweir 
1804cdf0e10cSrcweir                 // TODO: Typecast vor GetData, sal_uInt16 nCountTmp
1805cdf0e10cSrcweir                 sal_Size nCountTmp = GetData( pRWBuf, nBufSize );
1806cdf0e10cSrcweir                 if( nCryptMask )
1807cdf0e10cSrcweir                     EncryptBuffer(pRWBuf, nCountTmp);
1808cdf0e10cSrcweir                 nBufActualLen = (sal_uInt16)nCountTmp;
1809cdf0e10cSrcweir                 if( nCount > nCountTmp )
1810cdf0e10cSrcweir                 {
1811cdf0e10cSrcweir                     nCount = nCountTmp;  // zurueckstutzen, Eof siehe unten
1812cdf0e10cSrcweir                 }
1813cdf0e10cSrcweir                 memcpy( pData, pRWBuf, (size_t)nCount );
1814cdf0e10cSrcweir                 nBufActualPos = (sal_uInt16)nCount;
1815cdf0e10cSrcweir                 pBufPos = pRWBuf + nCount;
1816cdf0e10cSrcweir             }
1817cdf0e10cSrcweir         }
1818cdf0e10cSrcweir     }
1819cdf0e10cSrcweir     bIsEof = sal_False;
1820cdf0e10cSrcweir     nBufFree = nBufActualLen - nBufActualPos;
1821cdf0e10cSrcweir     if( nCount != nSaveCount && nError != ERRCODE_IO_PENDING )
1822cdf0e10cSrcweir         bIsEof = sal_True;
1823cdf0e10cSrcweir     if( nCount == nSaveCount && nError == ERRCODE_IO_PENDING )
1824cdf0e10cSrcweir         nError = ERRCODE_NONE;
1825cdf0e10cSrcweir     return nCount;
1826cdf0e10cSrcweir }
1827cdf0e10cSrcweir 
1828cdf0e10cSrcweir /*************************************************************************
1829cdf0e10cSrcweir |*
1830cdf0e10cSrcweir |*    Stream::Write()
1831cdf0e10cSrcweir |*
1832cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
1833cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
1834cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
1835cdf0e10cSrcweir |*
1836cdf0e10cSrcweir *************************************************************************/
1837cdf0e10cSrcweir 
Write(const void * pData,sal_Size nCount)1838cdf0e10cSrcweir sal_Size SvStream::Write( const void* pData, sal_Size nCount )
1839cdf0e10cSrcweir {
1840cdf0e10cSrcweir     if( !nCount )
1841cdf0e10cSrcweir         return 0;
1842cdf0e10cSrcweir     if( !bIsWritable )
1843cdf0e10cSrcweir     {
1844cdf0e10cSrcweir         SetError( ERRCODE_IO_CANTWRITE );
1845cdf0e10cSrcweir         return 0;
1846cdf0e10cSrcweir     }
1847cdf0e10cSrcweir     if( !bIsConsistent )
1848cdf0e10cSrcweir         RefreshBuffer();   // Aenderungen des Puffers durch PutBack loeschen
1849cdf0e10cSrcweir 
1850cdf0e10cSrcweir     if( !pRWBuf )
1851cdf0e10cSrcweir     {
1852cdf0e10cSrcweir         if( nCryptMask )
1853cdf0e10cSrcweir             nCount = CryptAndWriteBuffer( pData, nCount );
1854cdf0e10cSrcweir         else
1855cdf0e10cSrcweir             nCount = PutData( (char*)pData, nCount );
1856cdf0e10cSrcweir         nBufFilePos += nCount;
1857cdf0e10cSrcweir         return nCount;
1858cdf0e10cSrcweir     }
1859cdf0e10cSrcweir 
1860cdf0e10cSrcweir     eIOMode = STREAM_IO_WRITE;
1861cdf0e10cSrcweir     if( nCount <= (sal_Size)(nBufSize - nBufActualPos) )
1862cdf0e10cSrcweir     {
1863cdf0e10cSrcweir         memcpy( pBufPos, pData, (size_t)nCount );
1864cdf0e10cSrcweir         nBufActualPos = nBufActualPos + (sal_uInt16)nCount;
1865cdf0e10cSrcweir         // wurde der Puffer erweitert ?
1866cdf0e10cSrcweir         if( nBufActualPos > nBufActualLen )
1867cdf0e10cSrcweir             nBufActualLen = nBufActualPos;
1868cdf0e10cSrcweir 
1869cdf0e10cSrcweir         pBufPos += nCount;
1870cdf0e10cSrcweir         bIsDirty = sal_True;
1871cdf0e10cSrcweir     }
1872cdf0e10cSrcweir     else
1873cdf0e10cSrcweir     {
1874cdf0e10cSrcweir         // Flushen ?
1875cdf0e10cSrcweir         if( bIsDirty )
1876cdf0e10cSrcweir         {
1877cdf0e10cSrcweir             SeekPos( nBufFilePos );
1878cdf0e10cSrcweir             if( nCryptMask )
1879cdf0e10cSrcweir                 CryptAndWriteBuffer( pRWBuf, (sal_Size)nBufActualLen );
1880cdf0e10cSrcweir             else
1881cdf0e10cSrcweir                 PutData( pRWBuf, nBufActualLen );
1882cdf0e10cSrcweir             bIsDirty = sal_False;
1883cdf0e10cSrcweir         }
1884cdf0e10cSrcweir 
1885cdf0e10cSrcweir         // passt der Block in den Puffer ?
1886cdf0e10cSrcweir         if( nCount > nBufSize )
1887cdf0e10cSrcweir         {
1888cdf0e10cSrcweir             eIOMode = STREAM_IO_DONTKNOW;
1889cdf0e10cSrcweir             nBufFilePos += nBufActualPos;
1890cdf0e10cSrcweir             nBufActualLen = 0;
1891cdf0e10cSrcweir             nBufActualPos = 0;
1892cdf0e10cSrcweir             pBufPos       = pRWBuf;
1893cdf0e10cSrcweir             SeekPos( nBufFilePos );
1894cdf0e10cSrcweir             if( nCryptMask )
1895cdf0e10cSrcweir                 nCount = CryptAndWriteBuffer( pData, nCount );
1896cdf0e10cSrcweir             else
1897cdf0e10cSrcweir                 nCount = PutData( (char*)pData, nCount );
1898cdf0e10cSrcweir             nBufFilePos += nCount;
1899cdf0e10cSrcweir         }
1900cdf0e10cSrcweir         else
1901cdf0e10cSrcweir         {
1902cdf0e10cSrcweir             // Block in Puffer stellen
1903cdf0e10cSrcweir             memcpy( pRWBuf, pData, (size_t)nCount );
1904cdf0e10cSrcweir 
1905cdf0e10cSrcweir             // Reihenfolge!
1906cdf0e10cSrcweir             nBufFilePos += nBufActualPos;
1907cdf0e10cSrcweir             nBufActualPos = (sal_uInt16)nCount;
1908cdf0e10cSrcweir             pBufPos = pRWBuf + nCount;
1909cdf0e10cSrcweir             nBufActualLen = (sal_uInt16)nCount;
1910cdf0e10cSrcweir             bIsDirty = sal_True;
1911cdf0e10cSrcweir         }
1912cdf0e10cSrcweir     }
1913cdf0e10cSrcweir     nBufFree = nBufSize - nBufActualPos;
1914cdf0e10cSrcweir     return nCount;
1915cdf0e10cSrcweir }
1916cdf0e10cSrcweir 
1917cdf0e10cSrcweir 
1918cdf0e10cSrcweir /*************************************************************************
1919cdf0e10cSrcweir |*
1920cdf0e10cSrcweir |*    Stream::Seek()
1921cdf0e10cSrcweir |*
1922cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
1923cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
1924cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
1925cdf0e10cSrcweir |*
1926cdf0e10cSrcweir *************************************************************************/
1927cdf0e10cSrcweir 
Seek(sal_Size nFilePos)1928cdf0e10cSrcweir sal_Size SvStream::Seek( sal_Size nFilePos )
1929cdf0e10cSrcweir {
1930cdf0e10cSrcweir     eIOMode = STREAM_IO_DONTKNOW;
1931cdf0e10cSrcweir 
1932cdf0e10cSrcweir     bIsEof = sal_False;
1933cdf0e10cSrcweir     if( !pRWBuf )
1934cdf0e10cSrcweir     {
1935cdf0e10cSrcweir         nBufFilePos = SeekPos( nFilePos );
1936cdf0e10cSrcweir         DBG_ASSERT(Tell()==nBufFilePos,"Out Of Sync!");
1937cdf0e10cSrcweir         return nBufFilePos;
1938cdf0e10cSrcweir     }
1939cdf0e10cSrcweir 
1940cdf0e10cSrcweir     // Ist Position im Puffer ?
1941cdf0e10cSrcweir     if( nFilePos >= nBufFilePos && nFilePos <= (nBufFilePos + nBufActualLen))
1942cdf0e10cSrcweir     {
1943cdf0e10cSrcweir         nBufActualPos = (sal_uInt16)(nFilePos - nBufFilePos);
1944cdf0e10cSrcweir         pBufPos = pRWBuf + nBufActualPos;
1945cdf0e10cSrcweir         // nBufFree korrigieren, damit wir nicht von einem
1946cdf0e10cSrcweir         // PutBack (ignoriert den StreamMode) getoetet werden
1947cdf0e10cSrcweir         nBufFree = nBufActualLen - nBufActualPos;
1948cdf0e10cSrcweir     }
1949cdf0e10cSrcweir     else
1950cdf0e10cSrcweir     {
1951cdf0e10cSrcweir         if( bIsDirty && bIsConsistent)
1952cdf0e10cSrcweir         {
1953cdf0e10cSrcweir             SeekPos( nBufFilePos );
1954cdf0e10cSrcweir             if( nCryptMask )
1955cdf0e10cSrcweir                 CryptAndWriteBuffer( pRWBuf, nBufActualLen );
1956cdf0e10cSrcweir             else
1957cdf0e10cSrcweir                 PutData( pRWBuf, nBufActualLen );
1958cdf0e10cSrcweir             bIsDirty = sal_False;
1959cdf0e10cSrcweir         }
1960cdf0e10cSrcweir         nBufActualLen = 0;
1961cdf0e10cSrcweir         nBufActualPos = 0;
1962cdf0e10cSrcweir         pBufPos       = pRWBuf;
1963cdf0e10cSrcweir         nBufFilePos = SeekPos( nFilePos );
1964cdf0e10cSrcweir     }
1965cdf0e10cSrcweir #ifdef OV_DEBUG
1966cdf0e10cSrcweir     {
1967cdf0e10cSrcweir         sal_Size nDebugTemp = nBufFilePos + nBufActualPos;
1968cdf0e10cSrcweir         DBG_ASSERT(Tell()==nDebugTemp,"Sync?");
1969cdf0e10cSrcweir     }
1970cdf0e10cSrcweir #endif
1971cdf0e10cSrcweir     return nBufFilePos + nBufActualPos;
1972cdf0e10cSrcweir }
1973cdf0e10cSrcweir 
1974cdf0e10cSrcweir /*************************************************************************
1975cdf0e10cSrcweir |*
1976cdf0e10cSrcweir |*    Stream::Flush()
1977cdf0e10cSrcweir |*
1978cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
1979cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
1980cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
1981cdf0e10cSrcweir |*
1982cdf0e10cSrcweir *************************************************************************/
1983cdf0e10cSrcweir 
Flush()1984cdf0e10cSrcweir void SvStream::Flush()
1985cdf0e10cSrcweir {
1986cdf0e10cSrcweir     if( bIsDirty && bIsConsistent )
1987cdf0e10cSrcweir     {
1988cdf0e10cSrcweir         SeekPos( nBufFilePos );
1989cdf0e10cSrcweir         if( nCryptMask )
1990cdf0e10cSrcweir             CryptAndWriteBuffer( pRWBuf, (sal_Size)nBufActualLen );
1991cdf0e10cSrcweir         else
1992cdf0e10cSrcweir             if( PutData( pRWBuf, nBufActualLen ) != nBufActualLen )
1993cdf0e10cSrcweir                 SetError( SVSTREAM_WRITE_ERROR );
1994cdf0e10cSrcweir         bIsDirty = sal_False;
1995cdf0e10cSrcweir     }
1996cdf0e10cSrcweir     if( bIsWritable )
1997cdf0e10cSrcweir         FlushData();
1998cdf0e10cSrcweir }
1999cdf0e10cSrcweir 
2000cdf0e10cSrcweir 
2001cdf0e10cSrcweir /*************************************************************************
2002cdf0e10cSrcweir |*
2003cdf0e10cSrcweir |*    Stream::PutBack()
2004cdf0e10cSrcweir |*
2005cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2006cdf0e10cSrcweir |*    Ersterstellung    OV 01.08.94
2007cdf0e10cSrcweir |*    Letzte Aenderung  OV 01.08.94
2008cdf0e10cSrcweir |*
2009cdf0e10cSrcweir *************************************************************************/
2010cdf0e10cSrcweir 
2011cdf0e10cSrcweir /*
2012cdf0e10cSrcweir     4 Faelle :
2013cdf0e10cSrcweir 
2014cdf0e10cSrcweir     1. Datenzeiger steht mitten im Puffer (nBufActualPos >= 1)
2015cdf0e10cSrcweir     2. Datenzeiger auf Position 0, Puffer ist voll
2016cdf0e10cSrcweir     3. Datenzeiger auf Position 0, Puffer ist teilweise gefuellt
2017cdf0e10cSrcweir     4. Datenzeiger auf Position 0, Puffer ist leer -> Fehler!
2018cdf0e10cSrcweir */
2019cdf0e10cSrcweir 
PutBack(char aCh)2020cdf0e10cSrcweir SvStream& SvStream::PutBack( char aCh )
2021cdf0e10cSrcweir {
2022cdf0e10cSrcweir     // wenn kein Buffer oder Zurueckscrollen nicht moeglich -> Fehler
2023cdf0e10cSrcweir     if( !pRWBuf || !nBufActualLen || ( !nBufActualPos && !nBufFilePos ) )
2024cdf0e10cSrcweir     {
2025cdf0e10cSrcweir         // 4. Fall
2026cdf0e10cSrcweir         SetError( SVSTREAM_GENERALERROR );
2027cdf0e10cSrcweir         return *this;
2028cdf0e10cSrcweir     }
2029cdf0e10cSrcweir 
2030cdf0e10cSrcweir     // Flush() (Phys. Flushen aber nicht notwendig, deshalb selbst schreiben)
2031cdf0e10cSrcweir     if( bIsConsistent && bIsDirty  )
2032cdf0e10cSrcweir     {
2033cdf0e10cSrcweir         SeekPos( nBufFilePos );
2034cdf0e10cSrcweir         if( nCryptMask )
2035cdf0e10cSrcweir             CryptAndWriteBuffer( pRWBuf, nBufActualLen );
2036cdf0e10cSrcweir         else
2037cdf0e10cSrcweir             PutData( pRWBuf, nBufActualLen );
2038cdf0e10cSrcweir         bIsDirty = sal_False;
2039cdf0e10cSrcweir     }
2040cdf0e10cSrcweir     bIsConsistent = sal_False;  // Puffer enthaelt jetzt TRASH
2041cdf0e10cSrcweir     if( nBufActualPos )
2042cdf0e10cSrcweir     {
2043cdf0e10cSrcweir         // 1. Fall
2044cdf0e10cSrcweir         nBufActualPos--;
2045cdf0e10cSrcweir         pBufPos--;
2046cdf0e10cSrcweir         *pBufPos = aCh;
2047cdf0e10cSrcweir         nBufFree++;
2048cdf0e10cSrcweir     }
2049cdf0e10cSrcweir     else  // Puffer muss verschoben werden
2050cdf0e10cSrcweir     {
2051cdf0e10cSrcweir         // Ist Puffer am Anschlag ?
2052cdf0e10cSrcweir         if( nBufSize == nBufActualLen )
2053cdf0e10cSrcweir         {
2054cdf0e10cSrcweir             // 2. Fall
2055cdf0e10cSrcweir             memmove( pRWBuf+1, pRWBuf, nBufSize-1 );
2056cdf0e10cSrcweir             // nBufFree behaelt den Wert!
2057cdf0e10cSrcweir         }
2058cdf0e10cSrcweir         else
2059cdf0e10cSrcweir         {
2060cdf0e10cSrcweir             // 3. Fall -> Puffer vergroessern
2061cdf0e10cSrcweir             memmove( pRWBuf+1, pRWBuf, (sal_uInt16)nBufActualLen );
2062cdf0e10cSrcweir             nBufActualLen++;
2063cdf0e10cSrcweir             nBufFree++;
2064cdf0e10cSrcweir         }
2065cdf0e10cSrcweir         nBufFilePos--;
2066cdf0e10cSrcweir         *pRWBuf = aCh;
2067cdf0e10cSrcweir     }
2068cdf0e10cSrcweir     eIOMode = STREAM_IO_DONTKNOW;
2069cdf0e10cSrcweir     bIsEof = sal_False;
2070cdf0e10cSrcweir     return *this;
2071cdf0e10cSrcweir }
2072cdf0e10cSrcweir 
2073cdf0e10cSrcweir /*************************************************************************
2074cdf0e10cSrcweir |*
2075cdf0e10cSrcweir |*    Stream::EatWhite()
2076cdf0e10cSrcweir |*
2077cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2078cdf0e10cSrcweir |*    Ersterstellung    OV 01.08.94
2079cdf0e10cSrcweir |*    Letzte Aenderung  OV 01.08.94
2080cdf0e10cSrcweir |*
2081cdf0e10cSrcweir *************************************************************************/
2082cdf0e10cSrcweir 
EatWhite()2083cdf0e10cSrcweir void SvStream::EatWhite()
2084cdf0e10cSrcweir {
2085cdf0e10cSrcweir     char aCh;
2086cdf0e10cSrcweir     Read(&aCh, sizeof(char) );
2087cdf0e10cSrcweir     while( !bIsEof && isspace((int)aCh) )  //( aCh == ' ' || aCh == '\t' ) )
2088cdf0e10cSrcweir         Read(&aCh, sizeof(char) );
2089cdf0e10cSrcweir     if( !bIsEof ) // konnte das letzte Char gelesen werden ?
2090cdf0e10cSrcweir         SeekRel( -1L );
2091cdf0e10cSrcweir }
2092cdf0e10cSrcweir 
2093cdf0e10cSrcweir /*************************************************************************
2094cdf0e10cSrcweir |*
2095cdf0e10cSrcweir |*    Stream::RefreshBuffer()
2096cdf0e10cSrcweir |*
2097cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2098cdf0e10cSrcweir |*    Ersterstellung    OV 01.08.94
2099cdf0e10cSrcweir |*    Letzte Aenderung  OV 01.08.94
2100cdf0e10cSrcweir |*
2101cdf0e10cSrcweir *************************************************************************/
2102cdf0e10cSrcweir 
RefreshBuffer()2103cdf0e10cSrcweir void SvStream::RefreshBuffer()
2104cdf0e10cSrcweir {
2105cdf0e10cSrcweir     if( bIsDirty && bIsConsistent )
2106cdf0e10cSrcweir     {
2107cdf0e10cSrcweir         SeekPos( nBufFilePos );
2108cdf0e10cSrcweir         if( nCryptMask )
2109cdf0e10cSrcweir             CryptAndWriteBuffer( pRWBuf, (sal_Size)nBufActualLen );
2110cdf0e10cSrcweir         else
2111cdf0e10cSrcweir             PutData( pRWBuf, nBufActualLen );
2112cdf0e10cSrcweir         bIsDirty = sal_False;
2113cdf0e10cSrcweir     }
2114cdf0e10cSrcweir     SeekPos( nBufFilePos );
2115cdf0e10cSrcweir     nBufActualLen = (sal_uInt16)GetData( pRWBuf, nBufSize );
2116cdf0e10cSrcweir     if( nBufActualLen && nError == ERRCODE_IO_PENDING )
2117cdf0e10cSrcweir         nError = ERRCODE_NONE;
2118cdf0e10cSrcweir     if( nCryptMask )
2119cdf0e10cSrcweir         EncryptBuffer(pRWBuf, (sal_Size)nBufActualLen);
2120cdf0e10cSrcweir     bIsConsistent = sal_True;
2121cdf0e10cSrcweir     eIOMode = STREAM_IO_DONTKNOW;
2122cdf0e10cSrcweir }
2123cdf0e10cSrcweir 
2124cdf0e10cSrcweir 
2125cdf0e10cSrcweir /*************************************************************************
2126cdf0e10cSrcweir |*
2127cdf0e10cSrcweir |*    Stream::CreateFormatString()
2128cdf0e10cSrcweir |*
2129cdf0e10cSrcweir |*    Beschreibung      Baut Formatstring zusammen
2130cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
2131cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
2132cdf0e10cSrcweir |*
2133cdf0e10cSrcweir *************************************************************************/
2134cdf0e10cSrcweir 
CreateFormatString()2135cdf0e10cSrcweir void SvStream::CreateFormatString()
2136cdf0e10cSrcweir {
2137cdf0e10cSrcweir     aFormatString = '%';
2138cdf0e10cSrcweir     nPrintfParams = SPECIAL_PARAM_NONE;
2139cdf0e10cSrcweir 
2140cdf0e10cSrcweir     if( nJustification )
2141cdf0e10cSrcweir     {
2142cdf0e10cSrcweir         aFormatString += '-';
2143cdf0e10cSrcweir     }
2144cdf0e10cSrcweir 
2145cdf0e10cSrcweir     if( nWidth )
2146cdf0e10cSrcweir     {
2147cdf0e10cSrcweir         if( cFiller != ' ' )
2148cdf0e10cSrcweir             aFormatString += '0';
2149cdf0e10cSrcweir         aFormatString += '*';
2150cdf0e10cSrcweir         nPrintfParams = SPECIAL_PARAM_WIDTH;
2151cdf0e10cSrcweir     }
2152cdf0e10cSrcweir 
2153cdf0e10cSrcweir     if( nPrecision )
2154cdf0e10cSrcweir     {
2155cdf0e10cSrcweir         aFormatString += ".*";
2156cdf0e10cSrcweir         if( nWidth )
2157cdf0e10cSrcweir             nPrintfParams = SPECIAL_PARAM_BOTH;
2158cdf0e10cSrcweir         else
2159cdf0e10cSrcweir             nPrintfParams = SPECIAL_PARAM_PRECISION;
2160cdf0e10cSrcweir     }
2161cdf0e10cSrcweir }
2162cdf0e10cSrcweir 
2163cdf0e10cSrcweir /*************************************************************************
2164cdf0e10cSrcweir |*
2165cdf0e10cSrcweir |*    Stream::ReadNumber()
2166cdf0e10cSrcweir |*
2167cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2168cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
2169cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
2170cdf0e10cSrcweir |*
2171cdf0e10cSrcweir *************************************************************************/
2172cdf0e10cSrcweir 
2173cdf0e10cSrcweir #define BUFSIZE_LONG 21  // log( 2 hoch 64 ) + 1
2174cdf0e10cSrcweir 
ReadNumber(long & rLong)2175cdf0e10cSrcweir SvStream& SvStream::ReadNumber( long& rLong )
2176cdf0e10cSrcweir {
2177cdf0e10cSrcweir     EatWhite();
2178cdf0e10cSrcweir     if( bIsEof || nError )
2179cdf0e10cSrcweir     {
2180cdf0e10cSrcweir         SetError( SVSTREAM_GENERALERROR );
2181cdf0e10cSrcweir         return *this;
2182cdf0e10cSrcweir     }
2183cdf0e10cSrcweir     sal_Size nFPtr = Tell();
2184cdf0e10cSrcweir     char buf[ BUFSIZE_LONG ];
2185cdf0e10cSrcweir     memset( buf, 0, BUFSIZE_LONG );
2186cdf0e10cSrcweir     sal_Size nTemp = Read( buf, BUFSIZE_LONG-1 );
2187cdf0e10cSrcweir     if( !nTemp || nError )
2188cdf0e10cSrcweir     {
2189cdf0e10cSrcweir         SetError( SVSTREAM_GENERALERROR );
2190cdf0e10cSrcweir         return *this;
2191cdf0e10cSrcweir     }
2192cdf0e10cSrcweir     char *pEndPtr;
2193cdf0e10cSrcweir     rLong = strtol( buf, &pEndPtr, (int)nRadix );
2194cdf0e10cSrcweir     nFPtr += ( (sal_Size)pEndPtr - (sal_Size)(&(buf[0])) );
2195cdf0e10cSrcweir     Seek( nFPtr );
2196cdf0e10cSrcweir     bIsEof = sal_False;
2197cdf0e10cSrcweir     return *this;
2198cdf0e10cSrcweir }
2199cdf0e10cSrcweir 
ReadNumber(sal_uInt32 & rUInt32)2200cdf0e10cSrcweir SvStream& SvStream::ReadNumber( sal_uInt32& rUInt32 )
2201cdf0e10cSrcweir {
2202cdf0e10cSrcweir     EatWhite();
2203cdf0e10cSrcweir     if( bIsEof || nError )
2204cdf0e10cSrcweir     {
2205cdf0e10cSrcweir         SetError( SVSTREAM_GENERALERROR );
2206cdf0e10cSrcweir         return *this;
2207cdf0e10cSrcweir     }
2208cdf0e10cSrcweir     sal_Size nFPtr = Tell();
2209cdf0e10cSrcweir     char buf[ BUFSIZE_LONG ];
2210cdf0e10cSrcweir     memset( buf, 0, BUFSIZE_LONG );
2211cdf0e10cSrcweir     sal_Size nTemp = Read( buf, BUFSIZE_LONG-1 );
2212cdf0e10cSrcweir     if( !nTemp || nError )
2213cdf0e10cSrcweir     {
2214cdf0e10cSrcweir         SetError( SVSTREAM_GENERALERROR );
2215cdf0e10cSrcweir         return *this;
2216cdf0e10cSrcweir     }
2217cdf0e10cSrcweir     char *pEndPtr;
2218cdf0e10cSrcweir     rUInt32 = strtoul( buf, &pEndPtr, (int)nRadix );
2219cdf0e10cSrcweir     nFPtr += ( (sal_uIntPtr)pEndPtr - (sal_uIntPtr)buf );
2220cdf0e10cSrcweir     Seek( nFPtr );
2221cdf0e10cSrcweir     bIsEof = sal_False;
2222cdf0e10cSrcweir     return *this;
2223cdf0e10cSrcweir }
2224cdf0e10cSrcweir 
ReadNumber(double & rDouble)2225cdf0e10cSrcweir SvStream& SvStream::ReadNumber( double& rDouble )
2226cdf0e10cSrcweir {
2227cdf0e10cSrcweir     EatWhite();
2228cdf0e10cSrcweir     if( bIsEof || nError )
2229cdf0e10cSrcweir     {
2230cdf0e10cSrcweir         SetError( SVSTREAM_GENERALERROR );
2231cdf0e10cSrcweir         return *this;
2232cdf0e10cSrcweir     }
2233cdf0e10cSrcweir     sal_Size nFPtr = Tell();
2234cdf0e10cSrcweir     char buf[ BUFSIZE_LONG ];
2235cdf0e10cSrcweir     memset( buf, 0, BUFSIZE_LONG );
2236cdf0e10cSrcweir     sal_Size nTemp = Read( buf, BUFSIZE_LONG-1 );
2237cdf0e10cSrcweir     if( !nTemp || nError )
2238cdf0e10cSrcweir     {
2239cdf0e10cSrcweir         SetError( SVSTREAM_GENERALERROR );
2240cdf0e10cSrcweir         return *this;
2241cdf0e10cSrcweir     }
2242cdf0e10cSrcweir     char *pEndPtr;
2243cdf0e10cSrcweir     rDouble = strtod( buf, &pEndPtr );
2244cdf0e10cSrcweir     nFPtr += ( (sal_Size)pEndPtr - (sal_Size)buf );
2245cdf0e10cSrcweir     Seek( nFPtr );
2246cdf0e10cSrcweir     bIsEof = sal_False;
2247cdf0e10cSrcweir     return *this;
2248cdf0e10cSrcweir }
2249cdf0e10cSrcweir 
2250cdf0e10cSrcweir 
2251cdf0e10cSrcweir /*************************************************************************
2252cdf0e10cSrcweir |*
2253cdf0e10cSrcweir |*    Stream::WriteNumber()
2254cdf0e10cSrcweir |*
2255cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2256cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
2257cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
2258cdf0e10cSrcweir |*
2259cdf0e10cSrcweir *************************************************************************/
2260cdf0e10cSrcweir 
WriteNumber(long nLong)2261cdf0e10cSrcweir SvStream& SvStream::WriteNumber( long nLong )
2262cdf0e10cSrcweir {
2263cdf0e10cSrcweir     char buffer[256+12];
2264cdf0e10cSrcweir     char pType[] = "ld"; // Nicht static!
2265cdf0e10cSrcweir     if( nRadix == 16 )
2266cdf0e10cSrcweir         pType[1] = 'x';
2267cdf0e10cSrcweir     else if( nRadix == 8 )
2268cdf0e10cSrcweir         pType[1] = 'o';
2269cdf0e10cSrcweir     ByteString aFStr( aFormatString);
2270cdf0e10cSrcweir     aFStr += pType;
2271cdf0e10cSrcweir     int nLen;
2272cdf0e10cSrcweir     switch ( nPrintfParams )
2273cdf0e10cSrcweir     {
2274cdf0e10cSrcweir         case SPECIAL_PARAM_NONE :
2275cdf0e10cSrcweir             nLen = sprintf( buffer, aFStr.GetBuffer(), nLong );
2276cdf0e10cSrcweir             break;
2277cdf0e10cSrcweir         case SPECIAL_PARAM_WIDTH :
2278cdf0e10cSrcweir             nLen = sprintf( buffer, aFStr.GetBuffer(), nWidth, nLong );
2279cdf0e10cSrcweir             break;
2280cdf0e10cSrcweir         case SPECIAL_PARAM_PRECISION :
2281cdf0e10cSrcweir             nLen = sprintf( buffer, aFStr.GetBuffer(), nPrecision,nLong);
2282cdf0e10cSrcweir             break;
2283cdf0e10cSrcweir         default:
2284cdf0e10cSrcweir             nLen=sprintf(buffer, aFStr.GetBuffer(),nWidth,nPrecision,nLong);
2285cdf0e10cSrcweir     }
2286cdf0e10cSrcweir     Write( buffer, (long)nLen );
2287cdf0e10cSrcweir     return *this;
2288cdf0e10cSrcweir }
2289cdf0e10cSrcweir 
WriteNumber(sal_uInt32 nUInt32)2290cdf0e10cSrcweir SvStream& SvStream::WriteNumber( sal_uInt32 nUInt32 )
2291cdf0e10cSrcweir {
2292cdf0e10cSrcweir     char buffer[256+12];
2293cdf0e10cSrcweir     char pType[] = "lu"; // Nicht static!
2294cdf0e10cSrcweir     if( nRadix == 16 )
2295cdf0e10cSrcweir         pType[1] = 'x';
2296cdf0e10cSrcweir     else if( nRadix == 8 )
2297cdf0e10cSrcweir         pType[1] = 'o';
2298cdf0e10cSrcweir     ByteString aFStr( aFormatString);
2299cdf0e10cSrcweir     aFStr += pType;
2300cdf0e10cSrcweir     int nLen;
2301cdf0e10cSrcweir     switch ( nPrintfParams )
2302cdf0e10cSrcweir     {
2303cdf0e10cSrcweir         case SPECIAL_PARAM_NONE :
2304cdf0e10cSrcweir             nLen = sprintf( buffer, aFStr.GetBuffer(), nUInt32 );
2305cdf0e10cSrcweir             break;
2306cdf0e10cSrcweir         case SPECIAL_PARAM_WIDTH :
2307cdf0e10cSrcweir             nLen = sprintf( buffer, aFStr.GetBuffer(), nWidth, nUInt32 );
2308cdf0e10cSrcweir             break;
2309cdf0e10cSrcweir         case SPECIAL_PARAM_PRECISION :
2310cdf0e10cSrcweir             nLen = sprintf( buffer, aFStr.GetBuffer(), nPrecision, nUInt32 );
2311cdf0e10cSrcweir             break;
2312cdf0e10cSrcweir         default:
2313cdf0e10cSrcweir             nLen=sprintf(buffer,aFStr.GetBuffer(),nWidth,nPrecision,nUInt32 );
2314cdf0e10cSrcweir     }
2315cdf0e10cSrcweir     Write( buffer, (long)nLen );
2316cdf0e10cSrcweir     return *this;
2317cdf0e10cSrcweir }
2318cdf0e10cSrcweir 
2319cdf0e10cSrcweir 
WriteNumber(const double & rDouble)2320cdf0e10cSrcweir SvStream& SvStream::WriteNumber( const double& rDouble )
2321cdf0e10cSrcweir {
2322cdf0e10cSrcweir     char buffer[256+24];
2323cdf0e10cSrcweir     ByteString aFStr( aFormatString);
2324cdf0e10cSrcweir     aFStr += "lf";
2325cdf0e10cSrcweir     int nLen;
2326cdf0e10cSrcweir     switch ( nPrintfParams )
2327cdf0e10cSrcweir     {
2328cdf0e10cSrcweir         case SPECIAL_PARAM_NONE :
2329cdf0e10cSrcweir             nLen = sprintf( buffer, aFStr.GetBuffer(), rDouble );
2330cdf0e10cSrcweir             break;
2331cdf0e10cSrcweir         case SPECIAL_PARAM_WIDTH :
2332cdf0e10cSrcweir             nLen = sprintf( buffer, aFStr.GetBuffer(), nWidth, rDouble );
2333cdf0e10cSrcweir             break;
2334cdf0e10cSrcweir         case SPECIAL_PARAM_PRECISION :
2335cdf0e10cSrcweir             nLen = sprintf( buffer, aFStr.GetBuffer(), nPrecision, rDouble);
2336cdf0e10cSrcweir             break;
2337cdf0e10cSrcweir         default:
2338cdf0e10cSrcweir             nLen=sprintf(buffer, aFStr.GetBuffer(),nWidth,nPrecision,rDouble);
2339cdf0e10cSrcweir     }
2340cdf0e10cSrcweir     Write( buffer, (long)nLen );
2341cdf0e10cSrcweir     return *this;
2342cdf0e10cSrcweir }
2343cdf0e10cSrcweir 
2344cdf0e10cSrcweir /*************************************************************************
2345cdf0e10cSrcweir |*
2346cdf0e10cSrcweir |*    Stream::CryptAndWriteBuffer()
2347cdf0e10cSrcweir |*
2348cdf0e10cSrcweir |*    Beschreibung      Verschluesseln und Schreiben
2349cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
2350cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
2351cdf0e10cSrcweir |*
2352cdf0e10cSrcweir *************************************************************************/
2353cdf0e10cSrcweir 
2354cdf0e10cSrcweir #define CRYPT_BUFSIZE 1024
2355cdf0e10cSrcweir 
CryptAndWriteBuffer(const void * pStart,sal_Size nLen)2356cdf0e10cSrcweir sal_Size SvStream::CryptAndWriteBuffer( const void* pStart, sal_Size nLen)
2357cdf0e10cSrcweir {
2358cdf0e10cSrcweir     unsigned char  pTemp[CRYPT_BUFSIZE];
2359cdf0e10cSrcweir     unsigned char* pDataPtr = (unsigned char*)pStart;
2360cdf0e10cSrcweir     sal_Size nCount = 0;
2361cdf0e10cSrcweir     sal_Size nBufCount;
2362cdf0e10cSrcweir     unsigned char nMask = nCryptMask;
2363cdf0e10cSrcweir     do
2364cdf0e10cSrcweir     {
2365cdf0e10cSrcweir         if( nLen >= CRYPT_BUFSIZE )
2366cdf0e10cSrcweir             nBufCount = CRYPT_BUFSIZE;
2367cdf0e10cSrcweir         else
2368cdf0e10cSrcweir             nBufCount = nLen;
2369cdf0e10cSrcweir         nLen -= nBufCount;
2370cdf0e10cSrcweir         memcpy( pTemp, pDataPtr, (sal_uInt16)nBufCount );
2371cdf0e10cSrcweir         // **** Verschluesseln *****
2372cdf0e10cSrcweir         for ( sal_uInt16 n=0; n < CRYPT_BUFSIZE; n++ )
2373cdf0e10cSrcweir         {
2374cdf0e10cSrcweir             unsigned char aCh = pTemp[n];
2375cdf0e10cSrcweir             aCh ^= nMask;
2376cdf0e10cSrcweir             SWAPNIBBLES(aCh)
2377cdf0e10cSrcweir             pTemp[n] = aCh;
2378cdf0e10cSrcweir         }
2379cdf0e10cSrcweir         // *************************
2380cdf0e10cSrcweir         nCount += PutData( (char*)pTemp, nBufCount );
2381cdf0e10cSrcweir         pDataPtr += nBufCount;
2382cdf0e10cSrcweir     }
2383cdf0e10cSrcweir     while ( nLen );
2384cdf0e10cSrcweir     return nCount;
2385cdf0e10cSrcweir }
2386cdf0e10cSrcweir 
2387cdf0e10cSrcweir /*************************************************************************
2388cdf0e10cSrcweir |*
2389cdf0e10cSrcweir |*    Stream::EncryptBuffer()
2390cdf0e10cSrcweir |*
2391cdf0e10cSrcweir |*    Beschreibung      Buffer entschluesseln
2392cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
2393cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
2394cdf0e10cSrcweir |*
2395cdf0e10cSrcweir *************************************************************************/
2396cdf0e10cSrcweir 
EncryptBuffer(void * pStart,sal_Size nLen)2397cdf0e10cSrcweir sal_Bool SvStream::EncryptBuffer(void* pStart, sal_Size nLen)
2398cdf0e10cSrcweir {
2399cdf0e10cSrcweir     unsigned char* pTemp = (unsigned char*)pStart;
2400cdf0e10cSrcweir     unsigned char nMask = nCryptMask;
2401cdf0e10cSrcweir 
2402cdf0e10cSrcweir     for ( sal_Size n=0; n < nLen; n++, pTemp++ )
2403cdf0e10cSrcweir     {
2404cdf0e10cSrcweir         unsigned char aCh = *pTemp;
2405cdf0e10cSrcweir         SWAPNIBBLES(aCh)
2406cdf0e10cSrcweir         aCh ^= nMask;
2407cdf0e10cSrcweir         *pTemp = aCh;
2408cdf0e10cSrcweir     }
2409cdf0e10cSrcweir     return sal_True;
2410cdf0e10cSrcweir }
2411cdf0e10cSrcweir 
2412cdf0e10cSrcweir /*************************************************************************
2413cdf0e10cSrcweir |*
2414cdf0e10cSrcweir |*    Stream::SetKey()
2415cdf0e10cSrcweir |*
2416cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2417cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
2418cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
2419cdf0e10cSrcweir |*
2420cdf0e10cSrcweir *************************************************************************/
2421cdf0e10cSrcweir 
implGetCryptMask(const sal_Char * pStr,sal_Int32 nLen,long nVersion)2422cdf0e10cSrcweir unsigned char implGetCryptMask(const sal_Char* pStr, sal_Int32 nLen, long nVersion)
2423cdf0e10cSrcweir {
2424cdf0e10cSrcweir     unsigned char nCryptMask = 0;
2425cdf0e10cSrcweir 
2426cdf0e10cSrcweir     if (!nLen)
2427cdf0e10cSrcweir         return nCryptMask;
2428cdf0e10cSrcweir 
2429cdf0e10cSrcweir     if( nVersion <= SOFFICE_FILEFORMAT_31 )
2430cdf0e10cSrcweir     {
2431cdf0e10cSrcweir         while( nLen )
2432cdf0e10cSrcweir         {
2433cdf0e10cSrcweir             nCryptMask ^= *pStr;
2434cdf0e10cSrcweir             pStr++;
2435cdf0e10cSrcweir             nLen--;
2436cdf0e10cSrcweir         }
2437cdf0e10cSrcweir     }
2438cdf0e10cSrcweir     else // BugFix #25888#
2439cdf0e10cSrcweir     {
2440cdf0e10cSrcweir         for( sal_uInt16 i = 0; i < nLen; i++ ) {
2441cdf0e10cSrcweir             nCryptMask ^= pStr[i];
2442cdf0e10cSrcweir             if( nCryptMask & 0x80 ) {
2443cdf0e10cSrcweir                 nCryptMask <<= 1;
2444cdf0e10cSrcweir                 nCryptMask++;
2445cdf0e10cSrcweir             }
2446cdf0e10cSrcweir             else
2447cdf0e10cSrcweir                 nCryptMask <<= 1;
2448cdf0e10cSrcweir         }
2449cdf0e10cSrcweir     }
2450cdf0e10cSrcweir 
2451cdf0e10cSrcweir     if( !nCryptMask )
2452cdf0e10cSrcweir         nCryptMask = 67;
2453cdf0e10cSrcweir 
2454cdf0e10cSrcweir     return nCryptMask;
2455cdf0e10cSrcweir }
2456cdf0e10cSrcweir 
SetKey(const ByteString & rKey)2457cdf0e10cSrcweir void SvStream::SetKey( const ByteString& rKey )
2458cdf0e10cSrcweir {
2459cdf0e10cSrcweir     aKey = rKey;
2460cdf0e10cSrcweir     nCryptMask = implGetCryptMask( aKey.GetBuffer(), aKey.Len(), GetVersion() );
2461cdf0e10cSrcweir }
2462cdf0e10cSrcweir 
2463cdf0e10cSrcweir /*************************************************************************
2464cdf0e10cSrcweir |*
2465cdf0e10cSrcweir |*    Stream::SyncSvStream()
2466cdf0e10cSrcweir |*
2467cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2468cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
2469cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
2470cdf0e10cSrcweir |*
2471cdf0e10cSrcweir *************************************************************************/
2472cdf0e10cSrcweir 
SyncSvStream(sal_Size nNewStreamPos)2473cdf0e10cSrcweir void SvStream::SyncSvStream( sal_Size nNewStreamPos )
2474cdf0e10cSrcweir {
2475cdf0e10cSrcweir     ClearBuffer();
2476cdf0e10cSrcweir     SvStream::nBufFilePos = nNewStreamPos;
2477cdf0e10cSrcweir }
2478cdf0e10cSrcweir 
2479cdf0e10cSrcweir /*************************************************************************
2480cdf0e10cSrcweir |*
2481cdf0e10cSrcweir |*    Stream::SyncSysStream()
2482cdf0e10cSrcweir |*
2483cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2484cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
2485cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
2486cdf0e10cSrcweir |*
2487cdf0e10cSrcweir *************************************************************************/
2488cdf0e10cSrcweir 
SyncSysStream()2489cdf0e10cSrcweir void SvStream::SyncSysStream()
2490cdf0e10cSrcweir {
2491cdf0e10cSrcweir     Flush();
2492cdf0e10cSrcweir     SeekPos( Tell() );
2493cdf0e10cSrcweir }
2494cdf0e10cSrcweir 
2495cdf0e10cSrcweir /*************************************************************************
2496cdf0e10cSrcweir |*
2497cdf0e10cSrcweir |*    Stream::SetStreamSize()
2498cdf0e10cSrcweir |*
2499cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2500cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
2501cdf0e10cSrcweir |*    Letzte Aenderung  OV 08.06.94
2502cdf0e10cSrcweir |*
2503cdf0e10cSrcweir *************************************************************************/
2504cdf0e10cSrcweir 
SetStreamSize(sal_Size nSize)2505cdf0e10cSrcweir sal_Bool SvStream::SetStreamSize( sal_Size nSize )
2506cdf0e10cSrcweir {
2507cdf0e10cSrcweir #ifdef DBG_UTIL
2508cdf0e10cSrcweir     sal_Size nFPos = Tell();
2509cdf0e10cSrcweir #endif
2510cdf0e10cSrcweir     sal_uInt16 nBuf = nBufSize;
2511cdf0e10cSrcweir     SetBufferSize( 0 );
2512cdf0e10cSrcweir     SetSize( nSize );
2513cdf0e10cSrcweir     SetBufferSize( nBuf );
2514cdf0e10cSrcweir     DBG_ASSERT(Tell()==nFPos,"SetStreamSize failed");
2515cdf0e10cSrcweir     return (sal_Bool)(nError == 0);
2516cdf0e10cSrcweir }
2517cdf0e10cSrcweir 
2518cdf0e10cSrcweir //============================================================================
2519cdf0e10cSrcweir 
AddMark(sal_Size)2520cdf0e10cSrcweir void SvStream::AddMark( sal_Size )
2521cdf0e10cSrcweir {
2522cdf0e10cSrcweir }
2523cdf0e10cSrcweir 
2524cdf0e10cSrcweir //============================================================================
2525cdf0e10cSrcweir 
RemoveMark(sal_Size)2526cdf0e10cSrcweir void SvStream::RemoveMark( sal_Size )
2527cdf0e10cSrcweir {
2528cdf0e10cSrcweir }
2529cdf0e10cSrcweir 
2530cdf0e10cSrcweir /*************************************************************************
2531cdf0e10cSrcweir |*
2532cdf0e10cSrcweir |*    endl()
2533cdf0e10cSrcweir |*
2534cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2535cdf0e10cSrcweir |*    Ersterstellung    OV 08.06.94
2536cdf0e10cSrcweir |*    Letzte Aenderung  TH 13.11.96
2537cdf0e10cSrcweir |*
2538cdf0e10cSrcweir *************************************************************************/
2539cdf0e10cSrcweir 
endl(SvStream & rStr)2540cdf0e10cSrcweir SvStream& endl( SvStream& rStr )
2541cdf0e10cSrcweir {
2542cdf0e10cSrcweir     LineEnd eDelim = rStr.GetLineDelimiter();
2543cdf0e10cSrcweir     if ( eDelim == LINEEND_CR )
2544cdf0e10cSrcweir         rStr << _CR;
2545cdf0e10cSrcweir     else if( eDelim == LINEEND_LF )
2546cdf0e10cSrcweir         rStr << _LF;
2547cdf0e10cSrcweir     else
2548cdf0e10cSrcweir         rStr << _CR << _LF;
2549cdf0e10cSrcweir     return rStr;
2550cdf0e10cSrcweir }
2551cdf0e10cSrcweir 
endlu(SvStream & rStrm)2552cdf0e10cSrcweir SvStream& endlu( SvStream& rStrm )
2553cdf0e10cSrcweir {
2554cdf0e10cSrcweir     switch ( rStrm.GetLineDelimiter() )
2555cdf0e10cSrcweir     {
2556cdf0e10cSrcweir         case LINEEND_CR :
2557cdf0e10cSrcweir             rStrm << sal_Unicode(_CR);
2558cdf0e10cSrcweir         break;
2559cdf0e10cSrcweir         case LINEEND_LF :
2560cdf0e10cSrcweir             rStrm << sal_Unicode(_LF);
2561cdf0e10cSrcweir         break;
2562cdf0e10cSrcweir         default:
2563cdf0e10cSrcweir             rStrm << sal_Unicode(_CR) << sal_Unicode(_LF);
2564cdf0e10cSrcweir     }
2565cdf0e10cSrcweir     return rStrm;
2566cdf0e10cSrcweir }
2567cdf0e10cSrcweir 
endlub(SvStream & rStrm)2568cdf0e10cSrcweir SvStream& endlub( SvStream& rStrm )
2569cdf0e10cSrcweir {
2570cdf0e10cSrcweir     if ( rStrm.GetStreamCharSet() == RTL_TEXTENCODING_UNICODE )
2571cdf0e10cSrcweir         return endlu( rStrm );
2572cdf0e10cSrcweir     else
2573cdf0e10cSrcweir         return endl( rStrm );
2574cdf0e10cSrcweir }
2575cdf0e10cSrcweir 
2576cdf0e10cSrcweir /*************************************************************************
2577cdf0e10cSrcweir |*
2578cdf0e10cSrcweir |*    SvMemoryStream::SvMemoryStream()
2579cdf0e10cSrcweir |*
2580cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2581cdf0e10cSrcweir |*    Ersterstellung    OV 20.06.94
2582cdf0e10cSrcweir |*    Letzte Aenderung  OV 20.06.94
2583cdf0e10cSrcweir |*
2584cdf0e10cSrcweir *************************************************************************/
2585cdf0e10cSrcweir 
SvMemoryStream(void * pBuffer,sal_Size bufSize,StreamMode eMode)2586cdf0e10cSrcweir SvMemoryStream::SvMemoryStream( void* pBuffer, sal_Size bufSize,
2587cdf0e10cSrcweir                                 StreamMode eMode )
2588cdf0e10cSrcweir {
2589cdf0e10cSrcweir     if( eMode & STREAM_WRITE )
2590cdf0e10cSrcweir         bIsWritable = sal_True;
2591cdf0e10cSrcweir     else
2592cdf0e10cSrcweir         bIsWritable = sal_False;
2593cdf0e10cSrcweir     nEndOfData  = bufSize;
2594cdf0e10cSrcweir     bOwnsData   = sal_False;
2595cdf0e10cSrcweir     pBuf        = (sal_uInt8 *) pBuffer;
2596cdf0e10cSrcweir     nResize     = 0L;
2597cdf0e10cSrcweir     nSize       = bufSize;
2598cdf0e10cSrcweir     nPos        = 0L;
2599cdf0e10cSrcweir     SetBufferSize( 0 );
2600cdf0e10cSrcweir }
2601cdf0e10cSrcweir 
2602cdf0e10cSrcweir /*************************************************************************
2603cdf0e10cSrcweir |*
2604cdf0e10cSrcweir |*    SvMemoryStream::SvMemoryStream()
2605cdf0e10cSrcweir |*
2606cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2607cdf0e10cSrcweir |*    Ersterstellung    OV 20.06.94
2608cdf0e10cSrcweir |*    Letzte Aenderung  OV 20.06.94
2609cdf0e10cSrcweir |*
2610cdf0e10cSrcweir *************************************************************************/
2611cdf0e10cSrcweir 
SvMemoryStream(sal_Size nInitSize,sal_Size nResizeOffset)2612cdf0e10cSrcweir SvMemoryStream::SvMemoryStream( sal_Size nInitSize, sal_Size nResizeOffset )
2613cdf0e10cSrcweir {
2614cdf0e10cSrcweir     bIsWritable = sal_True;
2615cdf0e10cSrcweir     bOwnsData   = sal_True;
2616cdf0e10cSrcweir     nEndOfData  = 0L;
2617cdf0e10cSrcweir     nResize     = nResizeOffset;
2618cdf0e10cSrcweir     nPos        = 0;
2619cdf0e10cSrcweir     pBuf        = 0;
2620cdf0e10cSrcweir     if( nResize != 0 && nResize < 16 )
2621cdf0e10cSrcweir         nResize = 16;
2622cdf0e10cSrcweir     if( nInitSize && !AllocateMemory( nInitSize ) )
2623cdf0e10cSrcweir     {
2624cdf0e10cSrcweir         SetError( SVSTREAM_OUTOFMEMORY );
2625cdf0e10cSrcweir         nSize = 0;
2626cdf0e10cSrcweir     }
2627cdf0e10cSrcweir     else
2628cdf0e10cSrcweir         nSize = nInitSize;
2629cdf0e10cSrcweir     SetBufferSize( 64 );
2630cdf0e10cSrcweir }
2631cdf0e10cSrcweir 
2632cdf0e10cSrcweir /*************************************************************************
2633cdf0e10cSrcweir |*
2634cdf0e10cSrcweir |*    SvMemoryStream::~SvMemoryStream()
2635cdf0e10cSrcweir |*
2636cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2637cdf0e10cSrcweir |*    Ersterstellung    OV 20.06.94
2638cdf0e10cSrcweir |*    Letzte Aenderung  OV 20.06.94
2639cdf0e10cSrcweir |*
2640cdf0e10cSrcweir *************************************************************************/
2641cdf0e10cSrcweir 
~SvMemoryStream()2642cdf0e10cSrcweir SvMemoryStream::~SvMemoryStream()
2643cdf0e10cSrcweir {
2644cdf0e10cSrcweir     if( pBuf )
2645cdf0e10cSrcweir     {
2646cdf0e10cSrcweir         if( bOwnsData )
2647cdf0e10cSrcweir             FreeMemory();
2648cdf0e10cSrcweir         else
2649cdf0e10cSrcweir             Flush();
2650cdf0e10cSrcweir     }
2651cdf0e10cSrcweir }
2652cdf0e10cSrcweir 
2653cdf0e10cSrcweir /*************************************************************************
2654cdf0e10cSrcweir |*
2655cdf0e10cSrcweir |*    SvMemoryStream::IsA()
2656cdf0e10cSrcweir |*
2657cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2658cdf0e10cSrcweir |*    Ersterstellung    OV 20.06.94
2659cdf0e10cSrcweir |*    Letzte Aenderung  OV 20.06.94
2660cdf0e10cSrcweir |*
2661cdf0e10cSrcweir *************************************************************************/
2662cdf0e10cSrcweir 
IsA() const2663cdf0e10cSrcweir sal_uInt16 SvMemoryStream::IsA() const
2664cdf0e10cSrcweir {
2665cdf0e10cSrcweir     return (sal_uInt16)ID_MEMORYSTREAM;
2666cdf0e10cSrcweir }
2667cdf0e10cSrcweir 
2668cdf0e10cSrcweir /*************************************************************************
2669cdf0e10cSrcweir |*
2670cdf0e10cSrcweir |*    SvMemoryStream::SetBuffer()
2671cdf0e10cSrcweir |*
2672cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2673cdf0e10cSrcweir |*    Ersterstellung    OV 20.06.94
2674cdf0e10cSrcweir |*    Letzte Aenderung  OV 20.06.94
2675cdf0e10cSrcweir |*
2676cdf0e10cSrcweir *************************************************************************/
2677cdf0e10cSrcweir 
SetBuffer(void * pNewBuf,sal_Size nCount,sal_Bool bOwnsDat,sal_Size nEOF)2678cdf0e10cSrcweir void* SvMemoryStream::SetBuffer( void* pNewBuf, sal_Size nCount,
2679cdf0e10cSrcweir                                  sal_Bool bOwnsDat, sal_Size nEOF )
2680cdf0e10cSrcweir {
2681cdf0e10cSrcweir     void* pResult;
2682cdf0e10cSrcweir     SetBufferSize( 0 ); // Buffering in der Basisklasse initialisieren
2683cdf0e10cSrcweir     Seek( 0 );
2684cdf0e10cSrcweir     if( bOwnsData )
2685cdf0e10cSrcweir     {
2686cdf0e10cSrcweir         pResult = 0;
2687cdf0e10cSrcweir         if( pNewBuf != pBuf )
2688cdf0e10cSrcweir             FreeMemory();
2689cdf0e10cSrcweir     }
2690cdf0e10cSrcweir     else
2691cdf0e10cSrcweir         pResult = pBuf;
2692cdf0e10cSrcweir 
2693cdf0e10cSrcweir     pBuf        = (sal_uInt8 *) pNewBuf;
2694cdf0e10cSrcweir     nPos        = 0;
2695cdf0e10cSrcweir     nSize       = nCount;
2696cdf0e10cSrcweir     nResize     = 0;
2697cdf0e10cSrcweir     bOwnsData   = bOwnsDat;
2698cdf0e10cSrcweir 
2699cdf0e10cSrcweir     if( nEOF > nCount )
2700cdf0e10cSrcweir         nEOF = nCount;
2701cdf0e10cSrcweir     nEndOfData = nEOF;
2702cdf0e10cSrcweir 
2703cdf0e10cSrcweir     ResetError();
2704cdf0e10cSrcweir 
2705cdf0e10cSrcweir     DBG_ASSERT( nEndOfData<STREAM_SEEK_TO_END,"Invalid EOF");
2706cdf0e10cSrcweir     return pResult;
2707cdf0e10cSrcweir }
2708cdf0e10cSrcweir 
2709cdf0e10cSrcweir /*************************************************************************
2710cdf0e10cSrcweir |*
2711cdf0e10cSrcweir |*    SvMemoryStream::GetData()
2712cdf0e10cSrcweir |*
2713cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2714cdf0e10cSrcweir |*    Ersterstellung    OV 20.06.94
2715cdf0e10cSrcweir |*    Letzte Aenderung  OV 20.06.94
2716cdf0e10cSrcweir |*
2717cdf0e10cSrcweir *************************************************************************/
2718cdf0e10cSrcweir 
GetData(void * pData,sal_Size nCount)2719cdf0e10cSrcweir sal_Size SvMemoryStream::GetData( void* pData, sal_Size nCount )
2720cdf0e10cSrcweir {
2721cdf0e10cSrcweir     sal_Size nMaxCount = nEndOfData-nPos;
2722cdf0e10cSrcweir     if( nCount > nMaxCount )
2723cdf0e10cSrcweir         nCount = nMaxCount;
2724cdf0e10cSrcweir     memcpy( pData, pBuf+nPos, (size_t)nCount );
2725cdf0e10cSrcweir     nPos += nCount;
2726cdf0e10cSrcweir     return nCount;
2727cdf0e10cSrcweir }
2728cdf0e10cSrcweir 
2729cdf0e10cSrcweir /*************************************************************************
2730cdf0e10cSrcweir |*
2731cdf0e10cSrcweir |*    SvMemoryStream::PutData()
2732cdf0e10cSrcweir |*
2733cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2734cdf0e10cSrcweir |*    Ersterstellung    OV 20.06.94
2735cdf0e10cSrcweir |*    Letzte Aenderung  OV 20.06.94
2736cdf0e10cSrcweir |*
2737cdf0e10cSrcweir *************************************************************************/
2738cdf0e10cSrcweir 
PutData(const void * pData,sal_Size nCount)2739cdf0e10cSrcweir sal_Size SvMemoryStream::PutData( const void* pData, sal_Size nCount )
2740cdf0e10cSrcweir {
2741cdf0e10cSrcweir     if( GetError() )
2742cdf0e10cSrcweir         return 0L;
2743cdf0e10cSrcweir 
2744cdf0e10cSrcweir     sal_Size nMaxCount = nSize-nPos;
2745cdf0e10cSrcweir 
2746cdf0e10cSrcweir     // auf Ueberlauf testen
2747cdf0e10cSrcweir     if( nCount > nMaxCount )
2748cdf0e10cSrcweir     {
2749cdf0e10cSrcweir         if( nResize == 0 )
2750cdf0e10cSrcweir         {
2751cdf0e10cSrcweir             // soviel wie moeglich rueberschaufeln
2752cdf0e10cSrcweir             nCount = nMaxCount;
2753cdf0e10cSrcweir             SetError( SVSTREAM_OUTOFMEMORY );
2754cdf0e10cSrcweir         }
2755cdf0e10cSrcweir         else
2756cdf0e10cSrcweir         {
2757cdf0e10cSrcweir             long nNewResize;
2758cdf0e10cSrcweir             if( nSize && nSize > nResize )
2759cdf0e10cSrcweir                 nNewResize = nSize;
2760cdf0e10cSrcweir             else
2761cdf0e10cSrcweir                 nNewResize = nResize;
2762cdf0e10cSrcweir 
2763cdf0e10cSrcweir             if( (nCount-nMaxCount) < nResize )
2764cdf0e10cSrcweir             {
2765cdf0e10cSrcweir                 // fehlender Speicher ist kleiner als Resize-Offset,
2766cdf0e10cSrcweir                 // deshalb um Resize-Offset vergroessern
2767cdf0e10cSrcweir                 if( !ReAllocateMemory( nNewResize) )
2768cdf0e10cSrcweir                 {
2769cdf0e10cSrcweir                     nCount = 0;
2770cdf0e10cSrcweir                     SetError( SVSTREAM_WRITE_ERROR );
2771cdf0e10cSrcweir                 }
2772cdf0e10cSrcweir             }
2773cdf0e10cSrcweir             else
2774cdf0e10cSrcweir             {
2775cdf0e10cSrcweir                 // fehlender Speicher ist groesser als Resize-Offset
2776cdf0e10cSrcweir                 // deshalb um Differenz+ResizeOffset vergroessern
2777cdf0e10cSrcweir                 if( !ReAllocateMemory( nCount-nMaxCount+nNewResize ) )
2778cdf0e10cSrcweir                 {
2779cdf0e10cSrcweir                     nCount = 0;
2780cdf0e10cSrcweir                     SetError( SVSTREAM_WRITE_ERROR );
2781cdf0e10cSrcweir                 }
2782cdf0e10cSrcweir             }
2783cdf0e10cSrcweir         }
2784cdf0e10cSrcweir     }
2785cdf0e10cSrcweir     DBG_ASSERT(pBuf,"Possibly Reallocate failed");
2786cdf0e10cSrcweir     memcpy( pBuf+nPos, pData, (size_t)nCount);
2787cdf0e10cSrcweir 
2788cdf0e10cSrcweir     nPos += nCount;
2789cdf0e10cSrcweir     if( nPos > nEndOfData )
2790cdf0e10cSrcweir         nEndOfData = nPos;
2791cdf0e10cSrcweir     return nCount;
2792cdf0e10cSrcweir }
2793cdf0e10cSrcweir 
2794cdf0e10cSrcweir /*************************************************************************
2795cdf0e10cSrcweir |*
2796cdf0e10cSrcweir |*    SvMemoryStream::SeekPos()
2797cdf0e10cSrcweir |*
2798cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2799cdf0e10cSrcweir |*    Ersterstellung    OV 20.06.94
2800cdf0e10cSrcweir |*    Letzte Aenderung  OV 20.06.94
2801cdf0e10cSrcweir |*
2802cdf0e10cSrcweir *************************************************************************/
2803cdf0e10cSrcweir 
2804cdf0e10cSrcweir // nEndOfData: Erste Position im Stream, die nicht gelesen werden darf
2805cdf0e10cSrcweir // nSize: Groesse des allozierten Speichers
2806cdf0e10cSrcweir 
SeekPos(sal_Size nNewPos)2807cdf0e10cSrcweir sal_Size SvMemoryStream::SeekPos( sal_Size nNewPos )
2808cdf0e10cSrcweir {
2809cdf0e10cSrcweir     if( nNewPos < nEndOfData )
2810cdf0e10cSrcweir         nPos = nNewPos;
2811cdf0e10cSrcweir     else if( nNewPos == STREAM_SEEK_TO_END )
2812cdf0e10cSrcweir         nPos = nEndOfData;
2813cdf0e10cSrcweir     else
2814cdf0e10cSrcweir     {
2815cdf0e10cSrcweir         if( nNewPos >= nSize ) // muss Buffer vergroessert werden ?
2816cdf0e10cSrcweir         {
2817cdf0e10cSrcweir             if( nResize )  // ist vergroeseern erlaubt ?
2818cdf0e10cSrcweir             {
2819cdf0e10cSrcweir                 long nDiff = (long)(nNewPos - nSize + 1);
2820cdf0e10cSrcweir                 nDiff += (long)nResize;
2821cdf0e10cSrcweir                 ReAllocateMemory( nDiff );
2822cdf0e10cSrcweir                 nPos = nNewPos;
2823cdf0e10cSrcweir                 nEndOfData = nNewPos;
2824cdf0e10cSrcweir             }
2825cdf0e10cSrcweir             else  // vergroessern ist nicht erlaubt -> ans Ende setzen
2826cdf0e10cSrcweir             {
2827cdf0e10cSrcweir                 // SetError( SVSTREAM_OUTOFMEMORY );
2828cdf0e10cSrcweir                 nPos = nEndOfData;
2829cdf0e10cSrcweir             }
2830cdf0e10cSrcweir         }
2831cdf0e10cSrcweir         else  // gueltigen Bereich innerhalb des Buffers vergroessern
2832cdf0e10cSrcweir         {
2833cdf0e10cSrcweir             nPos = nNewPos;
2834cdf0e10cSrcweir             nEndOfData = nNewPos;
2835cdf0e10cSrcweir         }
2836cdf0e10cSrcweir     }
2837cdf0e10cSrcweir     return nPos;
2838cdf0e10cSrcweir }
2839cdf0e10cSrcweir 
2840cdf0e10cSrcweir /*************************************************************************
2841cdf0e10cSrcweir |*
2842cdf0e10cSrcweir |*    SvMemoryStream::FlushData()
2843cdf0e10cSrcweir |*
2844cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2845cdf0e10cSrcweir |*    Ersterstellung    OV 20.06.94
2846cdf0e10cSrcweir |*    Letzte Aenderung  OV 20.06.94
2847cdf0e10cSrcweir |*
2848cdf0e10cSrcweir *************************************************************************/
2849cdf0e10cSrcweir 
FlushData()2850cdf0e10cSrcweir void SvMemoryStream::FlushData()
2851cdf0e10cSrcweir {
2852cdf0e10cSrcweir }
2853cdf0e10cSrcweir 
2854cdf0e10cSrcweir /*************************************************************************
2855cdf0e10cSrcweir |*
2856cdf0e10cSrcweir |*    SvMemoryStream::ResetError()
2857cdf0e10cSrcweir |*
2858cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2859cdf0e10cSrcweir |*    Ersterstellung    OV 20.06.94
2860cdf0e10cSrcweir |*    Letzte Aenderung  OV 20.06.94
2861cdf0e10cSrcweir |*
2862cdf0e10cSrcweir *************************************************************************/
2863cdf0e10cSrcweir 
ResetError()2864cdf0e10cSrcweir void SvMemoryStream::ResetError()
2865cdf0e10cSrcweir {
2866cdf0e10cSrcweir     SvStream::ClearError();
2867cdf0e10cSrcweir }
2868cdf0e10cSrcweir 
2869cdf0e10cSrcweir /*************************************************************************
2870cdf0e10cSrcweir |*
2871cdf0e10cSrcweir |*    SvMemoryStream::AllocateMemory()
2872cdf0e10cSrcweir |*
2873cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2874cdf0e10cSrcweir |*    Ersterstellung    OV 20.06.94
2875cdf0e10cSrcweir |*    Letzte Aenderung  OV 20.06.94
2876cdf0e10cSrcweir |*
2877cdf0e10cSrcweir *************************************************************************/
2878cdf0e10cSrcweir 
AllocateMemory(sal_Size nNewSize)2879cdf0e10cSrcweir sal_Bool SvMemoryStream::AllocateMemory( sal_Size nNewSize )
2880cdf0e10cSrcweir {
2881cdf0e10cSrcweir     pBuf = new sal_uInt8[nNewSize];
2882cdf0e10cSrcweir     return( pBuf != 0 );
2883cdf0e10cSrcweir }
2884cdf0e10cSrcweir 
2885cdf0e10cSrcweir /*************************************************************************
2886cdf0e10cSrcweir |*
2887cdf0e10cSrcweir |*    SvMemoryStream::ReAllocateMemory()   (Bozo-Algorithmus)
2888cdf0e10cSrcweir |*
2889cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2890cdf0e10cSrcweir |*    Ersterstellung    OV 20.06.94
2891cdf0e10cSrcweir |*    Letzte Aenderung  OV 20.06.94
2892cdf0e10cSrcweir |*
2893cdf0e10cSrcweir *************************************************************************/
2894cdf0e10cSrcweir 
ReAllocateMemory(long nDiff)2895cdf0e10cSrcweir sal_Bool SvMemoryStream::ReAllocateMemory( long nDiff )
2896cdf0e10cSrcweir {
2897cdf0e10cSrcweir     sal_Bool bRetVal    = sal_False;
2898cdf0e10cSrcweir     long nTemp      = (long)nSize;
2899cdf0e10cSrcweir     nTemp           += nDiff;
2900cdf0e10cSrcweir     sal_Size nNewSize  = (sal_Size)nTemp;
2901cdf0e10cSrcweir 
2902cdf0e10cSrcweir     if( nNewSize )
2903cdf0e10cSrcweir     {
2904cdf0e10cSrcweir         sal_uInt8* pNewBuf   = new sal_uInt8[nNewSize];
2905cdf0e10cSrcweir 
2906cdf0e10cSrcweir         if( pNewBuf )
2907cdf0e10cSrcweir         {
2908cdf0e10cSrcweir             bRetVal = sal_True; // Success!
2909cdf0e10cSrcweir             if( nNewSize < nSize )      // Verkleinern ?
2910cdf0e10cSrcweir             {
2911cdf0e10cSrcweir                 memcpy( pNewBuf, pBuf, (size_t)nNewSize );
2912cdf0e10cSrcweir                 if( nPos > nNewSize )
2913cdf0e10cSrcweir                     nPos = 0L;
2914cdf0e10cSrcweir                 if( nEndOfData >= nNewSize )
2915cdf0e10cSrcweir                     nEndOfData = nNewSize-1L;
2916cdf0e10cSrcweir             }
2917cdf0e10cSrcweir             else
2918cdf0e10cSrcweir             {
2919cdf0e10cSrcweir                 memcpy( pNewBuf, pBuf, (size_t)nSize );
2920cdf0e10cSrcweir             }
2921cdf0e10cSrcweir 
2922cdf0e10cSrcweir             FreeMemory();
2923cdf0e10cSrcweir 
2924cdf0e10cSrcweir             pBuf  = pNewBuf;
2925cdf0e10cSrcweir             nSize = nNewSize;
2926cdf0e10cSrcweir         }
2927cdf0e10cSrcweir     }
2928cdf0e10cSrcweir     else
2929cdf0e10cSrcweir     {
2930cdf0e10cSrcweir         bRetVal = sal_True;
2931cdf0e10cSrcweir         FreeMemory();
2932cdf0e10cSrcweir         pBuf = 0;
2933cdf0e10cSrcweir         nSize = 0;
2934cdf0e10cSrcweir         nEndOfData = 0;
2935cdf0e10cSrcweir         nPos = 0;
2936cdf0e10cSrcweir     }
2937cdf0e10cSrcweir 
2938cdf0e10cSrcweir     return bRetVal;
2939cdf0e10cSrcweir }
2940cdf0e10cSrcweir 
FreeMemory()2941cdf0e10cSrcweir void SvMemoryStream::FreeMemory()
2942cdf0e10cSrcweir {
2943cdf0e10cSrcweir     delete[] pBuf;
2944cdf0e10cSrcweir }
2945cdf0e10cSrcweir 
2946cdf0e10cSrcweir /*************************************************************************
2947cdf0e10cSrcweir |*
2948cdf0e10cSrcweir |*    SvMemoryStream::SwitchBuffer()
2949cdf0e10cSrcweir |*
2950cdf0e10cSrcweir |*    Beschreibung      STREAM.SDW
2951cdf0e10cSrcweir |*    Ersterstellung    OV 26.07.94
2952cdf0e10cSrcweir |*    Letzte Aenderung  OV 26.07.94
2953cdf0e10cSrcweir |*
2954cdf0e10cSrcweir *************************************************************************/
2955cdf0e10cSrcweir 
SwitchBuffer(sal_Size nInitSize,sal_Size nResizeOffset)2956cdf0e10cSrcweir void* SvMemoryStream::SwitchBuffer( sal_Size nInitSize, sal_Size nResizeOffset)
2957cdf0e10cSrcweir {
2958cdf0e10cSrcweir     Flush();
2959cdf0e10cSrcweir     if( !bOwnsData )
2960cdf0e10cSrcweir         return 0;
2961cdf0e10cSrcweir     Seek( STREAM_SEEK_TO_BEGIN );
2962cdf0e10cSrcweir 
2963cdf0e10cSrcweir     void* pRetVal = pBuf;
2964cdf0e10cSrcweir     pBuf          = 0;
2965cdf0e10cSrcweir     nEndOfData    = 0L;
2966cdf0e10cSrcweir     nResize       = nResizeOffset;
2967cdf0e10cSrcweir     nPos          = 0;
2968cdf0e10cSrcweir 
2969cdf0e10cSrcweir     if( nResize != 0 && nResize < 16 )
2970cdf0e10cSrcweir         nResize = 16;
2971cdf0e10cSrcweir 
2972cdf0e10cSrcweir     ResetError();
2973cdf0e10cSrcweir 
2974cdf0e10cSrcweir     if( nInitSize && !AllocateMemory(nInitSize) )
2975cdf0e10cSrcweir     {
2976cdf0e10cSrcweir         SetError( SVSTREAM_OUTOFMEMORY );
2977cdf0e10cSrcweir         nSize = 0;
2978cdf0e10cSrcweir     }
2979cdf0e10cSrcweir     else
2980cdf0e10cSrcweir         nSize = nInitSize;
2981cdf0e10cSrcweir 
2982cdf0e10cSrcweir     SetBufferSize( 64 );
2983cdf0e10cSrcweir     return pRetVal;
2984cdf0e10cSrcweir }
2985cdf0e10cSrcweir 
SetSize(sal_Size nNewSize)2986cdf0e10cSrcweir void SvMemoryStream::SetSize( sal_Size nNewSize )
2987cdf0e10cSrcweir {
2988cdf0e10cSrcweir     long nDiff = (long)nNewSize - (long)nSize;
2989cdf0e10cSrcweir     ReAllocateMemory( nDiff );
2990cdf0e10cSrcweir }
2991cdf0e10cSrcweir 
TYPEINIT0(SvDataCopyStream)2992cdf0e10cSrcweir TYPEINIT0 ( SvDataCopyStream )
2993cdf0e10cSrcweir 
2994cdf0e10cSrcweir void SvDataCopyStream::Assign( const SvDataCopyStream& )
2995cdf0e10cSrcweir {
2996cdf0e10cSrcweir }
2997