3491020dd5218fcfe2fc9542892a9f1ce5a12b84
[matches/honours.git] / research / transmission_spectroscopy / TOF / Win32++ / samples / Networking / ClientDlg / ClientDialog.cpp
1 ///////////////////////////////////////\r
2 // ClientDialog.cpp\r
3 \r
4 #include "stdafx.h"\r
5 #include "ClientDialog.h"\r
6 #include "resource.h"\r
7 \r
8 \r
9 // Definitions for the CMyDialog class\r
10 CClientDialog::CClientDialog(UINT nResID, CWnd* pParent) :\r
11                 CDialog(nResID, pParent), m_bClientConnected(FALSE), m_SocketType(SOCK_STREAM)\r
12 {\r
13         // Add support for the IP Address control\r
14         // It requires Win95 with IE4 intergrated or a later version of Windows OS.\r
15         LoadCommonControlsEx();\r
16 }\r
17 \r
18 CClientDialog::~CClientDialog()\r
19 {\r
20 }\r
21 \r
22 void CClientDialog::Append(int nID, LPCTSTR buf)\r
23 {\r
24         // This function appends text to an edit control\r
25 \r
26         // Append Line Feed\r
27         int ndx = (int)SendDlgItemMessage(nID, WM_GETTEXTLENGTH, 0, 0);\r
28         if (ndx)\r
29         {\r
30                 SendDlgItemMessage(nID, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);\r
31                 SendDlgItemMessage(nID, EM_REPLACESEL, 0, (LPARAM) (_T("\r\n")));\r
32         }\r
33 \r
34         // Append text\r
35         ndx = (int)SendDlgItemMessage(nID, WM_GETTEXTLENGTH, 0, 0);\r
36         SendDlgItemMessage(nID, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);\r
37         SendDlgItemMessage(nID, EM_REPLACESEL, 0, (LPARAM) buf);\r
38 }\r
39 \r
40 INT_PTR CClientDialog::DialogProc(UINT uMsg, WPARAM wParam, LPARAM lParam)\r
41 {\r
42         switch (uMsg)\r
43         {\r
44         case USER_CONNECT:\r
45                 OnClientConnect();\r
46                 break;\r
47         case USER_DISCONNECT:\r
48                 OnClientDisconnect();\r
49                 break;\r
50         case USER_RECEIVE:\r
51                 OnClientReceive();\r
52                 break;\r
53         case WM_ACTIVATE:\r
54                 // Give focus to the Send Edit box\r
55                 SendMessage(WM_NEXTDLGCTL, (WPARAM)(HWND)m_EditSend, TRUE);\r
56                 break;\r
57         case WM_DESTROY:\r
58                 PostQuitMessage(0);\r
59                 break;\r
60         }\r
61 \r
62         // Pass unhandled messages on to parent DialogProc\r
63         return DialogProcDefault(uMsg, wParam, lParam);\r
64 }\r
65 \r
66 void CClientDialog::OnClientDisconnect()\r
67 {\r
68         // Called when the socket is disconnected from the server\r
69         m_bClientConnected = FALSE;\r
70         m_ButtonConnect.EnableWindow( TRUE );\r
71 \r
72         // Update the dialog\r
73         m_EditStatus.SetWindowText( _T("Disconnected from server") );\r
74         m_ButtonSend.EnableWindow( FALSE );\r
75         m_EditSend.EnableWindow( FALSE );\r
76         m_EditPort.EnableWindow( TRUE );\r
77         m_IP4Address.EnableWindow( TRUE );\r
78         m_RadioTCP.EnableWindow( TRUE );\r
79         m_RadioUDP.EnableWindow( TRUE );\r
80         m_RadioIP4.EnableWindow( TRUE );\r
81         m_ButtonConnect.SetWindowText( _T("Connect") );\r
82         if ( m_Client.IsIPV6Supported() )\r
83         {\r
84                 m_EditIP6Address.EnableWindow( TRUE );\r
85                 m_RadioIP6.EnableWindow( TRUE );\r
86         }\r
87 }\r
88 \r
89 void CClientDialog::LoadCommonControlsEx()\r
90 {\r
91         // This function adds support for the IP address control in the dialog.\r
92         HMODULE hComCtl;\r
93 \r
94         try\r
95         {\r
96                 // Load the Common Controls DLL\r
97                 hComCtl = ::LoadLibrary(_T("COMCTL32.DLL"));\r
98                 if (!hComCtl)\r
99                         throw CWinException(_T("Failed to load COMCTL32.DLL"));\r
100 \r
101                 if (GetComCtlVersion() > 470)\r
102                 {\r
103                         // Declare a pointer to the InItCommonControlsEx function\r
104                         typedef BOOL WINAPI INIT_EX(INITCOMMONCONTROLSEX*);\r
105                         INIT_EX* pfnInit = (INIT_EX*)::GetProcAddress(hComCtl, "InitCommonControlsEx");\r
106 \r
107                         // Call InitCommonControlsEx\r
108                         INITCOMMONCONTROLSEX InitStruct;\r
109                         InitStruct.dwSize = sizeof(INITCOMMONCONTROLSEX);\r
110                         InitStruct.dwICC = ICC_INTERNET_CLASSES;\r
111                         if((!(*pfnInit)(&InitStruct)))\r
112                                 throw CWinException(_T("InitCommonControlsEx failed"));\r
113                 }\r
114                 else\r
115                 {\r
116                         ::MessageBox(NULL, _T("IP Address Control not supported!"), _T("Error"), MB_OK);\r
117                 }\r
118 \r
119                 ::FreeLibrary(hComCtl);\r
120         }\r
121 \r
122         catch (const CWinException &e)\r
123         {\r
124                 e.what();\r
125                 if (hComCtl)\r
126                         ::FreeLibrary(hComCtl);\r
127         }\r
128 }\r
129 \r
130 \r
131 void CClientDialog::OnClientConnect()\r
132 {\r
133         // Called when the connection to the server is established\r
134         m_bClientConnected = TRUE;\r
135         m_ButtonConnect.EnableWindow( TRUE );\r
136 \r
137         // Move focus to the Send Edit box\r
138         SendMessage(WM_NEXTDLGCTL, (WPARAM)(HWND)m_EditSend, TRUE);\r
139         SetForegroundWindow();\r
140 \r
141         // Update the dialog\r
142         m_IP4Address.EnableWindow( FALSE );\r
143         m_EditIP6Address.EnableWindow( FALSE );\r
144         m_ButtonSend.EnableWindow( TRUE );\r
145         m_EditSend.EnableWindow( TRUE );\r
146         m_EditPort.EnableWindow( FALSE );\r
147         m_RadioIP4.EnableWindow( FALSE );\r
148         m_RadioIP6.EnableWindow( FALSE );\r
149         m_RadioTCP.EnableWindow( FALSE );\r
150         m_RadioUDP.EnableWindow( FALSE );\r
151         m_EditStatus.SetWindowText( _T("Connected to server") );\r
152         m_ButtonConnect.SetWindowText( _T("Disconnect") );\r
153 }\r
154 \r
155 int CClientDialog::OnClientReceive()\r
156 {\r
157         // Called when the socket has data to receive\r
158         std::vector<TCHAR> vTChar( 1025, _T('\0') );\r
159         TCHAR* buf = &vTChar.front();   // TChar array with 1025 elements initialised to _T('\0')\r
160         int size = m_Client.Receive( buf, 1024, 0 ); // receive at most 1024 chars\r
161         if (SOCKET_ERROR == size)\r
162         {\r
163                 Append( IDC_EDIT_STATUS, _T("Receive failed.") );\r
164                 return size;\r
165         }\r
166 \r
167         Append( IDC_EDIT_RECEIVE, buf );\r
168         return size;\r
169 }\r
170 \r
171 BOOL CClientDialog::OnCommand(WPARAM wParam, LPARAM lParam)\r
172 {\r
173         // Respond to the dialog buttons\r
174 \r
175         UNREFERENCED_PARAMETER(lParam);\r
176 \r
177         switch (LOWORD(wParam))\r
178     {\r
179         case IDC_BUTTON_CONNECT:\r
180                 OnStartClient();\r
181                 return TRUE;\r
182         case IDC_BUTTON_SEND:\r
183                 OnSend();\r
184                 // Give keyboard focus to the Send edit box\r
185                 SendMessage( WM_NEXTDLGCTL, (WPARAM)(HWND)m_EditSend, TRUE);\r
186                 return TRUE;\r
187     } //switch (LOWORD(wParam))\r
188 \r
189         return FALSE;\r
190 }\r
191 \r
192 BOOL CClientDialog::OnInitDialog()\r
193 {\r
194         // Set the Icon\r
195         SetIconLarge(IDW_MAIN);\r
196         SetIconSmall(IDW_MAIN);\r
197 \r
198         // reposition dialog\r
199         CRect rc = GetWindowRect();\r
200         MoveWindow( rc.left+14, rc.top+14, rc.Width(), rc.Height(), TRUE);\r
201 \r
202         // Attach CWnd objects to the dialog's children\r
203         m_IP4Address.AttachDlgItem( IDC_IPADDRESS, this );\r
204         m_EditIP6Address.AttachDlgItem( IDC_EDIT_IPV6ADDRESS, this );\r
205         m_EditStatus.AttachDlgItem( IDC_EDIT_STATUS, this );\r
206         m_EditPort.AttachDlgItem( IDC_EDIT_PORT, this );\r
207         m_EditSend.AttachDlgItem( IDC_EDIT_SEND, this );\r
208         m_EditReceive.AttachDlgItem( IDC_EDIT_RECEIVE, this );\r
209         m_ButtonConnect.AttachDlgItem( IDC_BUTTON_CONNECT, this );\r
210         m_ButtonSend.AttachDlgItem( IDC_BUTTON_SEND, this );\r
211         m_RadioIP4.AttachDlgItem( IDC_RADIO_IPV4, this );\r
212         m_RadioIP6.AttachDlgItem( IDC_RADIO_IPV6, this );\r
213         m_RadioTCP.AttachDlgItem( IDC_RADIO_TCP, this );\r
214         m_RadioUDP.AttachDlgItem( IDC_RADIO_UDP, this );\r
215 \r
216         // Set the initial state of the dialog\r
217         m_EditIP6Address.SetWindowText( _T("0000:0000:0000:0000:0000:0000:0000:0001") );\r
218         m_RadioIP4.SendMessage( BM_SETCHECK, BST_CHECKED, 0 );\r
219         m_EditStatus.SetWindowText( _T("Not Connected") );\r
220         m_EditPort.SetWindowText( _T("3000") );\r
221         m_RadioTCP.SendMessage( BM_SETCHECK, BST_CHECKED, 0 );\r
222         m_IP4Address.SendMessage( IPM_SETADDRESS, 0, MAKEIPADDRESS(127, 0, 0, 1) );\r
223 \r
224         if (!m_Client.IsIPV6Supported())\r
225         {\r
226                 m_RadioIP6.EnableWindow(FALSE);\r
227                 m_EditIP6Address.EnableWindow(FALSE);\r
228         }\r
229 \r
230         return true;\r
231 }\r
232 \r
233 void CClientDialog::OnStartClient()\r
234 {\r
235         TRACE(_T("Connect/Disconnect Button Pressed\n"));\r
236 \r
237         LRESULT lr = m_RadioTCP.SendMessage( BM_GETCHECK, 0, 0 );\r
238         m_SocketType = (lr == BST_CHECKED)? SOCK_STREAM : SOCK_DGRAM ;\r
239 \r
240         lr = m_RadioIP4.SendMessage( BM_GETCHECK, 0, 0 );\r
241         int IPfamily = (lr == BST_CHECKED)? PF_INET : PF_INET6 ;\r
242 \r
243         if (!m_bClientConnected)\r
244         {\r
245                 switch(m_SocketType)\r
246                 {\r
247                 case SOCK_STREAM:\r
248                         {\r
249                                 // Create the socket\r
250 \r
251                                 if (!m_Client.Create(IPfamily, SOCK_STREAM))\r
252                                 {\r
253                                         Append(IDC_EDIT_STATUS, m_Client.GetLastError());\r
254                                         MessageBox( _T("Failed to create Client socket"), _T("Connect Failed"), MB_ICONWARNING );\r
255                                         return;\r
256                                 }\r
257 \r
258                                 // Retrieve the IP Address\r
259                                 CString strAddr;\r
260                                 if (PF_INET6 == IPfamily)\r
261                                 {\r
262                                         strAddr = m_EditIP6Address.GetWindowText();\r
263                                 }\r
264                                 else\r
265                                 {\r
266                                         DWORD dwAddr = 0;\r
267                                         m_IP4Address.SendMessage( IPM_GETADDRESS, 0, (LPARAM) (LPDWORD) &dwAddr );\r
268                                         in_addr addr = {0};\r
269                                         addr.S_un.S_addr = htonl(dwAddr);\r
270                                         strAddr = A2T( inet_ntoa(addr) );\r
271                                 }\r
272 \r
273                                 // Retrieve the local port number\r
274                                 CString strPort = m_EditPort.GetWindowText();\r
275 \r
276                                 // Temporarily disable the Connect/Disconnect button\r
277                                 m_ButtonConnect.EnableWindow(FALSE);\r
278 \r
279                                 // Connect to the server\r
280                                 if (0 != m_Client.Connect(strAddr, strPort) )\r
281                                 {\r
282                                         Append(IDC_EDIT_STATUS, m_Client.GetLastError());\r
283                                         MessageBox( _T("Failed to connect to server. Is it started?"), _T("Connect Failed"), MB_ICONWARNING );\r
284                                         m_Client.Disconnect();\r
285                                         m_ButtonConnect.EnableWindow( TRUE );\r
286                                         return;\r
287                                 }\r
288                                 m_Client.StartEvents();\r
289 \r
290                         }\r
291                         break;\r
292 \r
293                 case SOCK_DGRAM:\r
294                         {\r
295                                 // Create the socket\r
296                                 if (!m_Client.Create(IPfamily, SOCK_DGRAM))\r
297                                 {\r
298                                         Append(IDC_EDIT_STATUS, m_Client.GetLastError());\r
299                                         MessageBox( _T("Failed to create Client socket"), _T("Connect Failed"), MB_ICONWARNING );\r
300                                         return;\r
301                                 }\r
302 \r
303                                 m_Client.StartEvents();\r
304 \r
305                                 //Update the dialog\r
306                                 m_IP4Address.EnableWindow( FALSE );\r
307                                 m_EditIP6Address.EnableWindow( FALSE );\r
308                                 m_ButtonSend.EnableWindow( TRUE );\r
309                                 m_EditSend.EnableWindow( TRUE );\r
310                                 m_EditPort.EnableWindow( FALSE );\r
311                                 m_RadioIP4.EnableWindow( FALSE );\r
312                                 m_RadioIP6.EnableWindow( FALSE );\r
313                                 m_RadioTCP.EnableWindow( FALSE );\r
314                                 m_RadioUDP.EnableWindow( FALSE );\r
315                                 m_ButtonConnect.SetWindowText( _T("Disconnect") );\r
316                                 m_EditStatus.SetWindowText( _T("Ready to Send") );\r
317                                 SendMessage( WM_NEXTDLGCTL, (WPARAM)(HWND)m_EditSend, TRUE );\r
318                                 m_bClientConnected = TRUE;\r
319                         }\r
320                         break;\r
321                 }\r
322         }\r
323         else\r
324         {\r
325                 // Shutdown and close the client socket\r
326                 m_Client.Disconnect();\r
327 \r
328                 // Update the dialog\r
329                 m_IP4Address.EnableWindow( TRUE );\r
330                 m_ButtonSend.EnableWindow( FALSE );\r
331                 m_EditSend.EnableWindow( FALSE );\r
332                 m_EditPort.EnableWindow( TRUE );\r
333                 m_RadioIP4.EnableWindow( TRUE );\r
334                 m_RadioTCP.EnableWindow( TRUE );\r
335                 m_RadioUDP.EnableWindow( TRUE );\r
336                 m_ButtonConnect.SetWindowText( _T("Connect") );\r
337                 m_EditStatus.SetWindowText( _T("Not Connected") );\r
338 \r
339                 if (m_Client.IsIPV6Supported())\r
340                 {\r
341                         m_RadioIP6.EnableWindow(TRUE);\r
342                         m_EditIP6Address.EnableWindow(TRUE);\r
343                 }\r
344                 m_bClientConnected = FALSE;\r
345         }\r
346 }\r
347 \r
348 void CClientDialog::OnSend()\r
349 {\r
350         switch (m_SocketType)\r
351         {\r
352         case SOCK_STREAM:       // for TCP client\r
353                 {\r
354                         CString sSend = GetDlgItemText(IDC_EDIT_SEND);\r
355                         if (SOCKET_ERROR == m_Client.Send(sSend, sSend.GetLength(), 0))\r
356                                 m_EditStatus.SetWindowText( _T("Send Failed") );\r
357                 }\r
358                 break;\r
359         case SOCK_DGRAM:        // for UDP client\r
360                 {\r
361                         LRESULT lr = m_RadioIP4.SendMessage( BM_GETCHECK, 0, 0 );\r
362                         int IPfamily = (lr == BST_CHECKED)? PF_INET : PF_INET6 ;\r
363 \r
364                         CString strPort = m_EditPort.GetWindowText();\r
365                         CString strSend = m_EditSend.GetWindowText();\r
366 \r
367                         // Retrieve the IP Address\r
368                         CString strAddr;\r
369                         if (PF_INET6 == IPfamily)\r
370                         {\r
371                                 strAddr = m_EditIP6Address.GetWindowText();\r
372                         }\r
373                         else\r
374                         {\r
375                                 DWORD dwAddr = 0;\r
376                                 m_IP4Address.SendMessage( IPM_GETADDRESS, 0, (LPARAM) (LPDWORD) &dwAddr );\r
377                                 in_addr addr = {0};\r
378                                 addr.S_un.S_addr = htonl(dwAddr);\r
379                                 strAddr = A2T( inet_ntoa(addr) );\r
380                         }\r
381 \r
382                         if (SOCKET_ERROR == m_Client.SendTo( strSend, strSend.GetLength(), 0, strAddr, strPort ))\r
383                                 m_EditStatus.SetWindowText( _T("SendTo Failed") );\r
384                 }\r
385                 break;\r
386         }\r
387 }\r
388 \r
389 \r

UCC git Repository :: git.ucc.asn.au