X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/db7c5931ed25a56f4eaef1076b158ca5d30b9a37..74a8f67d96591cec101def2a7d47c64072aff7fd:/src/common/protocol.cpp diff --git a/src/common/protocol.cpp b/src/common/protocol.cpp index 64c385528f..0173b097b7 100644 --- a/src/common/protocol.cpp +++ b/src/common/protocol.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: protocol.cpp +// Name: src/common/protocol.cpp // Purpose: Implement protocol base class // Author: Guilhem Lavaux // Modified by: @@ -9,34 +9,32 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "protocol.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ - #pragma hdrstop + #pragma hdrstop #endif #if wxUSE_PROTOCOL #include "wx/protocol/protocol.h" +#include "wx/protocol/log.h" + +#ifndef WX_PRECOMP + #include "wx/module.h" +#endif + #include "wx/url.h" -#include "wx/module.h" +#include "wx/log.h" #include -///////////////////////////////////////////////////////////////// +// ---------------------------------------------------------------------------- // wxProtoInfo -///////////////////////////////////////////////////////////////// +// ---------------------------------------------------------------------------- -/* - * -------------------------------------------------------------- - * --------- wxProtoInfo CONSTRUCTOR ---------------------------- - * -------------------------------------------------------------- - */ +IMPLEMENT_CLASS(wxProtoInfo, wxObject) wxProtoInfo::wxProtoInfo(const wxChar *name, const wxChar *serv, const bool need_host1, wxClassInfo *info) @@ -45,13 +43,18 @@ wxProtoInfo::wxProtoInfo(const wxChar *name, const wxChar *serv, { m_cinfo = info; m_needhost = need_host1; +#if wxUSE_URL next = wxURL::ms_protocols; wxURL::ms_protocols = this; +#else + next = NULL; +#endif } -///////////////////////////////////////////////////////////////// -// wxProtocol /////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// wxProtocol +// ---------------------------------------------------------------------------- #if wxUSE_SOCKETS IMPLEMENT_ABSTRACT_CLASS(wxProtocol, wxSocketClient) @@ -64,6 +67,9 @@ wxProtocol::wxProtocol() : wxSocketClient() #endif { + m_lastError = wxPROTO_NOERR; + m_log = NULL; + SetDefaultTimeout(60); // default timeout is 60 seconds } #if wxUSE_SOCKETS @@ -74,16 +80,29 @@ bool wxProtocol::Reconnect() if (!GetPeer(addr)) { Close(); - return FALSE; + return false; } if (!Close()) - return FALSE; - + return false; + if (!Connect(addr)) - return FALSE; + return false; + + return true; +} + +void wxProtocol::SetDefaultTimeout(wxUint32 Value) +{ + m_uiDefaultTimeout = Value; +#if wxUSE_SOCKETS + wxSocketBase::SetTimeout(Value); // sets it for this socket +#endif +} - return TRUE; +wxProtocol::~wxProtocol() +{ + delete m_log; } // ---------------------------------------------------------------------------- @@ -91,17 +110,18 @@ bool wxProtocol::Reconnect() // ---------------------------------------------------------------------------- /* static */ -wxProtocolError wxProtocol::ReadLine(wxSocketBase *socket, wxString& result) +wxProtocolError wxProtocol::ReadLine(wxSocketBase *sock, wxString& result) { static const int LINE_BUF = 4095; result.clear(); wxCharBuffer buf(LINE_BUF); + char *pBuf = buf.data(); while ( sock->WaitForRead() ) { // peek at the socket to see if there is a CRLF - sock->Peek(buf.data(), LINE_BUF); + sock->Peek(pBuf, LINE_BUF); size_t nRead = sock->LastCount(); if ( !nRead && sock->Error() ) @@ -110,16 +130,16 @@ wxProtocolError wxProtocol::ReadLine(wxSocketBase *socket, wxString& result) // look for "\r\n" paying attention to a special case: "\r\n" could // have been split by buffer boundary, so check also for \r at the end // of the last chunk and \n at the beginning of this one - buf.data()[nRead] = '\0'; - const char *eol = strchr(buf, '\n'); + pBuf[nRead] = '\0'; + const char *eol = strchr(pBuf, '\n'); // if we found '\n', is there a '\r' as well? if ( eol ) { - if ( eol == buf.data() ) + if ( eol == pBuf ) { // check for case of "\r\n" being split - if ( result.empty() || result.Last() != _T('\r') ) + if ( result.empty() || result.Last() != wxT('\r') ) { // ignore the stray '\n' eol = NULL; @@ -132,7 +152,7 @@ wxProtocolError wxProtocol::ReadLine(wxSocketBase *socket, wxString& result) else // '\n' in the middle of the buffer { // in any case, read everything up to and including '\n' - nRead = eol - buf + 1; + nRead = eol - pBuf + 1; if ( eol[-1] != '\r' ) { @@ -142,12 +162,12 @@ wxProtocolError wxProtocol::ReadLine(wxSocketBase *socket, wxString& result) } } - sock->Read(buf.data(), nRead); + sock->Read(pBuf, nRead); if ( sock->LastCount() != nRead ) return wxPROTO_NETERR; - buf.data()[nRead] = '\0'; - result += wxString::FromAscii(buf); + pBuf[nRead] = '\0'; + result += wxString::FromAscii(pBuf); if ( eol ) { @@ -166,46 +186,34 @@ 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) +#endif // wxUSE_SOCKETS + +// ---------------------------------------------------------------------------- +// logging +// ---------------------------------------------------------------------------- + +void wxProtocol::SetLog(wxProtocolLog *log) { -#define PROTO_BSIZE 2048 - size_t avail, size; - char tmp_buf[PROTO_BSIZE], tmp_str[PROTO_BSIZE]; - char *ret; - bool found; - - avail = sock->Read(tmp_buf, PROTO_BSIZE).LastCount(); - if (sock->Error() || avail == 0) - return wxPROTO_NETERR; - - memcpy(tmp_str, tmp_buf, avail); - - // Not implemented on all systems - // ret = (char *)memccpy(tmp_str, tmp_buf, '\n', avail); - found = FALSE; - for (ret=tmp_str;ret < (tmp_str+avail); ret++) - if (*ret == '\n') - { - found = TRUE; - break; - } + delete m_log; + m_log = log; +} - if (!found) - return wxPROTO_PROTERR; - - *ret = 0; +void wxProtocol::LogRequest(const wxString& str) +{ + if ( m_log ) + m_log->LogRequest(str); +} - result = wxString::FromAscii( tmp_str ); - result = result.Left(result.Length()-1); +void wxProtocol::LogResponse(const wxString& str) +{ + if ( m_log ) + m_log->LogResponse(str); +} - size = ret-tmp_str+1; - sock->Unread(&tmp_buf[size], avail-size); - - return wxPROTO_NOERR; -#undef PROTO_BSIZE +void wxProtocolLog::DoLogString(const wxString& str) +{ + wxUnusedVar(str); // unused if wxLogTrace() is disabled + wxLogTrace(m_traceMask, "%s", str); } -#endif // wxUSE_SOCKETS #endif // wxUSE_PROTOCOL -