X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b61d8079f54ee9fd67bd2a1e42970bc30031e20a..f0eebb39bc6bb54441e695b3c1b1e0bea6ab5c01:/src/msw/dde.cpp diff --git a/src/msw/dde.cpp b/src/msw/dde.cpp index 9fd53fd87d..1580323420 100644 --- a/src/msw/dde.cpp +++ b/src/msw/dde.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/dde.cpp +// Name: src/msw/dde.cpp // Purpose: DDE classes // Author: Julian Smart // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "dde.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -33,22 +29,18 @@ #ifndef WX_PRECOMP #include "wx/utils.h" #include "wx/app.h" + #include "wx/hashmap.h" + #include "wx/module.h" #endif -#include "wx/module.h" #include "wx/dde.h" #include "wx/intl.h" -#include "wx/hashmap.h" #include "wx/msw/private.h" #include #include -#ifdef __GNUWIN32_OLD__ - #include "wx/msw/gnuwin32/extra.h" -#endif - // ---------------------------------------------------------------------------- // macros and constants // ---------------------------------------------------------------------------- @@ -112,9 +104,9 @@ static wxAtomMap wxAtomTable; #include "wx/listimpl.cpp" -WX_DEFINE_LIST(wxDDEClientList); -WX_DEFINE_LIST(wxDDEServerList); -WX_DEFINE_LIST(wxDDEConnectionList); +WX_DEFINE_LIST(wxDDEClientList) +WX_DEFINE_LIST(wxDDEServerList) +WX_DEFINE_LIST(wxDDEConnectionList) static wxDDEClientList wxDDEClientObjects; static wxDDEServerList wxDDEServerObjects; @@ -308,7 +300,7 @@ bool wxDDEServer::Create(const wxString& server) wxDDEServer::~wxDDEServer() { - if ( !!m_serviceName ) + if ( !m_serviceName.empty() ) { HSZ hsz = DDEAtomFromString(m_serviceName); @@ -553,19 +545,21 @@ bool wxDDEConnection::Disconnect() return ok; } -bool wxDDEConnection::Execute(const wxChar *data, int size, wxIPCFormat format) +bool wxDDEConnection::Execute(const wxChar *data, int size, wxIPCFormat WXUNUSED(format)) { DWORD result; if (size < 0) { - size = wxStrlen(data) + 1; + size = (wxStrlen(data) + 1) * sizeof(wxChar); // includes final NUL } - bool ok = DdeClientTransaction((LPBYTE)data, - size * sizeof(wxChar), + bool ok = DdeClientTransaction((LPBYTE)data, + size, GetHConv(), NULL, - format, +// If the transaction specified by the wType parameter does not pass data or is XTYP_EXECUTE, +// wFmt should be zero. + 0, XTYP_EXECUTE, DDE_TIMEOUT, &result) != 0; @@ -599,7 +593,7 @@ wxChar *wxDDEConnection::Request(const wxString& item, int *size, wxIPCFormat fo DWORD len = DdeGetData(returned_data, NULL, 0, 0); - wxChar *data = GetBufferAtLeast( len/sizeof(wxChar) ); + wxChar *data = GetBufferAtLeast( len ); wxASSERT_MSG(data != NULL, _T("Buffer too small in wxDDEConnection::Request") ); (void) DdeGetData(returned_data, (LPBYTE)data, len, 0); @@ -607,22 +601,22 @@ wxChar *wxDDEConnection::Request(const wxString& item, int *size, wxIPCFormat fo (void) DdeFreeDataHandle(returned_data); if (size) - *size = (int)len/sizeof(wxChar); + *size = (int)len; return data; } -bool wxDDEConnection::Poke(const wxString& item, wxChar *data, int size, wxIPCFormat format) +bool wxDDEConnection::Poke(const wxString& item, const wxChar *data, int size, wxIPCFormat format) { DWORD result; if (size < 0) { - size = wxStrlen(data) + 1; + size = (wxStrlen(data) + 1) * sizeof(wxChar); // includes final NUL } HSZ item_atom = DDEGetAtom(item); - bool ok = DdeClientTransaction((LPBYTE)data, - size * sizeof(wxChar), + bool ok = DdeClientTransaction((LPBYTE)data, + size, GetHConv(), item_atom, format, XTYP_POKE, @@ -676,20 +670,21 @@ bool wxDDEConnection::StopAdvise(const wxString& item) // Calls that SERVER can make bool wxDDEConnection::Advise(const wxString& item, - wxChar *data, + const wxChar *data, int size, wxIPCFormat format) { if (size < 0) { - size = wxStrlen(data) + 1; + size = (wxStrlen(data) + 1) * sizeof(wxChar); // includes final NUL } HSZ item_atom = DDEGetAtom(item); HSZ topic_atom = DDEGetAtom(m_topicName); m_sendingData = data; // mrf: potential for scope problems here? m_dataSize = size; - m_dataType = format; + // wxIPC_PRIVATE does not succeed, so use text instead + m_dataType = format == wxIPC_PRIVATE ? wxIPC_TEXT : format; bool ok = DdePostAdvise(DDEIdInst, topic_atom, item_atom) != 0; if ( !ok ) @@ -780,7 +775,7 @@ _DDECallback(WORD wType, { DWORD len = DdeGetData(hData, NULL, 0, 0); - wxChar *data = connection->GetBufferAtLeast( len/sizeof(wxChar) ); + wxChar *data = connection->GetBufferAtLeast( len ); wxASSERT_MSG(data != NULL, _T("Buffer too small in _DDECallback (XTYP_EXECUTE)") ); @@ -788,10 +783,11 @@ _DDECallback(WORD wType, DdeFreeDataHandle(hData); +// XTYP_EXECUTE cannot be used for arbitrary data, but only for text if ( connection->OnExecute(connection->m_topicName, data, - (int)len/sizeof(wxChar), - (wxIPCFormat) wFmt) ) + (int)len, + wxIPC_TEXT ) ) { return (DDERETURN)(DWORD)DDE_FACK; } @@ -809,18 +805,18 @@ _DDECallback(WORD wType, wxString item_name = DDEStringFromAtom(hsz2); int user_size = -1; - wxChar *data = connection->OnRequest(connection->m_topicName, - item_name, - &user_size, - (wxIPCFormat) wFmt); + const wxChar *data = connection->OnRequest(connection->m_topicName, + item_name, + &user_size, + (wxIPCFormat)wFmt); if (data) { if (user_size < 0) - user_size = wxStrlen((wxChar*)data) + 1; + user_size = (wxStrlen((wxChar*)data) + 1) * sizeof(wxChar); // includes final NUL HDDEDATA handle = DdeCreateDataHandle(DDEIdInst, (LPBYTE)data, - user_size*sizeof(wxChar), + user_size, 0, hsz2, wFmt, @@ -841,9 +837,9 @@ _DDECallback(WORD wType, DWORD len = DdeGetData(hData, NULL, 0, 0); - wxChar *data = connection->GetBufferAtLeast( len/sizeof(wxChar) ); + wxChar *data = connection->GetBufferAtLeast( len ); wxASSERT_MSG(data != NULL, - _T("Buffer too small in _DDECallback (XTYP_EXECUTE)") ); + _T("Buffer too small in _DDECallback (XTYP_POKE)") ); DdeGetData(hData, (LPBYTE)data, len, 0); @@ -852,7 +848,7 @@ _DDECallback(WORD wType, connection->OnPoke(connection->m_topicName, item_name, data, - (int)len/sizeof(wxChar), + (int)len, (wxIPCFormat) wFmt); return (DDERETURN)DDE_FACK; @@ -903,7 +899,7 @@ _DDECallback(WORD wType, ( DDEIdInst, (LPBYTE)connection->m_sendingData, - connection->m_dataSize*sizeof(wxChar), + connection->m_dataSize, 0, hsz2, connection->m_dataType, @@ -928,7 +924,7 @@ _DDECallback(WORD wType, DWORD len = DdeGetData(hData, NULL, 0, 0); - wxChar *data = connection->GetBufferAtLeast( len/sizeof(wxChar) ); + wxChar *data = connection->GetBufferAtLeast( len ); wxASSERT_MSG(data != NULL, _T("Buffer too small in _DDECallback (XTYP_ADVDATA)") ); @@ -938,7 +934,7 @@ _DDECallback(WORD wType, if ( connection->OnAdvise(connection->m_topicName, item_name, data, - (int)len/sizeof(wxChar), + (int)len, (wxIPCFormat) wFmt) ) { return (DDERETURN)(DWORD)DDE_FACK; @@ -982,7 +978,7 @@ static HSZ DDEAtomFromString(const wxString& s) { wxASSERT_MSG( DDEIdInst, _T("DDE not initialized") ); - HSZ hsz = DdeCreateStringHandle(DDEIdInst, (wxChar*) s.c_str(), DDE_CP); + HSZ hsz = DdeCreateStringHandle(DDEIdInst, (wxChar*)s.wx_str(), DDE_CP); if ( !hsz ) { DDELogError(_("Failed to create DDE string"));