windows-nt/Source/XPSP1/NT/shell/cpls/poscpl/cashdrwr.c
2020-09-26 16:20:57 +08:00

118 lines
3.6 KiB
C

/*
* CASHDRWR.C
*
* Point-of-Sale Control Panel Applet
*
* Author: Ervin Peretz
*
* (c) 2001 Microsoft Corporation
*/
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <cpl.h>
#include <setupapi.h>
#include <hidsdi.h>
#include "internal.h"
#include "res.h"
#include "debug.h"
#if USE_OVERLAPPED_IO
VOID CALLBACK OverlappedWriteCompletionRoutine( DWORD dwErrorCode,
DWORD dwNumberOfBytesTransfered,
LPOVERLAPPED lpOverlapped)
{
posDevice *posDev;
/*
* We stashed our context in the hEvent field of the
* overlapped structure (this is allowed).
*/
ASSERT(lpOverlapped);
posDev = lpOverlapped->hEvent;
ASSERT(posDev->sig == POSCPL_SIG);
posDev->overlappedWriteStatus = dwErrorCode;
posDev->overlappedWriteLen = dwNumberOfBytesTransfered;
SetEvent(posDev->overlappedWriteEvent);
}
#endif
BOOL SetCashDrawerState(posDevice *posDev, enum cashDrawerStates newState)
{
NTSTATUS ntStat;
BOOL result = FALSE;
ASSERT(posDev->hidCapabilities.OutputReportByteLength <= 20);
ntStat = HidP_SetUsageValue(HidP_Output,
USAGE_PAGE_CASH_DEVICE,
0, // all collections
USAGE_CASH_DRAWER_SET,
newState,
posDev->hidPreparsedData,
posDev->writeBuffer,
posDev->hidCapabilities.OutputReportByteLength);
if (ntStat == HIDP_STATUS_SUCCESS){
DWORD bytesWritten = 0;
BOOL ok;
ASSERT(posDev->hidCapabilities.OutputReportByteLength > 0);
ASSERT(posDev->writeBuffer);
#if USE_OVERLAPPED_IO
/*
* It's ok to stash our context in the hEvent field
* of the overlapped structure.
*/
posDev->overlappedWriteInfo.hEvent = (HANDLE)posDev;
posDev->overlappedWriteInfo.Offset = 0;
posDev->overlappedWriteInfo.OffsetHigh = 0;
posDev->overlappedWriteLen = 0;
ResetEvent(posDev->overlappedWriteEvent);
ok = WriteFileEx( posDev->devHandle,
posDev->writeBuffer,
posDev->hidCapabilities.OutputReportByteLength,
&posDev->overlappedWriteInfo,
OverlappedWriteCompletionRoutine);
if (ok){
WaitForSingleObject(posDev->overlappedWriteEvent, INFINITE);
ok = (posDev->overlappedWriteStatus == NO_ERROR);
bytesWritten = posDev->overlappedWriteLen;
}
else {
bytesWritten = 0;
}
#else
ok = WriteFile( posDev->devHandle,
posDev->writeBuffer,
posDev->hidCapabilities.OutputReportByteLength,
&bytesWritten,
NULL);
#endif
if (ok){
ASSERT(bytesWritten <= posDev->hidCapabilities.OutputReportByteLength);
result = TRUE;
}
else {
DWORD err = GetLastError();
DBGERR(L"WriteFile failed", err);
}
}
else {
DBGERR(L"HidP_SetUsageValue failed", ntStat);
DBGERR(DBGHIDSTATUSSTR(ntStat), 0);
}
return result;
}