]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/wxsocket/client.cpp
Makefile for mingw/gcc-2.95
[wxWidgets.git] / samples / wxsocket / client.cpp
index ffb17c4de8d4356b2e2aa5c2c4c3947201ef391c..4d14e9cb941f00b3a3094e1e4ea813ba02f8465c 100644 (file)
@@ -3,7 +3,7 @@
  * Purpose:    wxSocket: client demo
  * Author:     LAVAUX Guilhem
  * Created:    June 1997
- * Updated:    
+ * CVS ID:     $Id$
  * Copyright:  (c) 1997, LAVAUX Guilhem
  */
 
@@ -27,6 +27,8 @@
 #include "wx/socket.h"
 #include "wx/url.h"
 #include "wx/protocol/http.h"
+#include "wx/thread.h"
+#include "wx/progdlg.h"
 
 #if defined(__WXMOTIF__) || defined(__WXGTK__)
 #include "mondrian.xpm"
@@ -46,6 +48,7 @@ class MyFrame: public wxFrame
   DECLARE_CLASS(MyFrame)
 public:
   MyClient *sock;
+  int m_good;
 
   MyFrame(void);
   virtual ~MyFrame();
@@ -55,8 +58,11 @@ public:
   void OnQuitApp(wxCommandEvent& evt);
   void OnExecOpenConnection(wxCommandEvent& evt);
   void OnExecCloseConnection(wxCommandEvent& evt);
+  void OnSocketEvent(wxSocketEvent& evt);
   void UpdateStatus();
 
+  void Download(wxInputStream *input);
+
   DECLARE_EVENT_TABLE()
 };
 
@@ -71,7 +77,7 @@ class MyClient: public wxSocketClient
 public:
   MyFrame *frame;
 
-  void OnNotify(wxRequestNotify WXUNUSED(flags)) { frame->UpdateStatus(); }
+  void OnNotify(GSocketEventFlags WXUNUSED(flags)) { frame->UpdateStatus(); }
 };
 
 // ID for the menu quit command
@@ -82,6 +88,7 @@ const int SKDEMO_TEST2   = 104;
 const int SKDEMO_CLOSE   = 105;
 const int SKDEMO_TEST3   = 106;
 const int ID_TEST_CLOSE  = 107;
+const int SKDEMO_SCK     = 108;
 
 IMPLEMENT_APP(MyApp)
 
@@ -133,14 +140,10 @@ MyFrame::MyFrame():
   wxFrame(NULL, -1, "wxSocket client demo",
           wxDefaultPosition, wxSize(300, 200), wxDEFAULT_FRAME_STYLE)
 {
-  // Init all
-  wxSocketHandler::Master();
-
   sock = new MyClient();
   sock->SetFlags((wxSocketBase::wxSockFlags) (wxSocketBase::WAITALL | wxSocketBase::SPEED));
-  wxSocketHandler::Master().Register(sock);
   sock->frame = this;
-  sock->SetNotify(wxSocketBase::REQ_LOST);
+  sock->SetNotify(wxSOCKET_LOST_FLAG);
   CreateStatusBar(2);
   UpdateStatus();
 }
@@ -162,15 +165,13 @@ void MyFrame::OnExecOpenConnection(wxCommandEvent& WXUNUSED(evt))
   if (sock->IsConnected())
     sock->Close();
 
-/*
   wxString hname = wxGetTextFromUser("Enter the address of the wxSocket Sample Server", 
                                   "Connect ...", "localhost");
-*/
-  wxString hname = "localhost";
   addr.Hostname(hname);
   addr.Service(3000);
-  sock->SetNotify(0);
-  sock->Connect(addr, TRUE);
+  sock->Connect(addr, FALSE);
+  sock->WaitOnConnect(10);
+  sock->SetFlags(wxSocketBase::NONE);
   if (!sock->IsConnected())
     wxMessageBox("Can't connect to the specified host", "Alert !");
 
@@ -179,8 +180,7 @@ void MyFrame::OnExecOpenConnection(wxCommandEvent& WXUNUSED(evt))
 
 void MyFrame::OnExecCloseConnection(wxCommandEvent& WXUNUSED(evt))
 {
-  if (sock)
-    sock->Close();
+  sock->Close();
   UpdateStatus();
 }
 
@@ -191,8 +191,23 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
   EVT_MENU(SKDEMO_QUIT, MyFrame::OnQuitApp)
   EVT_MENU(SKDEMO_CONNECT, MyFrame::OnExecOpenConnection)
   EVT_MENU(SKDEMO_CLOSE, MyFrame::OnExecCloseConnection)
