X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a737331db68b754c8bf31fa0a15f6d1f207b40bf..0045dee3f4992cfb5226e74338a9b354d32fffbe:/samples/wxsocket/client.cpp diff --git a/samples/wxsocket/client.cpp b/samples/wxsocket/client.cpp index bbda2d7525..4d14e9cb94 100644 --- a/samples/wxsocket/client.cpp +++ b/samples/wxsocket/client.cpp @@ -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::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(); } @@ -166,8 +169,9 @@ void MyFrame::OnExecOpenConnection(wxCommandEvent& WXUNUSED(evt)) "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 !"); @@ -176,8 +180,7 @@ void MyFrame::OnExecOpenConnection(wxCommandEvent& WXUNUSED(evt)) void MyFrame::OnExecCloseConnection(wxCommandEvent& WXUNUSED(evt)) { - if (sock) - sock->Close(); + sock->Close(); UpdateStatus(); } @@ -188,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(); @@ -220,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); @@ -259,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(); @@ -270,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", @@ -278,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; } }