mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 13:03:11 +08:00
209 lines
4.9 KiB
C++
209 lines
4.9 KiB
C++
#pragma once
|
|
|
|
#include "OpenOfficeBasic.h"
|
|
#include "tools/errcode.hxx"
|
|
#include "rtl/textenc.h"
|
|
|
|
#include "ASCBasic.h"
|
|
|
|
|
|
|
|
|
|
namespace SVMCore{
|
|
|
|
//\tools\inc\tools\stream.hxx
|
|
// read, write, create,... options
|
|
#define STREAM_READ 0x0001 // allow read accesses
|
|
#define STREAM_WRITE 0x0002 // allow write accesses
|
|
|
|
#define COMPRESSMODE_FULL (sal_uInt16)0xFFFF
|
|
#define COMPRESSMODE_NONE (sal_uInt16)0x0000
|
|
#define COMPRESSMODE_ZBITMAP (sal_uInt16)0x0001
|
|
#define COMPRESSMODE_NATIVE (sal_uInt16)0x0010
|
|
|
|
#define NUMBERFORMAT_INT_BIGENDIAN (sal_uInt16)0x0000
|
|
#define NUMBERFORMAT_INT_LITTLEENDIAN (sal_uInt16)0xFFFF
|
|
|
|
#define STREAM_SEEK_TO_BEGIN 0L
|
|
#define STREAM_SEEK_TO_END ULONG_MAX
|
|
|
|
class SvStream
|
|
{
|
|
private: sal_uInt16 m_nCompressionMode;
|
|
private: sal_uInt32 nError;
|
|
private: rtl_TextEncoding eStreamCharSet;
|
|
|
|
|
|
public: virtual bool Open( std::wstring sFilename ) = 0;
|
|
public: virtual int Read( void* pData, int nSize ) = 0;
|
|
public: virtual sal_Size Seek( sal_Size nFilePos ) = 0;
|
|
public: virtual sal_Size Tell() = 0;
|
|
public: virtual SvStream* CreateInstance() = 0;
|
|
public: virtual void SetBuffer( char* pcBuffer, sal_uInt32 nSize ) = 0;
|
|
public: virtual bool IsEof() = 0;
|
|
public: SvStream()
|
|
{
|
|
nError = SVSTREAM_OK;
|
|
m_nCompressionMode = COMPRESSMODE_NONE;
|
|
eStreamCharSet = RTL_TEXTENCODING_DONTKNOW;
|
|
}
|
|
public: virtual ~SvStream(){}
|
|
public:SvStream& operator >> ( long& r )
|
|
{
|
|
Read( &r, sizeof( long ) );
|
|
return *this;
|
|
}
|
|
|
|
public:SvStream& operator >> ( short& r )
|
|
{
|
|
Read( &r, sizeof( short ) );
|
|
return *this;
|
|
}
|
|
|
|
public:SvStream& operator >> ( int& r )
|
|
{
|
|
Read( &r, sizeof( int ) );
|
|
return *this;
|
|
}
|
|
|
|
public:SvStream& operator>>( signed char& r )
|
|
{
|
|
Read( &r, sizeof( signed char ) );
|
|
return *this;
|
|
}
|
|
public:SvStream& operator>>( char& r )
|
|
{
|
|
Read( &r, sizeof( char ) );
|
|
return *this;
|
|
}
|
|
|
|
public:SvStream& operator>>( unsigned char& r )
|
|
{
|
|
Read( &r, sizeof( unsigned char ) );
|
|
return *this;
|
|
}
|
|
public:SvStream& operator>>( unsigned short& r )
|
|
{
|
|
Read( &r, sizeof( unsigned short ) );
|
|
return *this;
|
|
}
|
|
public:SvStream& operator>>( unsigned long& r )
|
|
{
|
|
Read( &r, sizeof( unsigned long ) );
|
|
return *this;
|
|
}
|
|
public:SvStream& operator>>( float& r )
|
|
{
|
|
Read( &r, sizeof( float ) );
|
|
return *this;
|
|
}
|
|
|
|
public:SvStream& operator>>( double& r )
|
|
{
|
|
Read( &r, sizeof( double ) );
|
|
return *this;
|
|
}
|
|
public:SvStream& operator>>( wchar_t& r )
|
|
{
|
|
Read( &r, sizeof( wchar_t ) );
|
|
return *this;
|
|
}
|
|
public:SvStream& operator>>( ByteString& r )
|
|
{
|
|
ReadByteString( r );
|
|
return *this;
|
|
}
|
|
public:sal_uInt16 GetCompressMode()
|
|
{
|
|
return m_nCompressionMode;
|
|
}
|
|
public:void SetCompressMode( sal_uInt16 nCompMode )
|
|
{
|
|
m_nCompressionMode = nCompMode;
|
|
}
|
|
public: sal_uInt16 GetNumberFormatInt()
|
|
{
|
|
return NUMBERFORMAT_INT_LITTLEENDIAN;
|
|
}
|
|
// -----------------------------------------------------------------------
|
|
|
|
public: SvStream& ReadByteString( String& rStr, rtl_TextEncoding eSrcCharSet )
|
|
{
|
|
// read UTF-16 string directly from stream ?
|
|
if (eSrcCharSet == RTL_TEXTENCODING_UNICODE)
|
|
{
|
|
sal_uInt32 nLen;
|
|
operator>> (nLen);
|
|
if (nLen)
|
|
{
|
|
#ifdef AVS
|
|
if (nLen > STRING_MAXLEN) {
|
|
SetError(SVSTREAM_GENERALERROR);
|
|
return *this;
|
|
}
|
|
#endif
|
|
sal_Unicode *pStr = rStr.AllocBuffer(nLen);
|
|
//BOOST_STATIC_ASSERT(STRING_MAXLEN <= SAL_MAX_SIZE / 2);
|
|
Read( pStr, nLen << 1 );
|
|
#ifdef AVS
|
|
if (bSwap)
|
|
for (sal_Unicode *pEnd = pStr + nLen; pStr < pEnd; pStr++)
|
|
SwapUShort((sal_uInt16&)(*pStr));
|
|
#endif
|
|
}
|
|
else
|
|
rStr = String();
|
|
|
|
return *this;
|
|
}
|
|
ByteString oTempString;
|
|
ReadByteString( oTempString );
|
|
rStr = String( oTempString, eSrcCharSet );
|
|
return *this;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
public: SvStream& ReadByteString( ByteString& rStr )
|
|
{
|
|
sal_uInt16 nLen = 0;
|
|
operator>>( nLen );
|
|
if( nLen )
|
|
{
|
|
char* pTmp = rStr.AllocBuffer( nLen );
|
|
Read( pTmp, nLen );
|
|
}
|
|
else
|
|
rStr = ByteString("");
|
|
return *this;
|
|
}
|
|
public: sal_Size SeekRel( sal_sSize nPos )
|
|
{
|
|
sal_Size nActualPos = Tell();
|
|
|
|
if ( nPos >= 0 )
|
|
{
|
|
if ( SAL_MAX_SIZE - nActualPos > (sal_Size)nPos )
|
|
nActualPos += nPos;
|
|
}
|
|
else
|
|
{
|
|
sal_Size nAbsPos = (sal_Size)-nPos;
|
|
if ( nActualPos >= nAbsPos )
|
|
nActualPos -= nAbsPos;
|
|
}
|
|
return Seek( nActualPos );
|
|
}
|
|
|
|
public: void SetError( sal_uInt32 nErrorCode )
|
|
{
|
|
if ( nError == SVSTREAM_OK )
|
|
nError = nErrorCode;
|
|
}
|
|
|
|
public: sal_uInt32 GetError() const { return ERRCODE_TOERROR(nError); }
|
|
public: void ResetError() { nError = SVSTREAM_OK; }
|
|
public: rtl_TextEncoding GetStreamCharSet() const { return eStreamCharSet; }
|
|
};
|
|
|
|
}//SVMCore
|