ReactOS 0.4.17-dev-1321-g5c122a9
dde_private.h File Reference
#include "dde.h"
#include "ddeml.h"
Include dependency graph for dde_private.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  WINE_DDEHEAD
 
struct  tagHSZNode
 
struct  tagWDML_SERVER
 
struct  tagWDML_XACT
 
struct  tagWDML_CONV
 
struct  tagWDML_LINK
 
struct  tagWDML_INSTANCE
 
struct  tagDDE_DATAHANDLE_HEAD
 

Macros

#define MAX_ATOM_LEN   255
 
#define MAX_BUFFER_LEN   (MAX_ATOM_LEN + 1)
 
#define WDML_CONV_MAGIC   0xbabe1234
 
#define WM_WDML_REGISTER   (WM_USER + 0x200)
 
#define WM_WDML_UNREGISTER   (WM_USER + 0x201)
 
#define WM_WDML_CONNECT_CONFIRM   (WM_USER + 0x202)
 
#define GWL_WDML_INSTANCE   (0)
 
#define GWL_WDML_CONVERSATION   (sizeof(ULONG_PTR))
 
#define GWL_WDML_SERVER   (sizeof(ULONG_PTR))
 

Typedefs

typedef struct tagHSZNode HSZNode
 
typedef struct tagWDML_SERVER WDML_SERVER
 
typedef struct tagWDML_XACT WDML_XACT
 
typedef struct tagWDML_CONV WDML_CONV
 
typedef struct tagWDML_LINK WDML_LINK
 
typedef struct tagWDML_INSTANCE WDML_INSTANCE
 
typedef struct tagDDE_DATAHANDLE_HEAD DDE_DATAHANDLE_HEAD
 
typedef enum tagWDML_SIDE WDML_SIDE
 

Enumerations

enum  tagWDML_SIDE { WDML_CLIENT_SIDE = 0 , WDML_SERVER_SIDE = 1 }
 
enum  WDML_QUEUE_STATE {
  WDML_QS_ERROR , WDML_QS_HANDLED , WDML_QS_PASS , WDML_QS_SWALLOWED ,
  WDML_QS_BLOCK
}
 

Functions

HDDEDATA WDML_InvokeCallback (WDML_INSTANCE *pInst, UINT uType, UINT uFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hdata, ULONG_PTR dwData1, ULONG_PTR dwData2)
 
WDML_SERVER * WDML_AddServer (WDML_INSTANCE *pInstance, HSZ hszService, HSZ hszTopic)
 
void WDML_RemoveServer (WDML_INSTANCE *pInstance, HSZ hszService, HSZ hszTopic)
 
WDML_SERVER * WDML_FindServer (WDML_INSTANCE *pInstance, HSZ hszService, HSZ hszTopic)
 
WDML_QUEUE_STATE WDML_ServerHandle (WDML_CONV *pConv, WDML_XACT *pXAct)
 
HDDEDATA WDML_ClientHandle (WDML_CONV *pConv, WDML_XACT *pXAct, DWORD dwTimeout, LPDWORD pdwResult)
 
WDML_CONV * WDML_AddConv (WDML_INSTANCE *pInstance, WDML_SIDE side, HSZ hszService, HSZ hszTopic, HWND hwndClient, HWND hwndServer)
 
void WDML_RemoveConv (WDML_CONV *pConv, WDML_SIDE side)
 
WDML_CONV * WDML_GetConv (HCONV hConv, BOOL checkConnected)
 
WDML_CONV * WDML_GetConvFromWnd (HWND hWnd)
 
WDML_CONV * WDML_FindConv (WDML_INSTANCE *pInstance, WDML_SIDE side, HSZ hszService, HSZ hszTopic)
 
BOOL WDML_PostAck (WDML_CONV *pConv, WDML_SIDE side, WORD appRetCode, BOOL fBusy, BOOL fAck, UINT_PTR pmt, LPARAM lParam, UINT oldMsg)
 
void WDML_AddLink (WDML_INSTANCE *pInstance, HCONV hConv, WDML_SIDE side, UINT wType, HSZ hszItem, UINT wFmt)
 
WDML_LINK * WDML_FindLink (WDML_INSTANCE *pInstance, HCONV hConv, WDML_SIDE side, HSZ hszItem, BOOL use_fmt, UINT uFmt)
 
void WDML_RemoveLink (WDML_INSTANCE *pInstance, HCONV hConv, WDML_SIDE side, HSZ hszItem, UINT wFmt)
 
BOOL WDML_DecHSZ (WDML_INSTANCE *pInstance, HSZ hsz)
 
BOOL WDML_IncHSZ (WDML_INSTANCE *pInstance, HSZ hsz)
 
ATOM WDML_MakeAtomFromHsz (HSZ hsz)
 
HSZ WDML_MakeHszFromAtom (const WDML_INSTANCE *pInstance, ATOM atom)
 
WDML_XACT * WDML_AllocTransaction (WDML_INSTANCE *pInstance, UINT ddeMsg, UINT wFmt, HSZ hszItem)
 
void WDML_QueueTransaction (WDML_CONV *pConv, WDML_XACT *pXAct)
 
BOOL WDML_UnQueueTransaction (WDML_CONV *pConv, WDML_XACT *pXAct)
 
void WDML_FreeTransaction (WDML_INSTANCE *pInstance, WDML_XACT *pXAct, BOOL doFreePmt)
 
HGLOBAL WDML_DataHandle2Global (HDDEDATA hDdeData, BOOL fResponse, BOOL fRelease, BOOL fDeferUpd, BOOL dAckReq)
 
HDDEDATA WDML_Global2DataHandle (WDML_CONV *pConv, HGLOBAL hMem, WINE_DDEHEAD *da)
 
BOOL WDML_IsAppOwned (HDDEDATA hDdeData)
 
WDML_INSTANCE * WDML_GetInstance (DWORD InstId)
 
WDML_INSTANCE * WDML_GetInstanceFromWnd (HWND hWnd)
 
