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