X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4846abaf45a5a1b2ba4392fab7fdc45f1518f4d7..12ed316d02733e7111a6967f6ae41e2c0ceaa57a:/src/common/protocol.cpp diff --git a/src/common/protocol.cpp b/src/common/protocol.cpp index ac5020956f..2203ac231f 100644 --- a/src/common/protocol.cpp +++ b/src/common/protocol.cpp @@ -17,19 +17,15 @@ #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop -#endif - -#if wxUSE_SOCKETS - -#ifndef WX_PRECOMP -#include + #pragma hdrstop #endif #include "wx/protocol/protocol.h" #include "wx/url.h" #include "wx/module.h" +#include + ///////////////////////////////////////////////////////////////// // wxProtoInfo ///////////////////////////////////////////////////////////////// @@ -47,26 +43,34 @@ wxProtoInfo::wxProtoInfo(const wxChar *name, const wxChar *serv, m_servname = serv; m_cinfo = info; m_needhost = need_host1; - next = wxURL::g_protocols; - wxURL::g_protocols = this; + next = wxURL::ms_protocols; + wxURL::ms_protocols = this; } ///////////////////////////////////////////////////////////////// // wxProtocol /////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// +#if wxUSE_SOCKETS IMPLEMENT_ABSTRACT_CLASS(wxProtocol, wxSocketClient) +#else +IMPLEMENT_ABSTRACT_CLASS(wxProtocol, wxObject) +#endif wxProtocol::wxProtocol() +#if wxUSE_SOCKETS : wxSocketClient() +#endif { } +#if wxUSE_SOCKETS bool wxProtocol::Reconnect() { wxIPV4address addr; - if (!GetPeer(addr)) { + if (!GetPeer(addr)) + { Close(); return FALSE; } @@ -74,9 +78,60 @@ bool wxProtocol::Reconnect() return FALSE; if (!Connect(addr)) return FALSE; + return TRUE; } +// ---------------------------------------------------------------------------- +// Read a line from socket +// ---------------------------------------------------------------------------- + +// TODO ReadLine() should use buffers private to wxProtocol for efficiency! + +// static +wxProtocolError wxProtocol::ReadLine(wxSocketBase *socket, wxString& result) +{ + result.Empty(); + char ch, chLast = '\0'; + while ( !socket->Read(&ch, sizeof(ch)).Error() ) + { + switch ( ch ) + { + case '\r': + // remember it, if the following is '\n', we're done + chLast = '\r'; + break; + + case '\n': + // only ends line if the previous character was '\r' + if ( chLast == '\r' ) + { + // EOL found + return wxPROTO_NOERR; + } + //else: fall through + + default: + // normal char + if ( chLast ) + { + result += chLast; + chLast = '\0'; + } + + result += ch; + } + } + + return wxPROTO_NETERR; +} + +wxProtocolError wxProtocol::ReadLine(wxString& result) +{ + return ReadLine(this, result); +} + +// old function which only chops '\n' and not '\r\n' wxProtocolError GetLine(wxSocketBase *sock, wxString& result) { #define PROTO_BSIZE 2048 size_t avail, size; @@ -85,7 +140,7 @@ wxProtocolError GetLine(wxSocketBase *sock, wxString& result) { bool found; avail = sock->Read(tmp_buf, PROTO_BSIZE).LastCount(); - if (sock->LastError() != 0 || avail == 0) + if (sock->Error() || avail == 0) return wxPROTO_NETERR; memcpy(tmp_str, tmp_buf, avail); @@ -107,38 +162,8 @@ wxProtocolError GetLine(wxSocketBase *sock, wxString& result) { result = result.Left(result.Length()-1); size = ret-tmp_str+1; - sock->CreatePushbackBefore(&tmp_buf[size], avail-size); + sock->Unread(&tmp_buf[size], avail-size); return wxPROTO_NOERR; #undef PROTO_BSIZE } - -// ---------------------------------------------------------------------- -// Module -// ---------------------------------------------------------------------- - -class wxProtocolModule: public wxModule { - DECLARE_DYNAMIC_CLASS(wxProtocolModule) -public: - wxProtocolModule() {} - bool OnInit(); - void OnExit(); -}; - -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxProtocolModule, wxModule) -#endif - -bool wxProtocolModule::OnInit() -{ - wxURL::g_proxy = new wxHTTP(); - return TRUE; -} - -void wxProtocolModule::OnExit() -{ - delete wxURL::g_proxy; - wxURL::g_proxy = NULL; -} - #endif - // wxUSE_SOCKETS