diff --git a/samples/ipc/client.cpp b/samples/ipc/client.cpp index 616ef99d80..99940537f1 100644 --- a/samples/ipc/client.cpp +++ b/samples/ipc/client.cpp @@ -9,15 +9,23 @@ // 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 @@ -31,189 +39,191 @@ #include "client.h" -MyFrame *frame = NULL; +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- IMPLEMENT_APP(MyApp) +BEGIN_EVENT_TABLE(MyFrame, wxFrame) + EVT_MENU(CLIENT_QUIT, MyFrame::OnExit) + EVT_MENU(CLIENT_EXECUTE, MyFrame::OnExecute) + EVT_MENU(CLIENT_POKE, MyFrame::OnPoke) + EVT_MENU(CLIENT_REQUEST, MyFrame::OnRequest) +END_EVENT_TABLE() + +// ---------------------------------------------------------------------------- +// globals +// ---------------------------------------------------------------------------- + char ipc_buffer[4000]; wxListBox *the_list = NULL; MyConnection *the_connection = NULL; MyClient *my_client ; +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// MyApp +// ---------------------------------------------------------------------------- + // The `main program' equivalent, creating the windows and returning the // main frame bool MyApp::OnInit() { - // Create the main frame window - frame = new MyFrame(NULL, "Client", wxPoint(400, 0), wxSize(400, 300)); - - // Give it an icon - frame->SetIcon(wxICON(mondrian)); - - // Make a menubar - wxMenu *file_menu = new wxMenu; - - file_menu->Append(CLIENT_EXECUTE, "Execute"); - file_menu->Append(CLIENT_REQUEST, "Request"); - file_menu->Append(CLIENT_POKE, "Poke"); - file_menu->Append(CLIENT_QUIT, "Quit"); - - wxMenuBar *menu_bar = new wxMenuBar; - - menu_bar->Append(file_menu, "File"); - - // Associate the menu bar with the frame - frame->SetMenuBar(menu_bar); - - // Make a panel - frame->panel = new wxPanel(frame, -1, wxPoint(0, 0), wxSize(400, 250)); - the_list = new wxListBox(frame->panel, CLIENT_LISTBOX, wxPoint(5, 5), wxSize(150, 120)); - the_list->Append("Apple"); - the_list->Append("Pear"); - the_list->Append("Orange"); - the_list->Append("Banana"); - the_list->Append("Fruit"); - - frame->panel->Fit(); - frame->Fit(); - - wxString server = "4242"; - + wxString server = "4242"; #if wxUSE_DDE_FOR_SAMPLE - wxString hostName = wxGetHostName(); + wxString hostName = wxGetHostName(); #else - wxString hostName = "localhost"; + wxString hostName = "localhost"; #endif - if (argc > 1) - server = argv[1]; - if (argc > 2) - hostName = argv[2]; + if (argc > 1) + server = argv[1]; + if (argc > 2) + hostName = argv[2]; - // Create a new client - my_client = new MyClient; - the_connection = (MyConnection *)my_client->MakeConnection(hostName, server, "IPC TEST"); + // Create a new client + my_client = new MyClient; + the_connection = (MyConnection *)my_client->MakeConnection(hostName, server, "IPC TEST"); - if (!the_connection) - { - wxMessageBox("Failed to make connection to server", "Client Demo Error"); -#ifdef __WXMSW__ -// extern void wxPrintDDEError(); -// wxPrintDDEError(); -#endif - return FALSE; - } - if (!the_connection->StartAdvise("Item")) - wxMessageBox("StartAdvise failed", "Client Demo Error"); + while ( !the_connection ) + { + if ( wxMessageBox("Failed to make connection to server.\nRetry?", + "Client Demo Error", + wxICON_ERROR | wxYES_NO | wxCANCEL ) != wxYES ) + { + // no server + return FALSE; + } - frame->Show(TRUE); + the_connection = (MyConnection *)my_client->MakeConnection(hostName, server, "IPC TEST"); + } - return TRUE; -} + if (!the_connection->StartAdvise("Item")) + wxMessageBox("StartAdvise failed", "Client Demo Error"); -int MyApp::OnExit() -{ - if (my_client) - delete my_client ; - - return 0; -} - -BEGIN_EVENT_TABLE(MyFrame, wxFrame) - EVT_MENU(CLIENT_QUIT, MyFrame::OnExit) - EVT_MENU(CLIENT_EXECUTE, MyFrame::OnExecute) - EVT_MENU(CLIENT_POKE, MyFrame::OnPoke) - EVT_MENU(CLIENT_REQUEST, MyFrame::OnRequest) - EVT_CLOSE(MyFrame::OnCloseWindow) -END_EVENT_TABLE() - -// 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; -} - -void MyFrame::OnExecute(wxCommandEvent& event) -{ - if (the_connection) - if (!the_connection->Execute("Hello from the client!")) - wxMessageBox("Execute failed", "Client Demo Error"); -} - -void MyFrame::OnPoke(wxCommandEvent& event) -{ - if (the_connection) - if (!the_connection->Poke("An item", "Some data to poke at the server!")) - wxMessageBox("Poke failed", "Client Demo Error"); -} - -void MyFrame::OnRequest(wxCommandEvent& event) -{ - if (the_connection) - { - char *data = the_connection->Request("An item"); - if (data) - wxMessageBox(data, "Client: Request", wxOK); - else - wxMessageBox("Request failed", "Client Demo Error"); - } -} - -void MyFrame::OnExit(wxCommandEvent& event) -{ - if (the_connection) - the_connection->Disconnect(); - - this->Destroy(); -} - -// Define the behaviour for the frame closing -void MyFrame::OnCloseWindow(wxCloseEvent& event) -{ - if (the_connection) - { - the_connection->Disconnect(); - } - this->Destroy(); -} - -MyClient::MyClient(void) -{ -} - -wxConnectionBase *MyClient::OnMakeConnection(void) -{ - return new MyConnection; -} - -MyConnection::MyConnection(void):wxConnection(ipc_buffer, 3999) -{ -} - -MyConnection::~MyConnection(void) -{ - the_connection = NULL; -} - -bool MyConnection::OnAdvise(const wxString& topic, const wxString& item, char *data, int size, wxIPCFormat format) -{ - if (the_list) - { - int n = the_list->FindString(data); - if (n > -1) - the_list->SetSelection(n); - } - return TRUE; -} - -bool MyConnection::OnDisconnect() -{ - frame->Destroy(); - - the_connection = NULL; - delete this; + // Create the main frame window + (new MyFrame(NULL, "Client"))->Show(TRUE); + + return TRUE; +} + +int MyApp::OnExit() +{ + if (the_connection) + { + the_connection->Disconnect(); + } + + // will delete the connection too + delete my_client; + + return 0; +} + +// Define my frame constructor +MyFrame::MyFrame(wxFrame *frame, const wxString& title) + : wxFrame(frame, -1, title) +{ + panel = NULL; + + // Give it an icon + SetIcon(wxICON(mondrian)); + + // Make a menubar + wxMenu *file_menu = new wxMenu; + + file_menu->Append(CLIENT_EXECUTE, "Execute"); + file_menu->Append(CLIENT_REQUEST, "Request"); + file_menu->Append(CLIENT_POKE, "Poke"); + file_menu->Append(CLIENT_QUIT, "Quit"); + + wxMenuBar *menu_bar = new wxMenuBar; + + menu_bar->Append(file_menu, "File"); + + // Associate the menu bar with the frame + SetMenuBar(menu_bar); + + // Make a panel + panel = new wxPanel(this); + the_list = new wxListBox(panel, CLIENT_LISTBOX, wxPoint(5, 5)); + the_list->Append("Apple"); + the_list->Append("Pear"); + the_list->Append("Orange"); + the_list->Append("Banana"); + the_list->Append("Fruit"); + + panel->Fit(); + Fit(); +} + +void MyFrame::OnExecute(wxCommandEvent& event) +{ + if (the_connection) + if (!the_connection->Execute("Hello from the client!")) + wxMessageBox("Execute failed", "Client Demo Error"); +} + +void MyFrame::OnPoke(wxCommandEvent& event) +{ + if (the_connection) + if (!the_connection->Poke("An item", "Some data to poke at the server!")) + wxMessageBox("Poke failed", "Client Demo Error"); +} + +void MyFrame::OnRequest(wxCommandEvent& event) +{ + if (the_connection) + { + char *data = the_connection->Request("An item"); + if (data) + wxMessageBox(data, "Client: Request", wxOK); + else + wxMessageBox("Request failed", "Client Demo Error"); + } +} + +void MyFrame::OnExit(wxCommandEvent& event) +{ + Close(); +} + +wxConnectionBase *MyClient::OnMakeConnection() +{ + return new MyConnection; +} + +MyConnection::MyConnection() + : wxConnection(ipc_buffer, WXSIZEOF(ipc_buffer)) +{ +} + +MyConnection::~MyConnection() +{ + the_connection = NULL; +} + +bool MyConnection::OnAdvise(const wxString& topic, const wxString& item, char *data, int size, wxIPCFormat format) +{ + if (the_list) + { + int n = the_list->FindString(data); + if (n > -1) + the_list->SetSelection(n); + } + return TRUE; +} + +bool MyConnection::OnDisconnect() +{ + wxWindow *win = wxTheApp->GetTopWindow(); + if ( win ) + win->Destroy(); return TRUE; } diff --git a/samples/ipc/client.h b/samples/ipc/client.h index 8017a29def..8dcdc7dbe4 100644 --- a/samples/ipc/client.h +++ b/samples/ipc/client.h @@ -12,40 +12,42 @@ // Define a new application class MyApp: public wxApp { - public: - bool OnInit(); - int OnExit(); +public: + virtual bool OnInit(); + virtual int OnExit(); }; // Define a new frame class MyFrame: public wxFrame { - public: - wxPanel *panel; +public: + MyFrame(wxFrame *frame, const wxString& title); - MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size); - void OnCloseWindow(wxCloseEvent& event); void OnExit(wxCommandEvent& event); void OnExecute(wxCommandEvent& event); void OnPoke(wxCommandEvent& event); void OnRequest(wxCommandEvent& event); -DECLARE_EVENT_TABLE() + +private: + wxPanel *panel; + + DECLARE_EVENT_TABLE() }; class MyConnection: public wxConnection { - public: - MyConnection(); - ~MyConnection(); - bool OnAdvise(const wxString& topic, const wxString& item, char *data, int size, wxIPCFormat format); - bool OnDisconnect(); +public: + MyConnection(); + ~MyConnection(); + + bool OnAdvise(const wxString& topic, const wxString& item, char *data, int size, wxIPCFormat format); + bool OnDisconnect(); }; class MyClient: public wxClient { - public: - MyClient(); - wxConnectionBase *OnMakeConnection(); +public: + wxConnectionBase *OnMakeConnection(); }; #define CLIENT_QUIT wxID_EXIT diff --git a/samples/ipc/server.cpp b/samples/ipc/server.cpp index 3dfb36562f..4763f877e8 100644 --- a/samples/ipc/server.cpp +++ b/samples/ipc/server.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: server.cpp -// Purpose: DDE sample: server +// Purpose: IPC sample: server // Author: Julian Smart // Modified by: // Created: 25/01/99 @@ -9,101 +9,126 @@ // 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" + #include "mondrian.xpm" #endif #include "server.h" -MyFrame *frame = NULL; +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- IMPLEMENT_APP(MyApp) -char ipc_buffer[4000]; -MyConnection *the_connection = NULL; -MyServer *my_server ; - -bool MyApp::OnInit() -{ - // Create the main frame window - frame = new MyFrame(NULL, "Server", wxDefaultPosition, wxSize(400, 500)); - - frame->CreateStatusBar(); - - // Give it an icon - frame->SetIcon(wxICON(mondrian)); - - // Make a menubar - wxMenu *file_menu = new wxMenu; - - file_menu->Append(SERVER_QUIT, "&Exit"); - - wxMenuBar *menu_bar = new wxMenuBar; - - menu_bar->Append(file_menu, "&File"); - - // Associate the menu bar with the frame - frame->SetMenuBar(menu_bar); - - // 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"); - - frame->panel->Fit(); - frame->Fit(); - - wxString server_name = "4242"; - if (argc > 1) - server_name = argv[1]; - - // Create a new server - my_server = new MyServer; - my_server->Create(server_name); - frame->Show(TRUE); - - return TRUE; -} - BEGIN_EVENT_TABLE(MyFrame, wxFrame) - EVT_MENU(SERVER_QUIT, MyFrame::OnExit) - EVT_CLOSE(MyFrame::OnCloseWindow) EVT_LISTBOX(SERVER_LISTBOX, MyFrame::OnListBoxClick) END_EVENT_TABLE() -// Define my frame constructor -MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size): - wxFrame(frame, -1, title, pos, size) +BEGIN_EVENT_TABLE(IPCDialogBox, wxDialog) + EVT_BUTTON(SERVER_QUIT_BUTTON, IPCDialogBox::OnQuit) +END_EVENT_TABLE() + +// ---------------------------------------------------------------------------- +// global variables +// ---------------------------------------------------------------------------- + +char ipc_buffer[4000]; +MyConnection *the_connection = NULL; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// MyApp +// ---------------------------------------------------------------------------- + +bool MyApp::OnInit() { - panel = NULL; + // Create the main frame window + (new MyFrame(NULL, "Server"))->Show(); + + // create the server object + wxString server_name = "4242"; + if (argc > 1) + server_name = argv[1]; + + // Create a new server + m_server = new MyServer; + m_server->Create(server_name); + + return TRUE; } -void MyFrame::OnExit(wxCommandEvent& event) +int MyApp::OnExit() { - if (my_server) - delete my_server; - this->Destroy(); + delete m_server; + + return 0; +} + +// ---------------------------------------------------------------------------- +// MyFrame +// ---------------------------------------------------------------------------- + +// Define my frame constructor +MyFrame::MyFrame(wxFrame *frame, const wxString& title) + : wxFrame(frame, -1, title) +{ + panel = NULL; + + CreateStatusBar(); + + // Give it an icon + SetIcon(wxICON(mondrian)); + + // Make a menubar + wxMenu *file_menu = new wxMenu; + + file_menu->Append(SERVER_QUIT, "&Exit"); + + wxMenuBar *menu_bar = new wxMenuBar; + + menu_bar->Append(file_menu, "&File"); + + // Associate the menu bar with the frame + SetMenuBar(menu_bar); + + // Make a panel + panel = new wxPanel(this); + wxListBox *list = new wxListBox(panel, SERVER_LISTBOX, wxPoint(5, 5)); + list->Append("Apple"); + list->Append("Pear"); + list->Append("Orange"); + list->Append("Banana"); + list->Append("Fruit"); + + panel->Fit(); + Fit(); } // Set the client process's listbox to this item @@ -115,84 +140,96 @@ void MyFrame::OnListBoxClick(wxCommandEvent& event) wxString value = listBox->GetStringSelection(); if (the_connection) { - the_connection->Advise("Item", (char*) (const char*) value); + the_connection->Advise("Item", (wxChar *)value.c_str()); } } } -void MyFrame::OnCloseWindow(wxCloseEvent& event) -{ - if (my_server) - delete my_server; - this->Destroy(); -} +// ---------------------------------------------------------------------------- +// IPCDialogBox +// ---------------------------------------------------------------------------- -BEGIN_EVENT_TABLE(IPCDialogBox, wxDialog) - EVT_BUTTON(SERVER_QUIT_BUTTON, IPCDialogBox::OnQuit) -END_EVENT_TABLE() - -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, "Quit this connection", + wxPoint(5, 5)); + Fit(); } void IPCDialogBox::OnQuit(wxCommandEvent& event) { - connection->Disconnect(); - delete connection; + 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 - return NULL; + if (strcmp(topic, "STDIO") != 0 && strcmp(topic, "IPC TEST") == 0) + return new MyConnection(ipc_buffer, WXSIZEOF(ipc_buffer)); + else + return NULL; } -MyConnection::MyConnection(char *buf, int size):wxConnection(buf, size) +// ---------------------------------------------------------------------------- +// MyConnection +// ---------------------------------------------------------------------------- + +MyConnection::MyConnection(char *buf, int size) + : wxConnection(buf, size) { - dialog = new IPCDialogBox(frame, "Connection", wxPoint(100, 100), wxSize(500, 500), this); - dialog->Show(TRUE); - the_connection = this; + dialog = new IPCDialogBox(wxTheApp->GetTopWindow(), "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) + { + dialog->Destroy(); + the_connection = NULL; + } } -bool MyConnection::OnExecute(const wxString& topic, char *data, int size, wxIPCFormat format) +bool MyConnection::OnExecute(const wxString& WXUNUSED(topic), + char *data, + int WXUNUSED(size), + wxIPCFormat WXUNUSED(format)) { - char buf[300]; - sprintf(buf, "Execute command: %s", data); - frame->SetStatusText(buf); - return TRUE; + wxLogStatus("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, + char *data, + int WXUNUSED(size), + wxIPCFormat WXUNUSED(format)) { - char buf[300]; - sprintf(buf, "Poke command: %s", data); - frame->SetStatusText(buf); - return TRUE; + wxLogStatus("Poke command: %s = %s", item, data); + return TRUE; } -char *MyConnection::OnRequest(const wxString& topic, const wxString& item, int *size, wxIPCFormat format) +char *MyConnection::OnRequest(const wxString& WXUNUSED(topic), + const wxString& WXUNUSED(item), + int * WXUNUSED(size), + wxIPCFormat WXUNUSED(format)) { - return "Here, have your data, client!"; + return "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; } diff --git a/samples/ipc/server.h b/samples/ipc/server.h index 81aa31697b..03b358b1f4 100644 --- a/samples/ipc/server.h +++ b/samples/ipc/server.h @@ -10,41 +10,47 @@ ///////////////////////////////////////////////////////////////////////////// // Define a new application -class MyApp: public wxApp +class MyServer; +class MyApp : public wxApp { - public: - bool OnInit(); +public: + virtual bool OnInit(); + virtual int OnExit(); + +private: + MyServer *m_server; }; DECLARE_APP(MyApp) // Define a new frame -class MyFrame: public wxFrame +class MyFrame : public wxFrame { - public: +public: + MyFrame(wxFrame *frame, const wxString& title); + + void OnListBoxClick(wxCommandEvent& event); + +private: wxPanel *panel; - MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size); - - void OnCloseWindow(wxCloseEvent& event); - void OnExit(wxCommandEvent& event); - void OnListBoxClick(wxCommandEvent& event); -DECLARE_EVENT_TABLE() + DECLARE_EVENT_TABLE() }; class IPCDialogBox; -class MyConnection: public wxConnection +class MyConnection : public wxConnection { - public: - IPCDialogBox *dialog; +public: + MyConnection(char *buf, int size); + ~MyConnection(); - MyConnection(char *buf, int size); - ~MyConnection(); + bool OnExecute(const wxString& topic, char *data, int size, wxIPCFormat format); + char *OnRequest(const wxString& topic, const wxString& item, int *size, wxIPCFormat format); + bool OnPoke(const wxString& topic, const wxString& item, char *data, int size, wxIPCFormat format); + bool OnStartAdvise(const wxString& topic, const wxString& item); - bool OnExecute(const wxString& topic, char *data, int size, wxIPCFormat format); - char *OnRequest(const wxString& topic, const wxString& item, int *size, wxIPCFormat format); - bool OnPoke(const wxString& topic, const wxString& item, char *data, int size, wxIPCFormat format); - bool OnStartAdvise(const wxString& topic, const wxString& item); +private: + IPCDialogBox *dialog; }; class MyServer: public wxServer @@ -56,13 +62,18 @@ public: class IPCDialogBox: public wxDialog { public: - MyConnection *connection; - IPCDialogBox(wxFrame *parent, const wxString& title, - const wxPoint& pos, const wxSize& size, MyConnection *the_connection); + IPCDialogBox(wxWindow *parent, + const wxString& title, + const wxPoint& pos, + const wxSize& size, + MyConnection *the_connection); void OnQuit(wxCommandEvent& event); -DECLARE_EVENT_TABLE() +private: + MyConnection *m_connection; + + DECLARE_EVENT_TABLE() }; #define SERVER_QUIT wxID_EXIT