/*
* File: client.cpp
* Purpose: wxSocket: client demo
- * Author: LAVAUX Guilhem (from minimal.cc)
+ * Author: LAVAUX Guilhem
* Created: June 1997
- * Updated:
- * Copyright: (c) 1993, AIAI, University of Edinburgh
- * (C) 1997, LAVAUX Guilhem
+ * CVS ID: $Id$
+ * Copyright: (c) 1997, LAVAUX Guilhem
*/
+
#ifdef __GNUG__
#pragma implementation
#pragma interface
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
+
+#include "wx/wfstream.h"
#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"
+#endif
// Define a new application type
class MyApp: public wxApp
void OnExecCloseConnection(wxCommandEvent& 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 SKDEMO_QUIT = 101;
-const SKDEMO_CONNECT = 102;
-const SKDEMO_TEST1 = 103;
-const SKDEMO_TEST2 = 104;
-const SKDEMO_CLOSE = 105;
-const SKDEMO_TEST3 = 106;
-const ID_TEST_CLOSE = 107;
+const int SKDEMO_QUIT = 101;
+const int SKDEMO_CONNECT = 102;
+const int SKDEMO_TEST1 = 103;
+const int SKDEMO_TEST2 = 104;
+const int SKDEMO_CLOSE = 105;
+const int SKDEMO_TEST3 = 106;
+const int ID_TEST_CLOSE = 107;
IMPLEMENT_APP(MyApp)
MyFrame *frame = new MyFrame();
// Give it an icon
-#ifdef wx_msw
- frame->SetIcon(new wxIcon("mondrian"));
-#endif
-#ifdef wx_x
- frame->SetIcon(new wxIcon("mondrian.xbm"));
-#endif
+ frame->SetIcon(wxICON(mondrian));
// Make a menubar
wxMenu *file_menu = new wxMenu();
socket_menu->Append(SKDEMO_CONNECT, "Open session");
socket_menu->AppendSeparator();
socket_menu->Append(SKDEMO_TEST1, "Start test 1");
- socket_menu->Append(SKDEMO_TEST2, "Start test 2");
socket_menu->AppendSeparator();
socket_menu->Append(SKDEMO_CLOSE, "Close session");
socket_menu->AppendSeparator();
frame->SetMenuBar(menu_bar);
// Make a panel with a message
- (void)new wxPanel(frame, 0, 0, 300, 100);
+ (void)new wxPanel(frame, -1, wxPoint(0, 0), wxSize(300, 100));
// Show the frame
frame->Show(TRUE);
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(GSOCK_LOST_FLAG);
CreateStatusBar(2);
UpdateStatus();
}
addr.Service(3000);
sock->SetNotify(0);
sock->Connect(addr, TRUE);
+ 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();
}
SetStatusText("", 1);
} else {
wxIPV4address addr;
- char s[100];
+ wxChar s[100];
sock->GetPeer(addr);
- sprintf(s, "Connected to %s", (const char *)addr.Hostname());
+ wxSprintf(s, _T("Connected to %s"), WXSTRINGCAST addr.Hostname());
SetStatusText(s, 0);
- sprintf(s, "Service: %d", addr.Service());
+ wxSprintf(s, _T("Service: %d"), addr.Service());
SetStatusText(s, 1);
}
}
if (!sock->IsConnected())
return;
- wxDialog *dlgbox = new wxDialog(this, -1, "Test 1", wxDefaultPosition, wxSize(410, 270));
+ wxDialog *dlgbox = new wxDialog(this, -1, "Test 1", wxDefaultPosition, wxSize(414, 250));
wxTextCtrl *text_win = new wxTextCtrl(dlgbox, -1, "",
wxPoint(0, 0), wxSize(400, 200),
wxTE_MULTILINE);
(void)new wxButton(dlgbox, ID_TEST_CLOSE, "Close",
- wxPoint(100, 210), wxSize(100, 40));
- char *buf, *buf2;
+ wxPoint(100, 210), wxSize(100, -1));
+ wxChar *buf, *buf2;
dlgbox->Layout();
dlgbox->Show(TRUE);
text_win->WriteText("Initializing test 1 ...\n");
+ wxYield();
+
/* Init */
- buf = copystring("Salut ! Salut ! Salut ! Salut Toto\n");
- buf2 = new char[strlen(buf)+1];
+ buf = copystring(_T("Hi ! Hi ! Hi !\n"));
+ buf2 = new wxChar[wxStrlen(buf)+1];
char c = 0xbe;
- sock->WriteMsg(&c, 1);
+ sock->Write(&c, 1);
/* No 1 */
text_win->WriteText("Sending some byte to the server ...");
- sock->Write(buf, strlen(buf)+1);
+ wxYield();
+ sock->Write((char *)buf, wxStrlen(buf)+1);
text_win->WriteText("done\n");
+ wxYield();
text_win->WriteText("Receiving some byte from the server ...");
- sock->Read(buf2, strlen(buf)+1);
+ wxYield();
+ sock->Read((char *)buf2, wxStrlen(buf)+1);
text_win->WriteText("done\n");
+ wxYield();
text_win->WriteText("Comparing the two buffers ...");
- if (memcmp(buf, buf2, strlen(buf)+1) != 0) {
+ if (memcmp(buf, buf2, wxStrlen(buf)+1) != 0) {
text_win->WriteText("Fail\n");
sock->Close();
UpdateStatus();
delete dlgbox;
}
+
+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;
+ wxString message;
+ int percents;
+
+ char *buf;
+
+// TODO: Support for streams which don't support StreamSize
+
+ buf = new char[BUFSIZE];
+
+ downloaded = 0;
+ bytes_read = BUFSIZE;
+ while (downloaded < file_size && bytes_read != 0) {
+ bytes_read = buf_in.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 the address of the wxSocket Sample Server",
- "Connect ...", "localhost");
+ wxString urlname = wxGetTextFromUser("Enter an URL to get",
+ "URL:", "http://localhost");
wxURL url(urlname);
wxInputStream *datas = url.GetInputStream();
- if (!datas)
- wxMessageBox("Error in getting data from the URL.", "Alert !");
- else {
- wxMessageBox("Success !!", "OK !");
+ if (!datas) {
+ wxString error;
+ error.Printf(_T("Error in getting data from the URL. (error = %d)"), url.GetError());
+ wxMessageBox(error, "Alert !");
+ } else {
+ Download(datas);
+
delete datas;
}
}