]>
git.saurik.com Git - wxWidgets.git/blob - samples/ipc/server.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: IPC sample: server
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"
40 #include "wx/textdlg.h"
41 #include "wx/datetime.h"
43 // ----------------------------------------------------------------------------
45 // ----------------------------------------------------------------------------
49 BEGIN_EVENT_TABLE ( MyFrame
, wxFrame
)
50 EVT_MENU ( wxID_EXIT
, MyFrame :: OnExit
)
51 EVT_CLOSE ( MyFrame :: OnClose
)
52 EVT_BUTTON ( ID_START
, MyFrame :: OnStart
)
53 EVT_CHOICE ( ID_SERVERNAME
, MyFrame :: OnServerName
)
54 EVT_BUTTON ( ID_DISCONNECT
, MyFrame :: OnDisconnect
)
55 EVT_BUTTON ( ID_ADVISE
, MyFrame :: OnAdvise
)
59 // ============================================================================
61 // ============================================================================
63 // ----------------------------------------------------------------------------
65 // ----------------------------------------------------------------------------
69 // Create the main frame window
70 m_frame
= new MyFrame ( NULL
, _T ( "Server" ));
81 // ----------------------------------------------------------------------------
83 // ----------------------------------------------------------------------------
85 // Define my frame constructor
86 MyFrame :: MyFrame ( wxFrame
* frame
, const wxString
& title
)
87 : wxFrame ( frame
, wxID_ANY
, title
, wxDefaultPosition
, wxSize ( 400 , 300 ))
91 #endif // wxUSE_STATUSBAR
94 SetIcon ( wxICON ( mondrian
));
97 wxMenu
* file_menu
= new wxMenu
;
99 file_menu
-> Append ( wxID_EXIT
, _T ( "&Quit \t Ctrl-Q" ));
101 wxMenuBar
* menu_bar
= new wxMenuBar
;
103 menu_bar
-> Append ( file_menu
, _T ( "&File" ));
105 // Associate the menu bar with the frame
106 SetMenuBar ( menu_bar
);
108 // set a dialog background
109 SetBackgroundColour ( wxSystemSettings :: GetColour ( wxSYS_COLOUR_BTNFACE
));
111 // add the controls to the frame
112 wxBoxSizer
* item0
= new wxBoxSizer ( wxVERTICAL
);
114 wxBoxSizer
* item1
= new wxBoxSizer ( wxHORIZONTAL
);
116 wxFlexGridSizer
* item2
= new wxFlexGridSizer ( 2 , 0 , 0 );
117 item2
-> AddGrowableCol ( 1 );
119 wxButton
* item3
= new wxButton ( this , ID_START
, wxT ( "Start Server" ), wxDefaultPosition
, wxDefaultSize
, 0 );
120 item2
-> Add ( item3
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
124 IPC_SERVICE
, _T ( "..." )
126 wxChoice
* item4
= new wxChoice ( this , ID_SERVERNAME
, wxDefaultPosition
, wxSize ( 100 ,- 1 ), 2 , strs4
, 0 );
127 item2
-> Add ( item4
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
129 wxButton
* item5
= new wxButton ( this , ID_DISCONNECT
, wxT ( "Disconnect Client" ), wxDefaultPosition
, wxDefaultSize
, 0 );
130 item2
-> Add ( item5
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
132 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
134 wxButton
* item6
= new wxButton ( this , ID_ADVISE
, wxT ( "Advise" ), wxDefaultPosition
, wxDefaultSize
, 0 );
135 item2
-> Add ( item6
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
137 item2
-> Add ( 20 , 20 , 0 , wxALIGN_CENTER
| wxALL
, 5 );
139 item1
-> Add ( item2
, 1 , wxALIGN_CENTER
| wxALL
, 5 );
141 item0
-> Add ( item1
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
143 wxStaticBox
* item8
= new wxStaticBox ( this , - 1 , wxT ( "Server log" ) );
144 wxStaticBoxSizer
* item7
= new wxStaticBoxSizer ( item8
, wxVERTICAL
);
146 wxTextCtrl
* item9
= new wxTextCtrl ( this , ID_LOG
, wxT ( "" ), wxDefaultPosition
, wxSize ( 500 , 140 ), wxTE_MULTILINE
);
147 item7
-> Add ( item9
, 1 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
149 item0
-> Add ( item7
, 0 , wxGROW
| wxALIGN_CENTER_VERTICAL
| wxALL
, 5 );
152 item0
-> SetSizeHints ( this );
156 GetServername ()-> SetSelection ( 0 );
157 wxLogTextCtrl
* logWindow
= new wxLogTextCtrl ( GetLog ());
158 delete wxLog :: SetActiveTarget ( logWindow
);
159 wxLogMessage ( _T ( "Click on Start to start the server" ));
163 void MyFrame :: Enable ()
165 GetStart ()-> Enable ( m_server
== NULL
);
166 GetServername ()-> Enable ( m_server
== NULL
);
167 GetAdvise ()-> Enable ( m_server
&& m_server
-> CanAdvise ());
168 GetDisconnect ()-> Enable ( m_server
&& m_server
-> IsConnected ());
171 void MyFrame :: OnClose ( wxCloseEvent
& event
)
181 void MyFrame :: OnExit ( wxCommandEvent
& WXUNUSED ( event
))
186 void MyFrame :: OnStart ( wxCommandEvent
& WXUNUSED ( event
))
188 // Create a new server
189 m_server
= new MyServer
;
190 wxString servername
= GetServername ()-> GetStringSelection ();
191 if ( m_server
-> Create ( servername
))
193 wxLogMessage ( _T ( "Server %s started" ), servername
. c_str ());
194 #if wxUSE_DDE_FOR_IPC
195 wxLogMessage ( _T ( "Server uses DDE" ));
196 #else // !wxUSE_DDE_FOR_IPC
197 wxLogMessage ( _T ( "Server uses TCP" ));
198 #endif // wxUSE_DDE_FOR_IPC/!wxUSE_DDE_FOR_IPC
202 wxLogMessage ( _T ( "Server %s failed to start" ), servername
. c_str ());
209 void MyFrame :: OnServerName ( wxCommandEvent
& WXUNUSED ( event
) )
211 if ( GetServername ()-> GetStringSelection () == _T ( "..." ))
213 wxString s
= wxGetTextFromUser ( _T ( "Specify the name of the server" ),
214 _T ( "Server Name" ), _ ( "" ), this );
215 if (! s
. IsEmpty () && s
!= IPC_SERVICE
)
217 GetServername ()-> Insert ( s
, 0 );
218 GetServername ()-> SetSelection ( 0 );
223 void MyFrame :: Disconnect ()
225 m_server
-> Disconnect ();
229 void MyFrame :: OnDisconnect ( wxCommandEvent
& WXUNUSED ( event
))
234 void MyFrame :: OnAdvise ( wxCommandEvent
& WXUNUSED ( event
))
239 // ----------------------------------------------------------------------------
241 // ----------------------------------------------------------------------------
243 MyServer :: MyServer () : wxServer ()
248 MyServer ::~ MyServer ()
253 wxConnectionBase
* MyServer :: OnAcceptConnection ( const wxString
& topic
)
255 wxLogMessage ( _T ( "OnAcceptConnection( \" %s \" )" ), topic
. c_str ());
257 if ( topic
== IPC_TOPIC
)
259 m_connection
= new MyConnection ();
260 wxGetApp (). GetFrame ()-> Enable ();
261 wxLogMessage ( _T ( "Connection accepted" ));
268 void MyServer :: Disconnect ()
272 m_connection
-> Disconnect ();
275 wxGetApp (). GetFrame ()-> Enable ();
276 wxLogMessage ( _T ( "Disconnected client" ));
280 void MyServer :: Advise ()
284 wxString s
= wxDateTime :: Now (). Format ();
285 m_connection
-> Advise ( m_connection
-> m_sAdvise
, ( wxChar
*) s
. c_str ());
286 s
= wxDateTime :: Now (). FormatTime () + _T ( " " ) + wxDateTime :: Now (). FormatDate ();
287 m_connection
-> Advise ( m_connection
-> m_sAdvise
, ( wxChar
*) s
. c_str (), ( s
. Length () + 1 ) * sizeof ( wxChar
));
289 #if wxUSE_DDE_FOR_IPC
290 wxLogMessage ( _T ( "DDE Advise type argument cannot be wxIPC_PRIVATE. The client will receive it as wxIPC_TEXT, and receive the correct no of bytes, but not print a correct log entry." ));
293 bytes
[ 0 ] = '1' ; bytes
[ 1 ] = '2' ; bytes
[ 2 ] = '3' ;
294 m_connection
-> Advise ( m_connection
-> m_sAdvise
, ( wxChar
*) bytes
, 3 , wxIPC_PRIVATE
);
295 // this works, but the log treats it as a string now
296 // m_connection->Advise(m_connection->m_sAdvise, (wxChar *)bytes, 3, wxIPC_TEXT );
300 // ----------------------------------------------------------------------------
302 // ----------------------------------------------------------------------------
304 MyConnection :: MyConnection ()
309 MyConnection ::~ MyConnection ()
313 bool MyConnection :: OnExecute ( const wxString
& topic
,
314 wxChar
* data
, int size
, wxIPCFormat format
)
316 Log ( _T ( "OnExecute" ), topic
, _T ( "" ), data
, size
, format
);
320 bool MyConnection :: OnPoke ( const wxString
& topic
,
321 const wxString
& item
, wxChar
* data
, int size
, wxIPCFormat format
)
323 Log ( _T ( "OnPoke" ), topic
, item
, data
, size
, format
);
324 return wxConnection :: OnPoke ( topic
, item
, data
, size
, format
);
327 wxChar
* MyConnection :: OnRequest ( const wxString
& topic
,
328 const wxString
& item
, int * size
, wxIPCFormat format
)
331 if ( item
== _T ( "Date" ))
333 m_sRequestDate
= wxDateTime :: Now (). Format ();
334 data
= ( wxChar
*) m_sRequestDate
. c_str ();
337 else if ( item
== _T ( "Date+len" ))
339 m_sRequestDate
= wxDateTime :: Now (). FormatTime () + _T ( " " ) + wxDateTime :: Now (). FormatDate ();
340 data
= ( wxChar
*) m_sRequestDate
. c_str ();
341 * size
= ( m_sRequestDate
. Length () + 1 ) * sizeof ( wxChar
);
343 else if ( item
== _T ( "bytes[3]" ))
345 data
= ( wxChar
*) m_achRequestBytes
;
346 m_achRequestBytes
[ 0 ] = '1' ; m_achRequestBytes
[ 1 ] = '2' ; m_achRequestBytes
[ 2 ] = '3' ;
354 Log ( _T ( "OnRequest" ), topic
, item
, data
, * size
, format
);
358 bool MyConnection :: OnStartAdvise ( const wxString
& topic
,
359 const wxString
& item
)
361 wxLogMessage ( _T ( "OnStartAdvise( \" %s \" , \" %s \" )" ), topic
. c_str (), item
. c_str ());
362 wxLogMessage ( _T ( "Returning true" ));
364 wxGetApp (). GetFrame ()-> Enable ();
368 bool MyConnection :: OnStopAdvise ( const wxString
& topic
,
369 const wxString
& item
)
371 wxLogMessage ( _T ( "OnStopAdvise( \" %s \" , \" %s \" )" ), topic
. c_str (), item
. c_str ());
372 wxLogMessage ( _T ( "Returning true" ));
374 wxGetApp (). GetFrame ()-> Enable ();
378 void MyConnection :: Log ( const wxString
& command
, const wxString
& topic
,
379 const wxString
& item
, wxChar
* data
, int size
, wxIPCFormat format
)
382 if ( topic
. IsEmpty () && item
. IsEmpty ())
383 s
. Printf ( _T ( " %s (" ), command
. c_str ());
384 else if ( topic
. IsEmpty ())
385 s
. Printf ( _T ( " %s ( \" %s \" ," ), command
. c_str (), item
. c_str ());
386 else if ( item
. IsEmpty ())
387 s
. Printf ( _T ( " %s ( \" %s \" ," ), command
. c_str (), topic
. c_str ());
389 s
. Printf ( _T ( " %s ( \" %s \" , \" %s \" ," ), command
. c_str (), topic
. c_str (), item
. c_str ());
391 if ( format
== wxIPC_TEXT
|| format
== wxIPC_UNICODETEXT
)
392 wxLogMessage ( _T ( " %s \" %s \" , %d )" ), s
. c_str (), data
, size
);
393 else if ( format
== wxIPC_PRIVATE
)
397 char * bytes
= ( char *) data
;
398 wxLogMessage ( _T ( " %s ' %c%c%c ', %d )" ), s
. c_str (), bytes
[ 0 ], bytes
[ 1 ], bytes
[ 2 ], size
);
401 wxLogMessage ( _T ( " %s ..., %d )" ), s
. c_str (), size
);
403 else if ( format
== wxIPC_INVALID
)
404 wxLogMessage ( _T ( " %s [invalid data], %d )" ), s
. c_str (), size
);
407 bool MyConnection :: Advise ( const wxString
& item
, wxChar
* data
, int size
, wxIPCFormat format
)
409 Log ( _T ( "Advise" ), _T ( "" ), item
, data
, size
, format
);
410 return wxConnection :: Advise ( item
, data
, size
, format
);
413 bool MyConnection :: OnDisconnect ()
415 wxLogMessage ( _T ( "OnDisconnect()" ));
416 wxGetApp (). GetFrame ()-> Disconnect ();