chore: initial commit (extracted from Launchers monorepo)
Plugin: ns7zip v2.0.0 Architectures: x86-ansi, x86-unicode, amd64-unicode License: LGPL-2.1-or-later
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
// InBuffer.h
|
||||
|
||||
#ifndef ZIP7_INC_IN_BUFFER_H
|
||||
#define ZIP7_INC_IN_BUFFER_H
|
||||
|
||||
#include "../../Common/MyException.h"
|
||||
#include "../IStream.h"
|
||||
|
||||
#ifndef Z7_NO_EXCEPTIONS
|
||||
struct CInBufferException: public CSystemException
|
||||
{
|
||||
CInBufferException(HRESULT errorCode): CSystemException(errorCode) {}
|
||||
};
|
||||
#endif
|
||||
|
||||
class CInBufferBase
|
||||
{
|
||||
protected:
|
||||
Byte *_buf;
|
||||
Byte *_bufLim;
|
||||
Byte *_bufBase;
|
||||
|
||||
ISequentialInStream *_stream;
|
||||
UInt64 _processedSize;
|
||||
size_t _bufSize; // actually it's number of Bytes for next read. The buf can be larger
|
||||
// only up to 32-bits values now are supported!
|
||||
bool _wasFinished;
|
||||
|
||||
bool ReadBlock();
|
||||
bool ReadByte_FromNewBlock(Byte &b);
|
||||
Byte ReadByte_FromNewBlock();
|
||||
|
||||
public:
|
||||
#ifdef Z7_NO_EXCEPTIONS
|
||||
HRESULT ErrorCode;
|
||||
#endif
|
||||
UInt32 NumExtraBytes;
|
||||
|
||||
CInBufferBase() throw();
|
||||
|
||||
// the size of portion of data in real stream that was already read from this object
|
||||
// it doesn't include unused data in buffer
|
||||
// it doesn't include virtual Extra bytes after the end of real stream data
|
||||
UInt64 GetStreamSize() const { return _processedSize + (size_t)(_buf - _bufBase); }
|
||||
|
||||
// the size of virtual data that was read from this object
|
||||
// it doesn't include unused data in buffers
|
||||
// it includes any virtual Extra bytes after the end of real data
|
||||
UInt64 GetProcessedSize() const { return _processedSize + NumExtraBytes + (size_t)(_buf - _bufBase); }
|
||||
|
||||
bool WasFinished() const { return _wasFinished; }
|
||||
|
||||
void SetStream(ISequentialInStream *stream) { _stream = stream; }
|
||||
void ClearStreamPtr() { _stream = NULL; }
|
||||
|
||||
void SetBuf(Byte *buf, size_t bufSize, size_t end, size_t pos)
|
||||
{
|
||||
_bufBase = buf;
|
||||
_bufSize = bufSize;
|
||||
_processedSize = 0;
|
||||
_buf = buf + pos;
|
||||
_bufLim = buf + end;
|
||||
_wasFinished = false;
|
||||
#ifdef Z7_NO_EXCEPTIONS
|
||||
ErrorCode = S_OK;
|
||||
#endif
|
||||
NumExtraBytes = 0;
|
||||
}
|
||||
|
||||
void Init() throw();
|
||||
|
||||
Z7_FORCE_INLINE
|
||||
bool ReadByte(Byte &b)
|
||||
{
|
||||
if (_buf >= _bufLim)
|
||||
return ReadByte_FromNewBlock(b);
|
||||
b = *_buf++;
|
||||
return true;
|
||||
}
|
||||
|
||||
Z7_FORCE_INLINE
|
||||
bool ReadByte_FromBuf(Byte &b)
|
||||
{
|
||||
if (_buf >= _bufLim)
|
||||
return false;
|
||||
b = *_buf++;
|
||||
return true;
|
||||
}
|
||||
|
||||
Z7_FORCE_INLINE
|
||||
Byte ReadByte()
|
||||
{
|
||||
if (_buf >= _bufLim)
|
||||
return ReadByte_FromNewBlock();
|
||||
return *_buf++;
|
||||
}
|
||||
|
||||
size_t ReadBytesPart(Byte *buf, size_t size);
|
||||
size_t ReadBytes(Byte *buf, size_t size);
|
||||
const Byte *Lookahead(size_t &rem)
|
||||
{
|
||||
rem = (size_t)(_bufLim - _buf);
|
||||
if (!rem)
|
||||
{
|
||||
ReadBlock();
|
||||
rem = (size_t)(_bufLim - _buf);
|
||||
}
|
||||
return _buf;
|
||||
}
|
||||
size_t Skip(size_t size);
|
||||
};
|
||||
|
||||
class CInBuffer: public CInBufferBase
|
||||
{
|
||||
public:
|
||||
~CInBuffer() { Free(); }
|
||||
bool Create(size_t bufSize) throw(); // only up to 32-bits values now are supported!
|
||||
void Free() throw();
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user