Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

347 lines
9.6 KiB

  1. /*******************************************************************************
  2. *
  3. * (C) COPYRIGHT MICROSOFT CORP., 1996
  4. *
  5. * TITLE: DETAILS.C
  6. *
  7. * VERSION: 2.0
  8. *
  9. * AUTHOR: ReedB
  10. *
  11. * DATE: 17 Oct, 1996
  12. *
  13. * DESCRIPTION:
  14. * Implements the Detailed Batery Information dialog.
  15. *
  16. *******************************************************************************/
  17. #include <nt.h>
  18. #include <ntrtl.h>
  19. #include <nturtl.h>
  20. #include <windows.h>
  21. #include <commctrl.h>
  22. #include <devioctl.h>
  23. #include <ntpoapi.h>
  24. #include <poclass.h>
  25. #include "batmeter.h"
  26. #include "bmresid.h"
  27. /*******************************************************************************
  28. *
  29. * G L O B A L D A T A
  30. *
  31. *******************************************************************************/
  32. extern HINSTANCE g_hInstance; // Global instance handle of this DLL.
  33. extern const DWORD g_ContextMenuHelpIDs[]; //Help ID's.
  34. /*******************************************************************************
  35. *
  36. * AppendStrID
  37. *
  38. * DESCRIPTION:
  39. *
  40. * PARAMETERS:
  41. *
  42. *******************************************************************************/
  43. BOOL AppendStrID(LPTSTR lpszDest, UINT uiID, BOOLEAN bUseComma)
  44. {
  45. LPTSTR lpsz;
  46. if (lpszDest) {
  47. lpsz = LoadDynamicString(uiID);
  48. if (lpsz) {
  49. if (bUseComma) {
  50. lstrcat(lpszDest, TEXT(", "));
  51. }
  52. lstrcat(lpszDest, lpsz);
  53. LocalFree(lpsz);
  54. return TRUE;
  55. }
  56. }
  57. return FALSE;
  58. }
  59. /*******************************************************************************
  60. *
  61. * GetBatStatusDetails
  62. *
  63. * DESCRIPTION:
  64. *
  65. * PARAMETERS:
  66. *
  67. *******************************************************************************/
  68. BOOL GetBatStatusDetails(HWND hWnd, PBATTERY_STATE pbs)
  69. {
  70. BATTERY_STATUS bs;
  71. BATTERY_WAIT_STATUS bws;
  72. DWORD dwByteCount;
  73. BATTERY_INFORMATION bi;
  74. BATTERY_QUERY_INFORMATION bqi;
  75. TCHAR szChem[5], szStatus[128];
  76. CHAR szaChem[5];
  77. LPTSTR lpsz;
  78. UINT uiIDS;
  79. BOOLEAN bUseComma;
  80. bqi.BatteryTag = pbs->ulTag;
  81. bqi.InformationLevel = BatteryInformation;
  82. bqi.AtRate = 0;
  83. if (DeviceIoControl(pbs->hDevice, IOCTL_BATTERY_QUERY_INFORMATION,
  84. &bqi, sizeof(bqi),
  85. &bi, sizeof(bi),
  86. &dwByteCount, NULL)) {
  87. // Set chemistry.
  88. memcpy(szaChem, bi.Chemistry, 4);
  89. szaChem[4] = 0;
  90. if (szaChem[0]) {
  91. #ifdef UNICODE
  92. MultiByteToWideChar(CP_ACP, 0, szaChem, -1, szChem, 5);
  93. SetDlgItemText(hWnd, IDC_CHEM, szChem);
  94. #else
  95. SetDlgItemText(hWnd, IDC_CHEM, szaChem);
  96. #endif
  97. }
  98. else {
  99. ShowWindow(GetDlgItem(hWnd, IDC_CHEM), SW_HIDE);
  100. ShowWindow(GetDlgItem(hWnd, IDC_CHEMISTRY), SW_HIDE);
  101. }
  102. // Set up BATTERY_WAIT_STATUS for immediate return.
  103. memset(&bws, 0, sizeof(BATTERY_WAIT_STATUS));
  104. bws.BatteryTag = pbs->ulTag;
  105. if (DeviceIoControl(pbs->hDevice, IOCTL_BATTERY_QUERY_STATUS,
  106. &bws, sizeof(BATTERY_WAIT_STATUS),
  107. &bs, sizeof(BATTERY_STATUS),
  108. &dwByteCount, NULL)) {
  109. szStatus[0] = '\0';
  110. bUseComma = FALSE;
  111. if (bs.PowerState & BATTERY_POWER_ON_LINE) {
  112. AppendStrID(szStatus, IDS_BATTERY_POWER_ON_LINE, bUseComma);
  113. bUseComma = TRUE;
  114. }
  115. if (bs.PowerState & BATTERY_DISCHARGING) {
  116. AppendStrID(szStatus, IDS_BATTERY_DISCHARGING, bUseComma);
  117. bUseComma = TRUE;
  118. }
  119. if (bs.PowerState & BATTERY_CHARGING) {
  120. AppendStrID(szStatus, IDS_BATTERY_CHARGING, bUseComma);
  121. bUseComma = TRUE;
  122. }
  123. if (bs.PowerState & BATTERY_CRITICAL) {
  124. AppendStrID(szStatus, IDS_BATTERY_CRITICAL, bUseComma);
  125. bUseComma = TRUE;
  126. }
  127. SetDlgItemText(hWnd, IDC_STATE, szStatus);
  128. return TRUE;
  129. }
  130. }
  131. return FALSE;
  132. }
  133. /*******************************************************************************
  134. *
  135. * GetBatQueryInfo
  136. *
  137. * DESCRIPTION:
  138. *
  139. * PARAMETERS:
  140. *
  141. *******************************************************************************/
  142. BOOL GetBatQueryInfo(
  143. PBATTERY_STATE pbs,
  144. PBATTERY_QUERY_INFORMATION pbqi,
  145. PULONG pulData,
  146. ULONG ulSize
  147. )
  148. {
  149. DWORD dwByteCount;
  150. if (DeviceIoControl(pbs->hDevice, IOCTL_BATTERY_QUERY_INFORMATION,
  151. pbqi, sizeof(BATTERY_QUERY_INFORMATION),
  152. pulData, ulSize,
  153. &dwByteCount, NULL)) {
  154. return TRUE;
  155. }
  156. return FALSE;
  157. }
  158. /*******************************************************************************
  159. *
  160. * GetAndSetBatQueryInfoText
  161. *
  162. * DESCRIPTION:
  163. *
  164. * PARAMETERS:
  165. *
  166. *******************************************************************************/
  167. BOOL GetAndSetBatQueryInfoText(
  168. HWND hWnd,
  169. PBATTERY_STATE pbs,
  170. PBATTERY_QUERY_INFORMATION pbqi,
  171. UINT uiIDS,
  172. UINT uiLabelID
  173. )
  174. {
  175. WCHAR szBatStr[MAX_BATTERY_STRING_SIZE];
  176. memset(szBatStr, 0, sizeof(szBatStr));
  177. if (GetBatQueryInfo(pbs, pbqi, (PULONG)szBatStr, sizeof(szBatStr))) {
  178. #ifdef UNICODE
  179. if (lstrcmp(szBatStr, TEXT(""))) {
  180. SetDlgItemText(hWnd, uiIDS, szBatStr);
  181. return TRUE;
  182. }
  183. #else
  184. CHAR szaBatStr[MAX_BATTERY_STRING_SIZE];
  185. szaBatStr[0] = '\0';
  186. WideCharToMultiByte(CP_ACP, 0, szBatStr, -1,
  187. szaBatStr, MAX_BATTERY_STRING_SIZE, NULL, NULL);
  188. if (szaBatStr[0]) {
  189. SetDlgItemText(hWnd, uiIDS, szaBatStr);
  190. return TRUE;
  191. }
  192. #endif
  193. }
  194. ShowWindow(GetDlgItem(hWnd, uiIDS), SW_HIDE);
  195. ShowWindow(GetDlgItem(hWnd, uiLabelID), SW_HIDE);
  196. return FALSE;
  197. }
  198. /*******************************************************************************
  199. *
  200. * GetBatOptionalDetails
  201. *
  202. * DESCRIPTION:
  203. * Get optional battery data and set the dialog control.
  204. *
  205. * PARAMETERS:
  206. *
  207. *******************************************************************************/
  208. BOOL GetBatOptionalDetails(HWND hWnd, PBATTERY_STATE pbs)
  209. {
  210. BATTERY_QUERY_INFORMATION bqi;
  211. ULONG ulData;
  212. LPTSTR lpsz = NULL;
  213. BATTERY_MANUFACTURE_DATE bmd;
  214. TCHAR szDateBuf[128];
  215. SYSTEMTIME stDate;
  216. bqi.BatteryTag = pbs->ulTag;
  217. bqi.InformationLevel = BatteryManufactureDate;
  218. bqi.AtRate = 0;
  219. if (GetBatQueryInfo(pbs, &bqi, (PULONG)&bmd,
  220. sizeof(BATTERY_MANUFACTURE_DATE))) {
  221. memset(&stDate, 0, sizeof(SYSTEMTIME));
  222. stDate.wYear = (WORD) bmd.Year;
  223. stDate.wMonth = (WORD) bmd.Month;
  224. stDate.wDay = (WORD) bmd.Day;
  225. GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE,
  226. &stDate, NULL, szDateBuf, 128);
  227. SetDlgItemText(hWnd, IDC_BATMANDATE, szDateBuf);
  228. }
  229. else {
  230. ShowWindow(GetDlgItem(hWnd, IDC_BATMANDATE), SW_HIDE);
  231. ShowWindow(GetDlgItem(hWnd, IDC_DATEMANUFACTURED), SW_HIDE);
  232. }
  233. bqi.InformationLevel = BatteryDeviceName;
  234. GetAndSetBatQueryInfoText(hWnd, pbs, &bqi, IDC_DEVNAME, IDC_BATTERYNAME);
  235. bqi.InformationLevel = BatteryManufactureName;
  236. GetAndSetBatQueryInfoText(hWnd, pbs, &bqi, IDC_BATMANNAME, IDC_MANUFACTURE);
  237. bqi.InformationLevel = BatteryUniqueID;
  238. GetAndSetBatQueryInfoText(hWnd, pbs, &bqi, IDC_BATID, IDC_UNIQUEID);
  239. return TRUE;
  240. }
  241. /*******************************************************************************
  242. *
  243. * InitBatDetailDlg
  244. *
  245. * DESCRIPTION:
  246. *
  247. * PARAMETERS:
  248. *
  249. *******************************************************************************/
  250. BOOL InitBatDetailDialogs(HWND hWnd, PBATTERY_STATE pbs)
  251. {
  252. LPTSTR lpsz;
  253. DWORD dwByteCount;
  254. lpsz = LoadDynamicString(IDS_BATTERYNUMDETAILS, pbs->ulBatNum);
  255. if (lpsz) {
  256. SetWindowText(hWnd, lpsz);
  257. LocalFree(lpsz);
  258. }
  259. if (GetBatOptionalDetails(hWnd, pbs)) {
  260. return GetBatStatusDetails(hWnd, pbs);
  261. }
  262. return FALSE;
  263. }
  264. /*******************************************************************************
  265. *
  266. * BatDetailDlgProc
  267. *
  268. * DESCRIPTION:
  269. * DialogProc for the Detailed Battery Information dialog.
  270. *
  271. * PARAMETERS:
  272. *
  273. *******************************************************************************/
  274. LRESULT CALLBACK BatDetailDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  275. {
  276. UINT uiBatNum;
  277. static PBATTERY_STATE pbs;
  278. switch (uMsg) {
  279. case WM_INITDIALOG:
  280. pbs = (PBATTERY_STATE) lParam;
  281. return InitBatDetailDialogs(hWnd, pbs);
  282. case WM_COMMAND:
  283. switch (wParam) {
  284. case IDC_REFRESH:
  285. GetBatStatusDetails(hWnd, pbs);
  286. break;
  287. case IDCANCEL:
  288. case IDOK:
  289. EndDialog(hWnd, wParam);
  290. break;
  291. }
  292. break;
  293. case WM_HELP: // F1
  294. WinHelp(((LPHELPINFO)lParam)->hItemHandle, PWRMANHLP, HELP_WM_HELP, (ULONG_PTR)(LPTSTR)g_ContextMenuHelpIDs);
  295. break;
  296. case WM_CONTEXTMENU: // right mouse click
  297. WinHelp((HWND)wParam, PWRMANHLP, HELP_CONTEXTMENU, (ULONG_PTR)(LPTSTR)g_ContextMenuHelpIDs);
  298. break;
  299. }
  300. return FALSE;
  301. }