X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f83e3685a59eda99f79056f59e1c842d9d4e6834..dc259b792613550edda31cc6202b42e172e2a240:/src/msw/dde.cpp diff --git a/src/msw/dde.cpp b/src/msw/dde.cpp index de0a404346..4487bd6a6d 100644 --- a/src/msw/dde.cpp +++ b/src/msw/dde.cpp @@ -129,8 +129,6 @@ static wxList wxAtomTable(wxKEY_STRING); static wxList wxDDEClientObjects; static wxList wxDDEServerObjects; -char *DDEDefaultIPCBuffer = NULL; -int DDEDefaultIPCBufferSize = 0; static bool DDEInitialized = FALSE; // ---------------------------------------------------------------------------- @@ -189,13 +187,21 @@ extern void wxDDEInitialize() void wxDDECleanUp() { + wxDDEClientObjects.DeleteContents(TRUE); + wxDDEClientObjects.Clear(); + wxDDEClientObjects.DeleteContents(FALSE); + + wxDDEServerObjects.DeleteContents(TRUE); + wxDDEServerObjects.Clear(); + wxDDEServerObjects.DeleteContents(FALSE); + + wxAtomTable.Clear(); + if ( DDEIdInst != 0 ) { DdeUninitialize(DDEIdInst); DDEIdInst = 0; } - - delete [] DDEDefaultIPCBuffer; } // ---------------------------------------------------------------------------- @@ -310,6 +316,7 @@ wxDDEServer::~wxDDEServer() { wxDDEConnection *connection = (wxDDEConnection *)node->Data(); wxNode *next = node->Next(); + connection->SetConnected(false); connection->OnDisconnect(); // May delete the node implicitly node = next; } @@ -398,8 +405,7 @@ wxConnectionBase *wxDDEClient::MakeConnection(const wxString& WXUNUSED(host), (PCONVCONTEXT)NULL); if ( !hConv ) { - DDELogError(wxString::Format(_("Failed to create connection to " - "server '%s' on topic '%s'"), + DDELogError(wxString::Format(_("Failed to create connection to server '%s' on topic '%s'"), server.c_str(), topic.c_str())); } else @@ -459,21 +465,9 @@ bool wxDDEClient::DeleteConnection(WXHCONV conv) // wxDDEConnection // ---------------------------------------------------------------------------- -wxDDEConnection::wxDDEConnection(char *buffer, int size) +wxDDEConnection::wxDDEConnection(wxChar *buffer, int size) + : wxConnectionBase(buffer, size) { - if (buffer == NULL) - { - if (DDEDefaultIPCBuffer == NULL) - DDEDefaultIPCBuffer = new char[DDEDefaultIPCBufferSize]; - m_bufPtr = DDEDefaultIPCBuffer; - m_bufSize = DDEDefaultIPCBufferSize; - } - else - { - m_bufPtr = buffer; - m_bufSize = size; - } - m_client = NULL; m_server = NULL; @@ -482,20 +476,17 @@ wxDDEConnection::wxDDEConnection(char *buffer, int size) } wxDDEConnection::wxDDEConnection() + : wxConnectionBase() { m_hConv = 0; m_sendingData = NULL; m_server = NULL; m_client = NULL; - if (DDEDefaultIPCBuffer == NULL) - DDEDefaultIPCBuffer = new char[DDEDefaultIPCBufferSize]; - - m_bufPtr = DDEDefaultIPCBuffer; - m_bufSize = DDEDefaultIPCBufferSize; } wxDDEConnection::~wxDDEConnection() { + Disconnect(); if (m_server) m_server->GetConnections().DeleteObject(this); else @@ -505,6 +496,9 @@ wxDDEConnection::~wxDDEConnection() // Calls that CLIENT can make bool wxDDEConnection::Disconnect() { + if ( !GetConnected() ) + return true; + DDEDeleteConnection(GetHConv()); bool ok = DdeDisconnect(GetHConv()) != 0; @@ -513,6 +507,8 @@ bool wxDDEConnection::Disconnect() DDELogError(_T("Failed to disconnect from DDE server gracefully")); } + SetConnected( false ); // so we don't try and disconnect again + return ok; } @@ -531,6 +527,7 @@ bool wxDDEConnection::Execute(const wxChar *data, int size, wxIPCFormat format) XTYP_EXECUTE, DDE_TIMEOUT, &result) != 0; + if ( !ok ) { DDELogError(_T("DDE execute request failed")); @@ -539,9 +536,10 @@ bool wxDDEConnection::Execute(const wxChar *data, int size, wxIPCFormat format) return ok; } -char *wxDDEConnection::Request(const wxString& item, int *size, wxIPCFormat format) +wxChar *wxDDEConnection::Request(const wxString& item, int *size, wxIPCFormat format) { DWORD result; + HSZ atom = DDEGetAtom(item); HDDEDATA returned_data = DdeClientTransaction(NULL, 0, @@ -557,14 +555,19 @@ char *wxDDEConnection::Request(const wxString& item, int *size, wxIPCFormat form return NULL; } - DWORD len = DdeGetData(returned_data, (LPBYTE)m_bufPtr, m_bufSize, 0); + DWORD len = DdeGetData(returned_data, NULL, 0, 0); + + wxChar *data = GetBufferAtLeast( len ); + wxASSERT_MSG(data != NULL, + _T("Buffer too small in wxDDEConnection::Request") ); + DdeGetData(returned_data, (LPBYTE)data, len, 0); DdeFreeDataHandle(returned_data); if (size) *size = (int)len; - return m_bufPtr; + return data; } bool wxDDEConnection::Poke(const wxString& item, wxChar *data, int size, wxIPCFormat format) @@ -641,7 +644,7 @@ bool wxDDEConnection::Advise(const wxString& item, HSZ item_atom = DDEGetAtom(item); HSZ topic_atom = DDEGetAtom(m_topicName); - m_sendingData = data; + m_sendingData = data; // mrf: potential for scope problems here? m_dataSize = size; m_dataType = format; @@ -714,10 +717,14 @@ _DDECallback(WORD wType, case XTYP_DISCONNECT: { wxDDEConnection *connection = DDEFindConnection(hConv); - if (connection && connection->OnDisconnect()) + if (connection) { - DDEDeleteConnection(hConv); // Delete mapping: hConv => connection - return (DDERETURN)(DWORD)TRUE; + connection->SetConnected( false ); + if (connection->OnDisconnect()) + { + DDEDeleteConnection(hConv); // Delete mapping: hConv => connection + return (DDERETURN)(DWORD)TRUE; + } } break; } @@ -728,13 +735,18 @@ _DDECallback(WORD wType, if (connection) { - DWORD len = DdeGetData(hData, - (LPBYTE)connection->m_bufPtr, - connection->m_bufSize, - 0); + DWORD len = DdeGetData(hData, NULL, 0, 0); + + wxChar *data = connection->GetBufferAtLeast( len ); + wxASSERT_MSG(data != NULL, + _T("Buffer too small in _DDECallback (XTYP_EXECUTE)") ); + + DdeGetData(hData, (LPBYTE)data, len, 0); + DdeFreeDataHandle(hData); + if ( connection->OnExecute(connection->m_topicName, - connection->m_bufPtr, + data, (int)len, (wxIPCFormat) wFmt) ) { @@ -754,14 +766,14 @@ _DDECallback(WORD wType, wxString item_name = DDEStringFromAtom(hsz2); int user_size = -1; - char *data = connection->OnRequest(connection->m_topicName, + wxChar *data = connection->OnRequest(connection->m_topicName, item_name, &user_size, (wxIPCFormat) wFmt); if (data) { if (user_size < 0) - user_size = wxStrlen(data) + 1; + user_size = wxStrlen((wxChar*)data) + 1; HDDEDATA handle = DdeCreateDataHandle(DDEIdInst, (LPBYTE)data, @@ -784,15 +796,19 @@ _DDECallback(WORD wType, { wxString item_name = DDEStringFromAtom(hsz2); - DWORD len = DdeGetData(hData, - (LPBYTE)connection->m_bufPtr, - connection->m_bufSize, - 0); + DWORD len = DdeGetData(hData, NULL, 0, 0); + + wxChar *data = connection->GetBufferAtLeast( len ); + wxASSERT_MSG(data != NULL, + _T("Buffer too small in _DDECallback (XTYP_EXECUTE)") ); + + DdeGetData(hData, (LPBYTE)data, len, 0); + DdeFreeDataHandle(hData); connection->OnPoke(connection->m_topicName, item_name, - connection->m_bufPtr, + data, (int)len, (wxIPCFormat) wFmt); @@ -867,14 +883,18 @@ _DDECallback(WORD wType, { wxString item_name = DDEStringFromAtom(hsz2); - DWORD len = DdeGetData(hData, - (LPBYTE)connection->m_bufPtr, - connection->m_bufSize, - 0); + DWORD len = DdeGetData(hData, NULL, 0, 0); + + wxChar *data = connection->GetBufferAtLeast( len ); + wxASSERT_MSG(data != NULL, + _T("Buffer too small in _DDECallback (XTYP_ADVDATA)") ); + + DdeGetData(hData, (LPBYTE)data, len, 0); + DdeFreeDataHandle(hData); if ( connection->OnAdvise(connection->m_topicName, item_name, - connection->m_bufPtr, + data, (int)len, (wxIPCFormat) wFmt) ) { @@ -918,7 +938,7 @@ static HSZ DDEAtomFromString(const wxString& s) { wxASSERT_MSG( DDEIdInst, _T("DDE not initialized") ); - HSZ hsz = DdeCreateStringHandle(DDEIdInst, (char*) s.c_str(), DDE_CP); + HSZ hsz = DdeCreateStringHandle(DDEIdInst, (wxChar*) s.c_str(), DDE_CP); if ( !hsz ) { DDELogError(_("Failed to create DDE string"));