]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/wxsocket/server.cpp
* Added wxsocket lib and sample (I hope I don't forget some file)
[wxWidgets.git] / samples / wxsocket / server.cpp
diff --git a/samples/wxsocket/server.cpp b/samples/wxsocket/server.cpp
new file mode 100644 (file)
index 0000000..2c52190
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * File:       server.cpp
+ * Purpose:    wxSocket: server demo
+ * Author:     LAVAUX Guilhem (from minimal.cc)
+ * Created:    June 1997
+ * Updated:    
+ * Copyright:  (c) 1993, AIAI, University of Edinburgh
+ *             (C) 1997, LAVAUX Guilhem
+ */
+#ifdef __GNUG__
+#pragma implementation
+#pragma interface
+#endif
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+#include "wx/socket.h"
+
+// Define a new application type
+class MyApp: public wxApp
+{ public:
+    bool OnInit(void);
+};
+
+class MyServer;
+
+// Define a new frame type
+class MyFrame: public wxFrame
+{ 
+  DECLARE_EVENT_TABLE()
+public:
+  MyServer *sock;
+  int nb_clients;
+
+  MyFrame(wxFrame *frame);
+  virtual ~MyFrame();
+  void Menu_Exit(wxCommandEvent& evt);
+  void ExecTest1(wxSocketBase *sock_o);
+  void UpdateStatus(int incr);
+};
+
+#define SKDEMO_QUIT 101
+
+BEGIN_EVENT_TABLE(MyFrame, wxFrame)
+  EVT_MENU(SKDEMO_QUIT, MyFrame::Menu_Exit)
+END_EVENT_TABLE()
+
+class MySock: public wxSocketBase {
+public:
+  MyFrame *frame;
+
+  void OldOnNotify(wxRequestEvent flags);
+};
+
+class MyServer: public wxSocketServer {
+public:
+  MyFrame *frame;
+
+  MyServer(wxSockAddress& addr) : wxSocketServer(addr) { }
+  void OldOnNotify(wxRequestEvent flags);
+};
+
+IMPLEMENT_APP(MyApp)
+
+// `Main program' equivalent, creating windows and returning main app frame
+bool MyApp::OnInit(void)
+{
+  // Create the main frame window
+  MyFrame *frame = new MyFrame(NULL);
+
+  // Give it an icon
+#ifdef wx_msw
+  frame->SetIcon(new wxIcon("mondrian"));
+#endif
+#ifdef wx_x
+  frame->SetIcon(new wxIcon("aiai.xbm"));
+#endif
+
+  // Make a menubar
+  wxMenu *file_menu = new wxMenu;
+
+  file_menu->Append(SKDEMO_QUIT, "E&xit");
+  wxMenuBar *menu_bar = new wxMenuBar;
+  menu_bar->Append(file_menu, "File");
+  frame->SetMenuBar(menu_bar);
+
+  // Make a panel with a message
+  (void)new wxPanel(frame, 0, 0, 300, 100);
+
+  // Show the frame
+  frame->Show(TRUE);
+  
+  // Return the main frame window
+  return TRUE;
+}
+
+void MySock::OldOnNotify(wxRequestEvent flags)
+{
+  extern wxList wxPendingDelete;
+
+  switch (flags) {
+  case EVT_READ:
+    unsigned char c;
+
+    ReadMsg((char *)&c, 1);
+    if (c == 0xbe)
+      frame->ExecTest1(this);
+
+    break;
+  case EVT_LOST:
+    frame->UpdateStatus(-1);
+    wxPendingDelete.Append(this);
+    break;
+  }
+}
+
+void MyServer::OldOnNotify(wxRequestEvent WXUNUSED(flags))
+{
+  MySock *sock2 = new MySock();
+
+  if (!AcceptWith(*sock2))
+    return;
+
+  m_handler->Register(sock2);
+
+  sock2->SetFlags(NONE);
+  sock2->frame = frame;
+  sock2->SetNotify(REQ_READ | REQ_LOST);
+  sock2->Notify(TRUE);
+  frame->UpdateStatus(1);
+}
+
+// My frame Constructor
+MyFrame::MyFrame(wxFrame *frame):
+  wxFrame(frame, -1, "wxSocket sample (server)", wxDefaultPosition,
+          wxSize(300, 200))
+{
+  wxIPV4address addr;
+  addr.Service(3000);
+
+  // Init all
+  wxSocketHandler::Master();
+
+  sock = new MyServer(addr);
+  wxSocketHandler::Master().Register(sock);
+  sock->frame = this;
+  sock->SetNotify(wxSocketBase::REQ_ACCEPT);
+  sock->Notify(TRUE);
+  nb_clients = 0;
+
+  CreateStatusBar(1);
+  UpdateStatus(0);
+}
+
+MyFrame::~MyFrame()
+{
+  delete sock;
+}
+
+// Intercept menu commands
+void MyFrame::Menu_Exit(wxCommandEvent& event)
+{
+  Close(TRUE);
+}
+
+void MyFrame::ExecTest1(wxSocketBase *sock_o)
+{
+  char *buf = new char[50];
+  size_t l;
+
+  l = sock_o->Read(buf, 50).LastCount();
+  sock_o->Write(buf, l);
+}
+
+void MyFrame::UpdateStatus(int incr)
+{
+  char s[30];
+  nb_clients += incr;
+  sprintf(s, "%d clients connected", nb_clients);
+  SetStatusText(s);
+}