summaryrefslogtreecommitdiff
path: root/tools/inc/tools/stream.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'tools/inc/tools/stream.hxx')
-rw-r--r--tools/inc/tools/stream.hxx779
1 files changed, 0 insertions, 779 deletions
diff --git a/tools/inc/tools/stream.hxx b/tools/inc/tools/stream.hxx
deleted file mode 100644
index 78a0bc3df96f..000000000000
--- a/tools/inc/tools/stream.hxx
+++ /dev/null
@@ -1,779 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-#ifndef _STREAM_HXX
-#define _STREAM_HXX
-
-#include <limits>
-#include "tools/toolsdllapi.h"
-#include <tools/solar.h>
-#include <tools/string.hxx>
-#include <tools/errinf.hxx>
-#include <tools/ref.hxx>
-#include <tools/rtti.hxx>
-#include <rtl/string.hxx>
-
-class StreamData;
-
-inline rtl_TextEncoding GetStoreCharSet( rtl_TextEncoding eEncoding )
-{
- if ( eEncoding == RTL_TEXTENCODING_ISO_8859_1 )
- return RTL_TEXTENCODING_MS_1252;
- else
- return eEncoding;
-}
-
-// StreamTypes
-
-typedef sal_uInt16 StreamMode;
-
-// read, write, create,... options
-#define STREAM_READ 0x0001 ///< allow read accesses
-#define STREAM_WRITE 0x0002 ///< allow write accesses
-// file i/o
-#define STREAM_NOCREATE 0x0004 ///< 1 == Dont create file
-#define STREAM_TRUNC 0x0008 ///< Truncate _existing_ file to zero length
-#define STREAM_COPY_ON_SYMLINK 0x0010 ///< copy-on-write for symlinks (UNX)
-
-#define STREAM_READWRITEBITS (STREAM_READ | STREAM_WRITE | \
- STREAM_NOCREATE | STREAM_TRUNC)
-
-// sharing options
-#define STREAM_SHARE_DENYNONE 0x0100
-#define STREAM_SHARE_DENYREAD 0x0200 // overrides denynone
-#define STREAM_SHARE_DENYWRITE 0x0400 // overrides denynone
-#define STREAM_SHARE_DENYALL 0x0800 // overrides denyread,write,none
-
-#define STREAM_SHAREBITS (STREAM_SHARE_DENYNONE | STREAM_SHARE_DENYREAD |\
- STREAM_SHARE_DENYWRITE | STREAM_SHARE_DENYALL)
-
-#define STREAM_READWRITE (STREAM_READ | STREAM_WRITE)
-#define STREAM_SHARE_DENYREADWRITE (STREAM_SHARE_DENYREAD | STREAM_SHARE_DENYWRITE)
-
-#define STREAM_STD_READ (STREAM_READ | STREAM_SHARE_DENYNONE | STREAM_NOCREATE)
-#define STREAM_STD_WRITE (STREAM_WRITE | STREAM_SHARE_DENYALL)
-#define STREAM_STD_READWRITE (STREAM_READWRITE | STREAM_SHARE_DENYALL)
-
-#define STREAM_SEEK_TO_BEGIN 0L
-#define STREAM_SEEK_TO_END ULONG_MAX
-
-#define NUMBERFORMAT_INT_BIGENDIAN (sal_uInt16)0x0000
-#define NUMBERFORMAT_INT_LITTLEENDIAN (sal_uInt16)0xFFFF
-
-#define COMPRESSMODE_NONE (sal_uInt16)0x0000
-#define COMPRESSMODE_ZBITMAP (sal_uInt16)0x0001
-#define COMPRESSMODE_NATIVE (sal_uInt16)0x0010
-
-#define STREAM_IO_DONTKNOW 0
-#define STREAM_IO_READ 1
-#define STREAM_IO_WRITE 2
-
-#define ID_STREAM 1
-#define ID_FILESTREAM 2
-#define ID_MEMORYSTREAM 3
-#define ID_SHAREDMEMORYSTREAM 4
-#define ID_STORAGESTREAM 5
-#define ID_PERSISTSTREAM 6
-
-class SvStream;
-
-typedef SvStream& (*SvStrPtr)( SvStream& );
-
-inline SvStream& operator<<( SvStream& rStr, SvStrPtr f );
-
-// SvLockBytes
-
-enum LockType {};
-
-struct SvLockBytesStat
-{
- sal_Size nSize;
-
- SvLockBytesStat() : nSize(0) {}
-};
-
-enum SvLockBytesStatFlag { SVSTATFLAG_DEFAULT };
-
-class TOOLS_DLLPUBLIC SvLockBytes: public virtual SvRefBase
-{
- SvStream * m_pStream;
- sal_Bool m_bOwner;
- sal_Bool m_bSync;
-
-protected:
- void close();
-
-public:
- TYPEINFO();
-
- SvLockBytes() : m_pStream(0), m_bOwner(sal_False), m_bSync(sal_False) {}
-
- SvLockBytes(SvStream * pTheStream, sal_Bool bTheOwner = sal_False) :
- m_pStream(pTheStream), m_bOwner(bTheOwner), m_bSync(sal_False) {}
-
- virtual ~SvLockBytes() { close(); }
-
- virtual const SvStream * GetStream() const { return m_pStream; }
-
- virtual void SetSynchronMode(sal_Bool bTheSync = sal_True) { m_bSync = bTheSync; }
- virtual sal_Bool IsSynchronMode() const { return m_bSync; }
-
- virtual ErrCode ReadAt(sal_Size nPos, void * pBuffer, sal_Size nCount,
- sal_Size * pRead) const;
- virtual ErrCode WriteAt(sal_Size nPos, const void * pBuffer, sal_Size nCount,
- sal_Size * pWritten);
-
- virtual ErrCode Flush() const;
-
- virtual ErrCode SetSize(sal_Size nSize);
-
- virtual ErrCode Stat(SvLockBytesStat * pStat, SvLockBytesStatFlag) const;
-};
-
-SV_DECL_IMPL_REF(SvLockBytes);
-
-// SvOpenLockBytes
-
-class TOOLS_DLLPUBLIC SvOpenLockBytes: public SvLockBytes
-{
-public:
- TYPEINFO();
-
- SvOpenLockBytes() : SvLockBytes(0, sal_False) {}
- SvOpenLockBytes(SvStream * pStream, sal_Bool bOwner):
- SvLockBytes(pStream, bOwner) {}
-
- virtual ErrCode FillAppend(const void * pBuffer, sal_Size nCount,
- sal_Size * pWritten) = 0;
-
- virtual sal_Size Tell() const = 0;
-
- virtual sal_Size Seek(sal_Size nPos) = 0;
-
- virtual void Terminate() = 0;
-};
-
-SV_DECL_IMPL_REF(SvOpenLockBytes);
-
-// SvAsyncLockBytes
-
-class SvAsyncLockBytes: public SvOpenLockBytes
-{
- sal_Size m_nSize;
- sal_Bool m_bTerminated;
-
-public:
- TYPEINFO();
-
- SvAsyncLockBytes(SvStream * pStream, sal_Bool bOwner):
- SvOpenLockBytes(pStream, bOwner), m_nSize(0), m_bTerminated(sal_False) {}
-
- virtual ErrCode ReadAt(sal_Size nPos, void * pBuffer, sal_Size nCount,
- sal_Size * pRead) const;
- virtual ErrCode WriteAt(sal_Size nPos, const void * pBuffer, sal_Size nCount,
- sal_Size * pWritten);
-
- virtual ErrCode FillAppend(const void * pBuffer, sal_Size nCount,
- sal_Size * pWritten);
-
- virtual sal_Size Tell() const { return m_nSize; }
-
- virtual sal_Size Seek(sal_Size nPos);
-
- virtual void Terminate() { m_bTerminated = sal_True; }
-};
-
-SV_DECL_IMPL_REF(SvAsyncLockBytes);
-
-// SvStream
-
-class TOOLS_DLLPUBLIC SvStream
-{
-private:
- // LockBytes Interface
- void* pImp; // unused
- SvLockBytesRef xLockBytes; // Default implementation
- sal_Size nActPos;
-
- // Puffer-Verwaltung
- sal_uInt8* pRWBuf; // Points to read/write buffer
- sal_uInt8* pBufPos; // pRWBuf + nBufActualPos
- sal_uInt16 nBufSize; // Allocated size of buffer
- sal_uInt16 nBufActualLen; // Length of used segment of puffer
- // = nBufSize, if EOF did not occur
- sal_uInt16 nBufActualPos; // current position in buffer (0..nBufSize-1)
- sal_uInt16 nBufFree; // number of free slots in buffer to IO of type eIOMode
- unsigned int eIOMode : 2;// STREAM_IO_*
-
- // Error codes, conversion, compression, ...
- int bIsDirty : 1; // sal_True: Stream != buffer content
- int bIsConsistent : 1;// sal_False: Buffer contains data, which were
- // NOT allowed to be written by PutData
- // into the derived stream (cf. PutBack)
- int bSwap : 1;
- int bIsEof : 1;
- sal_uInt32 nError;
- sal_uInt16 nNumberFormatInt;
- sal_uInt16 nCompressMode;
- LineEnd eLineDelimiter;
- CharSet eStreamCharSet;
-
- // Encryption
- OString m_aCryptMaskKey;// aCryptMaskKey.getLength != 0 -> Encryption used
- unsigned char nCryptMask;
-
- // Userdata
- long nVersion; // for external use
-
- // helper methods
- TOOLS_DLLPRIVATE void ImpInit();
-
- SvStream ( const SvStream& rStream ); // not implemented
- SvStream& operator=( const SvStream& rStream ); // not implemented
-
-protected:
- sal_Size nBufFilePos;///< File position of pBuf[0]
- sal_uInt16 eStreamMode;
- sal_Bool bIsWritable;
-
- virtual sal_Size GetData( void* pData, sal_Size nSize );
- virtual sal_Size PutData( const void* pData, sal_Size nSize );
- virtual sal_Size SeekPos( sal_Size nPos );
- virtual void FlushData();
- virtual void SetSize( sal_Size nSize );
-
- void ClearError();
- void ClearBuffer();
-
- // encrypt and write in blocks
- sal_Size CryptAndWriteBuffer( const void* pStart, sal_Size nLen );
- sal_Bool EncryptBuffer( void* pStart, sal_Size nLen );
-
- void SyncSvStream( sal_Size nNewStreamPos ); ///< SvStream <- Medium
- void SyncSysStream(); ///< SvStream -> Medium
-
-public:
- SvStream();
- SvStream( SvLockBytes *pLockBytes);
- virtual ~SvStream();
-
- SvLockBytes* GetLockBytes() const { return xLockBytes; }
-
- sal_uInt32 GetError() const { return ERRCODE_TOERROR(nError); }
- sal_uInt32 GetErrorCode() const { return nError; }
-
- void SetError( sal_uInt32 nErrorCode );
- virtual void ResetError();
-
- void SetNumberFormatInt( sal_uInt16 nNewFormat );
- sal_uInt16 GetNumberFormatInt() const { return nNumberFormatInt; }
- /// Enable/disable swapping of endians, may be needed for Unicode import/export
- inline void SetEndianSwap( sal_Bool bVal );
- /// returns status of endian swap flag
- sal_Bool IsEndianSwap() const { return 0 != bSwap; }
-
- void SetCompressMode( sal_uInt16 nNewMode )
- { nCompressMode = nNewMode; }
- sal_uInt16 GetCompressMode() const { return nCompressMode; }
-
- void SetCryptMaskKey(const OString& rCryptMaskKey);
- const OString& GetCryptMaskKey() const { return m_aCryptMaskKey; }
-
- void SetStreamCharSet( CharSet eCharSet )
- { eStreamCharSet = eCharSet; }
- CharSet GetStreamCharSet() const { return eStreamCharSet; }
-
- void SetLineDelimiter( LineEnd eLineEnd )
- { eLineDelimiter = eLineEnd; }
- LineEnd GetLineDelimiter() const { return eLineDelimiter; }
-
- SvStream& operator>>( sal_uInt16& rUInt16 );
- SvStream& operator>>( sal_uInt32& rUInt32 );
- SvStream& operator>>( sal_uInt64& rUInt64 );
- SvStream& operator>>( sal_Int16& rInt16 );
- SvStream& operator>>( sal_Int32& rInt32 );
- SvStream& operator>>( sal_Int64& rInt64 );
-
- SvStream& operator>>( signed char& rChar );
- SvStream& operator>>( char& rChar );
- SvStream& operator>>( unsigned char& rChar );
- SvStream& operator>>( float& rFloat );
- SvStream& operator>>( double& rDouble );
- SvStream& operator>>( SvStream& rStream );
-
- SvStream& operator<<( sal_uInt16 nUInt16 );
- SvStream& operator<<( sal_uInt32 nUInt32 );
- SvStream& operator<<( sal_uInt64 nuInt64 );
- SvStream& operator<<( sal_Int16 nInt16 );
- SvStream& operator<<( sal_Int32 nInt32 );
- SvStream& operator<<( sal_Int64 nInt64 );
-
- SvStream& operator<<( bool b )
- { return operator<<(static_cast< sal_Bool >(b)); }
- SvStream& operator<<( signed char nChar );
- SvStream& operator<<( char nChar );
- SvStream& operator<<( unsigned char nChar );
- SvStream& operator<<( float nFloat );
- SvStream& operator<<( const double& rDouble );
- SvStream& operator<<( const char* pBuf );
- SvStream& operator<<( const unsigned char* pBuf );
- SvStream& operator<<( SvStream& rStream );
-
- SvStream& WriteNumber( sal_uInt32 nUInt32 );
- SvStream& WriteNumber( sal_Int32 nInt32 );
-
- sal_Size Read( void* pData, sal_Size nSize );
- sal_Size Write( const void* pData, sal_Size nSize );
- sal_Size Seek( sal_Size nPos );
- sal_Size SeekRel( sal_sSize nPos );
- sal_Size Tell() const { return nBufFilePos+nBufActualPos; }
- // length between current (Tell()) pos and end of stream
- virtual sal_Size remainingSize();
- void Flush();
- sal_Bool IsEof() const { return bIsEof; }
- // next Tell() <= nSize
- sal_Bool SetStreamSize( sal_Size nSize );
-
- /** Read a line of bytes.
-
- @param nMaxBytesToRead
- Maximum of bytes to read, if line is longer it will be
- truncated.
-
- @note NOTE that the default is one character less than STRING_MAXLEN to
- prevent problems after conversion to String that may be lurking
- in various places doing something like
- @code
- for (sal_uInt16 i=0; i < aString.Len(); ++i)
- @endcode
- causing endless loops ...
- */
- sal_Bool ReadLine( OString& rStr, sal_Int32 nMaxBytesToRead = 0xFFFE );
- sal_Bool WriteLine( const OString& rStr );
-
- /** Read a line of bytes.
-
- @param nMaxBytesToRead
- Maximum of bytes to read, if line is longer it will be
- truncated.
-
- @note NOTE that the default is one character less than STRING_MAXLEN to
- prevent problems after conversion to String that may be lurking
- in various places doing something like
- @code
- for (sal_uInt16 i=0; i < aString.Len(); ++i)
- @endcode
- causing endless loops ...
- */
- sal_Bool ReadByteStringLine( OUString& rStr, rtl_TextEncoding eSrcCharSet,
- sal_Int32 nMaxBytesToRead = 0xFFFE );
- sal_Bool ReadByteStringLine( String& rStr, rtl_TextEncoding eSrcCharSet );
- sal_Bool WriteByteStringLine( const String& rStr, rtl_TextEncoding eDestCharSet );
-
- /// Switch to no endian swapping and write 0xfeff
- sal_Bool StartWritingUnicodeText();
-
- /** If eReadBomCharSet==RTL_TEXTENCODING_DONTKNOW: read 16bit, if 0xfeff do
- nothing (UTF-16), if 0xfffe switch endian swapping (UTF-16), if 0xefbb
- or 0xbbef read another byte and check for UTF-8. If no UTF-* BOM was
- detected put all read bytes back. This means that if 2 bytes were read
- it was an UTF-16 BOM, if 3 bytes were read it was an UTF-8 BOM. There
- is no UTF-7, UTF-32 or UTF-EBCDIC BOM detection!
-
- If eReadBomCharSet!=RTL_TEXTENCODING_DONTKNOW: only read a BOM of that
- encoding and switch endian swapping if UTF-16 and 0xfffe. */
- sal_Bool StartReadingUnicodeText( rtl_TextEncoding eReadBomCharSet );
-
- /** Read a line of Unicode.
-
- @param nMaxCodepointsToRead
- Maximum of codepoints (UCS-2 or UTF-16 pairs, not bytes) to
- read, if line is longer it will be truncated.
-
- @note NOTE that the default is one character less than STRING_MAXLEN to
- prevent problems after conversion to String that may be lurking in
- various places doing something like
- @code
- for (sal_uInt16 i=0; i < aString.Len(); ++i)
- @endcode
- causing endless loops ...
- */
- sal_Bool ReadUniStringLine( OUString& rStr, sal_Int32 nMaxCodepointsToRead = 0xFFFE );
- /** Read a 32bit length prefixed sequence of utf-16 if
- eSrcCharSet==RTL_TEXTENCODING_UNICODE, otherwise read a 16bit length
- prefixed sequence of bytes and convert from eSrcCharSet */
- OUString ReadUniOrByteString(rtl_TextEncoding eSrcCharSet);
- /** Write a 32bit length prefixed sequence of utf-16 if
- eSrcCharSet==RTL_TEXTENCODING_UNICODE, otherwise convert to eSrcCharSet
- and write a 16bit length prefixed sequence of bytes */
- SvStream& WriteUniOrByteString( const OUString& rStr, rtl_TextEncoding eDestCharSet );
-
- /** Read a line of Unicode if eSrcCharSet==RTL_TEXTENCODING_UNICODE,
- otherwise read a line of Bytecode and convert from eSrcCharSet
-
- @param nMaxCodepointsToRead
- Maximum of codepoints (2 bytes if Unicode, bytes if not
- Unicode) to read, if line is longer it will be truncated.
-
- @note NOTE that the default is one character less than STRING_MAXLEN to
- prevent problems after conversion to String that may be lurking in
- various places doing something like
- @code
- for (sal_uInt16 i=0; i < aString.Len(); ++i)
- @endcode
- causing endless loops ...
- */
- sal_Bool ReadUniOrByteStringLine( OUString& rStr, rtl_TextEncoding eSrcCharSet,
- sal_Int32 nMaxCodepointsToRead = 0xFFFE );
- /** Write a sequence of Unicode characters if
- eDestCharSet==RTL_TEXTENCODING_UNICODE, otherwise write a sequence of
- Bytecodes converted to eDestCharSet */
- sal_Bool WriteUnicodeOrByteText( const String& rStr, rtl_TextEncoding eDestCharSet );
- sal_Bool WriteUnicodeOrByteText( const String& rStr )
- { return WriteUnicodeOrByteText( rStr, GetStreamCharSet() ); }
-
- /** Write a Unicode character if eDestCharSet==RTL_TEXTENCODING_UNICODE,
- otherwise write as Bytecode converted to eDestCharSet.
-
- This may result in more than one byte being written if a multi byte
- encoding (e.g. UTF7, UTF8) is chosen. */
- sal_Bool WriteUniOrByteChar( sal_Unicode ch, rtl_TextEncoding eDestCharSet );
- sal_Bool WriteUniOrByteChar( sal_Unicode ch )
- { return WriteUniOrByteChar( ch, GetStreamCharSet() ); }
-
- void SetBufferSize( sal_uInt16 nBufSize );
- sal_uInt16 GetBufferSize() const { return nBufSize; }
-
- void RefreshBuffer();
- SvStream& PutBack( char aCh );
-
- sal_Bool IsWritable() const { return bIsWritable; }
- StreamMode GetStreamMode() const { return eStreamMode; }
- virtual sal_uInt16 IsA() const;
-
- long GetVersion() { return nVersion; }
- void SetVersion( long n ) { nVersion = n; }
-
- friend SvStream& operator<<( SvStream& rStr, SvStrPtr f ); // for Manips
-
- /// end of input seen during previous i/o operation
- bool eof() const { return bIsEof; }
-
- /// stream is broken
- bool bad() const { return GetError() != 0; }
-
- /** Get state
-
- If the state is good() the previous i/o operation succeeded.
-
- If the state is good(), the next input operation might succeed;
- otherwise, it will fail.
-
- Applying an input operation to a stream that is not in the good() state
- is a null operation as far as the variable being read into is concerned.
-
- If we try to read into a variable v and the operation fails, the value
- of v should be unchanged,
- */
- bool good() const { return !(eof() || bad()); }
-};
-
-inline SvStream& operator<<( SvStream& rStr, SvStrPtr f )
-{
- (*f)(rStr);
- return rStr;
-}
-
-inline void SvStream::SetEndianSwap( sal_Bool bVal )
-{
-#ifdef OSL_BIGENDIAN
- SetNumberFormatInt( bVal ? NUMBERFORMAT_INT_LITTLEENDIAN : NUMBERFORMAT_INT_BIGENDIAN );
-#else
- SetNumberFormatInt( bVal ? NUMBERFORMAT_INT_BIGENDIAN : NUMBERFORMAT_INT_LITTLEENDIAN );
-#endif
-}
-
-TOOLS_DLLPUBLIC SvStream& endl( SvStream& rStr );
-/// same as endl() but Unicode
-TOOLS_DLLPUBLIC SvStream& endlu( SvStream& rStr );
-/// call endlu() if eStreamCharSet==RTL_TEXTECODING_UNICODE otherwise endl()
-TOOLS_DLLPUBLIC SvStream& endlub( SvStream& rStr );
-
-/// Attempt to read nUnits 8bit units to an OString, returned OString's
-/// length is number of units successfully read
-TOOLS_DLLPUBLIC OString read_uInt8s_ToOString(SvStream& rStrm,
- sal_Size nUnits);
-
-/// Attempt to read nUnits 8bit units to an OUString
-TOOLS_DLLPUBLIC inline OUString read_uInt8s_ToOUString(SvStream& rStrm,
- sal_Size nUnits, rtl_TextEncoding eEnc)
-{
- return OStringToOUString(read_uInt8s_ToOString(rStrm, nUnits), eEnc);
-}
-
-/// Attempt to read nUnits 16bit units to an OUString, returned
-/// OUString's length is number of units successfully read
-TOOLS_DLLPUBLIC OUString read_uInt16s_ToOUString(SvStream& rStrm,
- sal_Size nUnits);
-
-/// Attempt to read a pascal-style length (of type prefix) prefixed sequence of
-/// 16bit units to an OUString, returned OString's length is number of
-/// units successfully read.
-template<typename prefix>
-OUString read_lenPrefixed_uInt16s_ToOUString(SvStream& rStrm)
-{
- prefix nUnits = 0;
- rStrm >> nUnits;
- return read_uInt16s_ToOUString(rStrm, nUnits);
-}
-
-/// Attempt to write a prefixed sequence of nUnits 16bit units from an OUString,
-/// returned value is number of bytes written
-TOOLS_DLLPUBLIC sal_Size write_uInt16s_FromOUString(SvStream& rStrm,
- const OUString& rStr, sal_Size nUnits);
-
-TOOLS_DLLPUBLIC inline sal_Size write_uInt16s_FromOUString(SvStream& rStrm,
- const OUString& rStr)
-{
- return write_uInt16s_FromOUString(rStrm, rStr, rStr.getLength());
-}
-
-namespace streamdetail
-{
- /// Attempt to write a pascal-style length (of type prefix) prefixed
- /// sequence of units from a string-type, returned value is number of bytes
- /// written (including byte-count of prefix)
- template<typename prefix, typename S, sal_Size (*writeOper)(SvStream&, const S&, sal_Size)>
- sal_Size write_lenPrefixed_seq_From_str(SvStream& rStrm, const S &rStr)
- {
- sal_Size nWritten = 0;
- prefix nUnits = std::min<sal_Size>(rStr.getLength(), std::numeric_limits<prefix>::max());
- SAL_WARN_IF(static_cast<sal_Size>(nUnits) != static_cast<sal_Size>(rStr.getLength()),
- "tools.stream",
- "string too long for prefix count to fit in output type");
- rStrm << nUnits;
- if (rStrm.good())
- {
- nWritten += sizeof(prefix);
- nWritten += writeOper(rStrm, rStr, nUnits);
- }
- return nWritten;
- }
-}
-
-/// Attempt to write a pascal-style length (of type prefix) prefixed sequence
-/// of 16bit units from an OUString, returned value is number of bytes written
-/// (including byte-count of prefix)
-template<typename prefix> sal_Size write_lenPrefixed_uInt16s_FromOUString(SvStream& rStrm,
- const OUString &rStr)
-{
- return streamdetail::write_lenPrefixed_seq_From_str<prefix, OUString, write_uInt16s_FromOUString>(rStrm, rStr);
-}
-
-/// Attempt to read 8bit units to an OString until a zero terminator is
-/// encountered, returned OString's length is number of units *definitely*
-/// successfully read, check SvStream::good() to see if null terminator was
-/// successfully read
-TOOLS_DLLPUBLIC OString read_zeroTerminated_uInt8s_ToOString(SvStream& rStrm);
-
-/// Attempt to read 8bit units assuming source encoding eEnc to an OUString
-/// until a zero terminator is encountered. Check SvStream::good() to see if
-/// null terminator was successfully read
-TOOLS_DLLPUBLIC OUString read_zeroTerminated_uInt8s_ToOUString(SvStream& rStrm, rtl_TextEncoding eEnc);
-
-/// Attempt to read a pascal-style length (of type prefix) prefixed sequence of
-/// 8bit units to an OString, returned OString's length is number of units
-/// successfully read.
-template<typename prefix>
-OString read_lenPrefixed_uInt8s_ToOString(SvStream& rStrm)
-{
- prefix nUnits = 0;
- rStrm >> nUnits;
- return read_uInt8s_ToOString(rStrm, nUnits);
-}
-
-/// Attempt to read a pascal-style length (of type prefix) prefixed sequence of
-/// 8bit units to an OUString
-template<typename prefix>
-OUString read_lenPrefixed_uInt8s_ToOUString(SvStream& rStrm,
- rtl_TextEncoding eEnc)
-{
- return OStringToOUString(read_lenPrefixed_uInt8s_ToOString<prefix>(rStrm), eEnc);
-}
-
-/// Attempt to write a prefixed sequence of nUnits 8bit units from an OString,
-/// returned value is number of bytes written
-TOOLS_DLLPUBLIC inline sal_Size write_uInt8s_FromOString(SvStream& rStrm, const OString& rStr,
- sal_Size nUnits)
-{
- return rStrm.Write(rStr.getStr(), nUnits);
-}
-
-TOOLS_DLLPUBLIC inline sal_Size write_uInt8s_FromOString(SvStream& rStrm, const OString& rStr)
-{
- return write_uInt8s_FromOString(rStrm, rStr, rStr.getLength());
-}
-
-/// Attempt to write a pascal-style length (of type prefix) prefixed sequence
-/// of 8bit units from an OString, returned value is number of bytes written
-/// (including byte-count of prefix)
-template<typename prefix> sal_Size write_lenPrefixed_uInt8s_FromOString(SvStream& rStrm,
- const OString &rStr)
-{
- return streamdetail::write_lenPrefixed_seq_From_str<prefix, OString, write_uInt8s_FromOString>(rStrm, rStr);
-}
-
-/// Attempt to write a pascal-style length (of type prefix) prefixed sequence
-/// of 8bit units from an OUString, returned value is number of bytes written
-/// (including byte-count of prefix)
-template<typename prefix> sal_Size write_lenPrefixed_uInt8s_FromOUString(SvStream& rStrm,
- const OUString &rStr, rtl_TextEncoding eEnc)
-{
- return write_lenPrefixed_uInt8s_FromOString<prefix>(rStrm, OUStringToOString(rStr, eEnc));
-}
-
-// FileStream
-
-class TOOLS_DLLPUBLIC SvFileStream : public SvStream
-{
-private:
- StreamData* pInstanceData;
- String aFilename;
- sal_uInt16 nLockCounter;
- sal_Bool bIsOpen;
-#ifdef UNX
- sal_uInt32 GetFileHandle() const;
-#endif
- // Forbidden and not implemented.
- SvFileStream (const SvFileStream&);
- SvFileStream & operator= (const SvFileStream&);
-
- sal_Bool LockRange( sal_Size nByteOffset, sal_Size nBytes );
- sal_Bool UnlockRange( sal_Size nByteOffset, sal_Size nBytes );
- sal_Bool LockFile();
- sal_Bool UnlockFile();
-
-protected:
- virtual sal_Size GetData( void* pData, sal_Size nSize );
- virtual sal_Size PutData( const void* pData, sal_Size nSize );
- virtual sal_Size SeekPos( sal_Size nPos );
- virtual void SetSize( sal_Size nSize );
- virtual void FlushData();
-
-public:
- // Switches to Read StreamMode on failed attempt of Write opening
- SvFileStream( const String& rFileName, StreamMode eOpenMode );
- SvFileStream();
- ~SvFileStream();
-
- virtual void ResetError();
-
- void Open( const String& rFileName, StreamMode eOpenMode );
- void Close();
- sal_Bool IsOpen() const { return bIsOpen; }
- sal_Bool IsLocked() const { return ( nLockCounter!=0 ); }
- virtual sal_uInt16 IsA() const;
-
- const String& GetFileName() const { return aFilename; }
-};
-
-// MemoryStream
-
-class TOOLS_DLLPUBLIC SvMemoryStream : public SvStream
-{
- // Forbidden and not implemented.
- SvMemoryStream (const SvMemoryStream&);
- SvMemoryStream & operator= (const SvMemoryStream&);
-
- friend class SvCacheStream;
- sal_Size GetSize() const { return nSize; }
-
-protected:
- sal_Size nSize;
- sal_Size nResize;
- sal_Size nPos;
- sal_Size nEndOfData;
- sal_uInt8* pBuf;
- sal_Bool bOwnsData;
-
- virtual sal_Size GetData( void* pData, sal_Size nSize );
- virtual sal_Size PutData( const void* pData, sal_Size nSize );
- virtual sal_Size SeekPos( sal_Size nPos );
- virtual void SetSize( sal_Size nSize );
- virtual void FlushData();
-
- /// AllocateMemory must update pBuf accordingly
- /// - pBuf: Address of new block
- virtual sal_Bool AllocateMemory( sal_Size nSize );
-
- /// ReAllocateMemory must update the following variables:
- /// - pBuf: Address of new block
- /// - nEndOfData: Set to nNewSize-1L , if outside of block
- /// Set to 0 , if new block size is 0 bytes
- /// - nSize: New block size
- /// - nPos: Set to 0 if position outside of block
- virtual sal_Bool ReAllocateMemory( long nDiff );
-
- /// Is called when this stream allocated the buffer or the buffer is
- /// resized. FreeMemory may need to NULLify handles in derived classes.
- virtual void FreeMemory();
-
- SvMemoryStream(void*) { } // for sub-classes
-
-public:
- SvMemoryStream( void* pBuf, sal_Size nSize, StreamMode eMode);
- SvMemoryStream( sal_Size nInitSize=512, sal_Size nResize=64 );
- ~SvMemoryStream();
-
- virtual void ResetError();
-
- sal_Size GetEndOfData() const { return nEndOfData; }
- const void* GetData() { Flush(); return pBuf; }
- operator const void*() { Flush(); return pBuf; }
- virtual sal_uInt16 IsA() const;
-
- void* SwitchBuffer( sal_Size nInitSize=512, sal_Size nResize=64 );
- void* SetBuffer( void* pBuf, sal_Size nSize,
- sal_Bool bOwnsData=sal_True, sal_Size nEOF=0 );
-
- void ObjectOwnsMemory( sal_Bool bOwn ) { bOwnsData = bOwn; }
- sal_Bool IsObjectMemoryOwner() { return bOwnsData; }
- void SetResizeOffset( sal_Size nNewResize ) { nResize = nNewResize; }
- sal_Size GetResizeOffset() const { return nResize; }
- virtual sal_Size remainingSize() { return GetSize() - Tell(); }
-};
-
-/** Data Copy Stream
-
- This class is the foundation for all classes, using SvData
- (SO2\DTRANS.HXX/CXX) for transportation (e.g., graphics).
-*/
-class TOOLS_DLLPUBLIC SvDataCopyStream
-{
-public:
- // repeated execution of Load or Assign is allowed
- TYPEINFO();
- virtual ~SvDataCopyStream(){}
- virtual void Load( SvStream & ) = 0;
- virtual void Save( SvStream & ) = 0;
- virtual void Assign( const SvDataCopyStream & );
-};
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */