emu48-mirror/sources/Emu48/DDESERV.C
2024-03-19 22:25:45 +01:00

138 lines
3.6 KiB
C

/*
* DdeServ.c
*
* This file is part of Emu48
*
* Copyright (C) 1998 Christoph Gießelink
*
*/
#include "pch.h"
#include "Emu48.h"
HDDEDATA CALLBACK DdeCallback(UINT iType,UINT iFmt,HCONV hConv,
HSZ hsz1,HSZ hsz2,HDDEDATA hData,
DWORD dwData1,DWORD dwData2)
{
BYTE szBuffer[32];
HDDEDATA hReturn;
LPBYTE lpData,lpHeader;
DWORD dwAddress,dwSize,dwLoop,dwIndex;
BOOL bSuccess;
switch (iType)
{
case XTYP_CONNECT:
DdeQueryString(idDdeInst,hsz2,szBuffer,sizeof(szBuffer),0);
if (0 != strcmp(szBuffer,szAppName))
return (HDDEDATA) FALSE;
DdeQueryString(idDdeInst,hsz1,szBuffer,sizeof(szBuffer),0);
return (HDDEDATA) (0==strcmp(szBuffer,szTopic));
case XTYP_POKE:
// illegal data format or not in running state
if (iFmt != uCF_HpObj || nState != 0)
return (HDDEDATA) DDE_FNOTPROCESSED;
DdeAccessData(hData,&dwSize); // fetch data size
DdeUnaccessData(hData);
// reserve memory
if ((lpData = (LPBYTE) LocalAlloc(LMEM_FIXED,dwSize * 2)) == NULL)
return (HDDEDATA) DDE_FNOTPROCESSED;
if (!Chipset.dispon) // HP off
{
// turn on HP
KeyboardEvent(TRUE,0,0x8000);
Sleep(200);
KeyboardEvent(FALSE,0,0x8000);
}
if (WaitForSleepState()) // wait for cpu SHUTDN then sleep state
{
LocalFree(lpData); // free memory
return (HDDEDATA) DDE_FNOTPROCESSED;
}
while (nState!=nNextState) Sleep(0);
_ASSERT(nState==3);
// fetch data and write to stack
DdeGetData(hData,(LPBYTE) &dwIndex,sizeof(DWORD),0L);
if (dwIndex <= dwSize - sizeof(DWORD))
dwSize = dwIndex;
dwSize = DdeGetData(hData,lpData+dwSize,dwSize,sizeof(DWORD));
bSuccess = (WriteStack(lpData,dwSize) == S_ERR_NO);
LocalFree(lpData); // free memory
SwitchToState(0); // run state
while (nState!=nNextState) Sleep(0);
_ASSERT(nState==0);
if (bSuccess == FALSE)
return (HDDEDATA) DDE_FNOTPROCESSED;
KeyboardEvent(TRUE,0,0x8000);
Sleep(200);
KeyboardEvent(FALSE,0,0x8000);
// wait for sleep mode
while(Chipset.Shutdn == FALSE) Sleep(0);
return (HDDEDATA) DDE_FACK;
case XTYP_REQUEST:
// illegal data format or not in running state
if (iFmt != uCF_HpObj || nState != 0)
return NULL;
if (WaitForSleepState()) // wait for cpu SHUTDN then sleep state
return NULL;
while (nState!=nNextState) Sleep(0);
_ASSERT(nState==3);
dwAddress = RPL_Pick(1); // pick address of level1 object
if (dwAddress == 0)
{
SwitchToState(0); // run state
return NULL;
}
dwLoop = dwSize = (RPL_SkipOb(dwAddress) - dwAddress + 1) / 2;
lpHeader = (Chipset.type != 'X') ? BINARYHEADER48 : BINARYHEADER49;
// length of binary header
dwIndex = strlen(lpHeader);
// size of objectsize + header + object
dwSize += dwIndex + sizeof(DWORD);
// reserve memory
if ((lpData = (LPBYTE) LocalAlloc(LMEM_FIXED,dwSize)) == NULL)
{
SwitchToState(0); // run state
return NULL;
}
// save data length
*(DWORD *)lpData = dwLoop + dwIndex;
// copy header
memcpy(lpData + sizeof(DWORD),lpHeader,dwIndex);
// copy data
for (dwIndex += sizeof(DWORD);dwLoop--;++dwIndex,dwAddress += 2)
lpData[dwIndex] = Read2(dwAddress);
// write data
hReturn = DdeCreateDataHandle(idDdeInst,lpData,dwSize,0,hsz2,iFmt,0);
LocalFree(lpData);
SwitchToState(0); // run state
while (nState!=nNextState) Sleep(0);
_ASSERT(nState==0);
return hReturn;
}
return NULL;
}