void WDML_BroadcastDDEWindows (LPCWSTR clsName, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
void WDML_NotifyThreadExit (DWORD tid)
 
void WDML_NotifyThreadDetach (void)
 
static __inline void WDML_ExtractAck (WORD status, DDEACK *da)
 

Variables

const WCHAR WDML_szEventClass []
 
const char WDML_szServerConvClassA []
 
const WCHAR WDML_szServerConvClassW []
 
const char WDML_szClientConvClassA []
 
const WCHAR WDML_szClientConvClassW []
 

Macro Definition Documentation

◆ GWL_WDML_CONVERSATION

#define GWL_WDML_CONVERSATION   (sizeof(ULONG_PTR))

Definition at line 263 of file dde_private.h.

◆ GWL_WDML_INSTANCE

#define GWL_WDML_INSTANCE   (0)

Definition at line 262 of file dde_private.h.

◆ GWL_WDML_SERVER

#define GWL_WDML_SERVER   (sizeof(ULONG_PTR))

Definition at line 264 of file dde_private.h.

◆ MAX_ATOM_LEN

#define MAX_ATOM_LEN   255

Definition at line 33 of file dde_private.h.

◆ MAX_BUFFER_LEN

#define MAX_BUFFER_LEN   (MAX_ATOM_LEN + 1)

Definition at line 37 of file dde_private.h.

◆ WDML_CONV_MAGIC

#define WDML_CONV_MAGIC   0xbabe1234

Definition at line 144 of file dde_private.h.

◆ WM_WDML_CONNECT_CONFIRM

#define WM_WDML_CONNECT_CONFIRM   (WM_USER + 0x202)

Definition at line 253 of file dde_private.h.

◆ WM_WDML_REGISTER

#define WM_WDML_REGISTER   (WM_USER + 0x200)

Definition at line 251 of file dde_private.h.

◆ WM_WDML_UNREGISTER

#define WM_WDML_UNREGISTER   (WM_USER + 0x201)

Definition at line 252 of file dde_private.h.

Typedef Documentation

◆ DDE_DATAHANDLE_HEAD

◆ HSZNode

◆ WDML_CONV

◆ WDML_INSTANCE

◆ WDML_LINK

◆ WDML_SERVER

◆ WDML_SIDE

◆ WDML_XACT

Enumeration Type Documentation

◆ tagWDML_SIDE

Enumerator
WDML_CLIENT_SIDE 
WDML_SERVER_SIDE 

Definition at line 182 of file dde_private.h.

183{
185} WDML_SIDE;
enum tagWDML_SIDE WDML_SIDE
@ WDML_SERVER_SIDE
Definition: dde_private.h:184
@ WDML_CLIENT_SIDE
Definition: dde_private.h:184

◆ WDML_QUEUE_STATE

Enumerator
WDML_QS_ERROR 
WDML_QS_HANDLED 
WDML_QS_PASS 
WDML_QS_SWALLOWED 
WDML_QS_BLOCK 

Definition at line 187 of file dde_private.h.

187 {
WDML_QUEUE_STATE
Definition: dde_private.h:187
@ WDML_QS_PASS
Definition: dde_private.h:188
@ WDML_QS_BLOCK
Definition: dde_private.h:188
@ WDML_QS_HANDLED
Definition: dde_private.h:188
@ WDML_QS_SWALLOWED
Definition: dde_private.h:188
@ WDML_QS_ERROR
Definition: dde_private.h:188

Function Documentation

◆ WDML_AddConv()

WDML_CONV * WDML_AddConv ( WDML_INSTANCE *  pInstance,
WDML_SIDE  side,
HSZ  hszService,
HSZ  hszTopic,
HWND  hwndClient,
HWND  hwndServer 
)

Definition at line 2016 of file ddemisc.c.

2018{
2019 WDML_CONV* pConv;
2020
2021 /* no conversation yet, add it */
2022 pConv = HeapAlloc(GetProcessHeap(), 0, sizeof(WDML_CONV));
2023 if (!pConv) return NULL;
2024
2025 pConv->instance = pInstance;
2026 WDML_IncHSZ(pInstance, pConv->hszService = hszService);
2028 pConv->magic = WDML_CONV_MAGIC;
2029 pConv->hwndServer = hwndServer;
2030 pConv->hwndClient = hwndClient;
2031 pConv->transactions = NULL;
2032 pConv->hUser = 0;
2033 pConv->wStatus = (side == WDML_CLIENT_SIDE) ? ST_CLIENT : 0L;
2034 pConv->wStatus |= pInstance->wStatus;
2035 /* check if both side of the conversation are of the same instance */
2036 if (GetWindowThreadProcessId(hwndClient, NULL) == GetWindowThreadProcessId(hwndServer, NULL) &&
2037 WDML_GetInstanceFromWnd(hwndClient) == WDML_GetInstanceFromWnd(hwndServer))
2038 {
2039 pConv->wStatus |= ST_ISSELF;
2040 }
2041 pConv->wConvst = XST_NULL;
2042
2043 pConv->next = pInstance->convs[side];
2044 pInstance->convs[side] = pConv;
2045
2046 TRACE("pConv->wStatus %04lx pInstance(%p)\n", pConv->wStatus, pInstance);
2047
2048 return pConv;
2049}
#define WDML_CONV_MAGIC
Definition: dde_private.h:144
WDML_INSTANCE * WDML_GetInstanceFromWnd(HWND hWnd)
Definition: ddemisc.c:1265
BOOL WDML_IncHSZ(WDML_INSTANCE *pInstance, HSZ hsz)
Definition: ddemisc.c:366
#define ST_CLIENT
Definition: ddeml.h:84
#define XST_NULL
Definition: ddeml.h:62
#define ST_ISSELF
Definition: ddeml.h:88
#define NULL
Definition: types.h:112
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define L(x)
Definition: resources.c:13
FxWmiInstanceExternal * pInstance
Definition: fxwmiapi.cpp:117
static HSZ hszTopic
Definition: shlexec.c:148
#define TRACE(s)
Definition: solgame.cpp:4
struct tagWDML_CONV * next
Definition: dde_private.h:129
WDML_XACT * transactions
Definition: dde_private.h:138
struct tagWDML_INSTANCE * instance
Definition: dde_private.h:130
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)

Referenced by WDML_ClientProc(), and WDML_CreateServerConv().

◆ WDML_AddLink()

void WDML_AddLink ( WDML_INSTANCE *  pInstance,
HCONV  hConv,
WDML_SIDE  side,
UINT  wType,
HSZ  hszItem,
UINT  wFmt 
)

Definition at line 1763 of file ddemisc.c.

1765{
1766 WDML_LINK* pLink;
1767
1768 pLink = HeapAlloc(GetProcessHeap(), 0, sizeof(WDML_LINK));
1769 if (pLink == NULL)
1770 {
1771 ERR("OOM\n");
1772 return;
1773 }
1774
1775 pLink->hConv = hConv;
1776 pLink->transactionType = wType;
1777 WDML_IncHSZ(pInstance, pLink->hszItem = hszItem);
1778 pLink->uFmt = wFmt;
1779 pLink->next = pInstance->links[side];
1780 pInstance->links[side] = pLink;
1781}
#define ERR(fmt,...)
Definition: precomp.h:57

Referenced by WDML_HandleAdviseReply(), and WDML_ServerHandleAdvise().

◆ WDML_AddServer()

WDML_SERVER * WDML_AddServer ( WDML_INSTANCE *  pInstance,
HSZ  hszService,
HSZ  hszTopic 
)

Definition at line 1643 of file ddemisc.c.

1644{
1645 WDML_SERVER* pServer;
1646 WCHAR buf1[256];
1647 WCHAR buf2[256];
1648
1649 pServer = HeapAlloc(GetProcessHeap(), 0, sizeof(WDML_SERVER));
1650 if (pServer == NULL) return NULL;
1651
1652 pServer->hszService = hszService;
1653 WDML_IncHSZ(pInstance, hszService);
1654
1655 DdeQueryStringW(pInstance->instanceID, hszService, buf1, 256, CP_WINUNICODE);
1656#ifdef __REACTOS__
1657 swprintf(buf2, 256, L"%s(0x%*x)", buf1, (int)(2*sizeof(ULONG_PTR)), GetCurrentProcessId());
1658#else
1659 swprintf(buf2, 256, L"%s(0x%*x)", buf1, 2*sizeof(ULONG_PTR), GetCurrentProcessId());
1660#endif
1661 pServer->hszServiceSpec = DdeCreateStringHandleW(pInstance->instanceID, buf2, CP_WINUNICODE);
1662
1663 pServer->atomService = WDML_MakeAtomFromHsz(pServer->hszService);
1665
1666 pServer->filterOn = TRUE;
1667
1668 pServer->next = pInstance->servers;
1669 pInstance->servers = pServer;
1670 return pServer;
1671}
HSZ WINAPI DdeCreateStringHandleW(DWORD idInst, LPCWSTR psz, INT codepage)
Definition: ddemisc.c:612
ATOM WDML_MakeAtomFromHsz(HSZ hsz)
Definition: ddemisc.c:329
DWORD WINAPI DdeQueryStringW(DWORD idInst, HSZ hsz, LPWSTR psz, DWORD cchMax, INT iCodePage)
Definition: ddemisc.c:529
#define CP_WINUNICODE
Definition: ddeml.h:33
#define TRUE
Definition: types.h:120
short WCHAR
Definition: pedump.c:58
struct tagWDML_SERVER * next
Definition: dde_private.h:103
ATOM atomServiceSpec
Definition: dde_private.h:107
uint32_t ULONG_PTR
Definition: typedefs.h:65
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1207
#define swprintf
Definition: winemm.h:209

Referenced by DdeNameService().

◆ WDML_AllocTransaction()

WDML_XACT * WDML_AllocTransaction ( WDML_INSTANCE *  pInstance,
UINT  ddeMsg,
UINT  wFmt,
HSZ  hszItem 
)

Definition at line 1908 of file ddemisc.c.

1910{
1911 WDML_XACT* pXAct;
1912 static WORD tid = 1; /* FIXME: wrap around */
1913
1914 pXAct = HeapAlloc(GetProcessHeap(), 0, sizeof(WDML_XACT));
1915 if (!pXAct)
1916 {
1917 pInstance->lastError = DMLERR_MEMORY_ERROR;
1918 return NULL;
1919 }
1920
1921 pXAct->xActID = tid++;
1922 pXAct->ddeMsg = ddeMsg;
1923 pXAct->hDdeData = 0;
1924 pXAct->hUser = 0;
1925 pXAct->next = NULL;
1926 pXAct->wType = 0;
1927 pXAct->wFmt = wFmt;
1928 if ((pXAct->hszItem = hszItem)) WDML_IncHSZ(pInstance, pXAct->hszItem);
1929 pXAct->atom = 0;
1930 pXAct->hMem = 0;
1931 pXAct->lParam = 0;
1932
1933 return pXAct;
1934}
#define DMLERR_MEMORY_ERROR
Definition: ddeml.h:254
unsigned short WORD
Definition: ntddk_ex.h:93
static TfClientId tid
HDDEDATA hDdeData
Definition: dde_private.h:116
struct tagWDML_XACT * next
Definition: dde_private.h:113
LPARAM lParam
Definition: dde_private.h:124
HGLOBAL hMem
Definition: dde_private.h:123

Referenced by WDML_ClientQueueAdvise(), WDML_ClientQueueExecute(), WDML_ClientQueuePoke(), WDML_ClientQueueRequest(), WDML_ClientQueueTerminate(), WDML_ClientQueueUnadvise(), WDML_ServerQueueAdvise(), WDML_ServerQueueExecute(), WDML_ServerQueuePoke(), WDML_ServerQueueRequest(), WDML_ServerQueueTerminate(), and WDML_ServerQueueUnadvise().

◆ WDML_BroadcastDDEWindows()

void WDML_BroadcastDDEWindows ( LPCWSTR  clsName,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 2511 of file ddemisc.c.

2512{
2513 struct tagWDML_BroadcastPmt s;
2514
2515 s.clsName = clsName;
2516 s.uMsg = uMsg;
2517 s.wParam = wParam;
2518 s.lParam = lParam;
2520}
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
static BOOL CALLBACK WDML_BroadcastEnumProc(HWND hWnd, LPARAM lParam)
Definition: ddemisc.c:2493
GLdouble s
Definition: gl.h:2039
LONG_PTR LPARAM
Definition: minwindef.h:175
BOOL WINAPI EnumWindows(_In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam)

Referenced by DdeNameService(), and WDML_RemoveServer().

◆ WDML_ClientHandle()

HDDEDATA WDML_ClientHandle ( WDML_CONV *  pConv,
WDML_XACT *  pXAct,
DWORD  dwTimeout,
LPDWORD  pdwResult 
)

Definition at line 1095 of file ddeclient.c.

1096{
1097 HDDEDATA hDdeData;
1098
1099 if (!PostMessageW(pConv->hwndServer, pXAct->ddeMsg, (WPARAM)pConv->hwndClient, pXAct->lParam))
1100 {
1101 WARN("Failed posting message %x to %p (error=0x%lx)\n",
1102 pXAct->ddeMsg, pConv->hwndServer, GetLastError());
1103 pConv->wStatus &= ~ST_CONNECTED;
1104 pConv->instance->lastError = DMLERR_POSTMSG_FAILED;
1105 return 0;
1106 }
1107 pXAct->dwTimeout = dwTimeout;
1108 /* FIXME: should set the app bits on *pdwResult */
1109
1110 if (dwTimeout == TIMEOUT_ASYNC)
1111 {
1112 if (pdwResult)
1113 *pdwResult = MAKELONG(0, pXAct->xActID);
1114
1115 hDdeData = (HDDEDATA)1;
1116 }
1117 else
1118 hDdeData = WDML_SyncWaitTransactionReply((HCONV)pConv, dwTimeout, pXAct, pdwResult);
1119
1120 return hDdeData;
1121}
#define WARN(fmt,...)
Definition: precomp.h:61
static HDDEDATA WDML_SyncWaitTransactionReply(HCONV hConv, DWORD dwTimeout, const WDML_XACT *pXAct, DWORD *ack)
Definition: ddeclient.c:1012
#define DMLERR_POSTMSG_FAILED
Definition: ddeml.h:258
#define TIMEOUT_ASYNC
Definition: ddeml.h:200
UINT_PTR WPARAM
Definition: minwindef.h:174
_In_ UINT _In_ DWORD _Out_ DWORD * pdwResult
Definition: ntgdi.h:270
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
DWORD dwTimeout
Definition: dde_private.h:117
#define MAKELONG(a, b)
Definition: typedefs.h:249
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by DdeClientTransaction(), and WDML_EnableCallback().

◆ WDML_DataHandle2Global()

HGLOBAL WDML_DataHandle2Global ( HDDEDATA  hDdeData,
BOOL  fResponse,
BOOL  fRelease,
BOOL  fDeferUpd,
BOOL  dAckReq 
)

Definition at line 1568 of file ddemisc.c.

1570{
1571 DDE_DATAHANDLE_HEAD* pDdh;
1572 DWORD dwSize;
1573 HGLOBAL hMem = 0;
1574
1575 dwSize = GlobalSize(hDdeData) - sizeof(DDE_DATAHANDLE_HEAD);
1576 pDdh = GlobalLock(hDdeData);
1577 if (dwSize && pDdh)
1578 {
1579 WINE_DDEHEAD* wdh = NULL;
1580
1581 switch (pDdh->cfFormat)
1582 {
1583 default:
1584 FIXME("Unsupported format (%04x) for data %p, passing raw information\n",
1585 pDdh->cfFormat, hDdeData);
1586 /* fall through */
1587 case 0:
1588 case CF_TEXT:
1590 if (hMem && (wdh = GlobalLock(hMem)))
1591 {
1592 memcpy(wdh + 1, pDdh + 1, dwSize);
1593 }
1594 break;
1595 case CF_BITMAP:
1596 if (dwSize >= sizeof(HBITMAP))
1597 {
1598 BITMAP bmp;
1599 DWORD count;
1600 HBITMAP hbmp = *(HBITMAP*)(pDdh + 1);
1601
1602 if (GetObjectW(hbmp, sizeof(bmp), &bmp))
1603 {
1606 sizeof(WINE_DDEHEAD) + sizeof(bmp) + count);
1607 if (hMem && (wdh = GlobalLock(hMem)))
1608 {
1609 memcpy(wdh + 1, &bmp, sizeof(bmp));
1610 GetBitmapBits(hbmp, count, ((char*)(wdh + 1)) + sizeof(bmp));
1611 }
1612 }
1613 }
1614 break;
1615 }
1616 if (wdh)
1617 {
1618 wdh->unused = 0;
1619 wdh->fResponse = fResponse;
1620 wdh->fRelease = fRelease;
1621 wdh->fDeferUpd = fDeferUpd;
1622 wdh->fAckReq = fAckReq;
1623 wdh->cfFormat = pDdh->cfFormat;
1624 GlobalUnlock(hMem);
1625 }
1626 GlobalUnlock(hDdeData);
1627 }
1628
1629 return hMem;
1630}
#define CF_BITMAP
Definition: constants.h:397
#define CF_TEXT
Definition: constants.h:396
#define FIXME(fmt,...)
Definition: precomp.h:53
HBITMAP hbmp
struct tagDDE_DATAHANDLE_HEAD DDE_DATAHANDLE_HEAD
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei count
Definition: gl.h:1545
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
SIZE_T NTAPI GlobalSize(HGLOBAL hMem)
Definition: heapmem.c:1090
static ERESOURCE GlobalLock
Definition: sys_arch.c:8
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
BITMAP bmp
Definition: alphablend.c:62
static HBITMAP
Definition: button.c:44
unsigned short unused
Definition: dde_private.h:86
unsigned short fRelease
Definition: dde_private.h:88
unsigned short fResponse
Definition: dde_private.h:87
unsigned short fAckReq
Definition: dde_private.h:90
unsigned short fDeferUpd
Definition: dde_private.h:89
short cfFormat
Definition: dde_private.h:91
LONG bmHeight
Definition: wingdi.h:1869
LONG bmWidthBytes
Definition: wingdi.h:1870
#define GMEM_MOVEABLE
Definition: winbase.h:318
#define GMEM_DDESHARE
Definition: winbase.h:322
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
LONG WINAPI GetBitmapBits(_In_ HBITMAP hbit, _In_ LONG cb, _Out_writes_bytes_(cb) LPVOID lpvBits)

Referenced by DdePostAdvise(), and WDML_ServerHandleRequest().

◆ WDML_DecHSZ()

BOOL WDML_DecHSZ ( WDML_INSTANCE *  pInstance,
HSZ  hsz 
)

Definition at line 384 of file ddemisc.c.

385{
386 HSZNode* pPrev = NULL;
387 HSZNode* pCurrent;
388
389 for (pCurrent = pInstance->nodeList; pCurrent != NULL; pCurrent = (pPrev = pCurrent)->next)
390 {
391 /* If we found the node we were looking for and its ref count is one,
392 * we can remove it
393 */
394 if (pCurrent->hsz == hsz)
395 {
396 if (--pCurrent->refCount == 0)
397 {
398 if (pCurrent == pInstance->nodeList)
399 {
400 pInstance->nodeList = pCurrent->next;
401 }
402 else
403 {
404 pPrev->next = pCurrent->next;
405 }
406 HeapFree(GetProcessHeap(), 0, pCurrent);
407 DeleteAtom(HSZ2ATOM(hsz));
408 }
409 return TRUE;
410 }
411 }
412 WARN("HSZ %p not found\n", hsz);
413
414 return FALSE;
415}
#define HSZ2ATOM(hsz)
Definition: ddemisc.c:34
#define FALSE
Definition: types.h:117
#define HeapFree(x, y, z)
Definition: compat.h:735
ATOM WINAPI DeleteAtom(ATOM nAtom)
Definition: atom.c:526
struct tagHSZNode * next
Definition: dde_private.h:96
unsigned refCount
Definition: dde_private.h:98

Referenced by DdeFreeStringHandle(), WDML_EventProc(), WDML_FreeTransaction(), WDML_HandleIncomingData(), WDML_RemoveAllLinks(), WDML_RemoveConv(), WDML_RemoveLink(), WDML_RemoveServer(), WDML_ServerHandleAdvise(), WDML_ServerHandlePoke(), WDML_ServerHandleRequest(), and WDML_ServerHandleUnadvise().

◆ WDML_ExtractAck()

static __inline void WDML_ExtractAck ( WORD  status,
DDEACK *  da 
)
static

Definition at line 240 of file dde_private.h.

241{
242 *da = *((DDEACK*)&status);
243}
Definition: dde.h:51
Definition: ps.c:97

Referenced by WDML_HandleAdviseReply(), WDML_HandleExecuteReply(), WDML_HandleRequestReply(), and WDML_HandleUnadviseReply().

◆ WDML_FindConv()

WDML_CONV * WDML_FindConv ( WDML_INSTANCE *  pInstance,
WDML_SIDE  side,
HSZ  hszService,
HSZ  hszTopic 
)

Definition at line 2056 of file ddemisc.c.

2058{
2059 WDML_CONV* pCurrent;
2060
2061 for (pCurrent = pInstance->convs[side]; pCurrent != NULL; pCurrent = pCurrent->next)
2062 {
2063 if (DdeCmpStringHandles(pCurrent->hszService, hszService) == 0 &&
2064 DdeCmpStringHandles(pCurrent->hszTopic, hszTopic) == 0)
2065 {
2066 return pCurrent;
2067 }
2068
2069 }
2070 return NULL;
2071}
INT WINAPI DdeCmpStringHandles(HSZ hsz1, HSZ hsz2)
Definition: ddemisc.c:689

Referenced by DdeConnect().

◆ WDML_FindLink()

WDML_LINK * WDML_FindLink ( WDML_INSTANCE *  pInstance,
HCONV  hConv,
WDML_SIDE  side,
HSZ  hszItem,
BOOL  use_fmt,
UINT  uFmt 
)

Definition at line 1876 of file ddemisc.c.

1878{
1879 WDML_LINK* pCurrent;
1880
1881 for (pCurrent = pInstance->links[side]; pCurrent != NULL; pCurrent = pCurrent->next)
1882 {
1883 /* we don't need to check for transaction type as it can be altered */
1884
1885 if (pCurrent->hConv == hConv &&
1886 DdeCmpStringHandles(pCurrent->hszItem, hszItem) == 0 &&
1887 (!use_fmt || pCurrent->uFmt == uFmt))
1888 {
1889 break;
1890 }
1891
1892 }
1893
1894 return pCurrent;
1895}

Referenced by WDML_HandleAdviseReply(), WDML_HandleIncomingData(), WDML_ServerHandleAdvise(), and WDML_ServerHandleUnadvise().

◆ WDML_FindServer()

WDML_SERVER * WDML_FindServer ( WDML_INSTANCE *  pInstance,
HSZ  hszService,
HSZ  hszTopic 
)

Definition at line 1737 of file ddemisc.c.

1738{
1739 WDML_SERVER* pServer;
1740
1741 for (pServer = pInstance->servers; pServer != NULL; pServer = pServer->next)
1742 {
1743 if (hszService == pServer->hszService)
1744 {
1745 return pServer;
1746 }
1747 }
1748 TRACE("Service name missing\n");
1749 return NULL;
1750}

Referenced by DdeNameService().

◆ WDML_FreeTransaction()

void WDML_FreeTransaction ( WDML_INSTANCE *  pInstance,
WDML_XACT *  pXAct,
BOOL  doFreePmt 
)

Definition at line 1975 of file ddemisc.c.

1976{
1977 /* free pmt(s) in pXAct too. check against one for not deleting TRUE return values */
1978 if (doFreePmt && (ULONG_PTR)pXAct->hMem > 1)
1979 {
1980 GlobalFree(pXAct->hMem);
1981 }
1982 if (pXAct->hszItem) WDML_DecHSZ(pInstance, pXAct->hszItem);
1983
1984 HeapFree(GetProcessHeap(), 0, pXAct);
1985}
BOOL WDML_DecHSZ(WDML_INSTANCE *pInstance, HSZ hsz)
Definition: ddemisc.c:384
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611

Referenced by DdeAbandonTransaction(), DdeClientTransaction(), DdeDisconnect(), WDML_EnableCallback(), WDML_RemoveConv(), and WDML_ServerConvProc().

◆ WDML_GetConv()

WDML_CONV * WDML_GetConv ( HCONV  hConv,
BOOL  checkConnected 
)

Definition at line 2239 of file ddemisc.c.

2240{
2241 WDML_CONV* pConv = (WDML_CONV*)hConv;
2242
2243 /* FIXME: should do better checking */
2244 if (pConv == NULL || pConv->magic != WDML_CONV_MAGIC) return NULL;
2245
2246 if (!pConv->instance)
2247 {
2248 WARN("wrong thread ID, no instance\n");
2249 return NULL;
2250 }
2251
2252 if (pConv->instance->threadID != GetCurrentThreadId())
2253 {
2254 WARN("wrong thread ID\n");
2255 pConv->instance->lastError = DMLERR_INVALIDPARAMETER; /* FIXME: check */
2256 return NULL;
2257 }
2258
2259 if (checkConnected && !(pConv->wStatus & ST_CONNECTED))
2260 {
2261 WARN("found conv but ain't connected\n");
2262 pConv->instance->lastError = DMLERR_NO_CONV_ESTABLISHED;
2263 return NULL;
2264 }
2265
2266 return pConv;
2267}
#define ST_CONNECTED
Definition: ddeml.h:80
#define DMLERR_NO_CONV_ESTABLISHED
Definition: ddeml.h:256
#define DMLERR_INVALIDPARAMETER
Definition: ddeml.h:252
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:462

Referenced by DdeAbandonTransaction(), DdeClientTransaction(), DdeDisconnect(), DdeEnableCallback(), DdeImpersonateClient(), DdePostAdvise(), DdeQueryConvInfo(), DdeReconnect(), DdeSetUserHandle(), and WDML_SyncWaitTransactionReply().

◆ WDML_GetConvFromWnd()

WDML_CONV * WDML_GetConvFromWnd ( HWND  hWnd)

Definition at line 2274 of file ddemisc.c.

2275{
2277}
HWND hWnd
Definition: settings.c:17
#define GWL_WDML_CONVERSATION
Definition: dde_private.h:263
#define GetWindowLongPtrW
Definition: winuser.h:4983

Referenced by DdeConnect(), DdeReconnect(), WDML_ClientProc(), and WDML_ServerConvProc().

◆ WDML_GetInstance()

WDML_INSTANCE * WDML_GetInstance ( DWORD  InstId)

Definition at line 1234 of file ddemisc.c.

1235{
1237
1239
1241 {
1242 if (pInstance->instanceID == instId)
1243 {
1244 if (GetCurrentThreadId() != pInstance->threadID)
1245 {
1246 FIXME("Tried to get instance from wrong thread\n");
1247 continue;
1248 }
1249 break;
1250 }
1251 }
1252
1254
1255 if (!pInstance)
1256 WARN("Instance entry missing for id %04lx\n", instId);
1257 return pInstance;
1258}
static WDML_INSTANCE * WDML_InstanceList
Definition: ddemisc.c:36
static CRITICAL_SECTION WDML_CritSect
Definition: ddemisc.c:45
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)

