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