mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-08 04:07:02 -06:00
4.58 beta
This commit is contained in:
committed by
Kornel Lesiński
parent
bd1fa36322
commit
3901bf0ab8
@@ -18,7 +18,7 @@ static inline HRESULT ConvertBoolToHRESULT(bool result)
|
||||
DWORD lastError = ::GetLastError();
|
||||
if (lastError == 0)
|
||||
return E_FAIL;
|
||||
return lastError;
|
||||
return HRESULT_FROM_WIN32(lastError);
|
||||
#else
|
||||
return result ? S_OK: E_FAIL;
|
||||
#endif
|
||||
|
||||
@@ -30,11 +30,8 @@ HRESULT CFilterCoder::WriteWithLimit(ISequentialOutStream *outStream, UInt32 siz
|
||||
if (size > remSize)
|
||||
size = (UInt32)remSize;
|
||||
}
|
||||
UInt32 processedSize = 0;
|
||||
RINOK(WriteStream(outStream, _buffer, size, &processedSize));
|
||||
if (size != processedSize)
|
||||
return E_FAIL;
|
||||
_nowPos64 += processedSize;
|
||||
RINOK(WriteStream(outStream, _buffer, size));
|
||||
_nowPos64 += size;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -51,12 +48,12 @@ STDMETHODIMP CFilterCoder::Code(ISequentialInStream *inStream,
|
||||
|
||||
while(NeedMore())
|
||||
{
|
||||
UInt32 processedSize;
|
||||
size_t processedSize = kBufferSize - bufferPos;
|
||||
|
||||
// Change it: It can be optimized using ReadPart
|
||||
RINOK(ReadStream(inStream, _buffer + bufferPos, kBufferSize - bufferPos, &processedSize));
|
||||
RINOK(ReadStream(inStream, _buffer + bufferPos, &processedSize));
|
||||
|
||||
UInt32 endPos = bufferPos + processedSize;
|
||||
UInt32 endPos = bufferPos + (UInt32)processedSize;
|
||||
|
||||
bufferPos = Filter->Filter(_buffer, endPos);
|
||||
if (bufferPos > endPos)
|
||||
@@ -149,10 +146,7 @@ STDMETHODIMP CFilterCoder::Flush()
|
||||
if (Filter->Filter(_buffer, endPos) != endPos)
|
||||
return E_FAIL;
|
||||
}
|
||||
UInt32 processedSize;
|
||||
RINOK(WriteStream(_outStream, _buffer, _bufferPos, &processedSize));
|
||||
if (_bufferPos != processedSize)
|
||||
return E_FAIL;
|
||||
RINOK(WriteStream(_outStream, _buffer, _bufferPos));
|
||||
_bufferPos = 0;
|
||||
}
|
||||
CMyComPtr<IOutStreamFlush> flush;
|
||||
@@ -196,11 +190,9 @@ STDMETHODIMP CFilterCoder::Read(void *data, UInt32 size, UInt32 *processedSize)
|
||||
_buffer[i] = _buffer[i + _convertedPosEnd];
|
||||
_bufferPos = i;
|
||||
_convertedPosBegin = _convertedPosEnd = 0;
|
||||
UInt32 processedSizeTemp;
|
||||
UInt32 size0 = kBufferSize - _bufferPos;
|
||||
// Optimize it:
|
||||
RINOK(ReadStream(_inStream, _buffer + _bufferPos, size0, &processedSizeTemp));
|
||||
_bufferPos = _bufferPos + processedSizeTemp;
|
||||
size_t processedSizeTemp = kBufferSize - _bufferPos;
|
||||
RINOK(ReadStream(_inStream, _buffer + _bufferPos, &processedSizeTemp));
|
||||
_bufferPos = _bufferPos + (UInt32)processedSizeTemp;
|
||||
_convertedPosEnd = Filter->Filter(_buffer, _bufferPos);
|
||||
if (_convertedPosEnd == 0)
|
||||
{
|
||||
|
||||
@@ -92,7 +92,7 @@ HRESULT CInOutTempBuffer::WriteToStream(ISequentialOutStream *stream)
|
||||
if (_currentPositionInBuffer < _bufferPosition)
|
||||
{
|
||||
UInt32 sizeToWrite = _bufferPosition - _currentPositionInBuffer;
|
||||
RINOK(WriteStream(stream, _buffer + _currentPositionInBuffer, sizeToWrite, NULL));
|
||||
RINOK(WriteStream(stream, _buffer + _currentPositionInBuffer, sizeToWrite));
|
||||
_currentPositionInBuffer += sizeToWrite;
|
||||
}
|
||||
if (!_tmpFileCreated)
|
||||
@@ -104,7 +104,7 @@ HRESULT CInOutTempBuffer::WriteToStream(ISequentialOutStream *stream)
|
||||
return E_FAIL;
|
||||
if (localProcessedSize == 0)
|
||||
return S_OK;
|
||||
RINOK(WriteStream(stream, _buffer, localProcessedSize, NULL));
|
||||
RINOK(WriteStream(stream, _buffer, localProcessedSize));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -125,13 +125,10 @@ HRESULT CMemBlocks::WriteToStream(size_t blockSize, ISequentialOutStream *outStr
|
||||
UInt32 curSize = (UInt32)blockSize;
|
||||
if (totalSize < curSize)
|
||||
curSize = (UInt32)totalSize;
|
||||
UInt32 processedSize;
|
||||
if (blockIndex >= Blocks.Size())
|
||||
return E_FAIL;
|
||||
RINOK(WriteStream(outStream, Blocks[blockIndex], curSize, &processedSize));
|
||||
if (processedSize != curSize)
|
||||
return E_FAIL;
|
||||
totalSize -= processedSize;
|
||||
RINOK(WriteStream(outStream, Blocks[blockIndex], curSize));
|
||||
totalSize -= curSize;
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -8,11 +8,13 @@
|
||||
|
||||
STDMETHODIMP CSequentialInStreamImp::Read(void *data, UInt32 size, UInt32 *processedSize)
|
||||
{
|
||||
UInt32 numBytesToRead = (UInt32)(MyMin(_pos + size, _size) - _pos);
|
||||
memmove(data, _dataPointer + _pos, numBytesToRead);
|
||||
_pos += numBytesToRead;
|
||||
if(processedSize != NULL)
|
||||
*processedSize = numBytesToRead;
|
||||
size_t rem = _size - _pos;
|
||||
if (size < rem)
|
||||
rem = (size_t)size;
|
||||
memcpy(data, _dataPointer + _pos, rem);
|
||||
_pos += rem;
|
||||
if (processedSize != NULL)
|
||||
*processedSize = (UInt32)rem;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -21,13 +23,13 @@ void CWriteBuffer::Write(const void *data, size_t size)
|
||||
{
|
||||
size_t newCapacity = _size + size;
|
||||
_buffer.EnsureCapacity(newCapacity);
|
||||
memmove(_buffer + _size, data, size);
|
||||
memcpy(_buffer + _size, data, size);
|
||||
_size += size;
|
||||
}
|
||||
|
||||
STDMETHODIMP CSequentialOutStreamImp::Write(const void *data, UInt32 size, UInt32 *processedSize)
|
||||
{
|
||||
_writeBuffer.Write(data, size);
|
||||
_writeBuffer.Write(data, (size_t)size);
|
||||
if(processedSize != NULL)
|
||||
*processedSize = size;
|
||||
return S_OK;
|
||||
@@ -35,16 +37,14 @@ STDMETHODIMP CSequentialOutStreamImp::Write(const void *data, UInt32 size, UInt3
|
||||
|
||||
STDMETHODIMP CSequentialOutStreamImp2::Write(const void *data, UInt32 size, UInt32 *processedSize)
|
||||
{
|
||||
UInt32 newSize = size;
|
||||
if (_pos + size > _size)
|
||||
newSize = (UInt32)(_size - _pos);
|
||||
memmove(_buffer + _pos, data, newSize);
|
||||
if(processedSize != NULL)
|
||||
*processedSize = newSize;
|
||||
_pos += newSize;
|
||||
if (newSize != size)
|
||||
return E_FAIL;
|
||||
return S_OK;
|
||||
size_t rem = _size - _pos;
|
||||
if (size < rem)
|
||||
rem = (size_t)size;
|
||||
memcpy(_buffer + _pos, data, rem);
|
||||
_pos += rem;
|
||||
if (processedSize != NULL)
|
||||
*processedSize = (UInt32)rem;
|
||||
return (rem == size ? S_OK : E_FAIL);
|
||||
}
|
||||
|
||||
STDMETHODIMP CSequentialInStreamSizeCount::Read(void *data, UInt32 size, UInt32 *processedSize)
|
||||
|
||||
@@ -2,20 +2,21 @@
|
||||
|
||||
#include "StdAfx.h"
|
||||
|
||||
#include "../../Common/MyCom.h"
|
||||
#include "StreamUtils.h"
|
||||
|
||||
HRESULT ReadStream(ISequentialInStream *stream, void *data, UInt32 size, UInt32 *processedSize)
|
||||
static const UInt32 kBlockSize = ((UInt32)1 << 31);
|
||||
|
||||
HRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *processedSize)
|
||||
{
|
||||
if (processedSize != 0)
|
||||
*processedSize = 0;
|
||||
while(size != 0)
|
||||
size_t size = *processedSize;
|
||||
*processedSize = 0;
|
||||
while (size != 0)
|
||||
{
|
||||
UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize;
|
||||
UInt32 processedSizeLoc;
|
||||
HRESULT res = stream->Read(data, size, &processedSizeLoc);
|
||||
if (processedSize != 0)
|
||||
*processedSize += processedSizeLoc;
|
||||
data = (Byte *)((Byte *)data + processedSizeLoc);
|
||||
HRESULT res = stream->Read(data, curSize, &processedSizeLoc);
|
||||
*processedSize += processedSizeLoc;
|
||||
data = (void *)((Byte *)data + processedSizeLoc);
|
||||
size -= processedSizeLoc;
|
||||
RINOK(res);
|
||||
if (processedSizeLoc == 0)
|
||||
@@ -24,16 +25,27 @@ HRESULT ReadStream(ISequentialInStream *stream, void *data, UInt32 size, UInt32
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT WriteStream(ISequentialOutStream *stream, const void *data, UInt32 size, UInt32 *processedSize)
|
||||
HRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size)
|
||||
{
|
||||
if (processedSize != 0)
|
||||
*processedSize = 0;
|
||||
while(size != 0)
|
||||
size_t processedSize = size;
|
||||
RINOK(ReadStream(stream, data, &processedSize));
|
||||
return (size == processedSize) ? S_OK : S_FALSE;
|
||||
}
|
||||
|
||||
HRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size)
|
||||
{
|
||||
size_t processedSize = size;
|
||||
RINOK(ReadStream(stream, data, &processedSize));
|
||||
return (size == processedSize) ? S_OK : E_FAIL;
|
||||
}
|
||||
|
||||
HRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size)
|
||||
{
|
||||
while (size != 0)
|
||||
{
|
||||
UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize;
|
||||
UInt32 processedSizeLoc;
|
||||
HRESULT res = stream->Write(data, size, &processedSizeLoc);
|
||||
if (processedSize != 0)
|
||||
*processedSize += processedSizeLoc;
|
||||
HRESULT res = stream->Write(data, curSize, &processedSizeLoc);
|
||||
data = (const void *)((const Byte *)data + processedSizeLoc);
|
||||
size -= processedSizeLoc;
|
||||
RINOK(res);
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
|
||||
#include "../IStream.h"
|
||||
|
||||
HRESULT ReadStream(ISequentialInStream *stream, void *data, UInt32 size, UInt32 *processedSize);
|
||||
HRESULT WriteStream(ISequentialOutStream *stream, const void *data, UInt32 size, UInt32 *processedSize);
|
||||
HRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *size);
|
||||
HRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size);
|
||||
HRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size);
|
||||
HRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -17,7 +17,7 @@ static THREAD_FUNC_DECL CoderThread(void *p)
|
||||
}
|
||||
}
|
||||
|
||||
HRes CVirtThread::Create()
|
||||
WRes CVirtThread::Create()
|
||||
{
|
||||
RINOK(StartEvent.CreateIfNotCreated());
|
||||
RINOK(FinishedEvent.CreateIfNotCreated());
|
||||
|
||||
@@ -14,7 +14,7 @@ struct CVirtThread
|
||||
bool ExitEvent;
|
||||
|
||||
~CVirtThread();
|
||||
HRes Create();
|
||||
WRes Create();
|
||||
void Start();
|
||||
void WaitFinish() { FinishedEvent.Lock(); }
|
||||
virtual void Execute() = 0;
|
||||
|
||||
Reference in New Issue
Block a user