X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/521d34369b806a3ae359d2abef1ab28e3214974a..d8eff331e23435d9d8d6483a40f6fd9997a13f87:/samples/ipc/baseserver.cpp diff --git a/samples/ipc/baseserver.cpp b/samples/ipc/baseserver.cpp index 913704073b..6549fdfa42 100644 --- a/samples/ipc/baseserver.cpp +++ b/samples/ipc/baseserver.cpp @@ -39,63 +39,106 @@ #include "wx/datetime.h" // ---------------------------------------------------------------------------- -// wxWin macros +// local classes // ---------------------------------------------------------------------------- -// Define a new application -class MyServer; - -class MyApp : public wxApp -{ -public: - virtual bool OnInit(); - virtual int OnExit(); - -protected: - MyServer *m_server; -}; - -DECLARE_APP(MyApp) - +// a simple connection class testing and logging various operations class MyConnection : public MyConnectionBase, public wxTimer { public: virtual bool Disconnect() { return wxConnection::Disconnect(); } - virtual bool OnExecute(const wxString& topic, const void *data, size_t size, wxIPCFormat format); - virtual const void *OnRequest(const wxString& topic, const wxString& item, size_t *size, wxIPCFormat format); - virtual bool OnPoke(const wxString& topic, const wxString& item, const void *data, size_t size, wxIPCFormat format); + virtual bool OnExecute(const wxString& topic, + const void *data, + size_t size, + wxIPCFormat format); + virtual const void *OnRequest(const wxString& topic, + const wxString& item, + size_t *size, + wxIPCFormat format); + virtual bool OnPoke(const wxString& topic, + const wxString& item, + const void *data, + size_t size, + wxIPCFormat format); virtual bool OnStartAdvise(const wxString& topic, const wxString& item); virtual bool OnStopAdvise(const wxString& topic, const wxString& item); - virtual bool DoAdvise(const wxString& item, const void *data, size_t size, wxIPCFormat format); + virtual bool DoAdvise(const wxString& item, + const void *data, + size_t size, + wxIPCFormat format); virtual bool OnDisconnect(); virtual void Notify(); +private: wxString m_sAdvise; -protected: wxString m_sRequestDate; char m_achRequestBytes[3]; }; -class MyServer: public wxServer +// a connection used for benchmarking some IPC operations by +// tests/benchmarks/ipcclient.cpp +class BenchConnection : public wxConnection +{ +public: + BenchConnection() { m_advise = false; } + + virtual bool OnPoke(const wxString& topic, + const wxString& item, + const void *data, + size_t size, + wxIPCFormat format); + virtual bool OnStartAdvise(const wxString& topic, const wxString& item); + virtual bool OnStopAdvise(const wxString& topic, const wxString& item); + +private: + // return true if this is the supported topic+item combination, log an + // error message otherwise + bool IsSupportedTopicAndItem(const wxString& operation, + const wxString& topic, + const wxString& item) const; + + // the item which can be manipulated by the client via Poke() calls + wxString m_item; + + // should we notify the client about changes to m_item? + bool m_advise; + + wxDECLARE_NO_COPY_CLASS(BenchConnection); +}; + +// a simple server accepting connections to IPC_TOPIC and IPC_BENCHMARK_TOPIC +class MyServer : public wxServer { public: MyServer(); virtual ~MyServer(); void Disconnect(); bool IsConnected() { return m_connection != NULL; }; - MyConnection *GetConnection() { return m_connection; }; - wxConnectionBase *OnAcceptConnection(const wxString& topic); + + virtual wxConnectionBase *OnAcceptConnection(const wxString& topic); + +private: + wxConnection *m_connection; +}; + +// Define a new application +class MyApp : public wxApp +{ +public: + virtual bool OnInit(); protected: - MyConnection *m_connection; + MyServer m_server; }; +DECLARE_APP(MyApp) + // ============================================================================ // implementation // ============================================================================ -IMPLEMENT_APP(MyApp) +IMPLEMENT_APP_CONSOLE(MyApp) // ---------------------------------------------------------------------------- // MyApp @@ -108,29 +151,23 @@ bool MyApp::OnInit() delete wxLog::SetActiveTarget(new wxLogStderr); - // Create a new server - m_server = new MyServer; - if (m_server->Create("4242")) - { - wxLogMessage(_T("Server 4242 started")); + const char * const kind = #if wxUSE_DDE_FOR_IPC - wxLogMessage(_T("Server uses DDE")); -#else // !wxUSE_DDE_FOR_IPC - wxLogMessage(_T("Server uses TCP")); -#endif // wxUSE_DDE_FOR_IPC/!wxUSE_DDE_FOR_IPC - return true; - } - else + "DDE" +#else + "TCP" +#endif + ; + + // Create a new server + if ( !m_server.Create(IPC_SERVICE) ) { - wxLogMessage(_T("Server 4242 failed to start")); - delete m_server; + wxLogMessage("%s server failed to start on %s", kind, IPC_SERVICE); return false; } -} -int MyApp::OnExit() -{ - return 0; + wxLogMessage("%s server started on %s", kind, IPC_SERVICE); + return true; } // ---------------------------------------------------------------------------- @@ -149,26 +186,34 @@ MyServer::~MyServer() wxConnectionBase *MyServer::OnAcceptConnection(const wxString& topic) { - wxLogMessage(_T("OnAcceptConnection(\"%s\")"), topic.c_str()); + wxLogMessage("OnAcceptConnection(\"%s\")", topic); if ( topic == IPC_TOPIC ) { m_connection = new MyConnection; - wxLogMessage(_T("Connection accepted")); - return m_connection; } - // unknown topic - return NULL; + else if ( topic == IPC_BENCHMARK_TOPIC ) + { + m_connection = new BenchConnection; + } + else // unknown topic + { + wxLogMessage("Unknown topic"); + return NULL; + } + + wxLogMessage("Connection accepted"); + return m_connection; } void MyServer::Disconnect() { - if (m_connection) + if ( m_connection ) { m_connection->Disconnect(); delete m_connection; m_connection = NULL; - wxLogMessage(_T("Disconnected client")); + wxLogMessage("Disconnected client"); } } @@ -176,40 +221,53 @@ void MyServer::Disconnect() // MyConnection // ---------------------------------------------------------------------------- -bool MyConnection::OnExecute(const wxString& topic, - const void *data, size_t size, wxIPCFormat format) +bool +MyConnection::OnExecute(const wxString& topic, + const void *data, + size_t size, + wxIPCFormat format) { - Log(_T("OnExecute"), topic, _T(""), data, size, format); + Log("OnExecute", topic, "", data, size, format); return true; } -bool MyConnection::OnPoke(const wxString& topic, - const wxString& item, const void *data, size_t size, wxIPCFormat format) +bool +MyConnection::OnPoke(const wxString& topic, + const wxString& item, + const void *data, + size_t size, + wxIPCFormat format) { - Log(_T("OnPoke"), topic, item, data, size, format); + Log("OnPoke", topic, item, data, size, format); return wxConnection::OnPoke(topic, item, data, size, format); } -const void *MyConnection::OnRequest(const wxString& topic, - const wxString& item, size_t *size, wxIPCFormat format) +const void * +MyConnection::OnRequest(const wxString& topic, + const wxString& item, + size_t *size, + wxIPCFormat format) { const void *data; - if (item == _T("Date")) + if (item == "Date") { m_sRequestDate = wxDateTime::Now().Format(); data = m_sRequestDate.c_str(); *size = wxNO_LEN; } - else if (item == _T("Date+len")) + else if (item == "Date+len") { - m_sRequestDate = wxDateTime::Now().FormatTime() + _T(" ") + wxDateTime::Now().FormatDate(); + m_sRequestDate = wxDateTime::Now().FormatTime() + + " " + wxDateTime::Now().FormatDate(); data = m_sRequestDate.c_str(); *size = m_sRequestDate.Length() + 1; } - else if (item == _T("bytes[3]")) + else if (item == "bytes[3]") { data = m_achRequestBytes; - m_achRequestBytes[0] = '1'; m_achRequestBytes[1] = '2'; m_achRequestBytes[2] = '3'; + m_achRequestBytes[0] = '1'; + m_achRequestBytes[1] = '2'; + m_achRequestBytes[2] = '3'; *size = 3; } else @@ -217,42 +275,45 @@ const void *MyConnection::OnRequest(const wxString& topic, data = NULL; *size = 0; } - Log(_T("OnRequest"), topic, item, data, *size, format); + Log("OnRequest", topic, item, data, *size, format); return data; } -bool MyConnection::OnStartAdvise(const wxString& topic, - const wxString& item) +bool MyConnection::OnStartAdvise(const wxString& topic, const wxString& item) { - wxLogMessage(_T("OnStartAdvise(\"%s\",\"%s\")"), topic.c_str(), item.c_str()); - wxLogMessage(_T("Returning true")); + wxLogMessage("OnStartAdvise(\"%s\",\"%s\")", topic, item); + wxLogMessage("Returning true"); m_sAdvise = item; - Start(3000, false); + Start(3000); // schedule our Notify() to be called in 3 seconds return true; } -bool MyConnection::OnStopAdvise(const wxString& topic, - const wxString& item) +bool MyConnection::OnStopAdvise(const wxString& topic, const wxString& item) { - wxLogMessage(_T("OnStopAdvise(\"%s\",\"%s\")"), topic.c_str(), item.c_str()); - wxLogMessage(_T("Returning true")); - m_sAdvise.Empty(); + wxLogMessage("OnStopAdvise(\"%s\",\"%s\")", topic, item); + wxLogMessage("Returning true"); + m_sAdvise.clear(); Stop(); return true; } void MyConnection::Notify() { - if (!m_sAdvise.IsEmpty()) + if (!m_sAdvise.empty()) { wxString s = wxDateTime::Now().Format(); Advise(m_sAdvise, s); - s = wxDateTime::Now().FormatTime() + _T(" ") + wxDateTime::Now().FormatDate(); - Advise(m_sAdvise, (const char *)s.c_str(), s.Length() + 1); + s = wxDateTime::Now().FormatTime() + " " + + wxDateTime::Now().FormatDate(); + Advise(m_sAdvise, s.mb_str(), s.length() + 1); #if wxUSE_DDE_FOR_IPC - wxLogMessage(_T("DDE Advise type argument cannot be wxIPC_PRIVATE. The client will receive it as wxIPC_TEXT, and receive the correct no of bytes, but not print a correct log entry.")); -#endif + wxLogMessage("DDE Advise type argument cannot be wxIPC_PRIVATE. " + "The client will receive it as wxIPC_TEXT, " + "and receive the correct no of bytes, " + "but not print a correct log entry."); +#endif // DDE + char bytes[3]; bytes[0] = '1'; bytes[1] = '2'; bytes[2] = '3'; Advise(m_sAdvise, bytes, 3, wxIPC_PRIVATE); @@ -261,14 +322,85 @@ void MyConnection::Notify() } } -bool MyConnection::DoAdvise(const wxString& item, const void *data, size_t size, wxIPCFormat format) +bool MyConnection::DoAdvise(const wxString& item, + const void *data, + size_t size, + wxIPCFormat format) { - Log(_T("Advise"), _T(""), item, data, size, format); + Log("Advise", "", item, data, size, format); return wxConnection::DoAdvise(item, data, size, format); } bool MyConnection::OnDisconnect() { - wxLogMessage(_T("OnDisconnect()")); + wxLogMessage("OnDisconnect()"); + return true; +} + +// ---------------------------------------------------------------------------- +// BenchConnection +// ---------------------------------------------------------------------------- + +bool BenchConnection::IsSupportedTopicAndItem(const wxString& operation, + const wxString& topic, + const wxString& item) const +{ + if ( topic != IPC_BENCHMARK_TOPIC || + item != IPC_BENCHMARK_ITEM ) + { + wxLogMessage("Unexpected %s(\"%s\", \"%s\") call.", + operation, topic, item); + return false; + } + + return true; +} + +bool BenchConnection::OnPoke(const wxString& topic, + const wxString& item, + const void *data, + size_t size, + wxIPCFormat format) +{ + if ( !IsSupportedTopicAndItem("OnPoke", topic, item) ) + return false; + + if ( !IsTextFormat(format) ) + { + wxLogMessage("Unexpected format %d in OnPoke().", format); + return false; + } + + m_item = GetTextFromData(data, size, format); + + if ( m_advise ) + { + if ( !Advise(item, m_item) ) + { + wxLogMessage("Failed to advise client about the change."); + } + } + + return true; +} + +bool BenchConnection::OnStartAdvise(const wxString& topic, const wxString& item) +{ + if ( !IsSupportedTopicAndItem("OnStartAdvise", topic, item) ) + return false; + + m_advise = true; + return true; } + +bool BenchConnection::OnStopAdvise(const wxString& topic, const wxString& item) +{ + if ( !IsSupportedTopicAndItem("OnStopAdvise", topic, item) ) + return false; + + m_advise = false; + + return true; +} +