]> git.saurik.com Git - wxWidgets.git/blob - samples/wxsocket/server.cpp
* Committing new wxSocket core (socket.cpp sckint.cpp). It has to be improved ...
[wxWidgets.git] / samples / wxsocket / server.cpp
1 /*
2 * File: server.cpp
3 * Purpose: wxSocket: server demo
4 * Author: LAVAUX Guilhem
5 * Created: June 1997
6 * Updated:
7 * Copyright: (C) 1997, LAVAUX Guilhem
8 */
9
10 #ifdef __GNUG__
11 #pragma implementation
12 #pragma interface
13 #endif
14
15 // For compilers that support precompilation, includes "wx.h".
16 #include "wx/wxprec.h"
17
18 #ifdef __BORLANDC__
19 #pragma hdrstop
20 #endif
21
22 #ifndef WX_PRECOMP
23 #include "wx/wx.h"
24 #endif
25
26 #include "wx/socket.h"
27
28 #if defined(__WXMOTIF__) || defined(__WXGTK__)
29 #include "mondrian.xpm"
30 #endif
31
32 // Define a new application type
33 class MyApp: public wxApp
34 { public:
35 bool OnInit(void);
36 };
37
38 class MyServer;
39
40 // Define a new frame type
41 class MyFrame: public wxFrame
42 {
43 DECLARE_EVENT_TABLE()
44 public:
45 wxSocketServer *sock;
46 int nb_clients;
47
48 MyFrame(wxFrame *frame);
49 virtual ~MyFrame();
50 void Menu_Exit(wxCommandEvent& evt);
51 void OnSockRequest(wxSocketEvent& evt);
52 void OnSockRequestServer(wxSocketEvent& evt);
53 void ExecTest1(wxSocketBase *sock_o);
54 void UpdateStatus(int incr);
55 };
56
57 #define SKDEMO_QUIT 101
58 #define SKDEMO_SOCKET_SERV 102
59 #define SKDEMO_SOCKET 103
60
61 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
62 EVT_MENU(SKDEMO_QUIT, MyFrame::Menu_Exit)
63 EVT_SOCKET(SKDEMO_SOCKET_SERV, MyFrame::OnSockRequestServer)
64 EVT_SOCKET(SKDEMO_SOCKET, MyFrame::OnSockRequest)
65 END_EVENT_TABLE()
66
67 IMPLEMENT_APP(MyApp)
68
69 // `Main program' equivalent, creating windows and returning main app frame
70 bool MyApp::OnInit(void)
71 {
72 // Create the main frame window
73 MyFrame *frame = new MyFrame(NULL);
74
75 // Give it an icon
76 frame->SetIcon(wxICON(mondrian));
77
78 // Make a menubar
79 wxMenu *file_menu = new wxMenu;
80
81 file_menu->Append(SKDEMO_QUIT, "E&xit");
82 wxMenuBar *menu_bar = new wxMenuBar;
83 menu_bar->Append(file_menu, "File");
84 frame->SetMenuBar(menu_bar);
85
86 // Make a panel with a message
87 (void)new wxPanel(frame, 0, 0, 300, 100);
88
89 // Show the frame
90 frame->Show(TRUE);
91
92 // Return the main frame window
93 return TRUE;
94 }
95
96 extern wxList wxPendingDelete;
97
98 void MyFrame::OnSockRequest(wxSocketEvent& evt)
99 {
100 wxSocketBase *sock = evt.Socket();
101
102 printf("OnSockRequest OK\n");
103 printf("OnSockRequest (event = %d)\n",evt.SocketEvent());
104 switch (evt.SocketEvent()) {
105 case wxSocketBase::EVT_READ:
106 unsigned char c;
107
108 sock->Read((char *)&c, 1);
109 if (c == 0xbe)
110 ExecTest1(sock);
111
112 break;
113 case wxSocketBase::EVT_LOST:
114 UpdateStatus(-1);
115 printf("Destroying socket\n");
116 wxPendingDelete.Append(sock);
117 return;
118 break;
119 }
120 printf("OnSockRequest Exiting\n");
121 sock->SetNotify(wxSocketBase::REQ_READ | wxSocketBase::REQ_LOST);
122 }
123
124 void MyFrame::OnSockRequestServer(wxSocketEvent& evt)
125 {
126 wxSocketBase *sock2;
127 wxSocketServer *server = (wxSocketServer *) evt.Socket();
128
129 printf("OnSockRequestServer OK\n");
130
131 sock2 = server->Accept();
132 if (sock2 == NULL)
133 return;
134
135 sock2->SetFlags(wxSocketBase::NONE);
136 sock2->Notify(TRUE);
137 sock2->SetEventHandler(*this, SKDEMO_SOCKET);
138 server->SetNotify(wxSocketBase::REQ_ACCEPT);
139 UpdateStatus(1);
140 }
141
142 // My frame Constructor
143 MyFrame::MyFrame(wxFrame *frame):
144 wxFrame(frame, -1, "wxSocket sample (server)", wxDefaultPosition,
145 wxSize(300, 200))
146 {
147 wxIPV4address addr;
148 addr.Service(3000);
149
150 // Init all
151 wxSocketHandler::Master();
152
153 sock = new wxSocketServer(addr);
154 wxSocketHandler::Master().Register(sock);
155 sock->SetNotify(wxSocketBase::REQ_ACCEPT);
156 sock->SetEventHandler(*this, SKDEMO_SOCKET_SERV);
157 sock->Notify(TRUE);
158 nb_clients = 0;
159
160 CreateStatusBar(1);
161 UpdateStatus(0);
162 }
163
164 MyFrame::~MyFrame()
165 {
166 delete sock;
167 }
168
169 // Intercept menu commands
170 void MyFrame::Menu_Exit(wxCommandEvent& WXUNUSED(event))
171 {
172 Close(TRUE);
173 }
174
175 void MyFrame::ExecTest1(wxSocketBase *sock_o)
176 {
177 char *buf = new char[50];
178 size_t l;
179
180 l = sock_o->Read(buf, 50).LastCount();
181 sock_o->Write(buf, l);
182 }
183
184 void MyFrame::UpdateStatus(int incr)
185 {
186 char s[30];
187 nb_clients += incr;
188 sprintf(s, "%d clients connected", nb_clients);
189 SetStatusText(s);
190 }