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