X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a324a7bccf4bda8f4f2bf09daee8104cae953cee..9534d0dfdc3c6fad8ea5d5fd31bbb6f20650929b:/src/common/sckstrm.cpp diff --git a/src/common/sckstrm.cpp b/src/common/sckstrm.cpp index df93922870..b4498a51d0 100644 --- a/src/common/sckstrm.cpp +++ b/src/common/sckstrm.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: sckstrm.h +// Name: src/common/sckstrm.cpp // Purpose: wxSocket*Stream // Author: Guilhem Lavaux // Modified by: @@ -8,26 +8,23 @@ // Copyright: (c) // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "sckstrm.h" -#endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ - #pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_SOCKETS && wxUSE_STREAMS + +#include "wx/sckstrm.h" + #ifndef WX_PRECOMP - #include "wx/defs.h" + #include "wx/stream.h" #endif -#if wxUSE_SOCKETS && wxUSE_STREAMS - -#include "wx/stream.h" #include "wx/socket.h" -#include "wx/sckstrm.h" // --------------------------------------------------------------------------- // wxSocketOutputStream @@ -44,19 +41,35 @@ wxSocketOutputStream::~wxSocketOutputStream() size_t wxSocketOutputStream::OnSysWrite(const void *buffer, size_t size) { - size_t ret; - - ret = m_o_socket->Write((const char *)buffer, size).LastCount(); - switch (m_o_socket->LastError()) { - case GSOCK_NOERROR: - m_lasterror = wxStream_NOERROR; - break; - default: - m_lasterror = wxStream_READ_ERR; - break; - } - return ret; - + 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; + + // Patch 1476893 caused Advise to hang, needs further investigation +#if 0 + 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; +#endif } // --------------------------------------------------------------------------- @@ -74,18 +87,35 @@ wxSocketInputStream::~wxSocketInputStream() size_t wxSocketInputStream::OnSysRead(void *buffer, size_t size) { - size_t ret; - - ret = m_i_socket->Read((char *)buffer, size).LastCount(); - switch (m_i_socket->LastError()) { - case GSOCK_NOERROR: - m_lasterror = wxStream_NOERROR; - break; - default: - m_lasterror = wxStream_WRITE_ERR; - break; - } - return ret; + 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; + + // Patch 1476893 caused Advise to hang, needs further investigation +#if 0 + 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; +#endif } // ---------------------------------------------------------------------------