286 lines
5.7 KiB
C++
286 lines
5.7 KiB
C++
#pragma once
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
class CStream
|
|
{
|
|
public:
|
|
CStream() {}
|
|
virtual ~CStream() {}
|
|
|
|
protected:
|
|
|
|
public:
|
|
virtual bool IsEnd() const = 0;
|
|
virtual long Tell() = 0;
|
|
virtual int Size() const = 0;
|
|
virtual bool IsValid() const = 0;
|
|
virtual void Close() {};
|
|
virtual void Activate() {}
|
|
|
|
virtual int Seek( long lOffset, int nOrigin ) = 0;
|
|
virtual int Read( void *pBuffer, int nSize ) = 0;
|
|
virtual int Write( const void *pBuffer, int nSize ) = 0;
|
|
virtual const char *GetName() { return NULL; }
|
|
|
|
public:
|
|
template<class TYPE> void operator << ( TYPE Value );
|
|
|
|
void operator << ( const std::string &str );
|
|
void operator << ( const std::wstring &str );
|
|
|
|
template<class TYPE> void operator << ( const std::vector<TYPE> &vecVALUE );
|
|
void operator << ( const std::vector<std::string> &vecVALUE );
|
|
void operator << ( const std::vector<std::wstring> &vecVALUE );
|
|
|
|
void WriteBuffer ( const void* pBuffer, int Size );
|
|
|
|
public:
|
|
template<class TYPE> void operator >> ( TYPE &Value );
|
|
|
|
void operator >> ( std::string &str );
|
|
void operator >> ( std::wstring &str );
|
|
|
|
template<class TYPE> void operator >> ( std::vector<TYPE> &vecVALUE );
|
|
void operator >> ( std::vector<std::string> &vecVALUE );
|
|
void operator >> ( std::vector<std::wstring> &vecVALUE );
|
|
|
|
void ReadBuffer ( void* pBuffer, int Size );
|
|
|
|
public:
|
|
template<class TYPE> int SeekCur();
|
|
template<class TYPE> int SeekCur_String();
|
|
template<class TYPE> int SeekCur_Vec();
|
|
template<class TYPE> int SeekCur_VecString();
|
|
};
|
|
|
|
template<class TYPE>
|
|
void CStream::operator << ( TYPE Value )
|
|
{
|
|
Write ( &Value, sizeof(Value) );
|
|
}
|
|
|
|
template<class TYPE>
|
|
void CStream::operator >> ( TYPE &Value )
|
|
{
|
|
Read ( &Value, sizeof(Value) );
|
|
}
|
|
|
|
template<class TYPE>
|
|
void CStream::operator << ( const std::vector<TYPE> &vecVALUE )
|
|
{
|
|
DWORD dwVecSize = (DWORD)vecVALUE.size();
|
|
*this << ( dwVecSize );
|
|
|
|
if( !vecVALUE.empty() )
|
|
{
|
|
WriteBuffer( &(vecVALUE[0]), DWORD(sizeof(TYPE)*vecVALUE.size()) );
|
|
}
|
|
}
|
|
|
|
template<class TYPE>
|
|
void CStream::operator >> ( std::vector<TYPE> &vecVALUE )
|
|
{
|
|
DWORD dwSize(0);
|
|
*this >> ( dwSize );
|
|
|
|
if( dwSize > 0 )
|
|
{
|
|
vecVALUE.clear();
|
|
vecVALUE.reserve(dwSize);
|
|
|
|
TYPE tVALUE;
|
|
|
|
for ( DWORD i=0; i<dwSize; ++i )
|
|
{
|
|
ReadBuffer( &tVALUE, DWORD(sizeof(TYPE)) );
|
|
vecVALUE.push_back( tVALUE );
|
|
}
|
|
}
|
|
}
|
|
|
|
template<class TYPE>
|
|
int CStream::SeekCur()
|
|
{
|
|
return Seek( sizeof(TYPE), SEEK_CUR );
|
|
}
|
|
|
|
template<class TYPE>
|
|
int CStream::SeekCur_String()
|
|
{
|
|
DWORD dwSize;
|
|
*this >> dwSize;
|
|
|
|
if( dwSize > 0 )
|
|
{
|
|
Seek( sizeof(TYPE)*dwSize, SEEK_CUR );
|
|
}
|
|
|
|
return (int)dwSize;
|
|
}
|
|
|
|
template<class TYPE>
|
|
int CStream::SeekCur_Vec()
|
|
{
|
|
DWORD dwSize(0);
|
|
*this >> ( dwSize );
|
|
|
|
if( dwSize > 0 )
|
|
{
|
|
Seek( sizeof(TYPE)*dwSize, SEEK_CUR );
|
|
}
|
|
|
|
return (int)dwSize;
|
|
}
|
|
|
|
template<class TYPE>
|
|
int CStream::SeekCur_VecString()
|
|
{
|
|
DWORD dwSize(0);
|
|
*this >> ( dwSize );
|
|
|
|
if( dwSize > 0 )
|
|
{
|
|
for ( DWORD i=0; i<dwSize; ++i )
|
|
{
|
|
SeekCur_String<TYPE>();
|
|
}
|
|
}
|
|
|
|
return (int)dwSize;
|
|
}
|
|
|
|
class CMemoryStream;
|
|
class CFileStream : public CStream
|
|
{
|
|
public:
|
|
CFileStream();
|
|
CFileStream( const char *pFileName, int nMode = OPEN_READ );
|
|
virtual ~CFileStream();
|
|
enum
|
|
{
|
|
OPEN_READ,
|
|
OPEN_WRITE,
|
|
OPEN_READ_WRITE
|
|
};
|
|
|
|
protected:
|
|
FILE *m_pStream;
|
|
std::string m_szFileName;
|
|
int m_nMode;
|
|
|
|
public:
|
|
virtual void Activate();
|
|
|
|
void SetFileName( const char *pFileName ) { m_szFileName = pFileName; }
|
|
const char *GetFileName() { return m_szFileName.c_str(); }
|
|
|
|
const char *GetName() { return GetFileName(); }
|
|
|
|
bool Open( const char *pFileName, int nMode = OPEN_READ );
|
|
void Close();
|
|
bool IsEnd() const;
|
|
long Tell() ;
|
|
int Size() const;
|
|
bool IsValid() const;
|
|
|
|
int Seek( long lOffset, int nOrigin );
|
|
int Read( void *pBuffer, int nSize );
|
|
int Write( const void *pBuffer, int nSize );
|
|
};
|
|
|
|
class CMemoryStream : public CStream
|
|
{
|
|
public:
|
|
CMemoryStream();
|
|
CMemoryStream( void *pBuffer, int nSize );
|
|
virtual ~CMemoryStream() {}
|
|
void Initialize( void *pBuffer, int nSize );
|
|
|
|
protected:
|
|
char *m_pBuffer;
|
|
int m_nSize;
|
|
int m_nCurrent;
|
|
std::string m_szName;
|
|
|
|
public:
|
|
bool IsEnd() const;
|
|
long Tell();
|
|
virtual int Size() const;
|
|
bool IsValid() const;
|
|
|
|
virtual int Seek( long lOffset, int nOrigin );
|
|
virtual int Read( void *pBuffer, int nSize );
|
|
virtual int Write( const void *pBuffer, int nSize );
|
|
|
|
char *GetBuffer() { return m_pBuffer; }
|
|
|
|
const char *GetName() { return m_szName.c_str(); }
|
|
void SetName( const char *szName ) { m_szName = szName; }
|
|
};
|
|
|
|
class CPacketCompressStream : public CMemoryStream
|
|
{
|
|
public:
|
|
CPacketCompressStream();
|
|
CPacketCompressStream( void *pBuffer, int nSize );
|
|
virtual ~CPacketCompressStream() {}
|
|
|
|
enum CompressTypeEnum {
|
|
NOCOMPRESS,
|
|
INTEGER_SHORT,
|
|
INTEGER_CHAR,
|
|
DWORD_SHORT,
|
|
DWORD_CHAR,
|
|
FLOAT_SHORT,
|
|
VECTOR2_SHORT,
|
|
VECTOR3_SHORT,
|
|
VECTOR2_BIT,
|
|
VECTOR3_BIT,
|
|
};
|
|
|
|
protected:
|
|
int m_nValidBufferSize;
|
|
int m_nValidBitCurrent;
|
|
int m_nValueCount;
|
|
|
|
|
|
public:
|
|
virtual int Size() const;
|
|
|
|
virtual int Read( void *pBuffer, int nSize );
|
|
virtual int Write( const void *pBuffer, int nSize );
|
|
|
|
int Seek( long lOffset, int nOrigin, CompressTypeEnum Type );
|
|
int Read( void *pBuffer, int nSize, CompressTypeEnum Type, float fValue = 0.f );
|
|
int Write( const void *pBuffer, int nSize, CompressTypeEnum Type, float fValue = 0.f );
|
|
};
|
|
|
|
class CByteStream : public CStream
|
|
{
|
|
public:
|
|
typedef std::vector<char> VEC_CHAR;
|
|
typedef VEC_CHAR::iterator VEC_CHAR_IT;
|
|
|
|
public:
|
|
CByteStream();
|
|
CByteStream( void *pBuff, int nSize );
|
|
virtual ~CByteStream(){}
|
|
|
|
protected:
|
|
VEC_CHAR m_Buffer;
|
|
int m_nCurrent;
|
|
|
|
public:
|
|
bool IsEnd() const;
|
|
long Tell();
|
|
int Size() const;
|
|
bool IsValid() const;
|
|
|
|
int Seek( long lOffset, int nOrigin );
|
|
int Read( void *pBuffer, int nSize );
|
|
int Write( const void *pBuffer, int nSize );
|
|
|
|
char* GetBuffer() { return &m_Buffer[0]; }
|
|
};
|