]> git.saurik.com Git - wxWidgets.git/blob - samples/ipc/server.cpp
Fix docs for Bind
[wxWidgets.git] / samples / ipc / server.cpp
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
45 IMPLEMENT_APP(MyApp)
46
47 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
48 EVT_MENU (SERVER_EXIT, MyFrame::OnExit)
49 EVT_LISTBOX(SERVER_LISTBOX, MyFrame::OnListBoxClick)
50 END_EVENT_TABLE()
51
52 BEGIN_EVENT_TABLE(IPCDialogBox, wxDialog)
53 EVT_BUTTON(SERVER_QUIT_BUTTON, IPCDialogBox::OnQuit)
54 END_EVENT_TABLE()
55
56 // ----------------------------------------------------------------------------
57 // global variables
58 // ----------------------------------------------------------------------------
59
60 MyConnection *the_connection = NULL;
61
62 // ============================================================================
63 // implementation
64 // ============================================================================
65
66 // ----------------------------------------------------------------------------
67 // MyApp
68 // ----------------------------------------------------------------------------
69
70 bool 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
88 int MyApp::OnExit()
89 {
90 delete m_server;
91
92 return 0;
93 }
94
95 // ----------------------------------------------------------------------------
96 // MyFrame
97 // ----------------------------------------------------------------------------
98
99 // Define my frame constructor
100 MyFrame::MyFrame(wxFrame *frame, const wxString& title)
101 : wxFrame(frame, -1, title, wxDefaultPosition, wxSize(350, 250))
102 {
103 CreateStatusBar();
104
105 // Give it an icon
106 SetIcon(wxICON(mondrian));
107
108 // Make a menubar
109 wxMenu *file_menu = new wxMenu;
110
111 file_menu->Append(SERVER_EXIT, _T("&Quit\tCtrl-Q"));
112
113 wxMenuBar *menu_bar = new wxMenuBar;
114
115 menu_bar->Append(file_menu, _T("&File"));
116
117 // Associate the menu bar with the frame
118 SetMenuBar(menu_bar);
119
120 // Make a listbox
121 wxListBox *list = new wxListBox(this, SERVER_LISTBOX, wxPoint(5, 5));
122 list->Append(_T("Apple"));
123 list->Append(_T("Pear"));
124 list->Append(_T("Orange"));
125 list->Append(_T("Banana"));
126 list->Append(_T("Fruit"));
127 }
128
129 // Set the client process's listbox to this item
130 void MyFrame::OnListBoxClick(wxCommandEvent& WXUNUSED(event))
131 {
132 wxListBox* listBox = (wxListBox*) FindWindow(SERVER_LISTBOX);
133 if (listBox)
134 {
135 wxString value = listBox->GetStringSelection();
136
137 /* Because the_connection only holds one connection, in this sample only
138 one connection can receive advise messages */
139 if (the_connection)
140 {
141 the_connection->Advise(IPC_ADVISE_NAME, (wxChar*)value.c_str());
142 }
143 }
144 }
145
146 void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event))
147 {
148 Close(TRUE);
149 }
150
151 // ----------------------------------------------------------------------------
152 // IPCDialogBox
153 // ----------------------------------------------------------------------------
154
155 IPCDialogBox::IPCDialogBox(wxWindow *parent, const wxString& title,
156 const wxPoint& pos, const wxSize& size,
157 MyConnection *connection)
158 : wxDialog(parent, -1, title, pos, size)
159 {
160 m_connection = connection;
161 (void)new wxButton(this, SERVER_QUIT_BUTTON, _T("Quit this connection"),
162 wxPoint(5, 5));
163 Fit();
164 }
165
166 IPCDialogBox::~IPCDialogBox( )
167 {
168 // wxWindows exit code destroys dialog before destroying the connection in
169 // OnExit, so make sure connection won't try to delete the dialog later.
170 if (m_connection)
171 m_connection->dialog = NULL;
172 }
173
174 void IPCDialogBox::OnQuit(wxCommandEvent& WXUNUSED(event))
175 {
176 m_connection->Disconnect();
177 delete m_connection;
178 }
179
180 // ----------------------------------------------------------------------------
181 // MyServer
182 // ----------------------------------------------------------------------------
183
184 wxConnectionBase *MyServer::OnAcceptConnection(const wxString& topic)
185 {
186 if ( topic == IPC_TOPIC )
187 return new MyConnection();
188
189 // unknown topic
190 return NULL;
191 }
192
193 // ----------------------------------------------------------------------------
194 // MyConnection
195 // ----------------------------------------------------------------------------
196
197 MyConnection::MyConnection()
198 : wxConnection()
199 {
200 dialog = new IPCDialogBox(wxTheApp->GetTopWindow(), _T("Connection"),
201 wxPoint(100, 100), wxSize(500, 500), this);
202 dialog->Show(TRUE);
203 the_connection = this;
204 }
205
206 MyConnection::~MyConnection()
207 {
208 if (the_connection)
209 {
210 if (dialog)
211 {
212 dialog->m_connection = NULL;
213 dialog->Destroy();
214 }
215 the_connection = NULL;
216 }
217 }
218
219 bool MyConnection::OnExecute(const wxString& WXUNUSED(topic),
220 wxChar *data,
221 int WXUNUSED(size),
222 wxIPCFormat WXUNUSED(format))
223 {
224 wxLogStatus(wxT("Execute command: %s"), data);
225 return TRUE;
226 }
227
228 bool MyConnection::OnPoke(const wxString& WXUNUSED(topic),
229 const wxString& item,
230 wxChar *data,
231 int WXUNUSED(size),
232 wxIPCFormat WXUNUSED(format))
233 {
234 wxLogStatus(wxT("Poke command: %s = %s"), item.c_str(), data);
235 return TRUE;
236 }
237
238 wxChar *MyConnection::OnRequest(const wxString& WXUNUSED(topic),
239 const wxString& WXUNUSED(item),
240 int * WXUNUSED(size),
241 wxIPCFormat WXUNUSED(format))
242 {
243 return _T("Here, have your data, client!");
244 }
245
246 bool MyConnection::OnStartAdvise(const wxString& WXUNUSED(topic),
247 const wxString& WXUNUSED(item))
248 {
249 return TRUE;
250 }
251