Referenced by DdeAbandonTransaction(), DdeConnect(), DdeCreateDataHandle(), DdeCreateStringHandleA(), DdeCreateStringHandleW(), DdeEnableCallback(), DdeFreeStringHandle(), DdeGetLastError(), DdeKeepStringHandle(), DdeNameService(), DdePostAdvise(), DdeQueryStringA(), DdeQueryStringW(), and DdeUninitialize().

◆ WDML_GetInstanceFromWnd()

WDML_INSTANCE * WDML_GetInstanceFromWnd ( HWND  hWnd)

Definition at line 1265 of file ddemisc.c.

1266{
1268}
#define GWL_WDML_INSTANCE
Definition: dde_private.h:262

Referenced by WDML_AddConv(), WDML_ClientProc(), WDML_EventProc(), WDML_ServerConvProc(), and WDML_ServerNameProc().

◆ WDML_Global2DataHandle()

HDDEDATA WDML_Global2DataHandle ( WDML_CONV *  pConv,
HGLOBAL  hMem,
WINE_DDEHEAD *  da 
)

Definition at line 1509 of file ddemisc.c.

1510{
1511 DDEDATA* pDd;
1512 HDDEDATA ret = 0;
1513 DWORD size;
1514
1515 if (hMem)
1516 {
1517 pDd = GlobalLock(hMem);
1518 size = GlobalSize(hMem) - sizeof(WINE_DDEHEAD);
1519 if (pDd)
1520 {
1521 if (p) memcpy(p, pDd, sizeof(WINE_DDEHEAD));
1522 switch (pDd->cfFormat)
1523 {
1524 default:
1525 FIXME("Unsupported format (%04x) for data %p, passing raw information\n",
1526 pDd->cfFormat, hMem);
1527 /* fall through */
1528 case 0:
1529 case CF_TEXT:
1530 ret = DdeCreateDataHandle(pConv->instance->instanceID, pDd->Value, size, 0, 0, pDd->cfFormat, 0);
1531 break;
1532 case CF_BITMAP:
1533 if (size >= sizeof(BITMAP))
1534 {
1535 BITMAP* bmp = (BITMAP*)pDd->Value;
1537 if (size >= sizeof(BITMAP) + count)
1538 {
1539 HBITMAP hbmp;
1540
1543 pDd->Value + sizeof(BITMAP))))
1544 {
1545 ret = DdeCreateDataHandle(pConv->instance->instanceID, (LPBYTE)&hbmp, sizeof(hbmp),
1546 0, 0, CF_BITMAP, 0);
1547 }
1548 else ERR("Can't create bmp\n");
1549 }
1550 else
1551 {
1552 ERR("Wrong count: %lu / %d\n", size, count);
1553 }
1554 } else ERR("No bitmap header\n");
1555 break;
1556 }
1557 GlobalUnlock(hMem);
1558 }
1559 }
1560 return ret;
1561}
HDDEDATA WINAPI DdeCreateDataHandle(DWORD idInst, LPBYTE pSrc, DWORD cb, DWORD cbOff, HSZ hszItem, UINT wFmt, UINT afCmd)
Definition: ddemisc.c:1279
return ret
Definition: mutex.c:147
GLsizeiptr size
Definition: glext.h:5919
GLfloat GLfloat p
Definition: glext.h:8902
if(dx< 0)
Definition: linetemp.h:194
Definition: dde.h:57
BYTE Value[1]
Definition: dde.h:60
short cfFormat
Definition: dde.h:59
LONG bmWidth
Definition: wingdi.h:1868
WORD bmPlanes
Definition: wingdi.h:1871
WORD bmBitsPixel
Definition: wingdi.h:1872
unsigned char * LPBYTE
Definition: typedefs.h:53
HBITMAP WINAPI CreateBitmap(_In_ INT cx, _In_ INT cy, _In_ UINT cPlanes, _In_ UINT cBitsPerPel, _In_opt_ const VOID *pvBits)

