From 2f0add5ae0f51eaac054102121ff289e0f2580bd Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 28 May 2006 17:27:40 +0000 Subject: [PATCH] allow partial read/writes (patch 1476893) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39381 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/sckstrm.cpp | 54 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/src/common/sckstrm.cpp b/src/common/sckstrm.cpp index 5b1fcac0ca..8b16fcca90 100644 --- a/src/common/sckstrm.cpp +++ b/src/common/sckstrm.cpp @@ -41,11 +41,28 @@ wxSocketOutputStream::~wxSocketOutputStream() size_t wxSocketOutputStream::OnSysWrite(const void *buffer, size_t size) { - size_t ret = m_o_socket->Write((const char *)buffer, size).LastCount(); - - m_lasterror = m_o_socket->Error() ? wxSTREAM_WRITE_ERROR : wxSTREAM_NO_ERROR; - - return ret; + const char *buf = (const char *)buffer; + size_t count = 0; + + while ( count < size && m_o_socket->WaitForWrite() ) + { + const size_t ret = m_o_socket->Write(buf, size - count).LastCount(); + + buf += ret; + count += ret; + + if ( m_o_socket->Error() ) + { + if (m_o_socket->LastError() != wxSOCKET_WOULDBLOCK) + { + m_lasterror = wxSTREAM_WRITE_ERROR; + return count; + } + } + } + + m_lasterror = wxSTREAM_NO_ERROR; + return count; } // --------------------------------------------------------------------------- @@ -63,11 +80,28 @@ wxSocketInputStream::~wxSocketInputStream() size_t wxSocketInputStream::OnSysRead(void *buffer, size_t size) { - size_t ret = m_i_socket->Read((char *)buffer, size).LastCount(); - - m_lasterror = m_i_socket->Error() ? wxSTREAM_READ_ERROR : wxSTREAM_NO_ERROR; - - return ret; + char *buf = (char *)buffer; + size_t count = 0; + + while ( count < size && m_i_socket->WaitForRead() ) + { + const size_t ret = m_i_socket->Read(buf, size - count).LastCount(); + + buf += ret; + count += ret; + + if ( m_i_socket->Error() ) + { + if (m_i_socket->LastError() != wxSOCKET_WOULDBLOCK) + { + m_lasterror = wxSTREAM_READ_ERROR; + return count; + } + } + } + + m_lasterror = wxSTREAM_NO_ERROR; + return count; } // --------------------------------------------------------------------------- -- 2.50.0