/* * POSCPL.C * * Point-of-Sale Control Panel Applet * * Author: Ervin Peretz * * (c) 2001 Microsoft Corporation */ #include #include #include #include #include #include #include "internal.h" #include "res.h" #include "debug.h" HANDLE g_hInst = NULL; BOOL WINAPI LibMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { switch (dwReason){ case DLL_PROCESS_ATTACH: g_hInst = hDll; DisableThreadLibraryCalls(hDll); InitializeListHead(&allPOSDevicesList); break; case DLL_PROCESS_DETACH: case DLL_THREAD_DETACH: case DLL_THREAD_ATTACH: default: break; } return TRUE; } LONG CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2) { LONG result = 0L; switch (uMsg){ case CPL_INIT: result = 1; break; case CPL_GETCOUNT: result = 1; break; case CPL_INQUIRE: { LPCPLINFO pcplinfo = (LPCPLINFO)lParam2; switch (lParam1){ case 0: pcplinfo->idIcon = IDI_POSCPL_ICON; pcplinfo->idName = IDS_CAPTION; pcplinfo->idInfo = IDS_DESCRIPTION; break; case 1: // BUGBUG pcplinfo->idIcon = IDI_POSCPL_ICON; pcplinfo->idName = IDS_CAPTION; pcplinfo->idInfo = IDS_DESCRIPTION; break; } pcplinfo->lData = 0L; } result = 1; break; case CPL_SELECT: result = 0; // BUGBUG ? break; case CPL_DBLCLK: /* * The CPL was selected by the user. * Show our main dialog. */ switch (lParam1){ case 0: OpenAllHIDPOSDevices(); LaunchPOSDialog(hwndCPl); break; } break; case CPL_STOP: result = 1; // BUGBUG ? break; case CPL_EXIT: result = 1; break; case CPL_NEWINQUIRE: { LPNEWCPLINFO pnewcplinfo = (LPNEWCPLINFO)lParam2; switch (lParam1){ case 0: pnewcplinfo->hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_POSCPL_ICON)); // BUGBUG LoadString(g_hInst, IDS_xxx, pnewcplinfo->szName, sizeof(pnewcplinfo->szName)); // BUGBUG LoadString(g_hInst, IDS_xxx, pnewcplinfo->szInfo, sizeof(pnewcplinfo->szInfo)); break; } pnewcplinfo->dwHelpContext = 0; pnewcplinfo->dwSize = sizeof(NEWCPLINFO); pnewcplinfo->lData = 0L; pnewcplinfo->szHelpFile[0] = 0; } result = 1; break; default: result = 0; break; } return result; } VOID LaunchPOSDialog(HWND hwndCPl) { PROPSHEETPAGE *propSheetPages; ULONG numPropSheetPages; /* * Make sure we allocate at least one propsheetpage, * even if there are no devices. */ numPropSheetPages = (numDeviceInstances == 0) ? 1 : numDeviceInstances; propSheetPages = GlobalAlloc( GMEM_FIXED|GMEM_ZEROINIT, numPropSheetPages*sizeof(PROPSHEETPAGE)); if (propSheetPages){ PROPSHEETHEADER propSheetHeader = {0}; if (numDeviceInstances == 0){ /* * If there are no POS devices, * then put up a single tab saying so. */ propSheetPages[0].dwSize = sizeof(PROPSHEETPAGE); propSheetPages[0].dwFlags = PSP_DEFAULT; propSheetPages[0].hInstance = g_hInst; propSheetPages[0].pszTemplate = MAKEINTRESOURCE(IDD_NO_DEVICES_DLG); propSheetPages[0].pszIcon = NULL; // PSP_USEICONID not set in dwFlags propSheetPages[0].pszTitle = MAKEINTRESOURCE("BUGBUG"); // PSP_USETITLE not set in dwFlags propSheetPages[0].pfnDlgProc = NullPOSDlgProc; propSheetPages[0].lParam = (LPARAM)NULL; propSheetPages[0].pfnCallback = NULL; propSheetPages[0].pcRefParent = NULL; } else { LIST_ENTRY *listEntry; ULONG i; /* * Create the array of property sheet handles */ i = 0; listEntry = &allPOSDevicesList; while ((listEntry = listEntry->Flink) != &allPOSDevicesList){ posDevice *posDev; posDev = CONTAINING_RECORD(listEntry, posDevice, listEntry); ASSERT(i < numDeviceInstances); propSheetPages[i].dwSize = sizeof(PROPSHEETPAGE); propSheetPages[i].dwFlags = PSP_DEFAULT; propSheetPages[i].hInstance = g_hInst; propSheetPages[i].pszTemplate = MAKEINTRESOURCE(posDev->dialogId); propSheetPages[i].pszIcon = NULL; // PSP_USEICONID not set in dwFlags propSheetPages[i].pszTitle = MAKEINTRESOURCE("BUGBUG"); // PSP_USETITLE not set in dwFlags propSheetPages[i].pfnDlgProc = POSDlgProc; propSheetPages[i].lParam = (LPARAM)posDev; // BUGBUG ? - context ? propSheetPages[i].pfnCallback = NULL; propSheetPages[i].pcRefParent = NULL; i++; } } /* * Initialize the property sheet header */ propSheetHeader.dwSize = sizeof(PROPSHEETHEADER); propSheetHeader.dwFlags = PSH_PROPTITLE | PSH_PROPSHEETPAGE; propSheetHeader.hwndParent = hwndCPl; propSheetHeader.hInstance = g_hInst; propSheetHeader.pszIcon = NULL; propSheetHeader.pszCaption = MAKEINTRESOURCE(IDS_DIALOG_TITLE); propSheetHeader.ppsp = propSheetPages; propSheetHeader.nPages = numPropSheetPages; /* * Launch the property sheet tabbed dialog */ PropertySheet(&propSheetHeader); GlobalFree(propSheetPages); } else { ASSERT(propSheetPages); } } INT_PTR APIENTRY POSDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL result = TRUE; switch (uMsg){ case WM_INITDIALOG: { /* * On the WM_INITDIALOG only, lParam points to * our propSheetPage, which contains our posDevice * context (in the 'lParam' field). This is our * only chance to associate the posDevice context * with the actual dialog for future calls. */ PROPSHEETPAGE *propSheetPage = (PROPSHEETPAGE *)lParam; posDevice *posDev = (posDevice *)propSheetPage->lParam; ASSERT(posDev->sig == POSCPL_SIG); posDev->hDlg = hDlg; LaunchDeviceInstanceThread(posDev); } break; case WM_NOTIFY: switch (((NMHDR FAR*)lParam)->code){ case PSN_APPLY: SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR); break; default: result = FALSE; break; } break; case WM_COMMAND: switch (LOWORD(wParam)){ case IDC_SELECT_DEVICETYPE: break; case IDC_CASHDRAWER_STATE: break; case IDC_CASHDRAWER_STATETEXT: break; case IDC_CASHDRAWER_OPEN: { posDevice *posDev; posDev = GetDeviceByHDlg(hDlg); if (posDev){ SetCashDrawerState(posDev, DRAWER_STATE_OPEN); } else { DBGERR(L"GetDeviceByHDlg failed", 0); } } break; case IDC_MSR_TEXT: break; case IDC_STATIC1: case IDC_STATIC2: break; } break; case WM_DESTROY: { LIST_ENTRY *listEntry = &allPOSDevicesList; while ((listEntry = listEntry->Flink) != &allPOSDevicesList){ posDevice *posDev = CONTAINING_RECORD(listEntry, posDevice, listEntry); if (posDev->hThread){ #if 0 // BUGBUG FINISH - kill the thread WaitForSingleObject(posDev->hThread, INFINITE); CloseHandle(posDev->hThread); #endif } } } break; case WM_HELP: break; case WM_CONTEXTMENU: break; default: result = FALSE; break; } return (INT_PTR)result; } /* * NullPOSDlgProc * * This is the dialog proc when we have no POS devices to display. */ INT_PTR APIENTRY NullPOSDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL result = TRUE; switch (uMsg){ case WM_NOTIFY: switch (((NMHDR FAR*)lParam)->code){ case PSN_APPLY: SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR); break; default: result = FALSE; break; } break; default: result = FALSE; break; } return (INT_PTR)result; }