Referenced by WDML_HandleIncomingData(), and WDML_HandleRequestReply().

◆ WDML_IncHSZ()

BOOL WDML_IncHSZ ( WDML_INSTANCE *  pInstance,
HSZ  hsz 
)

Definition at line 366 of file ddemisc.c.

367{
368 HSZNode* pNode;
369
370 pNode = WDML_FindNode(pInstance, hsz);
371 if (!pNode) return FALSE;
372
373 pNode->refCount++;
374 return TRUE;
375}
static HSZNode * WDML_FindNode(WDML_INSTANCE *pInstance, HSZ hsz)
Definition: ddemisc.c:309

Referenced by DdeKeepStringHandle(), DdeNameService(), WDML_AddConv(), WDML_AddLink(), WDML_AddServer(), and WDML_AllocTransaction().

◆ WDML_InvokeCallback()

HDDEDATA WDML_InvokeCallback ( WDML_INSTANCE *  pInst,
UINT  uType,
UINT  uFmt,
HCONV  hConv,
HSZ  hsz1,
HSZ  hsz2,
HDDEDATA  hdata,
ULONG_PTR  dwData1,
ULONG_PTR  dwData2 
)

Definition at line 1210 of file ddemisc.c.

1213{
1214 HDDEDATA ret;
1215
1216 if (pInstance == NULL)
1217 return NULL;
1218
1219 TRACE("invoking CB[%p] (%x %x %p %p %p %p %Ix %Ix)\n",
1220 pInstance->callback, uType, uFmt,
1221 hConv, hsz1, hsz2, hdata, dwData1, dwData2);
1222 ret = pInstance->callback(uType, uFmt, hConv, hsz1, hsz2, hdata, dwData1, dwData2);
1223 TRACE("done => %p\n", ret);
1224 return ret;
1225}

