]> git.saurik.com Git - wxWidgets.git/commitdiff
Added wxInternetFilesystemModule to fs_inet.cpp
authorGuilhem Lavaux <lavaux@easynet.fr>
Wed, 28 Jul 1999 17:29:59 +0000 (17:29 +0000)
committerGuilhem Lavaux <lavaux@easynet.fr>
Wed, 28 Jul 1999 17:29:59 +0000 (17:29 +0000)
Fixed PROXY support in wxURL, wxHTTP. You can set the environement variable
HTTP_PROXY now.
Fixed parsing of content type in wxHtmlFilter
Added commments to gsocket.c
wxURL parses the URL only once now.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3180 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

14 files changed:
include/wx/protocol/http.h
include/wx/url.h
samples/wxsocket/client.cpp
samples/wxsocket/server.cpp
src/common/fs_inet.cpp
src/common/ftp.cpp
src/common/http.cpp
src/common/protocol.cpp
src/common/sckaddr.cpp
src/common/socket.cpp
src/common/url.cpp
src/html/htmlfilter.cpp
src/html/htmlwin.cpp
src/unix/gsocket.c

index ff8a2935b58f3ca853f38cdb53e634db8424066e..5aeea291bea7dd176eadb3cc3cac1418257483ec 100644 (file)
@@ -20,7 +20,7 @@ class WXDLLEXPORT wxHTTP : public wxProtocol {
 protected:
   wxProtocolError m_perr;
   wxList m_headers;
-  bool m_read;
+  bool m_read, m_proxy_mode;
   wxSockAddress *m_addr;
 public:
   wxHTTP();
@@ -36,6 +36,8 @@ public:
   void SetHeader(const wxString& header, const wxString& h_data);
   wxString GetHeader(const wxString& header);
 
+  void SetProxyMode(bool on);
+
 protected:
   typedef enum {
     wxHTTP_GET,
index f8f54af9633be54b14794a72c4c545cdce71ee49..66d974b4493d6a423be246b686e887571cbc652c 100644 (file)
@@ -39,10 +39,11 @@ protected:
   static wxHTTP *g_proxy;
   wxProtoInfo *m_protoinfo;
   wxProtocol *m_protocol;
-  wxHTTP m_proxy;
+  wxHTTP *m_proxy;
   wxURLError m_error;
   wxString m_protoname, m_hostname, m_servname, m_path, m_url;
   wxString m_user, m_password;
+  bool m_useProxy;
 
   bool PrepProto(wxString& url);
   bool PrepHost(wxString& url);
@@ -60,6 +61,8 @@ public:
 
   inline wxString GetProtocolName() const
         { return m_protoinfo->m_protoname; }
+  inline wxString GetHostName() const { return m_hostname; }
+  inline wxString GetURL() const { return m_url; }
   inline wxProtocol& GetProtocol() { return *m_protocol; }
   inline wxURLError GetError() const { return m_error; }
   inline wxString GetPath() const { return m_path; }
index feb050d03a863119d4ab3cc75897edb462ca02e7..c772f223b63bd9ce784c7d068f76e2aa3343da67 100644 (file)
@@ -274,26 +274,31 @@ void MyFrame::OnExecTest1(wxCommandEvent& WXUNUSED(evt))
 void MyFrame::Download(wxInputStream *input)
 {
   wxProgressDialog progress("Downloading ...", "0% downloaded");
-  wxBufferedInputStream buf_in(*input);
   wxFileOutputStream f_out("test.url");
-
-  size_t file_size = input->StreamSize();
   size_t downloaded;
-  int BUFSIZE = (file_size > 100) ? (file_size / 100) : file_size;
-  int bytes_read = BUFSIZE;
+  int BUFSIZE, bytes_read;
+  size_t file_size;
   wxString message;
   int percents;
 
   char *buf;
 
-// TODO: Support for streams which don't support StreamSize
-
+  if (input->GetSize() == (size_t)-1) {
+    file_size = (size_t)-1;
+    bytes_read = BUFSIZE = 10240;
+  } else {
+    file_size = input->GetSize();
+    if (file_size > 10240)
+      bytes_read = BUFSIZE = file_size / 1024;
+    else
+      bytes_read = BUFSIZE = 1024;
+  }
   buf = new char[BUFSIZE];
 
   downloaded = 0;
   bytes_read = BUFSIZE;
   while (downloaded < file_size && bytes_read != 0) {
-    bytes_read = buf_in.Read(buf, BUFSIZE).LastRead();
+    bytes_read = input->Read(buf, BUFSIZE).LastRead();
     f_out.Write(buf, bytes_read);
     downloaded += bytes_read;
 
index c7bbd60c87308f35e54f5c223cf7ee1988d39da8..1890bf5a621a244bbb3bad9b79c6f0853adb64bc 100644 (file)
@@ -108,8 +108,8 @@ void MyFrame::OnSockRequest(wxSocketEvent& evt)
 
   wxSocketBase *sock = evt.Socket();
 
-  printf("OnSockRequest OK\n");
-  printf("OnSockRequest (event = %d)\n",evt.SocketEvent());
+  wxPrintf(_T("OnSockRequest OK\n"));
+  wxPrintf(_T("OnSockRequest (event = %d)\n"),evt.SocketEvent());
   switch (evt.SocketEvent()) {
   case GSOCK_INPUT:
     unsigned char c;
@@ -120,13 +120,15 @@ void MyFrame::OnSockRequest(wxSocketEvent& evt)
 
     break;
   case GSOCK_LOST:
-    printf("Destroying socket\n");
+    wxPrintf(_T("Destroying socket\n"));
     wxPendingDelete.Append(sock);
     UpdateStatus(-1);
     return;
     break;
+  default:
+    wxPrintf(_T("Invalid event !\n"));
   }
-  printf("OnSockRequest Exiting\n");
+  wxPrintf(_T("OnSockRequest Exiting\n"));
 }
 
 void MyFrame::OnSockRequestServer(wxSocketEvent& evt)
@@ -142,8 +144,8 @@ void MyFrame::OnSockRequestServer(wxSocketEvent& evt)
   wxSocketBase *sock2;
   wxSocketServer *server = (wxSocketServer *) evt.Socket();
 
-  printf("OnSockRequestServer OK\n");
-  printf("OnSockRequest (Main = %d) (event = %d)\n",wxThread::IsMain(), evt.SocketEvent());
+  wxPrintf(_T("OnSockRequestServer OK\n"));
+  wxPrintf(_T("OnSockRequest (Main = %d) (event = %d)\n"),wxThread::IsMain(), evt.SocketEvent());
 
   sock2 = server->Accept();
   if (sock2 == NULL)
@@ -199,8 +201,8 @@ void MyFrame::ExecTest1(wxSocketBase *sock_o)
 
 void MyFrame::UpdateStatus(int incr)
 {
-  char s[30];
+  wxChar s[30];
   nb_clients += incr;
-  sprintf(s, "%d clients connected", nb_clients);
+  wxSprintf(s, _T("%d clients connected"), nb_clients);
   SetStatusText(s);
 }
index def435b732d294daa19ee309a9fe315392b77922..457f9a51fd2980172402070d175820a9894ef599 100644 (file)
@@ -83,7 +83,7 @@ wxFSFile* wxInternetFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxStri
     info = (wxInetCacheNode*) m_Cache.Get(right);
 
     // Add item into cache:
-    if (info != NULL)
+    if (info == NULL)
     {
         wxURL url(right);
         s = url.GetInputStream();
@@ -137,4 +137,19 @@ wxInternetFSHandler::~wxInternetFSHandler()
     }
 }
 
+class wxFileSystemInternetModule : public wxModule
+{
+    DECLARE_DYNAMIC_CLASS(wxFileSystemInternetModule)
+
+    public:
+        virtual bool OnInit()
+        {
+            wxFileSystem::AddHandler(new wxInternetFSHandler);
+            return TRUE;
+        }
+        virtual void OnExit() {}
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxFileSystemInternetModule, wxModule)
+
 #endif // wxUSE_FS_INET
index 8b85a33b670c0a12ae624e80b04ce91cd2b61e95..b789852c921ac3e92953c85d8169ef433c0057d7 100644 (file)
@@ -251,7 +251,7 @@ public:
 
   wxInputFTPStream(wxFTP *ftp_clt, wxSocketBase *sock)
     : wxSocketInputStream(*sock), m_ftp(ftp_clt) {}
-  size_t StreamSize() const { return m_ftpsize; }
+  size_t GetSize() const { return m_ftpsize; }
   virtual ~wxInputFTPStream(void)
   { 
      if (LastError() == wxStream_NOERROR)
index 18beaf43cf816fe5b0ba69d5149bf45ff438de94..fe883d2e2248205296be9c07536a7d012a4e1358 100644 (file)
@@ -45,6 +45,7 @@ wxHTTP::wxHTTP()
 {
   m_addr = NULL;
   m_read = FALSE;
+  m_proxy_mode = FALSE;
 
   SetNotify(GSOCK_LOST_FLAG);
 }
@@ -67,6 +68,11 @@ wxString wxHTTP::GetContentType()
   return GetHeader(_T("Content-Type"));
 }
 
+void wxHTTP::SetProxyMode(bool on)
+{
+  m_proxy_mode = on;
+}
+
 void wxHTTP::SetHeader(const wxString& header, const wxString& h_data)
 {
   if (m_read) {
@@ -86,7 +92,12 @@ void wxHTTP::SetHeader(const wxString& header, const wxString& h_data)
 
 wxString wxHTTP::GetHeader(const wxString& header)
 {
-  wxNode *node = m_headers.Find(header);
+  wxNode *node;
+  wxString upper_header;
+
+  upper_header = header.Upper();
+  
+  node = m_headers.Find(upper_header);
   if (!node)
     return wxEmptyString;
 
@@ -134,6 +145,8 @@ bool wxHTTP::ParseHeaders()
     wxString left_str = tokenzr.GetNextToken();
     wxString *str = new wxString(tokenzr.GetNextToken());
 
+    left_str.MakeUpper();
+
     m_headers.Append(left_str, (wxObject *) str);
   }
   return TRUE;
@@ -143,7 +156,7 @@ bool wxHTTP::Connect(const wxString& host)
 {
   wxIPV4address *addr;
 
-  if (m_connected) {
+  if (m_addr) {
     delete m_addr;
     m_addr = NULL;
     Close();
@@ -180,7 +193,7 @@ bool wxHTTP::BuildRequest(const wxString& path, wxHTTP_Req req)
 {
   wxChar *tmp_buf;
   wxChar buf[200]; // 200 is arbitrary.
-  wxString tmp_str;
+  wxString tmp_str = path;
 
   switch (req) {
   case wxHTTP_GET:
@@ -194,7 +207,6 @@ bool wxHTTP::BuildRequest(const wxString& path, wxHTTP_Req req)
   SetFlags(NONE);
   Notify(FALSE);
 
-  tmp_str = wxURL::ConvertToValidURI(path);
   wxSprintf(buf, _T("%s %s HTTP/1.0\n\r"), tmp_buf, tmp_str.GetData());
   const wxWX2MBbuf pathbuf = wxConvLibc.cWX2MB(buf);
   Write(pathbuf, strlen(MBSTRINGCAST pathbuf));
@@ -243,7 +255,7 @@ public:
   unsigned long m_read_bytes;
 
   wxHTTPStream(wxHTTP *http) : wxSocketInputStream(*http), m_http(http) {}
-  size_t StreamSize() const { return m_httpsize; }
+  size_t GetSize() const { return m_httpsize; }
   virtual ~wxHTTPStream(void) { m_http->Abort(); }
 
 protected:
@@ -265,18 +277,23 @@ size_t wxHTTPStream::OnSysRead(void *buffer, size_t bufsize)
 
 bool wxHTTP::Abort(void)
 {
-  return wxSocketClient::Close();
+  bool ret, connected;
+
+  ret = wxSocketClient::Close();
+
+  return ret;
 }
 
 wxInputStream *wxHTTP::GetInputStream(const wxString& path)
 {
   wxHTTPStream *inp_stream = new wxHTTPStream(this);
+  wxString new_path;
 
-  if (!m_addr || m_connected) {
-    m_perr = wxPROTO_CONNERR;
+  m_perr = wxPROTO_CONNERR;
+  if (!m_addr)
     return NULL;
-  }
 
+  // We set m_connected back to FALSE so wxSocketBase will know what to do.
   if (!wxProtocol::Connect(*m_addr))
     return NULL;
 
@@ -291,6 +308,7 @@ wxInputStream *wxHTTP::GetInputStream(const wxString& path)
   inp_stream->m_read_bytes = 0;
 
   Notify(FALSE);
+  SetFlags(SPEED | WAITALL);
 
   return inp_stream;
 }
index 736b38fd1359312a1877a0fd6cbd1407384de107..1f5fb7adfd5af6e2d230cdbe849ff984148bf5dc 100644 (file)
@@ -26,6 +26,8 @@
 #include "wx/url.h"
 #include "wx/module.h"
 
+#include <stdlib.h>
+
 /////////////////////////////////////////////////////////////////
 // wxProtoInfo
 /////////////////////////////////////////////////////////////////
@@ -126,13 +128,21 @@ IMPLEMENT_DYNAMIC_CLASS(wxProtocolModule, wxModule)
 
 bool wxProtocolModule::OnInit()
 {
-  wxURL::g_proxy = new wxHTTP();
+  char *env_http_prox;
+
+  wxURL::g_proxy = NULL;
+  // Initialize the proxy when HTTP_PROXY is defined
+  env_http_prox = getenv("HTTP_PROXY");
+  if (env_http_prox)
+    wxURL::SetDefaultProxy(env_http_prox);
+  
   return TRUE;
 }
 
 void wxProtocolModule::OnExit()
 {
-  delete wxURL::g_proxy;
+  if (wxURL::g_proxy)
+    delete wxURL::g_proxy;
   wxURL::g_proxy = NULL;
 }
 
index 1e126d81afc988d951dd6d5855648791295f187e..5681aaadd7c6775d9d205ffd3e454d660923f0bd 100644 (file)
@@ -32,6 +32,7 @@
 
 #include <wx/defs.h>
 #include <wx/object.h>
+#include <wx/log.h>
 #include <wx/gsocket.h>
 #include <wx/sckaddr.h>
 
@@ -101,6 +102,12 @@ wxIPV4address::~wxIPV4address()
 
 bool wxIPV4address::Hostname(const wxString& name)
 {
+  // Some people are sometimes fool.
+  if (name == _T("")) {
+    wxLogWarning( _T("Trying to solve a NULL hostname: giving up") );
+    return FALSE;
+  }
+
   return (GAddress_INET_SetHostName(m_address, name.fn_str()) == GSOCK_NOERROR);
 }
 
index 810f2491bf1d8b9f26c2cf8aaed586250bae4f9c..56f16ce2e5ff341a22a9b5d283f47b1e3ce7c884 100644 (file)
@@ -846,9 +846,8 @@ bool wxSocketClient::Connect(wxSockAddress& addr_man, bool WXUNUSED(wait) )
   // Update the flags of m_socket.
   SetFlags(m_flags);
   GSocket_SetPeer(m_socket, addr_man.GetAddress());
-  if (GSocket_Connect(m_socket, GSOCK_STREAMED) != GSOCK_NOERROR) {
+  if (GSocket_Connect(m_socket, GSOCK_STREAMED) != GSOCK_NOERROR)
     return FALSE;
-  }
 
   // Enables bg events.
   // ------------------
index 956f0266f471f3415fb97a0a32797a70e3a7c5e1..307bf7627f6ec6cdcb2c43b1bb32c72ff15af996 100644 (file)
 
 #if wxUSE_SOCKETS
 
-#ifndef WX_PRECOMP
-#endif
-
 #include <string.h>
 #include <ctype.h>
 
-// wxWindows headers
 #include <wx/string.h>
 #include <wx/list.h>
 #include <wx/utils.h>
-
-// wxSocket header
-#include "wx/url.h"
+#include <wx/url.h>
 
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_CLASS(wxProtoInfo, wxObject)
@@ -43,7 +37,7 @@ IMPLEMENT_CLASS(wxURL, wxObject)
 
 // Protocols list
 wxProtoInfo *wxURL::g_protocols = NULL;
-wxHTTP *wxURL::g_proxy;
+wxHTTP *wxURL::g_proxy = NULL;
 
 // --------------------------------------------------------------
 // wxURL
@@ -56,14 +50,10 @@ wxHTTP *wxURL::g_proxy;
 wxURL::wxURL(const wxString& url)
 {
   m_protocol = NULL;
-  if (g_proxy->IsConnected()) {
-    m_protocol = g_proxy;
-    m_protoname = "proxy";
-    m_path = url;
-    return;
-  }
-  m_url = url;
   m_error = wxURL_NOERR;
+  m_url = url;
+  m_useProxy = (g_proxy != NULL);
+  m_proxy = g_proxy;
   ParseURL();
 }
 
@@ -71,34 +61,54 @@ bool wxURL::ParseURL()
 {
   wxString last_url = m_url;
 
-  // Clean up
-  CleanData();
-
-  // Extract protocol name
-  if (!PrepProto(last_url)) {
-    m_error = wxURL_SNTXERR;
-    return FALSE;
-  }
+ // If the URL was already parsed (so m_protocol != NULL), we pass this section.
+  if (!m_protocol) {
 
-  // Find and create the protocol object
-  if (!FetchProtocol()) {
-    m_error = wxURL_NOPROTO;
-    return FALSE;
-  }
+    // Clean up
+    CleanData();
 
-  // Do we need a host name ?
-  if (m_protoinfo->m_needhost) {
-    // Extract it
-    if (!PrepHost(last_url)) {
+    // Extract protocol name
+    if (!PrepProto(last_url)) {
       m_error = wxURL_SNTXERR;
       return FALSE;
     }
+
+    // Find and create the protocol object
+    if (!FetchProtocol()) {
+      m_error = wxURL_NOPROTO;
+      return FALSE;
+    }
+
+    // Do we need a host name ?
+    if (m_protoinfo->m_needhost) {
+      // Extract it
+      if (!PrepHost(last_url)) {
+        m_error = wxURL_SNTXERR;
+        return FALSE;
+      }
+    }
+
+    // Extract full path
+    if (!PrepPath(last_url)) {
+      m_error = wxURL_NOPATH;
+      return FALSE;
+    }
   }
+  // URL parse finished.
 
-  // Extract full path
-  if (!PrepPath(last_url)) {
-    m_error = wxURL_NOPATH;
-    return FALSE;
+  if (m_useProxy) {
+    // We destroy the newly created protocol.
+    CleanData();
+
+    // Third, we rebuild the URL.
+    m_url = m_protoname + _T(":");
+    if (m_protoinfo->m_needhost)
+      m_url = m_url + _T("//") + m_hostname;
+
+    m_url += m_path;
+
+    // We initialize specific variables.
+    m_protocol = m_proxy; // FIXME: we should clone the protocol
   }
 
   m_error = wxURL_NOERR;
@@ -107,13 +117,15 @@ bool wxURL::ParseURL()
 
 void wxURL::CleanData()
 {
-  if (m_protoname != _T("proxy"))
+  if (!m_useProxy)
     delete m_protocol;
 }
 
 wxURL::~wxURL()
 {
   CleanData();
+  if (m_proxy && m_proxy != g_proxy)
+    delete m_proxy;
 }
 
 // --------------------------------------------------------------
@@ -125,7 +137,7 @@ bool wxURL::PrepProto(wxString& url)
   int pos;
 
   // Find end
-  pos = url.Find(':');
+  pos = url.Find(_T(':'));
   if (pos == -1)
     return FALSE;
 
@@ -146,7 +158,7 @@ bool wxURL::PrepHost(wxString& url)
 
   url = url(2, url.Length());
 
-  pos = url.Find('/');
+  pos = url.Find(_T('/'));
   if (pos == -1)
     pos = url.Length();
 
@@ -154,10 +166,10 @@ bool wxURL::PrepHost(wxString& url)
     return FALSE;
 
   temp_url = url(0, pos);
-  url = url(url.Find('/'), url.Length());
+  url = url(url.Find(_T('/')), url.Length());
 
   // Retrieve service number
-  pos2 = temp_url.Find(':', TRUE);
+  pos2 = temp_url.Find(_T(':'), TRUE);
   if (pos2 != -1 && pos2 < pos) {
     m_servname = temp_url(pos2+1, pos);
     if (!m_servname.IsNumber())
@@ -166,18 +178,18 @@ bool wxURL::PrepHost(wxString& url)
   }
 
   // Retrieve user and password.
-  pos2 = temp_url.Find('@');
+  pos2 = temp_url.Find(_T('@'));
   // Even if pos2 equals -1, this code is right.
   m_hostname = temp_url(pos2+1, temp_url.Length());
 
-  m_user = "";
-  m_password = "";
+  m_user = _T("");
+  m_password = _T("");
 
   if (pos2 == -1)
     return TRUE;
 
   temp_url = temp_url(0, pos2);
-  pos2 = temp_url.Find(':');
+  pos2 = temp_url.Find(_T(':'));
 
   if (pos2 == -1)
     return FALSE;
@@ -191,9 +203,9 @@ bool wxURL::PrepHost(wxString& url)
 bool wxURL::PrepPath(wxString& url)
 {
   if (url.Length() != 0)
-    m_path = url;
+    m_path = ConvertToValidURI(url);
   else
-    m_path = "/";
+    m_path = _T("/");
   return TRUE;
 }
 
@@ -224,10 +236,6 @@ wxInputStream *wxURL::GetInputStream(void)
   wxIPV4address addr;
   wxInputStream *the_i_stream = NULL;
 
-  if (!m_protocol)
-    if (!ParseURL())
-      return NULL;
-
   if (!m_protocol) {
     m_error = wxURL_NOPROTO;
     return NULL;
@@ -239,7 +247,8 @@ wxInputStream *wxURL::GetInputStream(void)
     m_protocol->SetPassword(m_password);
   }
 
-  if (m_protoinfo->m_needhost) {
+  // m_protoinfo is NULL when we use a proxy
+  if (!m_useProxy && m_protoinfo->m_needhost) {
     if (!addr.Hostname(m_hostname)) {
       m_error = wxURL_NOHOST;
       return NULL;
@@ -254,7 +263,12 @@ wxInputStream *wxURL::GetInputStream(void)
     }
   }
 
-  the_i_stream = m_protocol->GetInputStream(m_path);
+  // When we use a proxy, we have to pass the whole URL to it.
+  if (m_useProxy)
+    the_i_stream = m_protocol->GetInputStream(m_url);
+  else
+    the_i_stream = m_protocol->GetInputStream(m_path);
+
   if (!the_i_stream) {
     m_error = wxURL_PROTOERR;
     return NULL;
@@ -265,50 +279,73 @@ wxInputStream *wxURL::GetInputStream(void)
 
 void wxURL::SetDefaultProxy(const wxString& url_proxy)
 {
-  g_proxy->Close();
-
-  if (url_proxy.IsNull())
+  if (url_proxy.IsNull()) {
+    g_proxy->Close();
+    delete g_proxy;
+    g_proxy = NULL;
     return;
+  }
 
   wxString tmp_str = url_proxy;
-  int pos = tmp_str.Find(':');
+  int pos = tmp_str.Find(_T(':'));
+  if (pos == -1)
+    return;
+
   wxString hostname = tmp_str(0, pos),
-           port = tmp_str(pos, tmp_str.Length()-pos);
+           port = tmp_str(pos+1, tmp_str.Length()-pos);
   wxIPV4address addr;
 
-  addr.Hostname(hostname);
-  addr.Service(port);
-  
+  if (!addr.Hostname(hostname))
+    return;
+  if (!addr.Service(port))
+    return;
+
+  if (g_proxy)
+  // Finally, when all is right, we connect the new proxy.
+    g_proxy->Close();
+  else
+    g_proxy = new wxHTTP();
   g_proxy->Connect(addr, TRUE); // Watcom needs the 2nd arg for some reason
 }
 
 void wxURL::SetProxy(const wxString& url_proxy)
 {
   if (url_proxy.IsNull()) {
-    m_proxy.Close();
+    if (m_proxy) {
+      m_proxy->Close();
+      delete m_proxy;
+    }
+    m_useProxy = FALSE;
     return;
   }
 
-  CleanData();
-
   wxString tmp_str;
   wxString hostname, port;
   int pos;
   wxIPV4address addr;
 
   tmp_str = url_proxy;
-  pos = tmp_str.Find(':');
+  pos = tmp_str.Find(_T(':'));
+  // This is an invalid proxy name.
+  if (pos == -1)
+    return;
+
   hostname = tmp_str(0, pos);
   port = tmp_str(pos, tmp_str.Length()-pos);
 
   addr.Hostname(hostname);
   addr.Service(port);
 
-  m_proxy.Connect(addr, TRUE); // Watcom needs the 2nd arg for some reason
+  // Finally, create the whole stuff.
+  if (m_proxy && m_proxy != g_proxy)
+    delete m_proxy;
+  m_proxy = new wxHTTP();
+  m_proxy->Connect(addr, TRUE); // Watcom needs the 2nd arg for some reason
 
-  m_protocol = &m_proxy;
-  m_protoname = "proxy";
-  m_path = url_proxy;
+  CleanData();
+  // Reparse url.
+  m_useProxy = TRUE;
+  ParseURL();
 }
 
 wxString wxURL::ConvertToValidURI(const wxString& uri)
@@ -323,8 +360,7 @@ wxString wxURL::ConvertToValidURI(const wxString& uri)
     if (c == _T(' '))
       out_str += _T('+');
     else {
-      if (!isalpha(c) && c != _T('.') && c != _T('+') && c != _T('.') && 
-                         c != _T('/')) {
+      if (!isalpha(c) && c != _T('.') && c != _T('+') && c != _T('/')) { 
         hexa_code.Printf(_T("%%%02X"), c);
         out_str += hexa_code;
       } else
index 1bdccd5b17cc061ef6f6f62fa48a5eecd794221c..508824b43172bdecf5c5f59198c19aae6cb4a5c7 100644 (file)
@@ -124,7 +124,11 @@ IMPLEMENT_DYNAMIC_CLASS(wxHtmlFilterHTML, wxHtmlFilter)
 
 bool wxHtmlFilterHTML::CanRead(const wxFSFile& file) const
 {
-    return (file.GetMimeType() == "text/html");
+//    return (file.GetMimeType() == "text/html");
+// This is true in most case but some page can return:
+// "text/html; char-encoding=...."
+// So we use Find instead
+  return (file.GetMimeType().Find(_T("text/html")) == 0);
 }
 
 
index b98f5fed9a0bc78dca109d90a3f5e14eda8278ff..cdebaa3927267a25ffb4bc5f4f95764d82a2c56c 100644 (file)
@@ -128,7 +128,10 @@ bool wxHtmlWindow::SetPage(const wxString& source)
     SetBackgroundColour(wxColour(0xFF, 0xFF, 0xFF));
     m_OpenedPage = m_OpenedAnchor = wxEmptyString;
     m_Parser -> SetDC(dc);
-    if (m_Cell) delete m_Cell;
+    if (m_Cell) {
+      delete m_Cell;
+      m_Cell = NULL;
+    }
     m_Cell = (wxHtmlContainerCell*) m_Parser -> Parse(source);
     delete dc;
     m_Cell -> SetIndent(m_Borders, HTML_INDENT_ALL, HTML_UNITS_PIXELS);
index ab328de2e79076ea2911caa36cbd41f56d8c36a3..1e6e0254febffc4f91f3e6b20e1de4941beb5333 100644 (file)
 #include <stdlib.h>
 
 #ifdef sun
-  #include <sys/filio.h>
+#    include <sys/filio.h>
 #endif
 
 #ifdef sgi
-  #include <bstring.h>
+#    include <bstring.h>
 #endif
 
 #include <signal.h>
@@ -238,18 +238,18 @@ GSocketError GSocket_SetServer(GSocket *sck)
     return GSOCK_INVADDR;
   }
 
-  if (sck->m_stream)
-    type = SOCK_STREAM;
-  else
-    type = SOCK_DGRAM;
+  /* We always have a stream here  */
+  sck->m_stream = TRUE;
 
-  sck->m_fd = socket(sck->m_local->m_realfamily, type, 0);
+  /* Create the socket */
+  sck->m_fd = socket(sck->m_local->m_realfamily, SOCK_STREAM, 0);
 
   if (sck->m_fd == -1) {
     sck->m_error = GSOCK_IOERR;
     return GSOCK_IOERR;
   }
 
+  /* Bind the socket to the LOCAL address */
   if (bind(sck->m_fd, sck->m_local->m_addr, sck->m_local->m_len) < 0) {
     close(sck->m_fd);
     sck->m_fd = -1;
@@ -257,6 +257,7 @@ GSocketError GSocket_SetServer(GSocket *sck)
     return GSOCK_IOERR;
   }
 
+  /* Enable listening up to 5 connections */
   if (listen(sck->m_fd, 5) < 0) {
     close(sck->m_fd);
     sck->m_fd = -1;
@@ -264,10 +265,7 @@ GSocketError GSocket_SetServer(GSocket *sck)
     return GSOCK_IOERR;
   }
 
-  sck->m_server = TRUE;
-
   return GSOCK_NOERROR;
-     
 }
 
 /*
@@ -279,15 +277,19 @@ GSocket *GSocket_WaitConnection(GSocket *socket)
 
   assert(socket != NULL);
 
+  /* If the socket has already been created, we exit immediately */
   if (socket->m_fd == -1 || !socket->m_server) {
     socket->m_error = GSOCK_INVSOCK;
     return NULL;
   }
 
+  /* Reenable GSOCK_CONNECTION event */
   _GSocket_Enable(socket, GSOCK_CONNECTION);
 
+  /* Create a GSocket object for the new connection */
   connection = GSocket_new();
 
+  /* Accept the incoming connection */
   connection->m_fd = accept(socket->m_fd, NULL, NULL);
   if (connection->m_fd == -1) {
     GSocket_destroy(connection);
@@ -295,6 +297,7 @@ GSocket *GSocket_WaitConnection(GSocket *socket)
     return NULL;
   }
 
+  /* Initialize all fields */
   connection->m_stream   = TRUE;
   connection->m_server   = FALSE;
   connection->m_oriented = TRUE;
@@ -322,8 +325,10 @@ GSocketError GSocket_SetNonOriented(GSocket *sck)
   sck->m_server   = FALSE;
   sck->m_oriented = FALSE;
 
+  /* Create the socket */
   sck->m_fd = socket(sck->m_local->m_realfamily, SOCK_DGRAM, 0);
 
+  /* Bind it to the LOCAL address */
   if (bind(sck->m_fd, sck->m_local->m_addr, sck->m_local->m_len) < 0) {
     close(sck->m_fd);
     sck->m_fd    = -1;
@@ -357,6 +362,7 @@ GSocketError GSocket_Connect(GSocket *sck, GSocketStream stream)
     return GSOCK_INVADDR;
   }
 
+  /* Test whether we want the socket to be a stream (e.g. TCP) */
   sck->m_stream = (stream == GSOCK_STREAMED);
   sck->m_oriented = TRUE;
 
@@ -365,6 +371,7 @@ GSocketError GSocket_Connect(GSocket *sck, GSocketStream stream)
   else
     type = SOCK_DGRAM;
 
+  /* Create the socket */
   sck->m_fd = socket(sck->m_peer->m_realfamily, type, 0);
 
   if (sck->m_fd == -1) {
@@ -372,6 +379,7 @@ GSocketError GSocket_Connect(GSocket *sck, GSocketStream stream)
     return GSOCK_IOERR;
   }
 
+  /* Connect it to the PEER address */
   if (connect(sck->m_fd, sck->m_peer->m_addr,
               sck->m_peer->m_len) != 0) {
     close(sck->m_fd);
@@ -380,6 +388,7 @@ GSocketError GSocket_Connect(GSocket *sck, GSocketStream stream)
     return GSOCK_IOERR;
   }
   
+  /* It is not a server */
   sck->m_server = FALSE;
 
   return GSOCK_NOERROR;
@@ -397,9 +406,10 @@ int GSocket_Read(GSocket *socket, char *buffer, int size)
     return -1;
   }
 
+  /* Reenable GSOCK_INPUT event */
   _GSocket_Enable(socket, GSOCK_INPUT);
 
-  if (socket->m_oriented)
+  if (socket->m_stream)
     return _GSocket_Recv_Stream(socket, buffer, size);
   else
     return _GSocket_Recv_Dgram(socket, buffer, size);
@@ -417,7 +427,7 @@ int GSocket_Write(GSocket *socket, const char *buffer,
 
   _GSocket_Enable(socket, GSOCK_OUTPUT);
 
-  if (socket->m_oriented)
+  if (socket->m_stream)
     return _GSocket_Send_Stream(socket, buffer, size);
   else
     return _GSocket_Send_Dgram(socket, buffer, size);
@@ -502,6 +512,8 @@ void GSocket_SetFallback(GSocket *socket, GSocketEventFlags event,
   assert (socket != NULL);
 
   for (count=0;count<GSOCK_MAX_EVENT;count++) {
+    /* We test each flag and, if it is enabled, we enable the corresponding
+       event */
     if ((event & (1 << count)) != 0) {
       socket->m_fbacks[count] = fallback;
       socket->m_data[count] = cdata;
@@ -593,6 +605,7 @@ int _GSocket_Recv_Dgram(GSocket *socket, char *buffer, int size)
     return -1;
   }
 
+  /* Translate a system address into a GSocket address */
   if (!socket->m_peer)
     socket->m_peer = GAddress_new();
   _GAddress_translate_from(socket->m_peer, &from, fromlen);
@@ -634,6 +647,7 @@ int _GSocket_Send_Dgram(GSocket *socket, const char *buffer, int size)
     return -1;
   }
 
+  /* Frees memory allocated from _GAddress_translate_to */
   free(addr);
 
   return ret;
@@ -675,6 +689,10 @@ void _GSocket_Detected_Write(GSocket *socket)
  * -------------------------------------------------------------------------
  */
 
+/* CHECK_ADDRESS verifies that the current family is either GSOCK_NOFAMILY or
+ * GSOCK_*family*. In case it is GSOCK_NOFAMILY, it initializes address to be
+ * a GSOCK_*family*. In other cases, it returns GSOCK_INVADDR.
+ */
 #define CHECK_ADDRESS(address, family, retval) \
 { \
   if (address->m_family == GSOCK_NOFAMILY) \
@@ -804,10 +822,11 @@ GSocketError GAddress_INET_SetHostName(GAddress *address, const char *hostname)
 
   addr = &(((struct sockaddr_in *)address->m_addr)->sin_addr);
 
-  /* only name for the moment */
+  /* If it is a numeric host name, convert it now */
   if (inet_aton(hostname, addr) == 0) {
     struct in_addr *array_addr;
 
+    /* It is a real name, we solve it */
     if ((he = gethostbyname(hostname)) == NULL) {
       address->m_error = GSOCK_NOHOST;
       return GSOCK_NOHOST;
@@ -847,7 +866,6 @@ GSocketError GAddress_INET_SetPortName(GAddress *address, const char *port,
     return GSOCK_INVOP;
   }
  
-  /* TODO: TCP or UDP */
   se = getservbyname(port, protocol);
   if (!se) {
     if (isdigit(port[0])) {