Index: src/libchcore/TOverlappedDataBuffer.cpp =================================================================== diff -u -N -rb75259a9158d8b46d747e20ab4960dd002adb4b1 -refe016ef1d0cb0cf1ba379dbe3693e35f6a2361e --- src/libchcore/TOverlappedDataBuffer.cpp (.../TOverlappedDataBuffer.cpp) (revision b75259a9158d8b46d747e20ab4960dd002adb4b1) +++ src/libchcore/TOverlappedDataBuffer.cpp (.../TOverlappedDataBuffer.cpp) (revision efe016ef1d0cb0cf1ba379dbe3693e35f6a2361e) @@ -28,6 +28,7 @@ #include "IOverlappedDataBufferQueue.h" #include "RoundingFunctions.h" #include +#include #define STATUS_END_OF_FILE 0xc0000011 @@ -38,31 +39,29 @@ VOID CALLBACK OverlappedReadCompleted(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped) { TOverlappedDataBuffer* pBuffer = (TOverlappedDataBuffer*) lpOverlapped; - ATLTRACE(_T("OverlappedReadCompleted - read %I64u bytes\n"), pBuffer->GetBytesTransferred()); + // determine if this is the last packet bool bEof = (dwErrorCode == ERROR_HANDLE_EOF || pBuffer->GetStatusCode() == STATUS_END_OF_FILE || (dwErrorCode == ERROR_SUCCESS && pBuffer->GetBytesTransferred() != pBuffer->GetRequestedDataSize())); + // reset status code and error code if they pointed out to EOF if (pBuffer->GetStatusCode() == STATUS_END_OF_FILE) pBuffer->SetStatusCode(0); + pBuffer->SetErrorCode(dwErrorCode == ERROR_HANDLE_EOF ? ERROR_SUCCESS : dwErrorCode); - if (dwErrorCode != ERROR_SUCCESS) - ATLTRACE(_T("OverlappedReadCompleted error: %lu, status code: %I64u\n"), dwErrorCode, pBuffer->GetStatusCode()); - pBuffer->SetRealDataSize(dwNumberOfBytesTransfered); pBuffer->SetLastPart(bEof); + pBuffer->RequeueAsFull(); } VOID CALLBACK OverlappedWriteCompleted(DWORD dwErrorCode, DWORD /*dwNumberOfBytesTransfered*/, LPOVERLAPPED lpOverlapped) { TOverlappedDataBuffer* pBuffer = (TOverlappedDataBuffer*) lpOverlapped; - ATLTRACE(_T("OverlappedWriteCompleted - written %I64u bytes\n"), pBuffer->GetBytesTransferred()); - if(dwErrorCode != ERROR_SUCCESS) - ATLTRACE(_T("OverlappedWriteCompleted error: %lu, status code: %I64u\n"), dwErrorCode, pBuffer->GetStatusCode()); + pBuffer->SetErrorCode(dwErrorCode); pBuffer->RequeueAsFinished(); } @@ -136,4 +135,33 @@ m_pQueue->AddFinishedBuffer(this); } +void TOverlappedDataBuffer::InitForRead(unsigned long long ullPosition, DWORD dwRequestedSize) +{ + SetRequestedDataSize(dwRequestedSize); + SetFilePosition(ullPosition); + SetRealDataSize(0); + SetLastPart(false); + SetErrorCode(ERROR_SUCCESS); + SetStatusCode(0); + SetBytesTransferred(0); +} + +void TOverlappedDataBuffer::InitForWrite() +{ + SetErrorCode(ERROR_SUCCESS); + SetStatusCode(0); + SetBytesTransferred(0); +} + +void TOverlappedDataBuffer::Reset() +{ + SetRequestedDataSize(0); + SetFilePosition(0); + SetRealDataSize(0); + SetLastPart(false); + SetErrorCode(ERROR_SUCCESS); + SetStatusCode(0); + SetBytesTransferred(0); +} + END_CHCORE_NAMESPACE