From 022a8a5af2763ae462ac56fe6d1d7bd6d4fe71c8 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 12 Jan 2008 21:04:10 +0000 Subject: [PATCH] call OnExec() taking wxString argument from OnExecute() by default git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51185 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 2 ++ docs/latex/wx/ipcconn.tex | 6 ++--- include/wx/ipcbase.h | 28 +++++++++++++++++---- src/common/ipcbase.cpp | 51 +++++++++++++++++++++++++++++++++++++-- 4 files changed, 77 insertions(+), 10 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 9228db687b..ebe250a96d 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -157,6 +157,8 @@ Deprecated methods and their replacements - wxXmlProperty class was renamed to wxXmlAttribute in order to use standard terminology. Corresponding wxXmlNode methods were renamed to use "Attribute" instead of "Property" or "Prop" in their names. +- wxConnection::OnExecute() is not formally deprecated yet but new code should + use simpler OnExec() version which is called with wxString argument Major new features in this release diff --git a/docs/latex/wx/ipcconn.tex b/docs/latex/wx/ipcconn.tex index 88e791ef79..fee3d59ff9 100644 --- a/docs/latex/wx/ipcconn.tex +++ b/docs/latex/wx/ipcconn.tex @@ -117,7 +117,7 @@ to be called. Returns true if successful. Called by the client application to execute a command on the server. Can also be used to transfer arbitrary data to the server (similar to \helpref{wxConnection::Poke}{wxconnectionpoke} in -that respect). Causes the server connection's \helpref{wxConnection::OnExecute}{wxconnectiononexecute} +that respect). Causes the server connection's \helpref{wxConnection::OnExec}{wxconnectiononexec} member to be called. Returns true if successful. \membersection{wxConnection::Disconnect}\label{wxconnectiondisconnect} @@ -150,9 +150,9 @@ applications should generally override {\bf OnDisconnect} (finally calling the inherited method as well) so that they know the connection object is no longer available. -\membersection{wxConnection::OnExecute}\label{wxconnectiononexecute} +\membersection{wxConnection::OnExec}\label{wxconnectiononexec} -\func{virtual bool}{OnExecute}{\param{const wxString\& }{topic}, \param{const void* }{data}, \param{size\_t }{size}, \param{wxIPCFormat}{ format}} +\func{virtual bool}{OnExec}{\param{const wxString\& }{topic}, \param{const wxString\& }{data}} Message sent to the server application when the client notifies it to execute the given data, using \helpref{Execute}{wxconnectionexecute}. diff --git a/include/wx/ipcbase.h b/include/wx/ipcbase.h index f3987ac4af..56de3c8d35 100644 --- a/include/wx/ipcbase.h +++ b/include/wx/ipcbase.h @@ -127,12 +127,19 @@ public: // Callbacks to SERVER - override at will - virtual bool OnExecute(const wxString& WXUNUSED(topic), - const void *WXUNUSED(data), - size_t WXUNUSED(size), - wxIPCFormat WXUNUSED(format)) + virtual bool OnExec(const wxString& WXUNUSED(topic), + const wxString& WXUNUSED(data)) { return false; } + // deprecated function kept for backwards compatibility: usually you will + // want to override OnExec() above instead which receives its data in a more + // convenient format + virtual bool OnExecute(const wxString& topic, + const void *data, + size_t size, + wxIPCFormat format) + { return OnExec(topic, GetTextFromData(data, size, format)); } + virtual const void *OnRequest(const wxString& WXUNUSED(topic), const wxString& WXUNUSED(item), size_t *size, @@ -166,6 +173,17 @@ public: virtual bool OnDisconnect() { delete this; return true; } + // converts from the data and format into a wxString automatically + // + // this function accepts data in all of wxIPC_TEXT, wxIPC_UNICODETEXT, and + // wxIPC_UTF8TEXT formats but asserts if the format is anything else + // + // notice that the size parameter here contains the total size of the data, + // including the terminating '\0' or L'\0' + static + wxString GetTextFromData(const void *data, size_t size, wxIPCFormat format); + + // return a buffer at least this size, reallocating buffer if needed // returns NULL if using an inadequate user buffer which can't be resized void *GetBufferAtLeast(size_t bytes); @@ -184,7 +202,7 @@ private: bool m_deletebufferwhendone; protected: - bool m_connected; + bool m_connected; DECLARE_NO_ASSIGN_CLASS(wxConnectionBase) DECLARE_CLASS(wxConnectionBase) diff --git a/src/common/ipcbase.cpp b/src/common/ipcbase.cpp index 0de6f3b045..ee7e34278f 100644 --- a/src/common/ipcbase.cpp +++ b/src/common/ipcbase.cpp @@ -59,12 +59,59 @@ wxConnectionBase::wxConnectionBase(const wxConnectionBase& copy) } -wxConnectionBase::~wxConnectionBase(void) +wxConnectionBase::~wxConnectionBase() { - if ( m_deletebufferwhendone && m_buffer ) + if ( m_deletebufferwhendone ) delete m_buffer; } +/* static */ +wxString wxConnectionBase::GetTextFromData(const void* data, + size_t size, + wxIPCFormat fmt) +{ + wxString s; + switch ( fmt ) + { + case wxIPC_TEXT: + // normally the string should be NUL-terminated and size should + // include the total size of the buffer, including NUL -- but don't + // crash (by trying to access (size_t)-1 bytes) if it doesn't + if ( size ) + size--; + + s = wxString(wx_static_cast(const char *, data), size); + break; + +#if wxUSE_UNICODE + // TODO: we should handle both wxIPC_UTF16TEXT and wxIPC_UTF32TEXT here + // for inter-platform IPC + case wxIPC_UNICODETEXT: + wxASSERT_MSG( !(size % sizeof(wchar_t)), "invalid buffer size" ); + if ( size ) + { + size /= sizeof(wchar_t); + size--; + } + + s = wxString(wx_static_cast(const wchar_t *, data), size); + break; + + case wxIPC_UTF8TEXT: + if ( size ) + size--; + + s = wxString::FromUTF8(wx_static_cast(const char *, data), size); + break; +#endif // wxUSE_UNICODE + + default: + wxFAIL_MSG( "non-string IPC format in GetTextFromData()" ); + } + + return s; +} + void *wxConnectionBase::GetBufferAtLeast( size_t bytes ) { if ( m_buffersize >= bytes ) -- 2.45.2