diff options
Diffstat (limited to '3rdparty/lzma/CPP/7zip/Common/StreamBinder.cpp')
-rw-r--r-- | 3rdparty/lzma/CPP/7zip/Common/StreamBinder.cpp | 52 |
1 files changed, 41 insertions, 11 deletions
diff --git a/3rdparty/lzma/CPP/7zip/Common/StreamBinder.cpp b/3rdparty/lzma/CPP/7zip/Common/StreamBinder.cpp index 7a4c0ed26ad..435440c6649 100644 --- a/3rdparty/lzma/CPP/7zip/Common/StreamBinder.cpp +++ b/3rdparty/lzma/CPP/7zip/Common/StreamBinder.cpp @@ -12,7 +12,7 @@ class CBinderInStream: { CStreamBinder *_binder; public: - MY_UNKNOWN_IMP + MY_UNKNOWN_IMP1(ISequentialInStream) STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); ~CBinderInStream() { _binder->CloseRead(); } CBinderInStream(CStreamBinder *binder): _binder(binder) {} @@ -27,7 +27,7 @@ class CBinderOutStream: { CStreamBinder *_binder; public: - MY_UNKNOWN_IMP + MY_UNKNOWN_IMP1(ISequentialOutStream) STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); ~CBinderOutStream() { _binder->CloseWrite(); } CBinderOutStream(CStreamBinder *binder): _binder(binder) {} @@ -40,26 +40,38 @@ STDMETHODIMP CBinderOutStream::Write(const void *data, UInt32 size, UInt32 *proc WRes CStreamBinder::CreateEvents() { - RINOK(_canWrite_Event.Create(true)); + RINOK(_canWrite_Event.Create()); RINOK(_canRead_Event.Create()); return _readingWasClosed_Event.Create(); } void CStreamBinder::ReInit() { - _waitWrite = true; + _canWrite_Event.Reset(); _canRead_Event.Reset(); _readingWasClosed_Event.Reset(); + + // _readingWasClosed = false; + _readingWasClosed2 = false; + + _waitWrite = true; + _bufSize = 0; + _buf = NULL; ProcessedSize = 0; + // WritingWasCut = false; } void CStreamBinder::CreateStreams(ISequentialInStream **inStream, ISequentialOutStream **outStream) { + // _readingWasClosed = false; + _readingWasClosed2 = false; + _waitWrite = true; _bufSize = 0; _buf = NULL; ProcessedSize = 0; + // WritingWasCut = false; CBinderInStream *inStreamSpec = new CBinderInStream(this); CMyComPtr<ISequentialInStream> inStreamLoc(inStreamSpec); @@ -108,19 +120,37 @@ HRESULT CStreamBinder::Write(const void *data, UInt32 size, UInt32 *processedSiz { if (processedSize) *processedSize = 0; - if (size != 0) + if (size == 0) + return S_OK; + + if (!_readingWasClosed2) { _buf = data; _bufSize = size; - _canWrite_Event.Reset(); _canRead_Event.Set(); + + /* + _canWrite_Event.Lock(); + if (_readingWasClosed) + _readingWasClosed2 = true; + */ HANDLE events[2] = { _canWrite_Event, _readingWasClosed_Event }; DWORD waitResult = ::WaitForMultipleObjects(2, events, FALSE, INFINITE); - if (waitResult != WAIT_OBJECT_0 + 0) - return S_FALSE; - if (processedSize) - *processedSize = size; + if (waitResult >= WAIT_OBJECT_0 + 2) + return E_FAIL; + + size -= _bufSize; + if (size != 0) + { + if (processedSize) + *processedSize = size; + return S_OK; + } + // if (waitResult == WAIT_OBJECT_0 + 1) + _readingWasClosed2 = true; } - return S_OK; + + // WritingWasCut = true; + return k_My_HRESULT_WritingWasCut; } |