|
|
/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
devices.c
Abstract: Control Panel Applet for OLE POS Devices
Author:
Karan Mehra [t-karanm]
Environment:
Win32 mode
Revision History:
--*/
#include "pos.h"
#include <initguid.h>
#include <usbioctl.h>
BOOL InitializeDevicesDlg(HWND hwndDlg, BOOL bFirstTime) { RECT rc; HWND hwndListCtrl; DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
/*
* Register to receive device notifications from the PnP manager. */ notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; notificationFilter.dbcc_classguid = GUID_CLASS_USB_DEVICE;
ghNotify = RegisterDeviceNotification(hwndDlg, (LPVOID)¬ificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
/*
* Split the List Control [report view] into 3/4 for the NAME and 1/4 for the PORT. */ hwndListCtrl = GetDlgItem(hwndDlg,IDC_DEVICES_LIST);
if(bFirstTime) { GetClientRect(hwndListCtrl, &rc);
rc.right >>= 2; InsertColumn(hwndListCtrl, NAME_COLUMN, IDS_DEVICES_LIST_NAME, (INT)(rc.right*3)); InsertColumn(hwndListCtrl, PORT_COLUMN, IDS_DEVICES_LIST_PORT, (INT)(rc.right+2));
MoveOK(GetParent(hwndDlg)); } else ListView_DeleteAllItems(hwndListCtrl);
/*
* Create an Image List and add installed devices to the List View Control. */ gDeviceCount = 0; if(!InitializeImageList(hwndListCtrl) || !FillListViewItems(hwndListCtrl)) { DestroyWindow(hwndListCtrl); return FALSE; }
return TRUE; }
BOOL CALLBACK DevicesDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { BOOL fProcessed = TRUE;
switch(uMsg) {
case WM_INITDIALOG: InitializeDevicesDlg(hwndDlg, TRUE); break;
case WM_HELP: // F1
WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, POS_HELP_FILE, HELP_WM_HELP, (DWORD_PTR)gaPosHelpIds); break;
case WM_CONTEXTMENU: // Right Mouse Click
WinHelp((HWND)wParam, POS_HELP_FILE, HELP_CONTEXTMENU, (DWORD_PTR)gaPosHelpIds); break;
case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_DEVICES_REFRESH: InitializeDevicesDlg(hwndDlg, FALSE); break;
case IDC_DEVICES_TSHOOT: LaunchTroubleShooter(); break; } ListView_SetItemState(GetDlgItem(hwndDlg,IDC_DEVICES_LIST), gDeviceCount-1, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); break;
case WM_DEVICECHANGE: switch((UINT)wParam) { case DBT_DEVICEARRIVAL:
case DBT_DEVICEREMOVECOMPLETE: InitializeDevicesDlg(hwndDlg, FALSE); } break;
case WM_CLOSE:
case WM_DESTROY: if(ghNotify) { UnregisterDeviceNotification(ghNotify); ghNotify = NULL; } break;
default: fProcessed = FALSE; break;
} return fProcessed; }
VOID InsertColumn(HWND hwndListCtrl, INT iCol, UINT uMsg, INT iWidth) { LVCOLUMN lvcol;
lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvcol.fmt = LVCFMT_LEFT; lvcol.cx = iWidth; lvcol.iSubItem = iCol; lvcol.pszText = (LPTSTR)_alloca(BUFFER_SIZE);
LoadString(ghInstance, uMsg, lvcol.pszText, BUFFER_SIZE);
ListView_InsertColumn(hwndListCtrl, iCol, &lvcol); }
BOOL InitializeImageList(HWND hwndListCtrl) { HICON hiconItem; HIMAGELIST himlSmall;
/*
* Create the Image List for Report View. */ himlSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), TRUE, 1, 1);
/*
* Add an icon to the Image List. */ hiconItem = LoadIcon(ghInstance, MAKEINTRESOURCE(IDI_POS)); ImageList_AddIcon(himlSmall, hiconItem); DeleteObject(hiconItem);
/*
* Link the Image List to the List View Control. */ ListView_SetImageList(hwndListCtrl, himlSmall, LVSIL_SMALL); return TRUE; }
BOOL FillListViewItems(HWND hwndListCtrl) { HKEY hKey; LONG Error; LPTSTR pszName, pszPort; DWORD dwType, dwSize; INT localCount = 0;
Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, SERIALCOMM, 0, KEY_READ, &hKey);
if(Error != ERROR_SUCCESS) return FALSE;
pszName = _alloca(MAX_PATH); pszPort = _alloca(MAX_PATH);
while(TRUE) { dwType = dwSize = MAX_PATH * sizeof(TCHAR);
Error = RegEnumValue(hKey, localCount++, pszName, &dwType, NULL, NULL, (LPBYTE)pszPort, &dwSize);
if(Error != ERROR_SUCCESS) { /*
* We break out of this loop is when there are no more items. * This is just an extra check in case we fail by some other way. */ if(Error != ERROR_NO_MORE_ITEMS) DisplayErrorMessage(); break; }
if(QueryPrettyName(pszName, pszPort)) AddItem(hwndListCtrl, gDeviceCount++, pszName, pszPort); }
RegCloseKey(hKey); ListView_SetItemState(hwndListCtrl, gDeviceCount-1, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED); return TRUE; }
BOOL AddItem(HWND hwndListCtrl, INT iItem, LPTSTR pszName, LPTSTR pszPort) { LVITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.iImage = 0;
lvi.pszText = pszName;
lvi.iItem = iItem; lvi.iSubItem = NAME_COLUMN;
ListView_InsertItem(hwndListCtrl, &lvi); ListView_SetItemText(hwndListCtrl, iItem, PORT_COLUMN, pszPort);
return TRUE; }
VOID DisplayErrorMessage() { LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);
MessageBox(NULL, (LPTSTR)lpMsgBuf, TEXT("Error"), MB_OK | MB_ICONINFORMATION);
LocalFree(lpMsgBuf); }
BOOL QueryPrettyName(LPTSTR pszName, LPTSTR pszPort) { HANDLE comFile; DWORD dwSize; BOOL fProcessed; TCHAR portBuffer[BUFFER_SIZE];
/*
* Ports beyond COM9 need an explicit [\\.\] in front of them. */ wsprintf(portBuffer, TEXT("\\\\.\\%s"), pszPort);
comFile = CreateFile(portBuffer, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
/*
* Making sure that we are going to query the right device. */ if (comFile == INVALID_HANDLE_VALUE || wcsncmp(pszName, TEXT("\\Device\\POS"), 11)) return FALSE;
fProcessed = DeviceIoControl(comFile, IOCTL_SERIAL_QUERY_DEVICE_NAME, NULL, 0, (LPVOID)pszName, MAX_PATH, &dwSize, NULL); CloseHandle(comFile); return fProcessed; }
VOID MoveOK(HWND hwndParent) { HWND hwndButton = GetDlgItem(hwndParent, IDCANCEL);
if(hwndButton) { RECT rc;
GetWindowRect(hwndButton, &rc); DestroyWindow(hwndButton);
MapWindowPoints(NULL, hwndParent, (LPPOINT)&rc, 2);
hwndButton = GetDlgItem(hwndParent, IDOK); SetWindowPos(hwndButton, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER); } }
VOID LaunchTroubleShooter() { TCHAR lpszCmd[MAX_PATH]; STARTUPINFO si; PROCESS_INFORMATION pi;
if(LoadString(ghInstance, IDS_TSHOOT_CMD, lpszCmd, MAX_PATH)) {
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_FORCEONFEEDBACK; si.wShowWindow = SW_NORMAL;
if (CreateProcess(NULL, lpszCmd, NULL, NULL, FALSE, 0, 0, NULL, &si, &pi)) { CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } } }
|