]> git.saurik.com Git - wxWidgets.git/blame_incremental - samples/ipc/server.cpp
Build the new docs as part of the automated build
[wxWidgets.git] / samples / ipc / server.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: server.cpp
3// Purpose: IPC sample: server
4// Author: Julian Smart
5// Modified by:
6// Created: 25/01/99
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
27#ifndef WX_PRECOMP
28 #include "wx/wx.h"
29#endif
30
31// Settings common to both executables: determines whether
32// we're using TCP/IP or real DDE.
33#include "ddesetup.h"
34
35#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__)
36 #include "mondrian.xpm"
37#endif
38
39#include "server.h"
40
41// ----------------------------------------------------------------------------
42// wxWin macros
43// ----------------------------------------------------------------------------
44
45IMPLEMENT_APP(MyApp)
46
47BEGIN_EVENT_TABLE(MyFrame, wxFrame)
48 EVT_MENU (SERVER_EXIT, MyFrame::OnExit)
49 EVT_LISTBOX(SERVER_LISTBOX, MyFrame::OnListBoxClick)
50END_EVENT_TABLE()
51
52BEGIN_EVENT_TABLE(IPCDialogBox, wxDialog)
53 EVT_BUTTON(SERVER_QUIT_BUTTON, IPCDialogBox::OnQuit)
54END_EVENT_TABLE()
55
56// ----------------------------------------------------------------------------
57// global variables
58// ----------------------------------------------------------------------------
59
60MyConnection *the_connection = NULL;
61
62// ============================================================================
63// implementation
64// ============================================================================
65
66// ----------------------------------------------------------------------------
67// MyApp
68// ----------------------------------------------------------------------------
69
70bool MyApp::OnInit()
71{
72 // Create the main frame window
73 (new MyFrame(NULL, _T("Server")))->Show(true);
74
75 // service name (DDE classes) or port number (TCP/IP based classes)
76 wxString service = IPC_SERVICE;
77
78 if (argc > 1)
79 service = argv[1];
80
81 // Create a new server
82 m_server = new MyServer;
83 m_server->Create(service);
84
85 return true;
86}
87
88int MyApp::OnExit()
89{
90 delete m_server;
91
92 return 0;
93}
94
95// ----------------------------------------------------------------------------
96// MyFrame
97// ----------------------------------------------------------------------------
98
99// Define my frame constructor
100MyFrame::MyFrame(wxFrame *frame, const wxString& title)
101 : wxFrame(frame, wxID_ANY, title, wxDefaultPosition, wxSize(350, 250))
102{
103#if wxUSE_STATUSBAR
104 CreateStatusBar();
105#endif // wxUSE_STATUSBAR
106
107 // Give it an icon
108 SetIcon(wxICON(mondrian));
109
110 // Make a menubar
111 wxMenu *file_menu = new wxMenu;
112
113 file_menu->Append(SERVER_EXIT, _T("&Quit\tCtrl-Q"));
114
115 wxMenuBar *menu_bar = new wxMenuBar;
116
117 menu_bar->Append(file_menu, _T("&File"));
118
119 // Associate the menu bar with the frame
120 SetMenuBar(menu_bar);
121
122 // Make a listbox
123 wxListBox *list = new wxListBox(this, SERVER_LISTBOX, wxPoint(5, 5));
124 list->Append(_T("Apple"));
125 list->Append(_T("Pear"));
126 list->Append(_T("Orange"));
127 list->Append(_T("Banana"));
128 list->Append(_T("Fruit"));
129}
130
131// Set the client process's listbox to this item
132void MyFrame::OnListBoxClick(wxCommandEvent& WXUNUSED(event))
133{
134 wxListBox* listBox = (wxListBox*) FindWindow(SERVER_LISTBOX);
135 if (listBox)
136 {
137 wxString value = listBox->GetStringSelection();
138
139 /* Because the_connection only holds one connection, in this sample only
140 one connection can receive advise messages */
141 if (the_connection)
142 {
143 the_connection->Advise(IPC_ADVISE_NAME, (wxChar*)value.c_str());
144 }
145 }
146}
147
148void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event))
149{
150 Close(true);
151}
152
153// ----------------------------------------------------------------------------
154// IPCDialogBox
155// ----------------------------------------------------------------------------
156
157IPCDialogBox::IPCDialogBox(wxWindow *parent, const wxString& title,
158 const wxPoint& pos, const wxSize& size,
159 MyConnection *connection)
160 : wxDialog(parent, wxID_ANY, title, pos, size)
161{
162 m_connection = connection;
163 (void)new wxButton(this, SERVER_QUIT_BUTTON, _T("Quit this connection"),
164 wxPoint(5, 5));
165 Fit();
166}
167
168IPCDialogBox::~IPCDialogBox( )
169{
170 // wxWidgets exit code destroys dialog before destroying the connection in
171 // OnExit, so make sure connection won't try to delete the dialog later.
172 if (m_connection)
173 m_connection->dialog = NULL;
174}
175
176void IPCDialogBox::OnQuit(wxCommandEvent& WXUNUSED(event))
177{
178 m_connection->Disconnect();
179 delete m_connection;
180}
181
182// ----------------------------------------------------------------------------
183// MyServer
184// ----------------------------------------------------------------------------
185
186wxConnectionBase *MyServer::OnAcceptConnection(const wxString& topic)
187{
188 if ( topic == IPC_TOPIC )
189 return new MyConnection();
190
191 // unknown topic
192 return NULL;
193}
194
195// ----------------------------------------------------------------------------
196// MyConnection
197// ----------------------------------------------------------------------------
198
199MyConnection::MyConnection()
200 : wxConnection()
201{
202 dialog = new IPCDialogBox(wxTheApp->GetTopWindow(), _T("Connection"),
203 wxPoint(100, 100), wxSize(500, 500), this);
204 dialog->Show(true);
205 the_connection = this;
206}
207
208MyConnection::~MyConnection()
209{
210 if (the_connection)
211 {
212 if (dialog)
213 {
214 dialog->m_connection = NULL;
215 dialog->Destroy();
216 }
217 the_connection = NULL;
218 }
219}
220
221bool MyConnection::OnExecute(const wxString& WXUNUSED(topic),
222 wxChar *data,
223 int WXUNUSED(size),
224 wxIPCFormat WXUNUSED(format))
225{
226 wxLogStatus(wxT("Execute command: %s"), data);
227 return true;
228}
229
230bool MyConnection::OnPoke(const wxString& WXUNUSED(topic),
231 const wxString& item,
232 wxChar *data,
233 int WXUNUSED(size),
234 wxIPCFormat WXUNUSED(format))
235{
236 wxLogStatus(wxT("Poke command: %s = %s"), item.c_str(), data);
237 return true;
238}
239
240wxChar *MyConnection::OnRequest(const wxString& WXUNUSED(topic),
241 const wxString& WXUNUSED(item),
242 int * WXUNUSED(size),
243 wxIPCFormat WXUNUSED(format))
244{
245 return _T("Here, have your data, client!");
246}
247
248bool MyConnection::OnStartAdvise(const wxString& WXUNUSED(topic),
249 const wxString& WXUNUSED(item))
250{
251 return true;
252}
253