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