]>
git.saurik.com Git - wxWidgets.git/blob - samples/ipc/client.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: DDE sample: client
4 // Author: Julian Smart
5 // Modified by: Jurgen Doornik
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
31 // Settings common to both executables: determines whether
32 // we're using TCP/IP or real DDE.
35 #if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__)
36 #include "mondrian.xpm"
39 #include "wx/datetime.h"
42 // ----------------------------------------------------------------------------
44 // ----------------------------------------------------------------------------
48 BEGIN_EVENT_TABLE ( MyFrame
, wxFrame
)
49 EVT_MENU ( wxID_EXIT
, MyFrame :: OnExit
)
50 EVT_CLOSE ( MyFrame :: OnClose
)
51 EVT_BUTTON ( ID_START
, MyFrame :: OnStart
)
52 EVT_CHOICE ( ID_SERVERNAME
, MyFrame :: OnServername
)
53 EVT_CHOICE ( ID_HOSTNAME
, MyFrame :: OnHostname
)
54 EVT_CHOICE ( ID_TOPIC
, MyFrame :: OnTopic
)
55 EVT_BUTTON ( ID_DISCONNECT
, MyFrame :: OnDisconnect
)
56 EVT_BUTTON ( ID_STARTADVISE
, MyFrame :: OnStartAdvise
)
57 EVT_BUTTON ( ID_STOPADVISE
, MyFrame :: OnStopAdvise
)
58 EVT_BUTTON ( ID_POKE
, MyFrame :: OnPoke
)
59 EVT_BUTTON ( ID_EXECUTE
, MyFrame :: OnExecute
)
60 EVT_BUTTON ( ID_REQUEST
, MyFrame :: OnRequest
)
63 // ----------------------------------------------------------------------------
65 // ----------------------------------------------------------------------------
67 // ============================================================================
69 // ============================================================================
71 // ----------------------------------------------------------------------------
73 // ----------------------------------------------------------------------------
75 // The `main program' equivalent, creating the windows and returning the
79 if ( ! wxApp :: OnInit () )
82 // Create the main frame window
83 m_frame
= new MyFrame ( NULL
, _T ( "Client" ));
95 // Define my frame constructor
96 MyFrame :: MyFrame ( wxFrame
* frame
, const wxString
& title
)
97 : wxFrame ( frame
, wxID_ANY
, title
, wxDefaultPosition
, wxSize ( 400 , 300 ))
100 SetIcon ( wxICON ( mondrian
));
103 wxMenu
* file_menu
= new wxMenu
;
105 file_menu
-> Append ( wxID_EXIT
, _T ( "&Quit \t Ctrl-Q" ));
107 wxMenuBar
* menu_bar
= new wxMenuBar
;
109 menu_bar
-> Append ( file_menu
, _T ( "&File" ));
111 // Associate the menu bar with the frame
112 SetMenuBar ( menu_bar
);
114 // set a dialog background
115 SetBackgroundColour ( wxSystemSettings :: GetColour ( wxSYS_COLOUR_BTNFACE
));
117 // add the controls to the frame
120 IPC_SERVICE
, _T ( "..." )
131 wxBoxSizer
* item0
= new wxBoxSizer ( wxVERTICAL
);
133 wxBoxSizer
* item1
= new wxBoxSizer ( wxHORIZONTAL
);
135 wxGridSizer
* item2
= new wxGridSizer ( 4 , 0 , 0 );
137 wxButton
* item3
= new wxButton ( this , ID_START
, wxT ( "Connect to server" ), wxDefaultPosition
, wxDefaultSize
, 0 );
138 item2
-> Add ( item3
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
140 wxChoice
* item5
= new wxChoice ( this , ID_HOSTNAME
, wxDefaultPosition
, wxSize ( 100 ,- 1 ), 2 , strs5
, 0 );
141 item2
-> Add ( item5
, 0 , wxALIGN_CENTER
| wxALL
, 5 );
143 wxChoice
* item4
= new wxChoice ( this , ID_SERVERNAME
, wxDefaultPosition
, wxSize ( 100 ,- 1 ), 2 , strs4
, 0 );
144 item2
-> Add ( item4
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
146 wxChoice
* item6
= new wxChoice ( this , ID_TOPIC
, wxDefaultPosition
, wxSize ( 100 ,- 1 ), 2 , strs6
, 0 );
147 item2
-> Add ( item6
, 0 , wxALIGN_CENTER
| wxALL
, 5 );
149 wxButton
* item7
= new wxButton ( this , ID_DISCONNECT
, wxT ( "Disconnect " ), wxDefaultPosition
, wxDefaultSize
, 0 );
150 item2
-> Add ( item7
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
152 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
154 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
156 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
158 wxButton
* item8
= new wxButton ( this , ID_STARTADVISE
, wxT ( "StartAdvise" ), wxDefaultPosition
, wxDefaultSize
, 0 );
159 item2
-> Add ( item8
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
161 wxButton
* item9
= new wxButton ( this , ID_STOPADVISE
, wxT ( "StopAdvise" ), wxDefaultPosition
, wxDefaultSize
, 0 );
162 item2
-> Add ( item9
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
164 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
166 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
168 wxButton
* item10
= new wxButton ( this , ID_EXECUTE
, wxT ( "Execute" ), wxDefaultPosition
, wxDefaultSize
, 0 );
169 item2
-> Add ( item10
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
171 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
173 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
175 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
177 wxButton
* item11
= new wxButton ( this , ID_POKE
, wxT ( "Poke" ), wxDefaultPosition
, wxDefaultSize
, 0 );
178 item2
-> Add ( item11
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
180 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
182 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
184 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
186 wxButton
* item12
= new wxButton ( this , ID_REQUEST
, wxT ( "Request" ), wxDefaultPosition
, wxDefaultSize
, 0 );
187 item2
-> Add ( item12
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
189 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
191 item1
-> Add ( item2
, 1 , wxALIGN_CENTER
| wxALL
, 5 );
193 item0
-> Add ( item1
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
195 wxStaticBox
* item14
= new wxStaticBox ( this , - 1 , wxT ( "Client log" ) );
196 wxStaticBoxSizer
* item13
= new wxStaticBoxSizer ( item14
, wxVERTICAL
);
198 wxTextCtrl
* item15
= new wxTextCtrl ( this , ID_LOG
, wxEmptyString
, wxDefaultPosition
, wxSize ( 500 , 140 ), wxTE_MULTILINE
);
199 item13
-> Add ( item15
, 1 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
201 item0
-> Add ( item13
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
203 this -> SetSizer ( item0
);
204 item0
-> SetSizeHints ( this );
208 GetServername ()-> SetSelection ( 0 );
209 GetHostname ()-> SetSelection ( 0 );
210 GetTopic ()-> SetSelection ( 0 );
211 wxLogTextCtrl
* logWindow
= new wxLogTextCtrl ( GetLog ());
212 delete wxLog :: SetActiveTarget ( logWindow
);
213 wxLogMessage ( _T ( "Click on Connect to connect to the server" ));
217 void MyFrame :: EnableControls ()
219 GetStart ()-> Enable ( m_client
== NULL
);
220 GetServername ()-> Enable ( m_client
== NULL
);
221 GetHostname ()-> Enable ( m_client
== NULL
);
222 GetTopic ()-> Enable ( m_client
== NULL
);
224 const bool isConnected
= ( m_client
!= NULL
&& m_client
-> IsConnected ());
225 GetDisconnect ()-> Enable ( m_client
!= NULL
&& isConnected
);
226 GetStartAdvise ()-> Enable ( m_client
!= NULL
&& isConnected
);
227 GetStopAdvise ()-> Enable ( m_client
!= NULL
&& isConnected
);
228 GetExecute ()-> Enable ( m_client
!= NULL
&& isConnected
);
229 GetPoke ()-> Enable ( m_client
!= NULL
&& isConnected
);
230 GetRequest ()-> Enable ( m_client
!= NULL
&& isConnected
);
233 void MyFrame :: OnClose ( wxCloseEvent
& event
)
243 void MyFrame :: OnExit ( wxCommandEvent
& WXUNUSED ( event
))
248 void MyFrame :: OnStart ( wxCommandEvent
& WXUNUSED ( event
))
250 // Connect to the client
251 wxString servername
= GetServername ()-> GetStringSelection ();
252 wxString hostname
= GetHostname ()-> GetStringSelection ();
253 wxString topic
= GetTopic ()-> GetStringSelection ();
255 m_client
= new MyClient
;
256 bool retval
= m_client
-> Connect ( hostname
, servername
, topic
);
258 wxLogMessage ( _T ( "Client host= \" %s \" port= \" %s \" topic= \" %s \" %s " ),
259 hostname
. c_str (), servername
. c_str (), topic
. c_str (),
260 retval
? _T ( "connected" ) : _T ( "failed to connect" ));
270 void MyFrame :: OnServername ( wxCommandEvent
& WXUNUSED ( event
) )
272 if ( GetServername ()-> GetStringSelection () == _T ( "..." ))
274 wxString s
= wxGetTextFromUser ( _T ( "Specify the name of the server" ),
275 _T ( "Server Name" ), wxEmptyString
, this );
276 if (! s
. IsEmpty () && s
!= IPC_SERVICE
)
278 GetServername ()-> Insert ( s
, 0 );
279 GetServername ()-> SetSelection ( 0 );
284 void MyFrame :: OnHostname ( wxCommandEvent
& WXUNUSED ( event
) )
286 if ( GetHostname ()-> GetStringSelection () == _T ( "..." ))
288 wxString s
= wxGetTextFromUser ( _T ( "Specify the name of the host (ignored under DDE)" ),
289 _T ( "Host Name" ), wxEmptyString
, this );
290 if (! s
. IsEmpty () && s
!= IPC_HOST
)
292 GetHostname ()-> Insert ( s
, 0 );
293 GetHostname ()-> SetSelection ( 0 );
298 void MyFrame :: OnTopic ( wxCommandEvent
& WXUNUSED ( event
) )
300 if ( GetTopic ()-> GetStringSelection () == _T ( "..." ))
302 wxString s
= wxGetTextFromUser ( _T ( "Specify the name of the topic" ),
303 _T ( "Topic Name" ), wxEmptyString
, this );
304 if (! s
. IsEmpty () && s
!= IPC_TOPIC
)
306 GetTopic ()-> Insert ( s
, 0 );
307 GetTopic ()-> SetSelection ( 0 );
312 void MyFrame :: OnDisconnect ( wxCommandEvent
& WXUNUSED ( event
))
317 void MyFrame :: Disconnect ()
324 void MyFrame :: OnStartAdvise ( wxCommandEvent
& WXUNUSED ( event
))
326 m_client
-> GetConnection ()-> StartAdvise ( _T ( "something" ));
329 void MyFrame :: OnStopAdvise ( wxCommandEvent
& WXUNUSED ( event
))
331 m_client
-> GetConnection ()-> StopAdvise ( _T ( "something" ));
334 void MyFrame :: OnExecute ( wxCommandEvent
& WXUNUSED ( event
))
336 if ( m_client
-> IsConnected ())
338 wxString s
= _T ( "Date" );
340 m_client
-> GetConnection ()-> Execute (( const wxChar
*) s
. c_str ());
341 m_client
-> GetConnection ()-> Execute (( const wxChar
*) s
. c_str (), ( s
. Length () + 1 ) * sizeof ( wxChar
));
342 #if wxUSE_DDE_FOR_IPC
343 wxLogMessage ( _T ( "DDE Execute can only be used to send text strings, not arbitrary data. \n The type argument will be ignored, text truncated, converted to Unicode and null terminated." ));
346 bytes
[ 0 ] = '1' ; bytes
[ 1 ] = '2' ; bytes
[ 2 ] = '3' ;
347 m_client
-> GetConnection ()-> Execute (( wxChar
*) bytes
, 3 , wxIPC_PRIVATE
);
351 void MyFrame :: OnPoke ( wxCommandEvent
& WXUNUSED ( event
))
353 if ( m_client
-> IsConnected ())
355 wxString s
= wxDateTime :: Now (). Format ();
356 m_client
-> GetConnection ()-> Poke ( _T ( "Date" ), ( const wxChar
*) s
. c_str ());
357 s
= wxDateTime :: Now (). FormatTime () + _T ( " " ) + wxDateTime :: Now (). FormatDate ();
358 m_client
-> GetConnection ()-> Poke ( _T ( "Date" ), ( const wxChar
*) s
. c_str (), ( s
. Length () + 1 ) * sizeof ( wxChar
));
360 bytes
[ 0 ] = '1' ; bytes
[ 1 ] = '2' ; bytes
[ 2 ] = '3' ;
361 m_client
-> GetConnection ()-> Poke ( _T ( "bytes[3]" ), ( wxChar
*) bytes
, 3 , wxIPC_PRIVATE
);
365 void MyFrame :: OnRequest ( wxCommandEvent
& WXUNUSED ( event
))
367 if ( m_client
-> IsConnected ())
370 m_client
-> GetConnection ()-> Request ( _T ( "Date" ));
371 m_client
-> GetConnection ()-> Request ( _T ( "Date+len" ), & size
);
372 m_client
-> GetConnection ()-> Request ( _T ( "bytes[3]" ), & size
, wxIPC_PRIVATE
);
376 // ----------------------------------------------------------------------------
378 // ----------------------------------------------------------------------------
379 MyClient :: MyClient () : wxClient ()
384 bool MyClient :: Connect ( const wxString
& sHost
, const wxString
& sService
, const wxString
& sTopic
)
386 // suppress the log messages from MakeConnection()
389 m_connection
= ( MyConnection
*) MakeConnection ( sHost
, sService
, sTopic
);
390 return m_connection
!= NULL
;
393 wxConnectionBase
* MyClient :: OnMakeConnection ()
395 return new MyConnection
;
398 void MyClient :: Disconnect ()
402 m_connection
-> Disconnect ();
405 wxGetApp (). GetFrame ()-> EnableControls ();
406 wxLogMessage ( _T ( "Client disconnected from server" ));
410 MyClient ::~ MyClient ()
415 // ----------------------------------------------------------------------------
417 // ----------------------------------------------------------------------------
419 void MyConnection :: Log ( const wxString
& command
, const wxString
& topic
,
420 const wxString
& item
, const wxChar
* data
, int size
, wxIPCFormat format
)
423 if ( topic
. IsEmpty () && item
. IsEmpty ())
424 s
. Printf ( _T ( " %s (" ), command
. c_str ());
425 else if ( topic
. IsEmpty ())
426 s
. Printf ( _T ( " %s (item= \" %s \" ," ), command
. c_str (), item
. c_str ());
427 else if ( item
. IsEmpty ())
428 s
. Printf ( _T ( " %s (topic= \" %s \" ," ), command
. c_str (), topic
. c_str ());
430 s
. Printf ( _T ( " %s (topic= \" %s \" ,item= \" %s \" ," ), command
. c_str (), topic
. c_str (), item
. c_str ());
432 if ( format
== wxIPC_TEXT
|| format
== wxIPC_UNICODETEXT
)
433 wxLogMessage ( _T ( " %s \" %s \" , %d )" ), s
. c_str (), data
, size
);
434 else if ( format
== wxIPC_PRIVATE
)
438 char * bytes
= ( char *) data
;
439 wxLogMessage ( _T ( " %s ' %c%c%c ', %d )" ), s
. c_str (), bytes
[ 0 ], bytes
[ 1 ], bytes
[ 2 ], size
);
442 wxLogMessage ( _T ( " %s ..., %d )" ), s
. c_str (), size
);
444 else if ( format
== wxIPC_INVALID
)
445 wxLogMessage ( _T ( " %s [invalid data], %d )" ), s
. c_str (), size
);
448 bool MyConnection :: OnAdvise ( const wxString
& topic
, const wxString
& item
, wxChar
* data
,
449 int size
, wxIPCFormat format
)
451 Log ( _T ( "OnAdvise" ), topic
, item
, data
, size
, format
);
455 bool MyConnection :: OnDisconnect ()
457 wxLogMessage ( _T ( "OnDisconnect()" ));
458 wxGetApp (). GetFrame ()-> Disconnect ();
462 bool MyConnection :: Execute ( const wxChar
* data
, int size
, wxIPCFormat format
)
464 Log ( _T ( "Execute" ), wxEmptyString
, wxEmptyString
, ( wxChar
*) data
, size
, format
);
465 bool retval
= wxConnection :: Execute ( data
, size
, format
);
467 wxLogMessage ( _T ( "Execute failed!" ));
471 wxChar
* MyConnection :: Request ( const wxString
& item
, int * size
, wxIPCFormat format
)
473 wxChar
* data
= wxConnection :: Request ( item
, size
, format
);
474 Log ( _T ( "Request" ), wxEmptyString
, item
, data
, size
? * size
: - 1 , format
);
478 bool MyConnection :: Poke ( const wxString
& item
, const wxChar
* data
, int size
, wxIPCFormat format
)
480 Log ( _T ( "Poke" ), wxEmptyString
, item
, data
, size
, format
);
481 return wxConnection :: Poke ( item
, data
, size
, format
);