Referenced by DdePostAdvise(), WDML_EventProc(), WDML_HandleIncomingData(), WDML_HandleReply(), WDML_HandleTerminateReply(), WDML_ServerHandleAdvise(), WDML_ServerHandleExecute(), WDML_ServerHandlePoke(), WDML_ServerHandleRequest(), WDML_ServerHandleTerminate(), WDML_ServerHandleUnadvise(), and WDML_ServerNameProc().

◆ WDML_IsAppOwned()

BOOL WDML_IsAppOwned ( HDDEDATA  hDdeData)

Definition at line 1482 of file ddemisc.c.

1483{
1484 DDE_DATAHANDLE_HEAD* pDdh;
1485 BOOL ret = FALSE;
1486
1487 pDdh = GlobalLock(hData);
1488 if (pDdh != NULL)
1489 {
1490 ret = pDdh->bAppOwned;
1491 GlobalUnlock(hData);
1492 }
1493 return ret;
1494}
unsigned int BOOL
Definition: ntddk_ex.h:94

Referenced by DdePostAdvise(), and WDML_ServerNameProc().

◆ WDML_MakeAtomFromHsz()

ATOM WDML_MakeAtomFromHsz ( HSZ  hsz)

Definition at line 329 of file ddemisc.c.

330{
331 WCHAR nameBuffer[MAX_BUFFER_LEN];
332
333 if (GetAtomNameW(HSZ2ATOM(hsz), nameBuffer, MAX_BUFFER_LEN))
334 return GlobalAddAtomW(nameBuffer);
335 WARN("HSZ %p not found\n", hsz);
336 return 0;
337}
#define MAX_BUFFER_LEN
Definition: dde_private.h:37
UINT WINAPI GetAtomNameW(ATOM nAtom, LPWSTR lpBuffer, int nSize)
Definition: atom.c:569
ATOM WINAPI GlobalAddAtomW(LPCWSTR lpString)
Definition: atom.c:434

