Create the AHCI branch for Aman's work
[reactos.git] / dll / cpl / powercfg / hibernate.c
1 /*
2 * PROJECT: ReactOS Power Configuration Applet
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/powercfg/hibernate.c
5 * PURPOSE: hibernate tab of applet
6 * PROGRAMMERS: Alexander Wurzinger (Lohnegrim at gmx dot net)
7 * Johannes Anderwald (johannes.anderwald@reactos.org)
8 * Martin Rottensteiner
9 * Dmitry Chapyshev (lentind@yandex.ru)
10 */
11
12 #include "powercfg.h"
13
14 BOOLEAN Pos_InitData();
15 void Adv_InitDialog();
16
17
18 static VOID
19 Hib_InitDialog(HWND hwndDlg)
20 {
21 SYSTEM_POWER_CAPABILITIES PowerCaps;
22 MEMORYSTATUSEX msex;
23 TCHAR szSize[MAX_PATH];
24 TCHAR szTemp[MAX_PATH];
25 ULARGE_INTEGER FreeBytesAvailable, TotalNumberOfBytes, TotalNumberOfFreeBytes;
26
27 if (GetPwrCapabilities(&PowerCaps))
28 {
29 CheckDlgButton(hwndDlg,
30 IDC_HIBERNATEFILE,
31 PowerCaps.HiberFilePresent ? BST_CHECKED : BST_UNCHECKED);
32
33 msex.dwLength = sizeof(msex);
34 if (!GlobalMemoryStatusEx(&msex))
35 {
36 return; // FIXME
37 }
38
39 if (GetWindowsDirectory(szTemp,MAX_PATH))
40 {
41 if (!GetDiskFreeSpaceEx(szTemp,&FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes))
42 TotalNumberOfFreeBytes.QuadPart = 0;
43 }
44 else
45 {
46 if (!GetDiskFreeSpaceEx(NULL,&FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes))
47 TotalNumberOfFreeBytes.QuadPart = 0;
48 }
49
50 if (TotalNumberOfFreeBytes.QuadPart > 0x100000)
51 {
52 if (LoadString(hApplet, IDS_SIZEMB, szTemp, MAX_PATH))
53 {
54 _stprintf(szSize,szTemp,TotalNumberOfFreeBytes.QuadPart / 0x100000);
55 SetDlgItemText(hwndDlg, IDC_FREESPACE, szSize);
56 }
57 }
58 else
59 {
60 if (LoadString(hApplet, IDS_SIZEBYTS, szTemp, MAX_PATH))
61 {
62 _stprintf(szSize,szTemp,TotalNumberOfFreeBytes.QuadPart);
63 SetDlgItemText(hwndDlg, IDC_FREESPACE, szSize);
64 }
65 }
66
67 if (msex.ullTotalPhys>0x100000)
68 {
69 if (LoadString(hApplet, IDS_SIZEMB, szTemp, MAX_PATH))
70 {
71 _stprintf(szSize,szTemp,msex.ullTotalPhys/0x100000);
72 SetDlgItemText(hwndDlg, IDC_SPACEFORHIBERNATEFILE,szSize);
73 }
74 }
75 else
76 {
77 if (LoadString(hApplet, IDS_SIZEBYTS, szTemp, MAX_PATH))
78 {
79 _stprintf(szSize,szTemp,msex.ullTotalPhys);
80 SetDlgItemText(hwndDlg, IDC_SPACEFORHIBERNATEFILE, szSize);
81 }
82 }
83
84 if (TotalNumberOfFreeBytes.QuadPart < msex.ullTotalPhys && !PowerCaps.HiberFilePresent)
85 {
86 EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), FALSE);
87 ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), TRUE);
88 }
89 else
90 {
91 ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), FALSE);
92 EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), TRUE);
93 }
94 }
95 }
96
97 INT_PTR
98 Hib_SaveData(HWND hwndDlg)
99 {
100 BOOLEAN bHibernate;
101
102 bHibernate = (BOOLEAN)(IsDlgButtonChecked(hwndDlg, IDC_HIBERNATEFILE) == BST_CHECKED);
103
104 if (CallNtPowerInformation(SystemReserveHiberFile,&bHibernate, sizeof(bHibernate), NULL, 0) == STATUS_SUCCESS)
105 {
106 Pos_InitData();
107 Adv_InitDialog();
108 Hib_InitDialog(hwndDlg);
109 return TRUE;
110 }
111
112 return FALSE;
113 }
114
115 /* Property page dialog callback */
116 INT_PTR CALLBACK
117 HibernateDlgProc(HWND hwndDlg,
118 UINT uMsg,
119 WPARAM wParam,
120 LPARAM lParam)
121 {
122 switch(uMsg)
123 {
124 case WM_INITDIALOG:
125 Hib_InitDialog(hwndDlg);
126 return TRUE;
127 case WM_COMMAND:
128 switch(LOWORD(wParam))
129 {
130 case IDC_HIBERNATEFILE:
131 if (HIWORD(wParam) == BN_CLICKED)
132 {
133 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
134 }
135 }
136 break;
137 case WM_NOTIFY:
138 {
139 LPNMHDR lpnm = (LPNMHDR)lParam;
140 if (lpnm->code == (UINT)PSN_APPLY)
141 {
142 return Hib_SaveData(hwndDlg);
143 }
144 }
145 }
146 return FALSE;
147 }