89 lines
2.0 KiB
C++
89 lines
2.0 KiB
C++
#pragma once
|
|
|
|
#include "IFileSystem.h"
|
|
#include "XOREn.h"
|
|
|
|
class KEncodedFile : public KStream
|
|
{
|
|
public:
|
|
|
|
KEncodedFile( KStream *pFile ) : m_pFile( pFile )
|
|
{
|
|
// 2010.04.29 - prodongi
|
|
setClassId("KEncodedFile");
|
|
}
|
|
|
|
~KEncodedFile()
|
|
{
|
|
delete m_pFile;
|
|
}
|
|
|
|
virtual size_t Read( void *pBuf, size_t read_size )
|
|
{
|
|
size_t offset = m_pFile->Tell();
|
|
size_t len = m_pFile->Read( pBuf, read_size );
|
|
|
|
char* p0 = reinterpret_cast< char* >( pBuf );
|
|
char* p3 = p0 + len;
|
|
char* p1 = p0 + (sizeof(int) - offset % sizeof(int)) % sizeof(int);
|
|
char* p2 = p3 - (offset + len) % sizeof(int);
|
|
|
|
if ( p1 > p3 )
|
|
p1 = p2 = p3;
|
|
|
|
for (; p0 < p1; p0++, offset++ )
|
|
*p0 ^= XOREn::GetEncodeKeyChar( offset );
|
|
|
|
for (; p1 < p2; p1 += sizeof(int), offset += sizeof(int) )
|
|
*reinterpret_cast<int*>(p1) ^= XOREn::GetEncodeKeyInt( offset );
|
|
|
|
for (; p2 < p3; p2++, offset++ )
|
|
*p2 ^= XOREn::GetEncodeKeyChar( offset );
|
|
|
|
return len;
|
|
}
|
|
|
|
virtual size_t Write( const void *pBuf, size_t write_size )
|
|
{
|
|
const int BUF_SIZE = 32768;
|
|
char buf[ BUF_SIZE ];
|
|
|
|
size_t offset = m_pFile->Tell();
|
|
|
|
const char* p = reinterpret_cast< const char* >( pBuf );
|
|
|
|
size_t sum_wlen = 0;
|
|
while ( write_size > 0 )
|
|
{
|
|
size_t len = BUF_SIZE < write_size ? BUF_SIZE : write_size;
|
|
for ( size_t i = 0; i < len; i++, p++ )
|
|
buf[i] = *p ^ XOREn::GetEncodeKeyChar( offset+i );
|
|
|
|
size_t wlen = m_pFile->Write( buf, len );
|
|
if ( wlen == 0 )
|
|
break;
|
|
|
|
sum_wlen += wlen;
|
|
write_size -= len;
|
|
offset += len;
|
|
}
|
|
|
|
return sum_wlen;
|
|
}
|
|
|
|
virtual size_t Seek( long offset, enum_seek_origin origin ) { return m_pFile->Seek( offset, origin ); }
|
|
virtual size_t Tell() const { return m_pFile->Tell(); }
|
|
virtual size_t GetLength() const { return m_pFile->GetLength(); }
|
|
virtual bool Eos() const { return m_pFile->Eos(); }
|
|
virtual bool IsValid() const { return m_pFile->IsValid(); }
|
|
|
|
// 2010.04.29 - prodongi
|
|
virtual size_t getOriginalSize() const
|
|
{
|
|
return m_pFile->getOriginalSize(Size());
|
|
}
|
|
|
|
private:
|
|
|
|
KStream *m_pFile;
|
|
}; |