* Adding sckint.cpp to various makefiles. * Fixes in threadpsx.cpp (Pause/Resume) * Fixes in threaded event dispatching * Added Clone() to wxObject * Implemented Clone() in wxEvent and wxSocketEvent * wxSocket sample save the data got from the URL in test.url (this will change) * As I only tested wxSocket on Linux Redhat 5.2 I disabled it by default on Windows, Mac and Unix platforms. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2289 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			292 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			292 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * File:	client.cpp
 | |
|  * Purpose:	wxSocket: client demo
 | |
|  * Author:	LAVAUX Guilhem
 | |
|  * Created:	June 1997
 | |
|  * Updated:	
 | |
|  * Copyright:	(c) 1997, LAVAUX Guilhem
 | |
|  */
 | |
| 
 | |
| #ifdef __GNUG__
 | |
| #pragma implementation
 | |
| #pragma interface
 | |
| #endif
 | |
| 
 | |
| // For compilers that support precompilation, includes "wx.h".
 | |
| #include "wx/wxprec.h"
 | |
| 
 | |
| #ifdef __BORLANDC__
 | |
| #pragma hdrstop
 | |
| #endif
 | |
| 
 | |
| #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"
 | |
| 
 | |
| #if defined(__WXMOTIF__) || defined(__WXGTK__)
 | |
| #include "mondrian.xpm"
 | |
| #endif
 | |
| 
 | |
| // Define a new application type
 | |
| class MyApp: public wxApp
 | |
| { public:
 | |
|     virtual bool OnInit(void);
 | |
| };
 | |
| 
 | |
| class MyClient;
 | |
| 
 | |
| // Define a new frame type
 | |
| class MyFrame: public wxFrame
 | |
| { 
 | |
|   DECLARE_CLASS(MyFrame)
 | |
| public:
 | |
|   MyClient *sock;
 | |
| 
 | |
|   MyFrame(void);
 | |
|   virtual ~MyFrame();
 | |
|   void OnCloseTest(wxCommandEvent& evt);
 | |
|   void OnExecTest1(wxCommandEvent& evt);
 | |
|   void OnExecUrlTest(wxCommandEvent& evt);
 | |
|   void OnQuitApp(wxCommandEvent& evt);
 | |
|   void OnExecOpenConnection(wxCommandEvent& evt);
 | |
|   void OnExecCloseConnection(wxCommandEvent& evt);
 | |
|   void UpdateStatus();
 | |
| 
 | |
|   DECLARE_EVENT_TABLE()
 | |
| };
 | |
| 
 | |
| 
 | |
| IMPLEMENT_CLASS(MyFrame, wxFrame)
 | |
| 
 | |
| /*
 | |
|  * Define a new derived SocketClient
 | |
|  */
 | |
| class MyClient: public wxSocketClient
 | |
| {
 | |
| public:
 | |
|   MyFrame *frame;
 | |
| 
 | |
|   void OnNotify(wxRequestNotify WXUNUSED(flags)) { frame->UpdateStatus(); }
 | |
| };
 | |
| 
 | |
| // ID for the menu quit command
 | |
| 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)
 | |
| 
 | |
| /*
 | |
|  * `Main program' equivalent, creating windows and returning main app frame
 | |
|  */
 | |
| bool MyApp::OnInit(void)
 | |
| {
 | |
|   // Create the main frame window
 | |
|   MyFrame *frame = new MyFrame();
 | |
| 
 | |
|   // Give it an icon
 | |
|   frame->SetIcon(wxICON(mondrian));
 | |
| 
 | |
|   // Make a menubar
 | |
|   wxMenu *file_menu = new wxMenu();
 | |
| 
 | |
|   file_menu->Append(SKDEMO_QUIT, "Exit");
 | |
|   wxMenuBar *menu_bar = new wxMenuBar;
 | |
|   menu_bar->Append(file_menu, "File");
 | |
| 
 | |
|   wxMenu *socket_menu = new wxMenu();
 | |
|   socket_menu->Append(SKDEMO_CONNECT, "Open session");
 | |
|   socket_menu->AppendSeparator();
 | |
|   socket_menu->Append(SKDEMO_TEST1, "Start test 1");
 | |
|   socket_menu->AppendSeparator();
 | |
|   socket_menu->Append(SKDEMO_CLOSE, "Close session");
 | |
|   socket_menu->AppendSeparator();
 | |
|   socket_menu->Append(SKDEMO_TEST3, "Start URL test");
 | |
| 
 | |
|   menu_bar->Append(socket_menu, "Socket");
 | |
| 
 | |
|   frame->SetMenuBar(menu_bar);
 | |
| 
 | |
|   // Make a panel with a message
 | |
|   (void)new wxPanel(frame, -1, wxPoint(0, 0), wxSize(300, 100));
 | |
| 
 | |
|   // Show the frame
 | |
|   frame->Show(TRUE);
 | |
|   
 | |
|   // Return the main frame window
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * MyFrame Constructor
 | |
|  */
 | |
| 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->frame = this;
 | |
|   sock->SetNotify(wxSocketBase::REQ_LOST);
 | |
|   CreateStatusBar(2);
 | |
|   UpdateStatus();
 | |
| }
 | |
| 
 | |
| MyFrame::~MyFrame()
 | |
| {
 | |
|   delete sock;
 | |
| }
 | |
| 
 | |
| void MyFrame::OnQuitApp(wxCommandEvent& WXUNUSED(evt))
 | |
