X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d34f724d42cc7c2d584fc9d7e9ee5465388ee3f2..1441bb60dfea9ba90ddf991535ab4fe59211b6ba:/src/common/socket.cpp diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 3227bdb429..09324181ae 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -115,7 +115,7 @@ wxDEFINE_EVENT(wxEVT_SOCKET, wxSocketEvent); // discard buffer #define MAX_DISCARD_SIZE (10 * 1024) -#define wxTRACE_Socket _T("wxSocket") +#define wxTRACE_Socket wxT("wxSocket") // -------------------------------------------------------------------------- // wxWin macros @@ -213,7 +213,11 @@ public: { m_socket->m_reading = false; - m_socket->m_impl->ReenableEvents(wxSOCKET_INPUT_FLAG); + // connection could have been lost while reading, in this case calling + // ReenableEvents() would assert and is not necessary anyhow + wxSocketImpl * const impl = m_socket->m_impl; + if ( impl && impl->m_fd != INVALID_SOCKET ) + impl->ReenableEvents(wxSOCKET_INPUT_FLAG); } private: @@ -231,13 +235,15 @@ public: wxASSERT_MSG( !m_socket->m_writing, "write reentrancy?" ); m_socket->m_writing = true; - - m_socket->m_impl->ReenableEvents(wxSOCKET_OUTPUT_FLAG); } ~wxSocketWriteGuard() { m_socket->m_writing = false; + + wxSocketImpl * const impl = m_socket->m_impl; + if ( impl && impl->m_fd != INVALID_SOCKET ) + impl->ReenableEvents(wxSOCKET_OUTPUT_FLAG); } private: @@ -765,7 +771,7 @@ bool wxSocketBase::Initialize() void wxSocketBase::Shutdown() { // we should be initialized - wxASSERT_MSG( m_countInit > 0, _T("extra call to Shutdown()") ); + wxASSERT_MSG( m_countInit > 0, wxT("extra call to Shutdown()") ); if ( --m_countInit == 0 ) { wxSocketManager * const manager = wxSocketManager::Get(); @@ -813,7 +819,9 @@ void wxSocketBase::Init() // this Initialize() will be undone by wxSocketModule::OnExit(), all // the other calls to it should be matched by a call to Shutdown() if (!Initialize()) + { wxLogError("Cannot initialize wxSocketBase"); + } } } @@ -833,12 +841,6 @@ wxSocketBase::wxSocketBase(wxSocketFlags flags, wxSocketType type) wxSocketBase::~wxSocketBase() { - // Just in case the app called Destroy() *and* then deleted the socket - // immediately: don't leave dangling pointers. - wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; - if ( traits ) - traits->RemoveFromPendingDelete(this); - // Shutdown and close the socket if (!m_beingDeleted) Close(); @@ -847,8 +849,7 @@ wxSocketBase::~wxSocketBase() delete m_impl; // Free the pushback buffer - if (m_unread) - free(m_unread); + free(m_unread); } bool wxSocketBase::Destroy() @@ -864,14 +865,13 @@ bool wxSocketBase::Destroy() // Suppress events from now on Notify(false); - // schedule this object for deletion - wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; - if ( traits ) + // Schedule this object for deletion instead of destroying it right now if + // possible as we may have other events pending for it + if ( wxTheApp ) { - // let the traits object decide what to do with us - traits->ScheduleForDestroy(this); + wxTheApp->ScheduleForDestruction(this); } - else // no app or no traits + else // no app { // in wxBase we might have no app object at all, don't leak memory delete this; @@ -1607,20 +1607,29 @@ void wxSocketBase::OnRequest(wxSocketNotify notification) case wxSOCKET_CONNECTION: flag = wxSOCKET_CONNECTION_FLAG; + + // we're now successfully connected + m_connected = true; + m_establishing = false; + + // error was previously set to wxSOCKET_WOULDBLOCK, but this is not + // the case any longer + SetError(wxSOCKET_NOERROR); break; case wxSOCKET_LOST: flag = wxSOCKET_LOST_FLAG; + + // if we lost the connection the socket is now closed and not + // connected any more + m_connected = false; + m_closed = true; break; default: wxFAIL_MSG( "unknown wxSocket notification" ); } - // if we lost the connection the socket is now closed - if ( notification == wxSOCKET_LOST ) - m_closed = true; - // remember the events which were generated for this socket, we're going to // use this in DoWait() m_eventsgot |= flag; @@ -1728,13 +1737,13 @@ wxSocketServer::wxSocketServer(const wxSockAddress& addr, wxSocketFlags flags) : wxSocketBase(flags, wxSOCKET_SERVER) { - wxLogTrace( wxTRACE_Socket, _T("Opening wxSocketServer") ); + wxLogTrace( wxTRACE_Socket, wxT("Opening wxSocketServer") ); m_impl = wxSocketImpl::Create(*this); if (!m_impl) { - wxLogTrace( wxTRACE_Socket, _T("*** Failed to create m_impl") ); + wxLogTrace( wxTRACE_Socket, wxT("*** Failed to create m_impl") ); return; } @@ -1756,11 +1765,11 @@ wxSocketServer::wxSocketServer(const wxSockAddress& addr, delete m_impl; m_impl = NULL; - wxLogTrace( wxTRACE_Socket, _T("*** CreateServer() failed") ); + wxLogTrace( wxTRACE_Socket, wxT("*** CreateServer() failed") ); return; } - wxLogTrace( wxTRACE_Socket, _T("wxSocketServer on fd %d"), m_impl->m_fd ); + wxLogTrace( wxTRACE_Socket, wxT("wxSocketServer on fd %d"), m_impl->m_fd ); } // -------------------------------------------------------------------------- @@ -1826,7 +1835,7 @@ bool wxSocketServer::WaitForAccept(long seconds, long milliseconds) bool wxSocketBase::GetOption(int level, int optname, void *optval, int *optlen) { - wxASSERT_MSG( m_impl, _T("Socket not initialised") ); + wxASSERT_MSG( m_impl, wxT("Socket not initialised") ); SOCKOPTLEN_T lenreal = *optlen; if ( getsockopt(m_impl->m_fd, level, optname, @@ -1841,7 +1850,7 @@ 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_impl, _T("Socket not initialised") ); + wxASSERT_MSG( m_impl, wxT("Socket not initialised") ); return setsockopt(m_impl->m_fd, level, optname, static_cast(optval), optlen) == 0; @@ -2015,7 +2024,7 @@ wxDatagramSocket& wxDatagramSocket::SendTo( const wxSockAddress& addr, const void* buf, wxUint32 nBytes ) { - wxASSERT_MSG( m_impl, _T("Socket not initialised") ); + wxASSERT_MSG( m_impl, wxT("Socket not initialised") ); m_impl->SetPeer(addr.GetAddress()); Write(buf, nBytes);