// headers
// --------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(__APPLE__)
-# pragma implementation "server.cpp"
-# pragma interface "server.cpp"
-#endif
-
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
// --------------------------------------------------------------------------
// the application icon
-#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__)
-# include "mondrian.xpm"
-#endif
+#include "mondrian.xpm"
// --------------------------------------------------------------------------
// classes
DECLARE_EVENT_TABLE()
};
+// simple helper class to log start and end of each test
+class TestLogger
+{
+public:
+ TestLogger(const wxString& name) : m_name(name)
+ {
+ wxLogMessage("=== %s begins ===", m_name);
+ }
+
+ ~TestLogger()
+ {
+ wxLogMessage("=== %s ends ===", m_name);
+ }
+
+private:
+ const wxString m_name;
+};
+
// --------------------------------------------------------------------------
// constants
// --------------------------------------------------------------------------
enum
{
// menu items
- SERVER_QUIT = 1000,
- SERVER_ABOUT,
+ SERVER_QUIT = wxID_EXIT,
+ SERVER_ABOUT = wxID_ABOUT,
// id for sockets
- SERVER_ID,
+ SERVER_ID = 100,
SOCKET_ID
};
bool MyApp::OnInit()
{
+ if ( !wxApp::OnInit() )
+ return false;
+
// Create the main application window
MyFrame *frame = new MyFrame();
_("Welcome to wxSocket demo: Server\n"),
wxDefaultPosition, wxDefaultSize,
wxTE_MULTILINE | wxTE_READONLY);
+ delete wxLog::SetActiveTarget(new wxLogTextCtrl(m_text));
// Create the address - defaults to localhost:0 initially
+#if wxUSE_IPV6
+ wxIPV6address addr;
+#else
wxIPV4address addr;
+#endif
addr.Service(3000);
// Create the socket
// We use Ok() here to see if the server is really listening
if (! m_server->Ok())
{
- m_text->AppendText(_("Could not listen at the specified port !\n\n"));
+ wxLogMessage("Could not listen at the specified port !");
return;
}
else
{
- m_text->AppendText(_("Server listening.\n\n"));
+ wxLogMessage("Server listening.");
}
// Setup the event handler and subscribe to connection events
void MyFrame::Test1(wxSocketBase *sock)
{
- unsigned char len;
- char *buf;
-
- m_text->AppendText(_("Test 1 begins\n"));
+ TestLogger logtest("Test 1");
// Receive data from socket and send it back. We will first
// get a byte with the buffer size, so we can specify the
sock->SetFlags(wxSOCKET_WAITALL);
// Read the size
+ unsigned char len;
sock->Read(&len, 1);
- buf = new char[len];
+ wxCharBuffer buf(len);
// Read the data
- sock->Read(buf, len);
- m_text->AppendText(_("Got the data, sending it back\n"));
+ sock->Read(buf.data(), len);
+ wxLogMessage("Got the data, sending it back");
// Write it back
sock->Write(buf, len);
- delete[] buf;
-
- m_text->AppendText(_("Test 1 ends\n\n"));
}
void MyFrame::Test2(wxSocketBase *sock)
{
-#define MAX_MSG_SIZE 10000
+ char buf[4096];
- wxString s;
- wxChar *buf = new wxChar[MAX_MSG_SIZE];
- wxUint32 len;
-
- m_text->AppendText(_("Test 2 begins\n"));
+ TestLogger logtest("Test 2");
// We don't need to set flags because ReadMsg and WriteMsg
// are not affected by them anyway.
// Read the message
- len = sock->ReadMsg(buf, MAX_MSG_SIZE * sizeof(wxChar)).LastCount();
- s.Printf(_("Client says: %s\n"), buf);
- m_text->AppendText(s);
- m_text->AppendText(_("Sending the data back\n"));
+ wxUint32 len = sock->ReadMsg(buf, sizeof(buf)).LastCount();
+ if ( !len )
+ {
+ wxLogError("Failed to read message.");
+ return;
+ }
+
+ wxLogMessage("Got \"%s\" from client.", wxString::FromUTF8(buf, len));
+ wxLogMessage("Sending the data back");
// Write it back
sock->WriteMsg(buf, len);
- delete[] buf;
-
- m_text->AppendText(_("Test 2 ends\n\n"));
-
-#undef MAX_MSG_SIZE
}
void MyFrame::Test3(wxSocketBase *sock)
{
- unsigned char len;
- char *buf;
-
- m_text->AppendText(_("Test 3 begins\n"));
+ TestLogger logtest("Test 3");
// This test is similar to the first one, but the len is
// expressed in kbytes - this tests large data transfers.
sock->SetFlags(wxSOCKET_WAITALL);
// Read the size
+ unsigned char len;
sock->Read(&len, 1);
- buf = new char[len * 1024];
+ wxCharBuffer buf(len*1024);
// Read the data
- sock->Read(buf, len * 1024);
- m_text->AppendText(_("Got the data, sending it back\n"));
+ sock->Read(buf.data(), len * 1024);
+ wxLogMessage("Got the data, sending it back");
// Write it back
sock->Write(buf, len * 1024);
- delete[] buf;
-
- m_text->AppendText(_("Test 3 ends\n\n"));
}
void MyFrame::OnServerEvent(wxSocketEvent& event)
if (sock)
{
- m_text->AppendText(_("New client connection accepted\n\n"));
+ wxLogMessage("New client connection accepted");
}
else
{
- m_text->AppendText(_("Error: couldn't accept a new connection\n\n"));
+ wxLogMessage("Error: couldn't accept a new connection");
return;
}
case 0xCE: Test2(sock); break;
case 0xDE: Test3(sock); break;
default:
- m_text->AppendText(_("Unknown test id received from client\n\n"));
+ wxLogMessage("Unknown test id received from client");
}
// Enable input events again.
// middle of a test or something. Destroy() takes care of all
// this for us.
- m_text->AppendText(_("Deleting socket.\n\n"));
+ wxLogMessage("Deleting socket.");
sock->Destroy();
break;
}