Referenced by DdeConnect(), DdePostAdvise(), DdeReconnect(), WDML_AddServer(), WDML_ClientQueueAdvise(), WDML_ClientQueuePoke(), WDML_ClientQueueRequest(), WDML_ClientQueueUnadvise(), and WDML_CreateServerConv().

◆ WDML_MakeHszFromAtom()

HSZ WDML_MakeHszFromAtom ( const WDML_INSTANCE *  pInstance,
ATOM  atom 
)

Definition at line 346 of file ddemisc.c.

347{
348 WCHAR nameBuffer[MAX_BUFFER_LEN];
349
350 if (!atom) return NULL;
351
352 if (GlobalGetAtomNameW(atom, nameBuffer, MAX_BUFFER_LEN))
353 {
354 TRACE("%x => %s\n", atom, debugstr_w(nameBuffer));
355 return DdeCreateStringHandleW(pInstance->instanceID, nameBuffer, CP_WINUNICODE);
356 }
357 WARN("ATOM 0x%x not found\n", atom);
358 return 0;
359}
UINT WINAPI GlobalGetAtomNameW(ATOM nAtom, LPWSTR lpBuffer, int nSize)
Definition: atom.c:476
#define debugstr_w
Definition: kernel32.h:32

Referenced by WDML_ClientProc(), WDML_EventProc(), WDML_HandleAdviseReply(), WDML_HandleIncomingData(), WDML_HandlePokeReply(), WDML_HandleRequestReply(), WDML_HandleUnadviseReply(), WDML_ServerNameProc(), WDML_ServerQueueAdvise(), WDML_ServerQueuePoke(), WDML_ServerQueueRequest(), and WDML_ServerQueueUnadvise().

◆ WDML_NotifyThreadDetach()

void WDML_NotifyThreadDetach ( void  )

Definition at line 1185 of file ddemisc.c.

1186{
1190
1193 {
1194 next = pInstance->next;
1195 if (pInstance->threadID == tid)
1196 {
1198 DdeUninitialize(pInstance->instanceID);
1200 }
1201 }
1203}
BOOL WINAPI DdeUninitialize(DWORD idInst)
Definition: ddemisc.c:1116
PSYMCRYPT_PARALLEL_HASH_OPERATION next

