X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cdd64cc06c4f113f9321544b2a2f89db5ca6750a..9a78988fedc6e5364368cd09e60308180d3a7425:/src/msw/dde.cpp diff --git a/src/msw/dde.cpp b/src/msw/dde.cpp index 03fdc05daf..1ddd1a726d 100644 --- a/src/msw/dde.cpp +++ b/src/msw/dde.cpp @@ -5,7 +5,7 @@ // Modified by: // Created: 01/02/97 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem +// Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "dde.h" #endif @@ -38,15 +38,14 @@ #include "wx/module.h" #include "wx/dde.h" #include "wx/intl.h" - +#include "wx/hashmap.h" #include "wx/msw/private.h" #include -#include #include -#if defined(__TWIN32__) || defined(__GNUWIN32_OLD__) +#ifdef __GNUWIN32_OLD__ #include "wx/msw/gnuwin32/extra.h" #endif @@ -122,12 +121,20 @@ static void DDELogError(const wxString& s, UINT error = DMLERR_NO_ERROR); // global variables // ---------------------------------------------------------------------------- +WX_DECLARE_STRING_HASH_MAP( HSZ, wxAtomMap ); + static DWORD DDEIdInst = 0L; static wxDDEConnection *DDECurrentlyConnecting = NULL; +static wxAtomMap wxAtomTable; + +#include "wx/listimpl.cpp" + +WX_DEFINE_LIST(wxDDEClientList); +WX_DEFINE_LIST(wxDDEServerList); +WX_DEFINE_LIST(wxDDEConnectionList); -static wxList wxAtomTable(wxKEY_STRING); -static wxList wxDDEClientObjects; -static wxList wxDDEServerObjects; +static wxDDEClientList wxDDEClientObjects; +static wxDDEServerList wxDDEServerObjects; static bool DDEInitialized = false; @@ -187,15 +194,10 @@ extern void wxDDEInitialize() void wxDDECleanUp() { - wxDDEClientObjects.DeleteContents(true); - wxDDEClientObjects.Clear(); - wxDDEClientObjects.DeleteContents(false); + WX_CLEAR_LIST(wxDDEClientList, wxDDEClientObjects); + WX_CLEAR_LIST(wxDDEServerList, wxDDEServerObjects); - wxDDEServerObjects.DeleteContents(true); - wxDDEServerObjects.Clear(); - wxDDEServerObjects.DeleteContents(false); - - wxAtomTable.Clear(); + wxAtomTable.clear(); if ( DDEIdInst != 0 ) { @@ -211,64 +213,75 @@ void wxDDECleanUp() // Global find connection static wxDDEConnection *DDEFindConnection(HCONV hConv) { - wxNode *node = wxDDEServerObjects.GetFirst(); - wxDDEConnection *found = NULL; - while (node && !found) - { - wxDDEServer *object = (wxDDEServer *)node->GetData(); - found = object->FindConnection((WXHCONV) hConv); - node = node->GetNext(); - } - if (found) - return found; - - node = wxDDEClientObjects.GetFirst(); - while (node && !found) - { - wxDDEClient *object = (wxDDEClient *)node->GetData(); - found = object->FindConnection((WXHCONV) hConv); - node = node->GetNext(); - } - return found; + wxDDEServerList::compatibility_iterator serverNode = wxDDEServerObjects.GetFirst(); + wxDDEConnection *found = NULL; + while (serverNode && !found) + { + wxDDEServer *object = serverNode->GetData(); + found = object->FindConnection((WXHCONV) hConv); + serverNode = serverNode->GetNext(); + } + + if (found) + { + return found; + } + + wxDDEClientList::compatibility_iterator clientNode = wxDDEClientObjects.GetFirst(); + while (clientNode && !found) + { + wxDDEClient *object = clientNode->GetData(); + found = object->FindConnection((WXHCONV) hConv); + clientNode = clientNode->GetNext(); + } + return found; } // Global delete connection static void DDEDeleteConnection(HCONV hConv) { - wxNode *node = wxDDEServerObjects.GetFirst(); - bool found = false; - while (node && !found) - { - wxDDEServer *object = (wxDDEServer *)node->GetData(); - found = object->DeleteConnection((WXHCONV) hConv); - node = node->GetNext(); - } - if (found) - return; - - node = wxDDEClientObjects.GetFirst(); - while (node && !found) - { - wxDDEClient *object = (wxDDEClient *)node->GetData(); - found = object->DeleteConnection((WXHCONV) hConv); - node = node->GetNext(); - } + wxDDEServerList::compatibility_iterator serverNode = wxDDEServerObjects.GetFirst(); + bool found = false; + while (serverNode && !found) + { + wxDDEServer *object = serverNode->GetData(); + found = object->DeleteConnection((WXHCONV) hConv); + serverNode = serverNode->GetNext(); + } + if (found) + { + return; + } + + wxDDEClientList::compatibility_iterator clientNode = wxDDEClientObjects.GetFirst(); + while (clientNode && !found) + { + wxDDEClient *object = clientNode->GetData(); + found = object->DeleteConnection((WXHCONV) hConv); + clientNode = clientNode->GetNext(); + } } // Find a server from a service name static wxDDEServer *DDEFindServer(const wxString& s) { - wxNode *node = wxDDEServerObjects.GetFirst(); - wxDDEServer *found = NULL; - while (node && !found) - { - wxDDEServer *object = (wxDDEServer *)node->GetData(); - - if (object->GetServiceName() == s) - found = object; - else node = node->GetNext(); - } - return found; + wxDDEServerList::compatibility_iterator node = wxDDEServerObjects.GetFirst(); + wxDDEServer *found = NULL; + while (node && !found) + { + wxDDEServer *object = node->GetData(); + + if (object->GetServiceName() == s) + { + found = object; + } + else + { + node = node->GetNext(); + } + } + + return found; } // ---------------------------------------------------------------------------- @@ -311,11 +324,11 @@ wxDDEServer::~wxDDEServer() wxDDEServerObjects.DeleteObject(this); - wxNode *node = m_connections.GetFirst(); + wxDDEConnectionList::compatibility_iterator node = m_connections.GetFirst(); while (node) { - wxDDEConnection *connection = (wxDDEConnection *)node->GetData(); - wxNode *next = node->GetNext(); + wxDDEConnection *connection = node->GetData(); + wxDDEConnectionList::compatibility_iterator next = node->GetNext(); connection->SetConnected(false); connection->OnDisconnect(); // May delete the node implicitly node = next; @@ -325,8 +338,8 @@ wxDDEServer::~wxDDEServer() node = m_connections.GetFirst(); while (node) { - wxDDEConnection *connection = (wxDDEConnection *)node->GetData(); - wxNode *next = node->GetNext(); + wxDDEConnection *connection = node->GetData(); + wxDDEConnectionList::compatibility_iterator next = node->GetNext(); delete connection; node = next; } @@ -339,11 +352,11 @@ wxConnectionBase *wxDDEServer::OnAcceptConnection(const wxString& /* topic */) wxDDEConnection *wxDDEServer::FindConnection(WXHCONV conv) { - wxNode *node = m_connections.GetFirst(); + wxDDEConnectionList::compatibility_iterator node = m_connections.GetFirst(); wxDDEConnection *found = NULL; while (node && !found) { - wxDDEConnection *connection = (wxDDEConnection *)node->GetData(); + wxDDEConnection *connection = node->GetData(); if (connection->m_hConv == conv) found = connection; else node = node->GetNext(); @@ -354,19 +367,21 @@ wxDDEConnection *wxDDEServer::FindConnection(WXHCONV conv) // Only delete the entry in the map, not the actual connection bool wxDDEServer::DeleteConnection(WXHCONV conv) { - wxNode *node = m_connections.GetFirst(); - bool found = false; - while (node && !found) + wxDDEConnectionList::compatibility_iterator node = m_connections.GetFirst(); + while (node) { - wxDDEConnection *connection = (wxDDEConnection *)node->GetData(); + wxDDEConnection *connection = node->GetData(); if (connection->m_hConv == conv) { - found = true; - delete node; + m_connections.Erase(node); + return true; + } + else + { + node = node->GetNext(); } - else node = node->GetNext(); } - return found; + return false; } // ---------------------------------------------------------------------------- @@ -383,10 +398,10 @@ wxDDEClient::wxDDEClient() wxDDEClient::~wxDDEClient() { wxDDEClientObjects.DeleteObject(this); - wxNode *node = m_connections.GetFirst(); + wxDDEConnectionList::compatibility_iterator node = m_connections.GetFirst(); while (node) { - wxDDEConnection *connection = (wxDDEConnection *)node->GetData(); + wxDDEConnection *connection = node->GetData(); delete connection; // Deletes the node implicitly (see ~wxDDEConnection) node = m_connections.GetFirst(); } @@ -431,11 +446,11 @@ wxConnectionBase *wxDDEClient::OnMakeConnection() wxDDEConnection *wxDDEClient::FindConnection(WXHCONV conv) { - wxNode *node = m_connections.GetFirst(); + wxDDEConnectionList::compatibility_iterator node = m_connections.GetFirst(); wxDDEConnection *found = NULL; while (node && !found) { - wxDDEConnection *connection = (wxDDEConnection *)node->GetData(); + wxDDEConnection *connection = node->GetData(); if (connection->m_hConv == conv) found = connection; else node = node->GetNext(); @@ -446,19 +461,18 @@ wxDDEConnection *wxDDEClient::FindConnection(WXHCONV conv) // Only delete the entry in the map, not the actual connection bool wxDDEClient::DeleteConnection(WXHCONV conv) { - wxNode *node = m_connections.GetFirst(); - bool found = false; - while (node && !found) + wxDDEConnectionList::compatibility_iterator node = m_connections.GetFirst(); + while (node) { - wxDDEConnection *connection = (wxDDEConnection *)node->GetData(); + wxDDEConnection *connection = node->GetData(); if (connection->m_hConv == conv) { - found = true; - delete node; + m_connections.Erase(node); + return true; } else node = node->GetNext(); } - return found; + return false; } // ---------------------------------------------------------------------------- @@ -914,23 +928,21 @@ _DDECallback(WORD wType, // ---------------------------------------------------------------------------- // Atom table stuff -static HSZ DDEAddAtom(const wxString& string) +static HSZ DDEAddAtom(const wxString& str) { - HSZ atom = DDEAtomFromString(string); - wxAtomTable.Append(string, (wxObject *)atom); + HSZ atom = DDEAtomFromString(str); + wxAtomTable[str] = atom; return atom; } -static HSZ DDEGetAtom(const wxString& string) +static HSZ DDEGetAtom(const wxString& str) { - wxNode *node = wxAtomTable.Find(string); - if (node) - return (HSZ)node->GetData(); - else - { - DDEAddAtom(string); - return (HSZ)(wxAtomTable.Find(string)->GetData()); - } + wxAtomMap::iterator it = wxAtomTable.find(str); + + if (it != wxAtomTable.end()) + return it->second; + + return DDEAddAtom(str); } // atom <-> strings @@ -953,8 +965,7 @@ static wxString DDEStringFromAtom(HSZ hsz) static const size_t len = 256; wxString s; - (void)DdeQueryString(DDEIdInst, hsz, s.GetWriteBuf(len), len, DDE_CP); - s.UngetWriteBuf(); + (void)DdeQueryString(DDEIdInst, hsz, wxStringBuffer(s, len), len, DDE_CP); return s; }