156 lines
4.9 KiB
C
156 lines
4.9 KiB
C
|
/*
|
||
|
* INTERNAL.H
|
||
|
*
|
||
|
* Point-of-Sale Control Panel Applet
|
||
|
*
|
||
|
* Author: Ervin Peretz
|
||
|
*
|
||
|
* (c) 2001 Microsoft Corporation
|
||
|
*/
|
||
|
|
||
|
|
||
|
|
||
|
#define USE_OVERLAPPED_IO FALSE
|
||
|
|
||
|
|
||
|
|
||
|
typedef struct posDevice {
|
||
|
#define POSCPL_SIG 'CsoP'
|
||
|
DWORD sig;
|
||
|
|
||
|
LIST_ENTRY listEntry;
|
||
|
|
||
|
/*
|
||
|
* Device type, identified by dialog
|
||
|
* id for the device type
|
||
|
* (e.g. IDD_POS_CASHDRAWER_DLG).
|
||
|
*/
|
||
|
DWORD dialogId;
|
||
|
|
||
|
PHIDP_PREPARSED_DATA hidPreparsedData;
|
||
|
HIDD_ATTRIBUTES hidAttrib;
|
||
|
HIDP_CAPS hidCapabilities;
|
||
|
|
||
|
HWND hDlg;
|
||
|
|
||
|
HANDLE hThread;
|
||
|
|
||
|
PUCHAR readBuffer;
|
||
|
PUCHAR writeBuffer;
|
||
|
|
||
|
HANDLE devHandle;
|
||
|
WCHAR pathName[MAX_PATH];
|
||
|
|
||
|
#if USE_OVERLAPPED_IO
|
||
|
OVERLAPPED overlappedReadInfo;
|
||
|
NTSTATUS overlappedReadStatus;
|
||
|
DWORD overlappedReadLen;
|
||
|
HANDLE overlappedReadEvent;
|
||
|
|
||
|
OVERLAPPED overlappedWriteInfo;
|
||
|
NTSTATUS overlappedWriteStatus;
|
||
|
DWORD overlappedWriteLen;
|
||
|
HANDLE overlappedWriteEvent;
|
||
|
#endif
|
||
|
} posDevice;
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* These are non-standard vendor usage values and codes
|
||
|
* used by APG Cash Drawer.
|
||
|
*/
|
||
|
#define USAGE_PAGE_CASH_DEVICE 0x0F0
|
||
|
#define USAGE_CASH_DRAWER 0x0F1
|
||
|
#define USAGE_CASH_DRAWER_NUMBER 0x0F2
|
||
|
#define USAGE_CASH_DRAWER_SET 0x0F3
|
||
|
#define USAGE_CASH_DRAWER_STATUS 0x0F4
|
||
|
enum cashDrawerStates {
|
||
|
DRAWER_STATE_OPEN = 1,
|
||
|
DRAWER_STATE_CLOSED_READY = 2,
|
||
|
DRAWER_STATE_CLOSED_CHARGING = 3,
|
||
|
DRAWER_STATE_LOCKED = 4,
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* List macros -- not defined in winnt.h for some reason.
|
||
|
*/
|
||
|
#define InitializeListHead(ListHead) (\
|
||
|
(ListHead)->Flink = (ListHead)->Blink = (ListHead))
|
||
|
#define IsListEmpty(ListHead) \
|
||
|
((ListHead)->Flink == (ListHead))
|
||
|
#define RemoveHeadList(ListHead) \
|
||
|
(ListHead)->Flink;\
|
||
|
{RemoveEntryList((ListHead)->Flink)}
|
||
|
#define RemoveTailList(ListHead) \
|
||
|
(ListHead)->Blink;\
|
||
|
{RemoveEntryList((ListHead)->Blink)}
|
||
|
#define RemoveEntryList(Entry) {\
|
||
|
PLIST_ENTRY _EX_Blink;\
|
||
|
PLIST_ENTRY _EX_Flink;\
|
||
|
_EX_Flink = (Entry)->Flink;\
|
||
|
_EX_Blink = (Entry)->Blink;\
|
||
|
_EX_Blink->Flink = _EX_Flink;\
|
||
|
_EX_Flink->Blink = _EX_Blink;\
|
||
|
}
|
||
|
#define InsertTailList(ListHead,Entry) {\
|
||
|
PLIST_ENTRY _EX_Blink;\
|
||
|
PLIST_ENTRY _EX_ListHead;\
|
||
|
_EX_ListHead = (ListHead);\
|
||
|
_EX_Blink = _EX_ListHead->Blink;\
|
||
|
(Entry)->Flink = _EX_ListHead;\
|
||
|
(Entry)->Blink = _EX_Blink;\
|
||
|
_EX_Blink->Flink = (Entry);\
|
||
|
_EX_ListHead->Blink = (Entry);\
|
||
|
}
|
||
|
#define InsertHeadList(ListHead,Entry) {\
|
||
|
PLIST_ENTRY _EX_Flink;\
|
||
|
PLIST_ENTRY _EX_ListHead;\
|
||
|
_EX_ListHead = (ListHead);\
|
||
|
_EX_Flink = _EX_ListHead->Flink;\
|
||
|
(Entry)->Flink = _EX_Flink;\
|
||
|
(Entry)->Blink = _EX_ListHead;\
|
||
|
_EX_Flink->Blink = (Entry);\
|
||
|
_EX_ListHead->Flink = (Entry);\
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Function prototypes
|
||
|
*/
|
||
|
VOID LaunchPOSDialog(HWND hwndCPl);
|
||
|
INT_PTR APIENTRY POSDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||
|
INT_PTR APIENTRY NullPOSDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||
|
posDevice *NewPOSDevice(DWORD dialogId, HANDLE devHandle, PWCHAR devPath, PHIDP_PREPARSED_DATA pHidPreparsedData, PHIDD_ATTRIBUTES pHidAttrib, HIDP_CAPS *pHidCapabilities);
|
||
|
VOID DestroyPOSDevice(posDevice *posDev);
|
||
|
VOID EnqueuePOSDevice(posDevice *posDev);
|
||
|
VOID DequeuePOSDevice(posDevice *posDev);
|
||
|
VOID OpenAllHIDPOSDevices();
|
||
|
VOID IntToWChar(WCHAR *buf, DWORD x);
|
||
|
VOID HexToWChar(WCHAR *buf, DWORD x);
|
||
|
ULONG WStrNCpy(WCHAR *dest, const WCHAR *src, ULONG maxWChars);
|
||
|
ULONG AsciiToWChar(WCHAR *dest, const char *src, ULONG maxChars);
|
||
|
posDevice *GetDeviceByHDlg(HWND hDlg);
|
||
|
VOID LaunchDeviceInstanceThread(posDevice *posDev);
|
||
|
DWORD __stdcall DeviceInstanceThread(void *context);
|
||
|
BOOL SetCashDrawerState(posDevice *posDev, enum cashDrawerStates newState);
|
||
|
#if USE_OVERLAPPED_IO
|
||
|
VOID CALLBACK OverlappedReadCompletionRoutine(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped);
|
||
|
VOID CALLBACK OverlappedWriteCompletionRoutine(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped);
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Externs
|
||
|
*/
|
||
|
extern HANDLE g_hInst;
|
||
|
extern ULONG numDeviceInstances;
|
||
|
extern LIST_ENTRY allPOSDevicesList;
|
||
|
|