Index: src/libchcore/TOverlappedDataBufferQueue.cpp =================================================================== diff -u -N -rf8fcbbd1d2321cf0c8be79526c449384af654e49 -r7fd37811dbce76d429b80e4703e88925982f5859 --- src/libchcore/TOverlappedDataBufferQueue.cpp (.../TOverlappedDataBufferQueue.cpp) (revision f8fcbbd1d2321cf0c8be79526c449384af654e49) +++ src/libchcore/TOverlappedDataBufferQueue.cpp (.../TOverlappedDataBufferQueue.cpp) (revision 7fd37811dbce76d429b80e4703e88925982f5859) @@ -23,8 +23,48 @@ #include "ErrorCodes.h" #include +#define STATUS_END_OF_FILE 0xc0000011 + namespace chcore { + /////////////////////////////////////////////////////////////////////////////////// + // class TOverlappedDataBuffer + VOID CALLBACK OverlappedReadCompleted(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped) + { + _ASSERTE(dwNumberOfBytesTransfered == lpOverlapped->InternalHigh); + + TOverlappedDataBuffer* pBuffer = (TOverlappedDataBuffer*)lpOverlapped; + TOverlappedDataBufferQueue* pQueue = (TOverlappedDataBufferQueue*)pBuffer->GetParam(); + + // determine if this is the last packet + bool bEof = (dwErrorCode == ERROR_HANDLE_EOF || + pBuffer->GetStatusCode() == STATUS_END_OF_FILE || + (dwErrorCode == ERROR_SUCCESS && dwNumberOfBytesTransfered != 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); + + pBuffer->SetRealDataSize(dwNumberOfBytesTransfered); + pBuffer->SetLastPart(bEof); + + pQueue->AddFullBuffer(pBuffer); + } + + VOID CALLBACK OverlappedWriteCompleted(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped) + { + _ASSERTE(dwNumberOfBytesTransfered == lpOverlapped->InternalHigh); + + TOverlappedDataBuffer* pBuffer = (TOverlappedDataBuffer*)lpOverlapped; + TOverlappedDataBufferQueue* pQueue = (TOverlappedDataBufferQueue*)pBuffer->GetParam(); + + pBuffer->SetErrorCode(dwErrorCode); + + pQueue->AddFinishedBuffer(pBuffer); + } + bool CompareBufferPositions::operator()(const TOverlappedDataBuffer* pBufferA, const TOverlappedDataBuffer* pBufferB) { return pBufferA->GetBufferOrder() < pBufferB->GetBufferOrder(); @@ -147,7 +187,10 @@ throw TCoreException(eErr_InvalidOverlappedPosition, L"Tried to re-insert same buffer into queue", LOCATION); if (pBuffer->IsLastPart()) + { m_bDataSourceFinished = true; + UpdateReadPossibleEvent(); + } UpdateWritePossibleEvent(); UpdateAllBuffersAccountedFor();