home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / samples / ipc / server.cpp < prev    next >
C/C++ Source or Header  |  2002-12-16  |  8KB  |  252 lines

  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: server.cpp,v 1.11.2.1 2002/12/15 17:25:08 MBN Exp $
  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& 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.  
  252.