* Purpose: wxSocket: client demo
* Author: LAVAUX Guilhem
* Created: June 1997
- * Updated:
+ * CVS ID: $Id$
* Copyright: (c) 1997, LAVAUX Guilhem
*/
#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"
DECLARE_CLASS(MyFrame)
public:
MyClient *sock;
+ int m_good;
MyFrame(void);
virtual ~MyFrame();
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()
};
public:
MyFrame *frame;
- void OnNotify(wxRequestNotify WXUNUSED(flags)) { frame->UpdateStatus(); }
+ void OnNotify(GSocketEventFlags WXUNUSED(flags)) { frame->UpdateStatus(); }
};
// ID for the menu quit command
const int SKDEMO_CLOSE = 105;
const int SKDEMO_TEST3 = 106;
const int ID_TEST_CLOSE = 107;
+const int SKDEMO_SCK = 108;
IMPLEMENT_APP(MyApp)
wxFrame(NULL, -1, "wxSocket client demo",
wxDefaultPosition, wxSize(300, 200), wxDEFAULT_FRAME_STYLE)
{
- // Init all
- wxSocketHandler::Master();
-
sock = new MyClient();
- sock->SetFlags(wxSocketBase::WAITALL);
- wxSocketHandler::Master().Register(sock);
+ sock->SetFlags((wxSocketBase::wxSockFlags) (wxSocketBase::WAITALL | wxSocketBase::SPEED));
sock->frame = this;
- sock->SetNotify(wxSocketBase::REQ_LOST);
+ sock->SetNotify(wxSOCKET_LOST_FLAG);
CreateStatusBar(2);
UpdateStatus();
}
"Connect ...", "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 !");
void MyFrame::OnExecCloseConnection(wxCommandEvent& WXUNUSED(evt))
{
- if (sock)
- sock->Close();
+ sock->Close();
UpdateStatus();
}
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();
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);
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();
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",
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;
}
}