/////////////////////////////////////////////////////////////////////////////
// Name: server.cpp
-// Purpose: DDE sample: server
+// Purpose: IPC sample: server
// Author: Julian Smart
// Modified by:
// Created: 25/01/99
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
+// ============================================================================
+// declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
#ifndef WX_PRECOMP
-#include "wx/wx.h"
+ #include "wx/wx.h"
#endif
// Settings common to both executables: determines whether
// we're using TCP/IP or real DDE.
-
#include "ddesetup.h"
-#if defined(__WXGTK__) || defined(__WXMOTIF__)
-#include "mondrian.xpm"
+#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__)
+ #include "mondrian.xpm"
#endif
#include "server.h"
-MyFrame *frame = NULL;
+// ----------------------------------------------------------------------------
+// wxWin macros
+// ----------------------------------------------------------------------------
IMPLEMENT_APP(MyApp)
-char ipc_buffer[4000];
+BEGIN_EVENT_TABLE(MyFrame, wxFrame)
+ EVT_MENU (SERVER_EXIT, MyFrame::OnExit)
+ EVT_LISTBOX(SERVER_LISTBOX, MyFrame::OnListBoxClick)
+END_EVENT_TABLE()
+
+BEGIN_EVENT_TABLE(IPCDialogBox, wxDialog)
+ EVT_BUTTON(SERVER_QUIT_BUTTON, IPCDialogBox::OnQuit)
+END_EVENT_TABLE()
+
+// ----------------------------------------------------------------------------
+// global variables
+// ----------------------------------------------------------------------------
+
MyConnection *the_connection = NULL;
-MyServer *my_server ;
+
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// MyApp
+// ----------------------------------------------------------------------------
bool MyApp::OnInit()
{
- // Create the main frame window
- frame = new MyFrame(NULL, "Server", wxDefaultPosition, wxSize(400, 500));
+ // Create the main frame window
+ (new MyFrame(NULL, _T("Server")))->Show(TRUE);
- frame->CreateStatusBar();
+ // service name (DDE classes) or port number (TCP/IP based classes)
+ wxString service = IPC_SERVICE;
- // Give it an icon
- frame->SetIcon(wxICON(mondrian));
+ if (argc > 1)
+ service = argv[1];
- // Make a menubar
- wxMenu *file_menu = new wxMenu;
+ // Create a new server
+ m_server = new MyServer;
+ m_server->Create(service);
- file_menu->Append(SERVER_QUIT, "&Exit");
+ return TRUE;
+}
- wxMenuBar *menu_bar = new wxMenuBar;
+int MyApp::OnExit()
+{
+ delete m_server;
- menu_bar->Append(file_menu, "&File");
+ return 0;
+}
- // Associate the menu bar with the frame
- frame->SetMenuBar(menu_bar);
+// ----------------------------------------------------------------------------
+// MyFrame
+// ----------------------------------------------------------------------------
- // Make a panel
- frame->panel = new wxPanel(frame, 0, 0, 400, 250);
- wxListBox *list = new wxListBox(frame->panel, SERVER_LISTBOX,
- wxPoint(5, 5), wxSize(150, 120));
- list->Append("Apple");
- list->Append("Pear");
- list->Append("Orange");
- list->Append("Banana");
- list->Append("Fruit");
+// Define my frame constructor
+MyFrame::MyFrame(wxFrame *frame, const wxString& title)
+ : wxFrame(frame, -1, title, wxDefaultPosition, wxSize(350, 250))
+{
+ CreateStatusBar();
- frame->panel->Fit();
- frame->Fit();
+ // Give it an icon
+ SetIcon(wxICON(mondrian));
- wxString server_name = "4242";
- if (argc > 1)
- server_name = argv[1];
+ // Make a menubar
+ wxMenu *file_menu = new wxMenu;
- // Create a new server
- my_server = new MyServer;
- my_server->Create(server_name);
- frame->Show(TRUE);
+ file_menu->Append(SERVER_EXIT, _T("&Quit\tCtrl-Q"));
- return TRUE;
-}
+ wxMenuBar *menu_bar = new wxMenuBar;
-BEGIN_EVENT_TABLE(MyFrame, wxFrame)
- EVT_MENU(SERVER_QUIT, MyFrame::OnExit)
- EVT_CLOSE(MyFrame::OnCloseWindow)
- EVT_LISTBOX(SERVER_LISTBOX, MyFrame::OnListBoxClick)
-END_EVENT_TABLE()
+ menu_bar->Append(file_menu, _T("&File"));
-// Define my frame constructor
-MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size):
- wxFrame(frame, -1, title, pos, size)
-{
- panel = NULL;
-}
+ // Associate the menu bar with the frame
+ SetMenuBar(menu_bar);
-void MyFrame::OnExit(wxCommandEvent& event)
-{
- if (my_server)
- delete my_server;
- this->Destroy();
+ // Make a listbox
+ wxListBox *list = new wxListBox(this, SERVER_LISTBOX, wxPoint(5, 5));
+ list->Append(_T("Apple"));
+ list->Append(_T("Pear"));
+ list->Append(_T("Orange"));
+ list->Append(_T("Banana"));
+ list->Append(_T("Fruit"));
}
// Set the client process's listbox to this item
-void MyFrame::OnListBoxClick(wxCommandEvent& event)
+void MyFrame::OnListBoxClick(wxCommandEvent& WXUNUSED(event))
{
- wxListBox* listBox = (wxListBox*) panel->FindWindow(SERVER_LISTBOX);
+ wxListBox* listBox = (wxListBox*) FindWindow(SERVER_LISTBOX);
if (listBox)
{
wxString value = listBox->GetStringSelection();
+
+ /* Because the_connection only holds one connection, in this sample only
+ one connection can receive advise messages */
if (the_connection)
{
- the_connection->Advise("Item", (char*) (const char*) value);
+ the_connection->Advise(IPC_ADVISE_NAME, (wxChar*)value.c_str());
}
}
}
-void MyFrame::OnCloseWindow(wxCloseEvent& event)
+void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event))
{
- if (my_server)
- delete my_server;
- this->Destroy();
+ Close(TRUE);
}
-BEGIN_EVENT_TABLE(IPCDialogBox, wxDialog)
- EVT_BUTTON(SERVER_QUIT_BUTTON, IPCDialogBox::OnQuit)
-END_EVENT_TABLE()
+// ----------------------------------------------------------------------------
+// IPCDialogBox
+// ----------------------------------------------------------------------------
-IPCDialogBox::IPCDialogBox(wxFrame *parent, const wxString& title,
- const wxPoint& pos, const wxSize& size, MyConnection *the_connection):
- wxDialog(parent, -1, title, pos, size)
+IPCDialogBox::IPCDialogBox(wxWindow *parent, const wxString& title,
+ const wxPoint& pos, const wxSize& size,
+ MyConnection *connection)
+ : wxDialog(parent, -1, title, pos, size)
{
- connection = the_connection;
- (void)new wxButton(this, SERVER_QUIT_BUTTON, "Quit this connection", wxPoint(5, 5));
- Fit();
+ m_connection = connection;
+ (void)new wxButton(this, SERVER_QUIT_BUTTON, _T("Quit this connection"),
+ wxPoint(5, 5));
+ Fit();
}
-void IPCDialogBox::OnQuit(wxCommandEvent& event)
+IPCDialogBox::~IPCDialogBox( )
{
- connection->Disconnect();
- delete connection;
+ // wxWindows exit code destroys dialog before destroying the connection in
+ // OnExit, so make sure connection won't try to delete the dialog later.
+ if (m_connection)
+ m_connection->dialog = NULL;
}
+void IPCDialogBox::OnQuit(wxCommandEvent& WXUNUSED(event))
+{
+ m_connection->Disconnect();
+ delete m_connection;
+}
+
+// ----------------------------------------------------------------------------
+// MyServer
+// ----------------------------------------------------------------------------
+
wxConnectionBase *MyServer::OnAcceptConnection(const wxString& topic)
{
- if (strcmp(topic, "STDIO") != 0 && strcmp(topic, "IPC TEST") == 0)
- return new MyConnection(ipc_buffer, 4000);
- else
+ if ( topic == IPC_TOPIC )
+ return new MyConnection();
+
+ // unknown topic
return NULL;
}
-MyConnection::MyConnection(char *buf, int size):wxConnection(buf, size)
+// ----------------------------------------------------------------------------
+// MyConnection
+// ----------------------------------------------------------------------------
+
+MyConnection::MyConnection()
+ : wxConnection()
{
- dialog = new IPCDialogBox(frame, "Connection", wxPoint(100, 100), wxSize(500, 500), this);
- dialog->Show(TRUE);
- the_connection = this;
+ dialog = new IPCDialogBox(wxTheApp->GetTopWindow(), _T("Connection"),
+ wxPoint(100, 100), wxSize(500, 500), this);
+ dialog->Show(TRUE);
+ the_connection = this;
}
-MyConnection::~MyConnection(void)
+MyConnection::~MyConnection()
{
- if (the_connection)
- {
- dialog->Destroy();
- the_connection = NULL;
- }
+ if (the_connection)
+ {
+ if (dialog)
+ {
+ dialog->m_connection = NULL;
+ dialog->Destroy();
+ }
+ the_connection = NULL;
+ }
}
-bool MyConnection::OnExecute(const wxString& topic, char *data, int size, wxIPCFormat format)
+bool MyConnection::OnExecute(const wxString& WXUNUSED(topic),
+ wxChar *data,
+ int WXUNUSED(size),
+ wxIPCFormat WXUNUSED(format))
{
- char buf[300];
- sprintf(buf, "Execute command: %s", data);
- frame->SetStatusText(buf);
- return TRUE;
+ wxLogStatus(wxT("Execute command: %s"), data);
+ return TRUE;
}
-bool MyConnection::OnPoke(const wxString& topic, const wxString& item, char *data, int size, wxIPCFormat format)
+bool MyConnection::OnPoke(const wxString& WXUNUSED(topic),
+ const wxString& item,
+ wxChar *data,
+ int WXUNUSED(size),
+ wxIPCFormat WXUNUSED(format))
{
- char buf[300];
- sprintf(buf, "Poke command: %s", data);
- frame->SetStatusText(buf);
- return TRUE;
+ wxLogStatus(wxT("Poke command: %s = %s"), item.c_str(), data);
+ return TRUE;
}
-char *MyConnection::OnRequest(const wxString& topic, const wxString& item, int *size, wxIPCFormat format)
+wxChar *MyConnection::OnRequest(const wxString& WXUNUSED(topic),
+ const wxString& WXUNUSED(item),
+ int * WXUNUSED(size),
+ wxIPCFormat WXUNUSED(format))
{
- return "Here, have your data, client!";
+ return _T("Here, have your data, client!");
}
-bool MyConnection::OnStartAdvise(const wxString& topic, const wxString& item)
+bool MyConnection::OnStartAdvise(const wxString& WXUNUSED(topic),
+ const wxString& WXUNUSED(item))
{
- return TRUE;
+ return TRUE;
}