◆ WDML_NotifyThreadExit()

void WDML_NotifyThreadExit ( DWORD  tid)

◆ WDML_PostAck()

BOOL WDML_PostAck ( WDML_CONV *  pConv,
WDML_SIDE  side,
WORD  appRetCode,
BOOL  fBusy,
BOOL  fAck,
UINT_PTR  pmt,
LPARAM  lParam,
UINT  oldMsg 
)

Definition at line 2284 of file ddemisc.c.

2286{
2287 DDEACK ddeAck;
2288 HWND from, to;
2289
2290 if (side == WDML_SERVER_SIDE)
2291 {
2292 from = pConv->hwndServer;
2293 to = pConv->hwndClient;
2294 }
2295 else
2296 {
2297 to = pConv->hwndServer;
2298 from = pConv->hwndClient;
2299 }
2300
2301 ddeAck.bAppReturnCode = appRetCode;
2302 ddeAck.reserved = 0;
2303 ddeAck.fBusy = fBusy;
2304 ddeAck.fAck = fAck;
2305
2306 TRACE("Posting a %s ack\n", ddeAck.fAck ? "positive" : "negative");
2307
2308 lParam = (lParam) ? ReuseDDElParam(lParam, oldMsg, WM_DDE_ACK, *(WORD*)&ddeAck, pmt) :
2309 PackDDElParam(WM_DDE_ACK, *(WORD*)&ddeAck, pmt);
2311 {
2312 pConv->wStatus &= ~ST_CONNECTED;
2313 pConv->instance->lastError = DMLERR_POSTMSG_FAILED;
2315 return FALSE;
2316 }
2317 return TRUE;
2318}
#define WM_DDE_ACK
Definition: dde.h:41
LPARAM WINAPI PackDDElParam(UINT msg, UINT_PTR uiLo, UINT_PTR uiHi)
Definition: ddemisc.c:67
LPARAM WINAPI ReuseDDElParam(LPARAM lParam, UINT msgIn, UINT msgOut, UINT_PTR uiLo, UINT_PTR uiHi)
Definition: ddemisc.c:175
BOOL WINAPI FreeDDElParam(UINT msg, LPARAM lParam)
Definition: ddemisc.c:151
CardRegion * from
Definition: spigame.cpp:19
unsigned short fBusy
Definition: dde.h:52
unsigned short fAck
Definition: dde.h:52
unsigned short reserved
Definition: dde.h:52
unsigned short bAppReturnCode
Definition: dde.h:52

Referenced by WDML_HandleIncomingData(), WDML_ServerHandleAdvise(), WDML_ServerHandleExecute(), WDML_ServerHandlePoke(), WDML_ServerHandleRequest(), and WDML_ServerHandleUnadvise().

◆ WDML_QueueTransaction()

void WDML_QueueTransaction ( WDML_CONV *  pConv,
WDML_XACT *  pXAct 
)

Definition at line 1941 of file ddemisc.c.

1942{
1943 WDML_XACT** pt;
1944
1945 /* advance to last in queue */
1946 for (pt = &pConv->transactions; *pt != NULL; pt = &(*pt)->next);
1947 *pt = pXAct;
1948}
#define pt(x, y)
Definition: drawing.c:79

Referenced by DdeClientTransaction(), and WDML_ServerConvProc().

◆ WDML_RemoveConv()

void WDML_RemoveConv ( WDML_CONV *  pConv,
WDML_SIDE  side 
)

Definition at line 2078 of file ddemisc.c.

2079{
2080 WDML_CONV* pPrev = NULL;
2081 WDML_CONV* pCurrent;
2082 WDML_XACT* pXAct;
2083 WDML_XACT* pXActNext;
2084 HWND hWnd;
2085
2086 if (!pRef)
2087 return;
2088
2089 /* remove any pending transaction */
2090 for (pXAct = pRef->transactions; pXAct != NULL; pXAct = pXActNext)
2091 {
2092 pXActNext = pXAct->next;
2093 WDML_FreeTransaction(pRef->instance, pXAct, TRUE);
2094 }
2095
2096 WDML_RemoveAllLinks(pRef->instance, pRef, side);
2097
2098 /* FIXME: should we keep the window around ? it seems so (at least on client side
2099 * to let QueryConvInfo work after conv termination, but also to implement
2100 * DdeReconnect...
2101 */
2102 /* destroy conversation window, but first remove pConv from hWnd.
2103 * this would help the wndProc do appropriate handling upon a WM_DESTROY message
2104 */
2105 hWnd = (side == WDML_CLIENT_SIDE) ? pRef->hwndClient : pRef->hwndServer;
2107
2108 NtUserDestroyWindow((side == WDML_CLIENT_SIDE) ? pRef->hwndClient : pRef->hwndServer);
2109
2110 WDML_DecHSZ(pRef->instance, pRef->hszService);
2111 WDML_DecHSZ(pRef->instance, pRef->hszTopic);
2112
2113 for (pCurrent = pRef->instance->convs[side]; pCurrent != NULL; pCurrent = (pPrev = pCurrent)->next)
2114 {
2115 if (pCurrent == pRef)
2116 {
2117 if (pCurrent == pRef->instance->convs[side])
2118 {
2119 pRef->instance->convs[side] = pCurrent->next;
2120 }
2121 else
2122 {
2123 pPrev->next = pCurrent->next;
2124 }
2125 /* Ensure compiler doesn't optimize out the assignment with 0. */
2126 SecureZeroMemory(&pCurrent->magic, sizeof(pCurrent->magic));
2127 HeapFree(GetProcessHeap(), 0, pCurrent);
2128 break;
2129 }
2130 }
2131}
void WDML_FreeTransaction(WDML_INSTANCE *pInstance, WDML_XACT *pXAct, BOOL doFreePmt)
Definition: ddemisc.c:1975
static void WDML_RemoveAllLinks(WDML_INSTANCE *pInstance, WDML_CONV *pConv, WDML_SIDE side)
Definition: ddemisc.c:1830
BOOLEAN NTAPI NtUserDestroyWindow(HWND Wnd)
Definition: window.c:3041
#define SetWindowLongPtrW
Definition: winuser.h:5512
#define SecureZeroMemory
Definition: winbase.h:1441

Referenced by DdeDisconnect(), WDML_HandleTerminateReply(), WDML_RemoveServer(), and WDML_ServerHandleTerminate().

◆ WDML_RemoveLink()

void WDML_RemoveLink ( WDML_INSTANCE *  pInstance,
HCONV  hConv,
WDML_SIDE  side,
HSZ  hszItem,
UINT  wFmt 
)

Definition at line 1788 of file ddemisc.c.

1790{
1791 WDML_LINK* pPrev = NULL;
1792 WDML_LINK* pCurrent = NULL;
1793
1794 pCurrent = pInstance->links[side];
1795
1796 while (pCurrent != NULL)
1797 {
1798 if (pCurrent->hConv == hConv &&
1799 DdeCmpStringHandles(pCurrent->hszItem, hszItem) == 0 &&
1800 pCurrent->uFmt == uFmt)
1801 {
1802 if (pCurrent == pInstance->links[side])
1803 {
1804 pInstance->links[side] = pCurrent->next;
1805 }
1806 else
1807 {
1808 pPrev->next = pCurrent->next;
1809 }
1810
1811 WDML_DecHSZ(pInstance, pCurrent->hszItem);
1812 HeapFree(GetProcessHeap(), 0, pCurrent);
1813 break;
1814 }
1815
1816 pPrev = pCurrent;
1817 pCurrent = pCurrent->next;
1818 }
1819}

