X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/70d26c3f4ffb24d50457d405c9595fd23f9e5b7c..c4e2838090992384911a6a6aa44cac985d79a555:/samples/ipc/server.cpp?ds=inline diff --git a/samples/ipc/server.cpp b/samples/ipc/server.cpp index 3dfb36562f..562f9bb9f2 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,190 +9,245 @@ // 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, wxID_ANY, title, wxDefaultPosition, wxSize(350, 250)) +{ +#if wxUSE_STATUSBAR + CreateStatusBar(); +#endif // wxUSE_STATUSBAR - 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); + 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, wxID_ANY, 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; + // wxWidgets 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"), + wxDefaultPosition, wxDefaultSize, 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; }