+  EVT_SOCKET(SKDEMO_SCK, MyFrame::OnSocketEvent)
 END_EVENT_TABLE()
 
+class MyFrameSocketTimer: public wxTimer {
+ public:
+  void Notify() {
+    *m_var = 0;
+  }
+
+  int *m_var;
+};
+
+void MyFrame::OnSocketEvent(wxSocketEvent& evt)
+{
+  m_good = 1;
+}
+
 void MyFrame::OnCloseTest(wxCommandEvent& evt)
 {
   wxButton *button = (wxButton *)evt.GetEventObject();
@@ -223,7 +238,7 @@ void MyFrame::OnExecTest1(wxCommandEvent& WXUNUSED(evt))
   if (!sock->IsConnected())
     return;
 
-  wxDialog *dlgbox = new wxDialog(this, -1, "Test 1", wxDefaultPosition, wxSize(414, 250));
+  wxDialog *dlgbox = new wxDialog(this, -1, "Test 1", wxDefaultPosition, wxSize(414, 280));
   wxTextCtrl *text_win = new wxTextCtrl(dlgbox, -1, "",
                                         wxPoint(0, 0), wxSize(400, 200),
                                        wxTE_MULTILINE);
@@ -262,7 +277,44 @@ void MyFrame::OnExecTest1(wxCommandEvent& WXUNUSED(evt))
     sock->Close();
     UpdateStatus();
   } else
-    text_win->WriteText("done\nTest 1 passed !\n");
+    text_win->WriteText("done\nTest 1A passed !\n");
+
+  /* No 2 */
+  sock->SetEventHandler(*this, SKDEMO_SCK);
+  sock->SetNotify(wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG);
+  sock->Notify(TRUE);
+  text_win->WriteText("Test 1B: sending bytes to the server\n");
+  if (!sock->IsData())
+    text_win->WriteText("No data to read yet (this is OK)\n");
+
+  wxYield();
+  sock->Write((char *)buf, wxStrlen(buf)+1);
+  text_win->WriteText("Waiting for incoming bytes (timeout = 2 sec) ...");
+  wxYield();
+  
+  m_good = 2;
+
+  MyFrameSocketTimer timer;
+
+  timer.m_var = &m_good; 
+  timer.Start(2000, TRUE);
+
+  while (m_good == 2)
+   wxYield();
+
+  if (!m_good) {
+    text_win->WriteText("timeout ! Failed.\n");
+    sock->Close();
+    UpdateStatus();
+  } else
+    text_win->WriteText("event ! (no timeout).\n");
+
+  if (sock->IsData())
+    text_win->WriteText("Data is available, as expected...\n");
+
+  sock->Read((char *)buf2, wxStrlen(buf)+1);
+
+  text_win->WriteText("Success!\n");
 
   dlgbox->Layout();
   dlgbox->ShowModal();
@@ -273,6 +325,48 @@ void MyFrame::OnExecTest1(wxCommandEvent& WXUNUSED(evt))
   delete dlgbox;
 }
 
+
+void MyFrame::Download(wxInputStream *input)
+{
+  wxProgressDialog progress("Downloading ...", "0% downloaded");
+  wxFileOutputStream f_out("test.url");
+  size_t downloaded;
+  int BUFSIZE, bytes_read;
+  size_t file_size;
+  wxString message;
+  int percents;
+
+  char *buf;
+
+  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 = input->Read(buf, BUFSIZE).LastRead();
+    f_out.Write(buf, bytes_read);
+    downloaded += bytes_read;
+
+    percents = downloaded * 100 / file_size;
+
+    message = _T("");
+    message << percents << _T("% downloaded");
+    progress.Update(percents, message);
+  }
+
+  delete[] buf;   
+}
+
 void MyFrame::OnExecUrlTest(wxCommandEvent& WXUNUSED(evt))
 {
   wxString urlname = wxGetTextFromUser("Enter an URL to get",
@@ -281,14 +375,13 @@ void MyFrame::OnExecUrlTest(wxCommandEvent& WXUNUSED(evt))
   wxURL url(urlname);
   wxInputStream *datas = url.GetInputStream();
 
-  if (!datas)
-    wxMessageBox("Error in getting data from the URL.", "Alert !");
-  else {
-    wxFileOutputStream *str_out = new wxFileOutputStream("test.url");
-    str_out->Write(*datas);
+  if (!datas) {
+    wxString error;
+    error.Printf(_T("Error in getting data from the URL. (error = %d)"), url.GetError());
+    wxMessageBox(error, "Alert !");
+  } else {
+    Download(datas);
 
-    wxMessageBox("Success !! Click on OK to see the text.", "OK");
     delete datas;
-    delete str_out;
   }
 }