// Modified by:
// Created: 01/02/97
// RCS-ID: $Id$
-// Copyright: (c) Julian Smart and Markus Holzem
+// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/module.h"
#include "wx/dde.h"
#include "wx/intl.h"
-
+#include "wx/hashmap.h"
#include "wx/msw/private.h"
#include <string.h>
-#include <windows.h>
#include <ddeml.h>
-#if defined(__TWIN32__) || defined(__GNUWIN32_OLD__)
+#ifdef __GNUWIN32_OLD__
#include "wx/msw/gnuwin32/extra.h"
#endif
// global variables
// ----------------------------------------------------------------------------
+WX_DECLARE_STRING_HASH_MAP( HSZ, wxAtomMap );
+
static DWORD DDEIdInst = 0L;
static wxDDEConnection *DDECurrentlyConnecting = NULL;
-static wxList wxAtomTable(wxKEY_STRING);
+static wxAtomMap wxAtomTable;
#include "wx/listimpl.cpp"
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 )
{
// Global find connection
static wxDDEConnection *DDEFindConnection(HCONV hConv)
{
- wxDDEServerList::Node *serverNode = wxDDEServerObjects.GetFirst();
+ wxDDEServerList::compatibility_iterator serverNode = wxDDEServerObjects.GetFirst();
wxDDEConnection *found = NULL;
while (serverNode && !found)
{
return found;
}
- wxDDEClientList::Node *clientNode = wxDDEClientObjects.GetFirst();
+ wxDDEClientList::compatibility_iterator clientNode = wxDDEClientObjects.GetFirst();
while (clientNode && !found)
{
wxDDEClient *object = clientNode->GetData();
// Global delete connection
static void DDEDeleteConnection(HCONV hConv)
{
- wxDDEServerList::Node *serverNode = wxDDEServerObjects.GetFirst();
+ wxDDEServerList::compatibility_iterator serverNode = wxDDEServerObjects.GetFirst();
bool found = false;
while (serverNode && !found)
{
return;
}
- wxDDEClientList::Node *clientNode = wxDDEClientObjects.GetFirst();
+ wxDDEClientList::compatibility_iterator clientNode = wxDDEClientObjects.GetFirst();
while (clientNode && !found)
{
wxDDEClient *object = clientNode->GetData();
// Find a server from a service name
static wxDDEServer *DDEFindServer(const wxString& s)
{
- wxDDEServerList::Node *node = wxDDEServerObjects.GetFirst();
+ wxDDEServerList::compatibility_iterator node = wxDDEServerObjects.GetFirst();
wxDDEServer *found = NULL;
while (node && !found)
{
wxDDEServerObjects.DeleteObject(this);
- wxDDEConnectionList::Node *node = m_connections.GetFirst();
+ wxDDEConnectionList::compatibility_iterator node = m_connections.GetFirst();
while (node)
{
wxDDEConnection *connection = node->GetData();
- wxDDEConnectionList::Node *next = node->GetNext();
+ wxDDEConnectionList::compatibility_iterator next = node->GetNext();
connection->SetConnected(false);
connection->OnDisconnect(); // May delete the node implicitly
node = next;
while (node)
{
wxDDEConnection *connection = node->GetData();
- wxDDEConnectionList::Node *next = node->GetNext();
+ wxDDEConnectionList::compatibility_iterator next = node->GetNext();
delete connection;
node = next;
}
wxDDEConnection *wxDDEServer::FindConnection(WXHCONV conv)
{
- wxDDEConnectionList::Node *node = m_connections.GetFirst();
+ wxDDEConnectionList::compatibility_iterator node = m_connections.GetFirst();
wxDDEConnection *found = NULL;
while (node && !found)
{
// Only delete the entry in the map, not the actual connection
bool wxDDEServer::DeleteConnection(WXHCONV conv)
{
- wxDDEConnectionList::Node *node = m_connections.GetFirst();
- bool found = false;
- while (node && !found)
+ wxDDEConnectionList::compatibility_iterator node = m_connections.GetFirst();
+ while (node)
{
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;
}
// ----------------------------------------------------------------------------
wxDDEClient::~wxDDEClient()
{
wxDDEClientObjects.DeleteObject(this);
- wxDDEConnectionList::Node *node = m_connections.GetFirst();
+ wxDDEConnectionList::compatibility_iterator node = m_connections.GetFirst();
while (node)
{
wxDDEConnection *connection = node->GetData();
wxDDEConnection *wxDDEClient::FindConnection(WXHCONV conv)
{
- wxDDEConnectionList::Node *node = m_connections.GetFirst();
+ wxDDEConnectionList::compatibility_iterator node = m_connections.GetFirst();
wxDDEConnection *found = NULL;
while (node && !found)
{
// Only delete the entry in the map, not the actual connection
bool wxDDEClient::DeleteConnection(WXHCONV conv)
{
- wxDDEConnectionList::Node *node = m_connections.GetFirst();
- bool found = false;
- while (node && !found)
+ wxDDEConnectionList::compatibility_iterator node = m_connections.GetFirst();
+ while (node)
{
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;
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// 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
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;
}