|
|
/*******************************************************************************
* * (C) COPYRIGHT MICROSOFT CORP., 1996 * * TITLE: DETAILS.C * * VERSION: 2.0 * * AUTHOR: ReedB * * DATE: 17 Oct, 1996 * * DESCRIPTION: * Implements the Detailed Batery Information dialog. * *******************************************************************************/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <commctrl.h>
#include <devioctl.h>
#include <ntpoapi.h>
#include <poclass.h>
#include "batmeter.h"
#include "bmresid.h"
/*******************************************************************************
* * G L O B A L D A T A * *******************************************************************************/
extern HINSTANCE g_hInstance; // Global instance handle of this DLL.
extern const DWORD g_ContextMenuHelpIDs[]; //Help ID's.
/*******************************************************************************
* * AppendStrID * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/
BOOL AppendStrID( LPTSTR lpszDest, DWORD DestBufferSizeInChars, UINT uiID, BOOLEAN bUseComma) { LPTSTR lpsz; DWORD len; BOOL RetVal = FALSE;
if (DestBufferSizeInChars < 1) { return(FALSE); }
lpszDest[0] = TEXT('\0');
if (lpszDest) { lpsz = LoadDynamicString(uiID); if (lpsz) { len = lstrlen(lpsz); if (bUseComma) { len += sizeof(TEXT(", ")); // includes null terminator.
if (len <= DestBufferSizeInChars) { lstrcat(lpszDest, TEXT(", ")); } } else { len +=1; // null terminator
}
if (len <= DestBufferSizeInChars) { lstrcat(lpszDest, lpsz); RetVal = TRUE; } LocalFree(lpsz); } } return(RetVal); } /*******************************************************************************
* * GetBatStatusDetails * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/
BOOL GetBatStatusDetails(HWND hWnd, PBATTERY_STATE pbs) { BATTERY_STATUS bs; BATTERY_WAIT_STATUS bws; DWORD dwByteCount; BATTERY_INFORMATION bi; BATTERY_QUERY_INFORMATION bqi; TCHAR szChem[5], szStatus[128]; CHAR szaChem[5]; LPTSTR lpsz; UINT uiIDS; BOOLEAN bUseComma;
bqi.BatteryTag = pbs->ulTag; bqi.InformationLevel = BatteryInformation; bqi.AtRate = 0;
if (DeviceIoControl(pbs->hDevice, IOCTL_BATTERY_QUERY_INFORMATION, &bqi, sizeof(bqi), &bi, sizeof(bi), &dwByteCount, NULL)) {
// Set chemistry.
memcpy(szaChem, bi.Chemistry, 4); szaChem[4] = 0;
if (szaChem[0]) { #ifdef UNICODE
MultiByteToWideChar(CP_ACP, 0, szaChem, -1, szChem, 5); SetDlgItemText(hWnd, IDC_CHEM, szChem); #else
SetDlgItemText(hWnd, IDC_CHEM, szaChem); #endif
} else { ShowWindow(GetDlgItem(hWnd, IDC_CHEM), SW_HIDE); ShowWindow(GetDlgItem(hWnd, IDC_CHEMISTRY), SW_HIDE); }
// Set up BATTERY_WAIT_STATUS for immediate return.
memset(&bws, 0, sizeof(BATTERY_WAIT_STATUS)); bws.BatteryTag = pbs->ulTag;
if (DeviceIoControl(pbs->hDevice, IOCTL_BATTERY_QUERY_STATUS, &bws, sizeof(BATTERY_WAIT_STATUS), &bs, sizeof(BATTERY_STATUS), &dwByteCount, NULL)) {
szStatus[0] = '\0'; bUseComma = FALSE; if (bs.PowerState & BATTERY_POWER_ON_LINE) { AppendStrID( szStatus, ARRAYSIZE(szStatus), IDS_BATTERY_POWER_ON_LINE, bUseComma); bUseComma = TRUE; } if (bs.PowerState & BATTERY_DISCHARGING) { AppendStrID( szStatus, ARRAYSIZE(szStatus), IDS_BATTERY_DISCHARGING, bUseComma); bUseComma = TRUE; } if (bs.PowerState & BATTERY_CHARGING) { AppendStrID( szStatus, ARRAYSIZE(szStatus), IDS_BATTERY_CHARGING, bUseComma); bUseComma = TRUE; } if (bs.PowerState & BATTERY_CRITICAL) { AppendStrID( szStatus, ARRAYSIZE(szStatus), IDS_BATTERY_CRITICAL, bUseComma); bUseComma = TRUE; } SetDlgItemText(hWnd, IDC_STATE, szStatus); return TRUE; } } return FALSE; }
/*******************************************************************************
* * GetBatQueryInfo * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/
BOOL GetBatQueryInfo( PBATTERY_STATE pbs, PBATTERY_QUERY_INFORMATION pbqi, PVOID pData, ULONG ulSize ) { DWORD dwByteCount;
if (DeviceIoControl(pbs->hDevice, IOCTL_BATTERY_QUERY_INFORMATION, pbqi, sizeof(BATTERY_QUERY_INFORMATION), pData, ulSize, &dwByteCount, NULL)) { return TRUE; } return FALSE; }
/*******************************************************************************
* * GetAndSetBatQueryInfoText * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/
BOOL GetAndSetBatQueryInfoText( HWND hWnd, PBATTERY_STATE pbs, PBATTERY_QUERY_INFORMATION pbqi, UINT uiIDS, UINT uiLabelID ) { WCHAR szBatStr[MAX_BATTERY_STRING_SIZE];
memset(szBatStr, 0, sizeof(szBatStr)); if (GetBatQueryInfo(pbs, pbqi, (PVOID)szBatStr, sizeof(szBatStr))) { #ifdef UNICODE
if (lstrcmp(szBatStr, TEXT(""))) { SetDlgItemText(hWnd, uiIDS, szBatStr); return TRUE; } #else
CHAR szaBatStr[MAX_BATTERY_STRING_SIZE];
szaBatStr[0] = '\0'; WideCharToMultiByte(CP_ACP, 0, szBatStr, -1, szaBatStr, MAX_BATTERY_STRING_SIZE, NULL, NULL); if (szaBatStr[0]) { SetDlgItemText(hWnd, uiIDS, szaBatStr); return TRUE; } #endif
} ShowWindow(GetDlgItem(hWnd, uiIDS), SW_HIDE); ShowWindow(GetDlgItem(hWnd, uiLabelID), SW_HIDE); return FALSE; }
/*******************************************************************************
* * GetBatOptionalDetails * * DESCRIPTION: * Get optional battery data and set the dialog control. * * PARAMETERS: * *******************************************************************************/
BOOL GetBatOptionalDetails(HWND hWnd, PBATTERY_STATE pbs) { BATTERY_QUERY_INFORMATION bqi; ULONG ulData; LPTSTR lpsz = NULL; BATTERY_MANUFACTURE_DATE bmd; TCHAR szDateBuf[128]; SYSTEMTIME stDate;
bqi.BatteryTag = pbs->ulTag; bqi.InformationLevel = BatteryManufactureDate; bqi.AtRate = 0; if (GetBatQueryInfo(pbs, &bqi, (PULONG)&bmd, sizeof(BATTERY_MANUFACTURE_DATE))) {
memset(&stDate, 0, sizeof(SYSTEMTIME)); stDate.wYear = (WORD) bmd.Year; stDate.wMonth = (WORD) bmd.Month; stDate.wDay = (WORD) bmd.Day;
GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &stDate, NULL, szDateBuf, 128); SetDlgItemText(hWnd, IDC_BATMANDATE, szDateBuf); } else { ShowWindow(GetDlgItem(hWnd, IDC_BATMANDATE), SW_HIDE); ShowWindow(GetDlgItem(hWnd, IDC_DATEMANUFACTURED), SW_HIDE); } bqi.InformationLevel = BatteryDeviceName; GetAndSetBatQueryInfoText(hWnd, pbs, &bqi, IDC_DEVNAME, IDC_BATTERYNAME);
bqi.InformationLevel = BatteryManufactureName; GetAndSetBatQueryInfoText(hWnd, pbs, &bqi, IDC_BATMANNAME, IDC_MANUFACTURE);
bqi.InformationLevel = BatteryUniqueID; GetAndSetBatQueryInfoText(hWnd, pbs, &bqi, IDC_BATID, IDC_UNIQUEID);
return TRUE; }
/*******************************************************************************
* * InitBatDetailDlg * * DESCRIPTION: * * PARAMETERS: * *******************************************************************************/
BOOL InitBatDetailDialogs(HWND hWnd, PBATTERY_STATE pbs) { LPTSTR lpsz; DWORD dwByteCount;
lpsz = LoadDynamicString(IDS_BATTERYNUMDETAILS, pbs->ulBatNum); if (lpsz) { SetWindowText(hWnd, lpsz); LocalFree(lpsz); }
if (GetBatOptionalDetails(hWnd, pbs)) { return GetBatStatusDetails(hWnd, pbs); } return FALSE; }
/*******************************************************************************
* * BatDetailDlgProc * * DESCRIPTION: * DialogProc for the Detailed Battery Information dialog. * * PARAMETERS: * *******************************************************************************/
LRESULT CALLBACK BatDetailDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { UINT uiBatNum; static PBATTERY_STATE pbs;
switch (uMsg) { case WM_INITDIALOG: pbs = (PBATTERY_STATE) lParam; return InitBatDetailDialogs(hWnd, pbs);
case WM_COMMAND: switch (wParam) { case IDC_REFRESH: GetBatStatusDetails(hWnd, pbs); break;
case IDCANCEL: case IDOK: EndDialog(hWnd, wParam); break; } break;
case WM_HELP: // F1
WinHelp(((LPHELPINFO)lParam)->hItemHandle, PWRMANHLP, HELP_WM_HELP, (ULONG_PTR)(LPTSTR)g_ContextMenuHelpIDs); break;
case WM_CONTEXTMENU: // right mouse click
WinHelp((HWND)wParam, PWRMANHLP, HELP_CONTEXTMENU, (ULONG_PTR)(LPTSTR)g_ContextMenuHelpIDs); break; }
return FALSE; }
|