Referenced by WDML_HandleUnadviseReply(), and WDML_ServerHandleUnadvise().

◆ WDML_RemoveServer()

void WDML_RemoveServer ( WDML_INSTANCE *  pInstance,
HSZ  hszService,
HSZ  hszTopic 
)

Definition at line 1678 of file ddemisc.c.

1679{
1680 WDML_SERVER* pPrev = NULL;
1681 WDML_SERVER* pServer = NULL;
1682 WDML_CONV* pConv;
1683 WDML_CONV* pConvNext;
1684
1685 pServer = pInstance->servers;
1686
1687 while (pServer != NULL)
1688 {
1689 if (DdeCmpStringHandles(pServer->hszService, hszService) == 0)
1690 {
1692 pServer->atomService, pServer->atomServiceSpec);
1693 /* terminate all conversations for given topic */
1694 for (pConv = pInstance->convs[WDML_SERVER_SIDE]; pConv != NULL; pConv = pConvNext)
1695 {
1696 pConvNext = pConv->next;
1697 if (DdeCmpStringHandles(pConv->hszService, hszService) == 0)
1698 {
1699 HWND client = pConv->hwndClient, server = pConv->hwndServer;
1701 /* don't care about return code (whether client window is present or not) */
1703 }
1704 }
1705 if (pServer == pInstance->servers)
1706 {
1707 pInstance->servers = pServer->next;
1708 }
1709 else
1710 {
1711 pPrev->next = pServer->next;
1712 }
1713
1716 WDML_DecHSZ(pInstance, pServer->hszService);
1717
1718 GlobalDeleteAtom(pServer->atomService);
1720
1721 HeapFree(GetProcessHeap(), 0, pServer);
1722 break;
1723 }
1724
1725 pPrev = pServer;
1726 pServer = pServer->next;
1727 }
1728}
#define WM_DDE_TERMINATE
Definition: dde.h:38
#define WM_WDML_UNREGISTER
Definition: dde_private.h:252
const WCHAR WDML_szEventClass[]
Definition: ddemisc.c:41
void WDML_RemoveConv(WDML_CONV *pRef, WDML_SIDE side)
Definition: ddemisc.c:2078
void WDML_BroadcastDDEWindows(LPCWSTR clsName, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: ddemisc.c:2511
ATOM WINAPI GlobalDeleteAtom(ATOM nAtom)
Definition: atom.c:444
static FILE * client
Definition: client.c:37
static rfbScreenInfoPtr server
Definition: vnc.c:74

Referenced by DdeNameService().

◆ WDML_ServerHandle()

WDML_QUEUE_STATE WDML_ServerHandle ( WDML_CONV *  pConv,
WDML_XACT *  pXAct 
)

Definition at line 978 of file ddeserver.c.

979{
981
982 switch (pXAct->ddeMsg)
983 {
984 case WM_DDE_INITIATE:
985 FIXME("WM_DDE_INITIATE shouldn't be there!\n");
986 break;
987 case WM_DDE_REQUEST:
988 qs = WDML_ServerHandleRequest(pConv, pXAct);
989 break;
990
991 case WM_DDE_ADVISE:
992 qs = WDML_ServerHandleAdvise(pConv, pXAct);
993 break;
994
995 case WM_DDE_UNADVISE:
996 qs = WDML_ServerHandleUnadvise(pConv, pXAct);
997 break;
998
999 case WM_DDE_EXECUTE:
1000 qs = WDML_ServerHandleExecute(pConv, pXAct);
1001 break;
1002
1003 case WM_DDE_POKE:
1004 qs = WDML_ServerHandlePoke(pConv, pXAct);
1005 break;
1006
1007 case WM_DDE_TERMINATE:
1008 qs = WDML_ServerHandleTerminate(pConv, pXAct);
1009 break;
1010
1011 case WM_DDE_ACK:
1012 WARN("Shouldn't receive a ACK message (never requests them). Ignoring it\n");
1013 break;
1014
1015 default:
1016 FIXME("Unsupported message %d\n", pXAct->ddeMsg);
1017 }
1018 return qs;
1019}
#define WM_DDE_REQUEST
Definition: dde.h:43
#define WM_DDE_POKE
Definition: dde.h:44
#define WM_DDE_ADVISE
Definition: dde.h:39
#define WM_DDE_EXECUTE
Definition: dde.h:45
#define WM_DDE_INITIATE
Definition: dde.h:37
#define WM_DDE_UNADVISE
Definition: dde.h:40
static WDML_QUEUE_STATE WDML_ServerHandlePoke(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddeserver.c:885
static WDML_QUEUE_STATE WDML_ServerHandleUnadvise(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddeserver.c:705
static WDML_QUEUE_STATE WDML_ServerHandleRequest(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddeserver.c:544
static WDML_QUEUE_STATE WDML_ServerHandleExecute(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddeserver.c:812
static WDML_QUEUE_STATE WDML_ServerHandleTerminate(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddeserver.c:957
static WDML_QUEUE_STATE WDML_ServerHandleAdvise(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddeserver.c:620

Referenced by WDML_EnableCallback(), and WDML_ServerConvProc().

◆ WDML_UnQueueTransaction()

BOOL WDML_UnQueueTransaction ( WDML_CONV *  pConv,
WDML_XACT *  pXAct 
)

Definition at line 1955 of file ddemisc.c.

1956{
1957 WDML_XACT** pt;
1958
1959 for (pt = &pConv->transactions; *pt; pt = &(*pt)->next)
1960 {
1961 if (*pt == pXAct)
1962 {
1963 *pt = pXAct->next;
1964 return TRUE;
1965 }
1966 }
1967 return FALSE;
1968}

Referenced by DdeAbandonTransaction(), DdeClientTransaction(), and WDML_EnableCallback().

Variable Documentation

◆ WDML_szClientConvClassA

const char WDML_szClientConvClassA[]
extern

Definition at line 35 of file ddeclient.c.

Referenced by DdeConnect(), and WDML_ServerNameProc().

◆ WDML_szClientConvClassW

const WCHAR WDML_szClientConvClassW[]
extern

Definition at line 36 of file ddeclient.c.

Referenced by DdeConnect(), and WDML_ServerNameProc().

◆ WDML_szEventClass

const WCHAR WDML_szEventClass[]
extern

Definition at line 41 of file ddemisc.c.

Referenced by DdeNameService(), WDML_Initialize(), and WDML_RemoveServer().

◆ WDML_szServerConvClassA

const char WDML_szServerConvClassA[]
extern

Definition at line 35 of file ddeserver.c.

Referenced by WDML_ClientProc(), and WDML_CreateServerConv().

◆ WDML_szServerConvClassW

const WCHAR WDML_szServerConvClassW[]
extern

Definition at line 36 of file ddeserver.c.

Referenced by WDML_ClientProc(), and WDML_CreateServerConv().