#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
-#if wxUSE_SOCKETS
-
-#ifndef WX_PRECOMP
-#include <wx/wx.h>
-#endif
+#if wxUSE_PROTOCOL
#include "wx/protocol/protocol.h"
#include "wx/url.h"
#include "wx/module.h"
+#include <stdlib.h>
+
/////////////////////////////////////////////////////////////////
// wxProtoInfo
/////////////////////////////////////////////////////////////////
* --------------------------------------------------------------
*/
-wxProtoInfo::wxProtoInfo(const char *name, const char *serv,
+wxProtoInfo::wxProtoInfo(const wxChar *name, const wxChar *serv,
const bool need_host1, wxClassInfo *info)
{
m_protoname = name;
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;
}
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;
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);
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
}
+#endif // wxUSE_SOCKETS
-// ----------------------------------------------------------------------
-// Module
-// ----------------------------------------------------------------------
+#endif // wxUSE_PROTOCOL
-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