X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e59461fff579fcffaaf97baabcfc9f7504e4fed6..34d6780ea21af1cf358e9be668f22c6f0e11ebfb:/src/common/socket.cpp diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 4d98262d30..ee1365dbaa 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -13,10 +13,6 @@ // Declarations // ========================================================================== -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "socket.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -40,6 +36,7 @@ #include "wx/sckaddr.h" #include "wx/socket.h" +#include "wx/datetime.h" // DLL options compatibility check: #include "wx/build.h" @@ -98,7 +95,7 @@ public: public: wxSocketState() : wxObject() {} - DECLARE_NO_COPY_CLASS(wxSocketState) + DECLARE_NO_COPY_CLASS(wxSocketState) }; // ========================================================================== @@ -697,10 +694,6 @@ bool wxSocketBase::_Wait(long seconds, else timeout = m_timeout * 1000; -#if !defined(wxUSE_GUI) || !wxUSE_GUI - m_socket->SetTimeout(timeout); -#endif - // Wait in an active polling loop. // // NOTE: We duplicate some of the code in OnRequest, but this doesn't @@ -711,8 +704,19 @@ bool wxSocketBase::_Wait(long seconds, // Do this at least once (important if timeout == 0, when // we are just polling). Also, if just polling, do not yield. - wxStopWatch chrono; + wxDateTime current_time = wxDateTime::UNow(); + unsigned int time_limit = (current_time.GetTicks() * 1000) + current_time.GetMillisecond() + timeout; bool done = false; + bool valid_result = false; + +#if !defined(wxUSE_GUI) || !wxUSE_GUI + // This is used to avoid a busy loop on wxBase - having a select + // timeout of 50 ms per iteration should be enough. + if (timeout > 50) + m_socket->SetTimeout(50); + else + m_socket->SetTimeout(timeout); +#endif while (!done) { @@ -723,13 +727,15 @@ bool wxSocketBase::_Wait(long seconds, { m_connected = true; m_establishing = false; - return true; + valid_result = true; + break; } // Data available or output buffer ready if ((result & GSOCK_INPUT_FLAG) || (result & GSOCK_OUTPUT_FLAG)) { - return true; + valid_result = true; + break; } // Connection lost @@ -737,17 +743,33 @@ bool wxSocketBase::_Wait(long seconds, { m_connected = false; m_establishing = false; - return (flags & GSOCK_LOST_FLAG) != 0; + valid_result = ((flags & GSOCK_LOST_FLAG) != 0); + break; } // Wait more? - if ((!timeout) || (chrono.Time() > timeout) || (m_interrupt)) + current_time = wxDateTime::UNow(); + int time_left = time_limit - ((current_time.GetTicks() * 1000) + current_time.GetMillisecond()); + if ((!timeout) || (time_left <= 0) || (m_interrupt)) done = true; else - PROCESS_EVENTS(); + { +#if !defined(wxUSE_GUI) || !wxUSE_GUI + // If there's less than 50 ms left, just call select with that timeout. + if (time_left < 50) + m_socket->SetTimeout(time_left); +#else + PROCESS_EVENTS(); +#endif + } } - return false; + // Set timeout back to original value (we overwrote it for polling) +#if !defined(wxUSE_GUI) || !wxUSE_GUI + m_socket->SetTimeout(m_timeout*1000); +#endif + + return valid_result; } bool wxSocketBase::Wait(long seconds, long milliseconds) @@ -765,7 +787,7 @@ bool wxSocketBase::WaitForRead(long seconds, long milliseconds) return true; // Note that GSOCK_INPUT_LOST has to be explicitly passed to - // _Wait becuase of the semantics of WaitForRead: a return + // _Wait because of the semantics of WaitForRead: a return // value of true means that a GSocket_Read call will return // immediately, not that there is actually data to read. @@ -1056,7 +1078,7 @@ wxUint32 wxSocketBase::GetPushback(void *buffer, wxUint32 size, bool peek) // Ctor // -------------------------------------------------------------------------- -wxSocketServer::wxSocketServer(wxSockAddress& addr_man, +wxSocketServer::wxSocketServer(const wxSockAddress& addr_man, wxSocketFlags flags) : wxSocketBase(flags, wxSOCKET_SERVER) { @@ -1153,6 +1175,8 @@ bool wxSocketServer::WaitForAccept(long seconds, long milliseconds) bool wxSocketBase::GetOption(int level, int optname, void *optval, int *optlen) { + wxASSERT_MSG( m_socket, _T("Socket not initialised") ); + if (m_socket->GetSockOpt(level, optname, optval, optlen) != GSOCK_NOERROR) { @@ -1164,6 +1188,8 @@ bool wxSocketBase::GetOption(int level, int optname, void *optval, int *optlen) bool wxSocketBase::SetOption(int level, int optname, const void *optval, int optlen) { + wxASSERT_MSG( m_socket, _T("Socket not initialised") ); + if (m_socket->SetSockOpt(level, optname, optval, optlen) != GSOCK_NOERROR) { @@ -1259,7 +1285,7 @@ bool wxSocketClient::WaitOnConnect(long seconds, long milliseconds) /* NOTE: experimental stuff - might change */ -wxDatagramSocket::wxDatagramSocket( wxSockAddress& addr, +wxDatagramSocket::wxDatagramSocket( const wxSockAddress& addr, wxSocketFlags flags ) : wxSocketBase( flags, wxSOCKET_DATAGRAM ) { @@ -1299,10 +1325,12 @@ wxDatagramSocket& wxDatagramSocket::RecvFrom( wxSockAddress& addr, return (*this); } -wxDatagramSocket& wxDatagramSocket::SendTo( wxSockAddress& addr, +wxDatagramSocket& wxDatagramSocket::SendTo( const wxSockAddress& addr, const void* buf, wxUint32 nBytes ) { + wxASSERT_MSG( m_socket, _T("Socket not initialised") ); + m_socket->SetPeer(addr.GetAddress()); Write(buf, nBytes); return (*this);