]> git.saurik.com Git - wxWidgets.git/blame - samples/ipc/baseclient.cpp
use kind, not id, of a menu item to test whether it's a separator: this allows having...
[wxWidgets.git] / samples / ipc / baseclient.cpp
CommitLineData
ebe887ed
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: samples/ipc/baseclient.cpp
3// Purpose: IPC sample: console client
4// Author: Anders Larsen
5// Most of the code was stolen from: samples/ipc/client.cpp
6// (c) Julian Smart, Jurgen Doornik
7// Created: 2007-11-08
8// RCS-ID: $Id$
9// Copyright: (c) 2007 Anders Larsen
10// License: wxWindows licence
11///////////////////////////////////////////////////////////////////////////////
12
13// ============================================================================
14// declarations
15// ============================================================================
16
17// ----------------------------------------------------------------------------
18// headers
19// ----------------------------------------------------------------------------
20
21// For compilers that support precompilation, includes "wx.h".
22#include "wx/wxprec.h"
23
24#ifdef __BORLANDC__
25 #pragma hdrstop
26#endif
27
28#ifndef WX_PRECOMP
29 #include "wx/wx.h"
30#endif
31
32// Settings common to both executables: determines whether
33// we're using TCP/IP or real DDE.
34#include "ipcsetup.h"
35
521d3436
VZ
36#include "connection.h"
37
ebe887ed
VZ
38#include "wx/timer.h"
39#include "wx/datetime.h"
40
41// ----------------------------------------------------------------------------
42// wxWin macros
43// ----------------------------------------------------------------------------
44
45
46// Define a new application
47class MyClient;
ebe887ed
VZ
48
49class MyApp: public wxApp
50{
51public:
52 virtual bool OnInit();
53 virtual int OnExit();
54
55protected:
56 MyClient *m_client;
57};
58
521d3436 59class MyConnection : public MyConnectionBase
ebe887ed
VZ
60{
61public:
ebe887ed
VZ
62 virtual bool DoExecute(const void *data, size_t size, wxIPCFormat format);
63 virtual const void *Request(const wxString& item, size_t *size = NULL, wxIPCFormat format = wxIPC_TEXT);
64 virtual bool DoPoke(const wxString& item, const void* data, size_t size, wxIPCFormat format);
65 virtual bool OnAdvise(const wxString& topic, const wxString& item, const void *data, size_t size, wxIPCFormat format);
66 virtual bool OnDisconnect();
ebe887ed
VZ
67};
68
69class MyClient: public wxClient, public wxTimer
70{
71public:
72 MyClient();
73 virtual ~MyClient();
74 bool Connect(const wxString& sHost, const wxString& sService, const wxString& sTopic);
75 void Disconnect();
76 wxConnectionBase *OnMakeConnection();
77 bool IsConnected() { return m_connection != NULL; };
78 virtual void Notify();
79
80protected:
81 MyConnection *m_connection;
82 int m_step;
83};
84
85// ============================================================================
86// implementation
87// ============================================================================
88
89IMPLEMENT_APP(MyApp)
90
91// ----------------------------------------------------------------------------
92// MyApp
93// ----------------------------------------------------------------------------
94
95// The `main program' equivalent, creating the windows and returning the
96// main frame
97bool MyApp::OnInit()
98{
99 if ( !wxApp::OnInit() )
100 return false;
101
102 delete wxLog::SetActiveTarget(new wxLogStderr);
103
104 // Create a new client
105 m_client = new MyClient;
106 bool retval = m_client->Connect("localhost", "4242", "IPC TEST");
107
108 wxLogMessage(_T("Client host=\"localhost\" port=\"4242\" topic=\"IPC TEST\" %s"),
109 retval ? _T("connected") : _T("failed to connect"));
110
111 return retval;
112}
113
114int MyApp::OnExit()
115{
116 delete m_client;
117
118 return 0;
119}
120
121// ----------------------------------------------------------------------------
122// MyClient
123// ----------------------------------------------------------------------------
124
125MyClient::MyClient() : wxClient()
126{
127 m_connection = NULL;
128 m_step = 0;
129}
130
131bool MyClient::Connect(const wxString& sHost, const wxString& sService, const wxString& sTopic)
132{
133 // suppress the log messages from MakeConnection()
134 wxLogNull nolog;
135
136 m_connection = (MyConnection *)MakeConnection(sHost, sService, sTopic);
137 if (m_connection)
138 Start(1000, false);
139 return m_connection != NULL;
140}
141
142wxConnectionBase *MyClient::OnMakeConnection()
143{
144 return new MyConnection;
145}
146
147void MyClient::Disconnect()
148{
149 if (m_connection)
150 {
151 m_connection->Disconnect();
152 delete m_connection;
153 m_connection = NULL;
154 wxLogMessage(_T("Client disconnected from server"));
155 }
156 wxGetApp().ExitMainLoop();
157}
158
159MyClient::~MyClient()
160{
161 Disconnect();
162}
163
164void MyClient::Notify()
165{
166 switch (m_step++)
167 {
168 case 0:
169 {
170 size_t size;
171 m_connection->Request(_T("Date"));
172 m_connection->Request(_T("Date+len"), &size);
173 m_connection->Request(_T("bytes[3]"), &size, wxIPC_PRIVATE);
174 break;
175 }
176 case 1:
177 {
178 wxString s = wxDateTime::Now().Format();
179 m_connection->Poke(_T("Date"), s);
180 s = wxDateTime::Now().FormatTime() + _T(" ") + wxDateTime::Now().FormatDate();
181 m_connection->Poke(_T("Date"), (const char *)s.c_str(), s.length() + 1);
182 char bytes[3];
183 bytes[0] = '1'; bytes[1] = '2'; bytes[2] = '3';
184 m_connection->Poke(_T("bytes[3]"), bytes, 3, wxIPC_PRIVATE);
185 break;
186 }
187 case 2:
188 {
189 wxString s = _T("Date");
190 m_connection->Execute(s);
191 m_connection->Execute((const char *)s.c_str(), s.length() + 1);
ebe887ed 192 char bytes[3];
521d3436
VZ
193 bytes[0] = '1';
194 bytes[1] = '2';
195 bytes[2] = '3';
196 m_connection->Execute(bytes, WXSIZEOF(bytes));
ebe887ed
VZ
197 break;
198 }
199 case 3:
200 wxLogMessage(_T("StartAdvise(\"something\")"));
201 m_connection->StartAdvise(_T("something"));
202 break;
203 case 10:
204 wxLogMessage(_T("StopAdvise(\"something\")"));
205 m_connection->StopAdvise(_T("something"));
206 break;
207 case 15:
208 Disconnect();
209 break;
210 }
211}
212
213// ----------------------------------------------------------------------------
214// MyConnection
215// ----------------------------------------------------------------------------
216
ebe887ed
VZ
217bool MyConnection::OnAdvise(const wxString& topic, const wxString& item, const void *data,
218 size_t size, wxIPCFormat format)
219{
220 Log(_T("OnAdvise"), topic, item, data, size, format);
221 return true;
222}
223
224bool MyConnection::OnDisconnect()
225{
226 wxLogMessage(_T("OnDisconnect()"));
227 wxGetApp().ExitMainLoop();
228 return true;
229}
230
231bool MyConnection::DoExecute(const void *data, size_t size, wxIPCFormat format)
232{
233 Log(_T("Execute"), wxEmptyString, wxEmptyString, data, size, format);
234 bool retval = wxConnection::DoExecute(data, size, format);
235 if (!retval)
236 wxLogMessage(_T("Execute failed!"));
237 return retval;
238}
239
240const void *MyConnection::Request(const wxString& item, size_t *size, wxIPCFormat format)
241{
242 const void *data = wxConnection::Request(item, size, format);
243 Log(_T("Request"), wxEmptyString, item, data, size ? *size : wxNO_LEN, format);
244 return data;
245}
246
247bool MyConnection::DoPoke(const wxString& item, const void *data, size_t size, wxIPCFormat format)
248{
249 Log(_T("Poke"), wxEmptyString, item, data, size, format);
250 return wxConnection::DoPoke(item, data, size, format);
251}