| {
 | |
|   Close(TRUE);
 | |
| }
 | |
| 
 | |
| void MyFrame::OnExecOpenConnection(wxCommandEvent& WXUNUSED(evt))
 | |
| {
 | |
|   wxIPV4address addr;
 | |
|     
 | |
|   if (sock->IsConnected())
 | |
|     sock->Close();
 | |
| 
 | |
|   wxString hname = wxGetTextFromUser("Enter the address of the wxSocket Sample Server", 
 | |
|                                   "Connect ...", "localhost");
 | |
|   addr.Hostname(hname);
 | |
|   addr.Service(3000);
 | |
|   sock->SetNotify(0);
 | |
|   sock->Connect(addr, TRUE);
 | |
|   if (!sock->IsConnected())
 | |
|     wxMessageBox("Can't connect to the specified host", "Alert !");
 | |
| 
 | |
|   UpdateStatus();
 | |
| }
 | |
| 
 | |
| void MyFrame::OnExecCloseConnection(wxCommandEvent& WXUNUSED(evt))
 | |
| {
 | |
|   if (sock)
 | |
|     sock->Close();
 | |
|   UpdateStatus();
 | |
| }
 | |
| 
 | |
| BEGIN_EVENT_TABLE(MyFrame, wxFrame)
 | |
|   EVT_BUTTON(ID_TEST_CLOSE, MyFrame::OnCloseTest)
 | |
|   EVT_MENU(SKDEMO_TEST1, MyFrame::OnExecTest1)
 | |
|   EVT_MENU(SKDEMO_TEST3, MyFrame::OnExecUrlTest)
 | |
|   EVT_MENU(SKDEMO_QUIT, MyFrame::OnQuitApp)
 | |
|   EVT_MENU(SKDEMO_CONNECT, MyFrame::OnExecOpenConnection)
 | |
|   EVT_MENU(SKDEMO_CLOSE, MyFrame::OnExecCloseConnection)
 | |
| END_EVENT_TABLE()
 | |
| 
 | |
| void MyFrame::OnCloseTest(wxCommandEvent& evt)
 | |
| {
 | |
|   wxButton *button = (wxButton *)evt.GetEventObject();
 | |
|   wxDialog *dlg = (wxDialog *)button->GetParent();
 | |
| 
 | |
|   dlg->EndModal(0);
 | |
| }
 | |
| 
 | |
| void MyFrame::UpdateStatus()
 | |
| {
 | |
|   if (!sock->IsConnected()) {
 | |
|     SetStatusText("Not connected", 0);
 | |
|     SetStatusText("", 1);
 | |
|   } else {
 | |
|     wxIPV4address addr;
 | |
|     wxChar s[100];
 | |
| 
 | |
|     sock->GetPeer(addr);
 | |
|     wxSprintf(s, _T("Connected to %s"), WXSTRINGCAST addr.Hostname());
 | |
|     SetStatusText(s, 0);
 | |
|     wxSprintf(s, _T("Service: %d"), addr.Service());
 | |
|     SetStatusText(s, 1);
 | |
|   } 
 | |
| }
 | |
| 
 | |
| void MyFrame::OnExecTest1(wxCommandEvent& WXUNUSED(evt))
 | |
| {
 | |
|   if (!sock->IsConnected())
 | |
|     return;
 | |
| 
 | |
|   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, -1));
 | |
|   wxChar *buf, *buf2;
 | |
| 
 | |
|   dlgbox->Layout();
 | |
|   dlgbox->Show(TRUE);
 | |
| 
 | |
|   text_win->WriteText("Initializing test 1 ...\n");
 | |
|   
 | |
|   wxYield();
 | |
|   
 | |
|   /* Init */
 | |
|   buf = copystring(_T("Hi ! Hi ! Hi !\n"));
 | |
|   buf2 = new wxChar[wxStrlen(buf)+1];
 | |
|   char c = 0xbe;
 | |
|   sock->Write(&c, 1);
 | |
| 
 | |
|   /* No 1 */
 | |
|   text_win->WriteText("Sending some byte to the server ...");
 | |
|   wxYield();
 | |
|   sock->Write((char *)buf, wxStrlen(buf)+1);
 | |
|   text_win->WriteText("done\n");
 | |
|   wxYield();
 | |
|   text_win->WriteText("Receiving some byte from the server ...");
 | |
|   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, wxStrlen(buf)+1) != 0) {
 | |
|     text_win->WriteText("Fail\n");
 | |
|     sock->Close();
 | |
|     UpdateStatus();
 | |
|   } else
 | |
|     text_win->WriteText("done\nTest 1 passed !\n");
 | |
| 
 | |
|   dlgbox->Layout();
 | |
|   dlgbox->ShowModal();
 | |
| 
 | |
|   delete [] buf;
 | |
|   delete [] buf2;
 | |
|   delete text_win;
 | |
|   delete dlgbox;
 | |
| }
 | |
| 
 | |
| void MyFrame::OnExecUrlTest(wxCommandEvent& WXUNUSED(evt))
 | |
| {
 | |
|   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 {
 | |
|     wxFileOutputStream *str_out = new wxFileOutputStream("test.url");
 | |
|     str_out->Write(*datas);
 | |
| 
 | |
|     wxMessageBox("Success !! Click on OK to see the text.", "OK");
 | |
|     delete datas;
 | |
|     delete str_out;
 | |
|   }
 | |
| }
 |