2025-04-27 07:49:33 -04:00

196 lines
4.6 KiB
C

/***************************************************************************/
/** Microsoft Windows **/
/** Copyright(c) Microsoft Corp., 1991,1992 **/
/***************************************************************************/
// ts=4
// DDE.C - ClipBook viewer DDEML callback function
// 4-92 clausgi created
#include "windows.h"
#include "clipbook.h"
#include "common.h"
// internal forwards
static HWND GetConvHwnd ( HCONV hConv );
// ddeml callback routine
HDDEDATA EXPENTRY DdeCallback(
WORD wType,
WORD wFmt,
HCONV hConv,
HSZ hszTopic,
HSZ hszItem,
HDDEDATA hData,
DWORD lData1,
DWORD lData2)
{
HWND hwndTmp;
CONVINFO ConvInfo;
PDATAREQ pDataReq;
switch (wType)
{
case XTYP_ADVDATA:
if ( hwndTmp = GetConvHwnd ( hConv ) )
{
InitListBox ( hwndTmp, hData );
}
return FALSE;
break;
case XTYP_DISCONNECT:
ConvInfo.cb = sizeof(CONVINFO);
if ( DdeQueryConvInfo ( hConv, (DWORD)QID_SYNC, &ConvInfo ) == 0 )
{
PERROR(TEXT("DdeQueryConvInfo for %lx failed: %x\n\r"),
(DWORD)hConv, DdeGetLastError(idInst));
break;
}
if ( pDataReq = (PDATAREQ)ConvInfo.hUser )
{
PINFO(TEXT("Freeing data req on %lx at disconnect time\n\r"), hConv );
ProcessDataReq ( 0, pDataReq );
DeleteDataReq ( pDataReq );
DdeSetUserHandle ( hConv, (DWORD)QID_SYNC, 0L );
}
else
{
PINFO(TEXT("Disconnect received on %lx - no datareq\n\r"), hConv );
}
break;
case XTYP_XACT_COMPLETE:
ConvInfo.cb = sizeof(CONVINFO);
if ( DdeQueryConvInfo ( hConv, (DWORD)QID_SYNC, &ConvInfo ) == 0 )
{
PERROR(TEXT("DdeQueryConvInfo for %lx failed: %x\n\r"),
(DWORD)hConv, DdeGetLastError(idInst));
break;
}
PINFO(TEXT("dde callback: got %lx data from conv handle %lx\n\r"),
ConvInfo.hUser, (DWORD)hConv );
pDataReq = (PDATAREQ)ConvInfo.hUser;
ProcessDataReq ( hData, pDataReq );
DeleteDataReq ( pDataReq );
if ( pDataReq->fDisconnect )
{
DdeDisconnect ( hConv );
}
DdeSetUserHandle ( hConv, (DWORD)QID_SYNC, 0L );
break;
case XTYP_REGISTER:
case XTYP_UNREGISTER:
case XTYP_ADVREQ:
case XTYP_REQUEST:
case XTYP_ADVSTART:
case XTYP_CONNECT_CONFIRM:
case XTYP_CONNECT:
default:
break;
}
return 0;
}
// this function retrieves the window handle associated with
// a conversation handle - the hande is put there by
// using DdeSetUserHandle at DdeConnect time
static HWND GetConvHwnd ( HCONV hConv )
{
CONVINFO ConvInfo;
PDATAREQ pDataReq;
ConvInfo.cb = sizeof(CONVINFO);
if ( DdeQueryConvInfo ( hConv, (DWORD)QID_SYNC, &ConvInfo ) == 0 )
{
PERROR(TEXT("DdeQueryConvInfo for %lx failed: %x\n\r"),
(DWORD)hConv, DdeGetLastError(idInst));
}
pDataReq = (PDATAREQ)ConvInfo.hUser;
PINFO(TEXT("GetConvHwnd: got %p as conv handle\r\n"), pDataReq);
if ( !IsWindow ( pDataReq->hwndMDI ) )
{
PERROR(TEXT("Invalid window %lx in conv Uhandle: %lx!\n\r"),
(DWORD)pDataReq->hwndMDI, (DWORD)hConv );
return NULL;
}
return pDataReq->hwndMDI;
}
//
// Purpose: Get the version of Clipsrv connected to the given MDI
// child.
//
// Parameters:
// hwndChild - The child window.
//
// Returns:
// A version number with the Clipsrv OS version in the hiword, and
// the Clipsrv version in the loword.
//
// Hiword values:
// 0 - Win 3.x
// 1 - NT 1.x
//
// Loword values:
// 0 - WFW 1.0 Clipsrv
// 1 - NT 1.0 Clipsrv, adds [version] and [security] executes
//
/////////////////////////////////////////////////////////////////////
DWORD GetClipsrvVersion(
HWND hwndChild)
{
MDIINFO *pMDI;
HDDEDATA hdde;
DWORD dwRet;
char *lpszDDE;
dwRet = 0;
pMDI = GETMDIINFO(hwndChild);
if (pMDI && !(pMDI->flags & F_CLPBRD))
{
hdde = MySyncXact(SZCMD_VERSION, lstrlen(SZCMD_VERSION) + 1,
pMDI->hExeConv, 0L, CF_TEXT, XTYP_EXECUTE,
SHORT_SYNC_TIMEOUT, NULL);
if (hdde)
{
lpszDDE = (char *)DdeAccessData(hdde, &dwRet);
if (lpszDDE)
{
dwRet = MAKELONG(lpszDDE[0] - '0', lpszDDE[2] - '0');
}
else
{
dwRet = 0L;
}
DdeUnaccessData(hdde);
DdeFreeDataHandle(hdde);
}
else
{
PINFO(TEXT("Clipsrv didn't like version execute\r\n"));
}
}
else
{
PERROR(TEXT("No Clipsrv for clipboard!\r\n"));
}
return dwRet;
}