]>
git.saurik.com Git - wxWidgets.git/blob - samples/ipc/baseserver.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: samples/ipc/baseserver.cpp
3 // Purpose: IPC sample: console server
4 // Author: Anders Larsen
5 // Most of the code was stolen from: samples/ipc/server.cpp
6 // (c) Julian Smart, Jurgen Doornik
9 // Copyright: (c) 2007 Anders Larsen
10 // License: wxWindows licence
11 ///////////////////////////////////////////////////////////////////////////////
13 // ============================================================================
15 // ============================================================================
17 // ----------------------------------------------------------------------------
19 // ----------------------------------------------------------------------------
21 // For compilers that support precompilation, includes "wx.h".
22 #include "wx/wxprec.h"
32 // Settings common to both executables: determines whether
33 // we're using TCP/IP or real DDE.
36 #include "connection.h"
39 #include "wx/datetime.h"
41 // ----------------------------------------------------------------------------
43 // ----------------------------------------------------------------------------
45 class MyConnection
: public MyConnectionBase
, public wxTimer
48 virtual bool Disconnect() { return wxConnection::Disconnect(); }
49 virtual bool OnExecute(const wxString
& topic
, const void *data
, size_t size
, wxIPCFormat format
);
50 virtual const void *OnRequest(const wxString
& topic
, const wxString
& item
, size_t *size
, wxIPCFormat format
);
51 virtual bool OnPoke(const wxString
& topic
, const wxString
& item
, const void *data
, size_t size
, wxIPCFormat format
);
52 virtual bool OnStartAdvise(const wxString
& topic
, const wxString
& item
);
53 virtual bool OnStopAdvise(const wxString
& topic
, const wxString
& item
);
54 virtual bool DoAdvise(const wxString
& item
, const void *data
, size_t size
, wxIPCFormat format
);
55 virtual bool OnDisconnect();
56 virtual void Notify();
61 wxString m_sRequestDate
;
62 char m_achRequestBytes
[3];
65 class MyServer
: public wxServer
71 bool IsConnected() { return m_connection
!= NULL
; };
73 virtual wxConnectionBase
*OnAcceptConnection(const wxString
& topic
);
76 wxConnection
*m_connection
;
79 // Define a new application
80 class MyApp
: public wxApp
83 virtual bool OnInit();
91 // ============================================================================
93 // ============================================================================
95 IMPLEMENT_APP_CONSOLE(MyApp
)
97 // ----------------------------------------------------------------------------
99 // ----------------------------------------------------------------------------
103 if ( !wxApp::OnInit() )
106 delete wxLog::SetActiveTarget(new wxLogStderr
);
108 const char * const kind
=
109 #if wxUSE_DDE_FOR_IPC
116 // Create a new server
117 if ( !m_server
.Create(IPC_SERVICE
) )
119 wxLogMessage("%s server failed to start on %s", kind
, IPC_SERVICE
);
123 wxLogMessage("%s server started on %s", kind
, IPC_SERVICE
);
127 // ----------------------------------------------------------------------------
129 // ----------------------------------------------------------------------------
136 MyServer::~MyServer()
141 wxConnectionBase
*MyServer::OnAcceptConnection(const wxString
& topic
)
143 wxLogMessage("OnAcceptConnection(\"%s\")", topic
.c_str());
145 if ( topic
== IPC_TOPIC
)
147 m_connection
= new MyConnection
;
148 wxLogMessage("Connection accepted");
156 void MyServer::Disconnect()
160 m_connection
->Disconnect();
163 wxLogMessage("Disconnected client");
167 // ----------------------------------------------------------------------------
169 // ----------------------------------------------------------------------------
172 MyConnection::OnExecute(const wxString
& topic
,
177 Log("OnExecute", topic
, "", data
, size
, format
);
182 MyConnection::OnPoke(const wxString
& topic
,
183 const wxString
& item
,
188 Log("OnPoke", topic
, item
, data
, size
, format
);
189 return wxConnection::OnPoke(topic
, item
, data
, size
, format
);
193 MyConnection::OnRequest(const wxString
& topic
,
194 const wxString
& item
,
201 m_sRequestDate
= wxDateTime::Now().Format();
202 data
= m_sRequestDate
.c_str();
205 else if (item
== "Date+len")
207 m_sRequestDate
= wxDateTime::Now().FormatTime() + " " + wxDateTime::Now().FormatDate();
208 data
= m_sRequestDate
.c_str();
209 *size
= m_sRequestDate
.Length() + 1;
211 else if (item
== "bytes[3]")
213 data
= m_achRequestBytes
;
214 m_achRequestBytes
[0] = '1'; m_achRequestBytes
[1] = '2'; m_achRequestBytes
[2] = '3';
222 Log("OnRequest", topic
, item
, data
, *size
, format
);
226 bool MyConnection::OnStartAdvise(const wxString
& topic
, const wxString
& item
)
228 wxLogMessage("OnStartAdvise(\"%s\",\"%s\")", topic
.c_str(), item
.c_str());
229 wxLogMessage("Returning true");
231 Start(3000); // schedule our Notify() to be called in 3 seconds
235 bool MyConnection::OnStopAdvise(const wxString
& topic
, const wxString
& item
)
237 wxLogMessage("OnStopAdvise(\"%s\",\"%s\")", topic
.c_str(), item
.c_str());
238 wxLogMessage("Returning true");
244 void MyConnection::Notify()
246 if (!m_sAdvise
.empty())
248 wxString s
= wxDateTime::Now().Format();
249 Advise(m_sAdvise
, s
);
250 s
= wxDateTime::Now().FormatTime() + " " + wxDateTime::Now().FormatDate();
251 Advise(m_sAdvise
, s
.mb_str(), s
.length() + 1);
253 #if wxUSE_DDE_FOR_IPC
254 wxLogMessage("DDE Advise type argument cannot be wxIPC_PRIVATE. "
255 "The client will receive it as wxIPC_TEXT, "
256 "and receive the correct no of bytes, "
257 "but not print a correct log entry.");
261 bytes
[0] = '1'; bytes
[1] = '2'; bytes
[2] = '3';
262 Advise(m_sAdvise
, bytes
, 3, wxIPC_PRIVATE
);
263 // this works, but the log treats it as a string now
264 // m_connection->Advise(m_connection->m_sAdvise, bytes, 3, wxIPC_TEXT );
268 bool MyConnection::DoAdvise(const wxString
& item
, const void *data
, size_t size
, wxIPCFormat format
)
270 Log("Advise", "", item
, data
, size
, format
);
271 return wxConnection::DoAdvise(item
, data
, size
, format
);
274 bool MyConnection::OnDisconnect()
276 wxLogMessage("OnDisconnect()");