Sunc with trunk revision 58971.
[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@student.tugraz.at)
8 * Martin Rottensteiner
9 * Dmitry Chapyshev (lentind@yandex.ru)
10 */
11
12 //#ifndef NSTATUS
13 //typedef long NTSTATUS;
14 //#endif
15
16 #include "powercfg.h"
17
18 BOOLEAN Pos_InitData();
19 void Adv_InitDialog();
20
21
22 static VOID
23 Hib_InitDialog(HWND hwndDlg)
24 {
25 SYSTEM_POWER_CAPABILITIES PowerCaps;
26 MEMORYSTATUSEX msex;
27 TCHAR szSize[MAX_PATH];
28 TCHAR szTemp[MAX_PATH];
29 ULARGE_INTEGER FreeBytesAvailable, TotalNumberOfBytes, TotalNumberOfFreeBytes;
30
31 if (GetPwrCapabilities(&PowerCaps))
32 {
33 CheckDlgButton(hwndDlg,
34 IDC_HIBERNATEFILE,
35 PowerCaps.HiberFilePresent ? BST_CHECKED : BST_UNCHECKED);
36
37 msex.dwLength = sizeof(msex);
38 if (!GlobalMemoryStatusEx(&msex))
39 {
40 return; // FIXME
41 }
42
43 if (GetWindowsDirectory(szTemp,MAX_PATH))
44 {
45 if (!GetDiskFreeSpaceEx(szTemp,&FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes))
46 TotalNumberOfFreeBytes.QuadPart = 0;
47 }
48 else
49 {
50 if (!GetDiskFreeSpaceEx(NULL,&FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes))
51 TotalNumberOfFreeBytes.QuadPart = 0;
52 }
53
54 if (TotalNumberOfFreeBytes.QuadPart > 0x100000)
55 {
56 if (LoadString(hApplet, IDS_SIZEMB, szTemp, MAX_PATH))
57 {
58 _stprintf(szSize,szTemp,TotalNumberOfFreeBytes.QuadPart / 0x100000);
59 SetDlgItemText(hwndDlg, IDC_FREESPACE, szSize);
60 }
61 }
62 else
63 {
64 if (LoadString(hApplet, IDS_SIZEBYTS, szTemp, MAX_PATH))
65 {
66 _stprintf(szSize,szTemp,TotalNumberOfFreeBytes.QuadPart);
67 SetDlgItemText(hwndDlg, IDC_FREESPACE, szSize);
68 }
69 }
70
71 if (msex.ullTotalPhys>0x100000)
72 {
73 if (LoadString(hApplet, IDS_SIZEMB, szTemp, MAX_PATH))
74 {
75 _stprintf(szSize,szTemp,msex.ullTotalPhys/0x100000);
76 SetDlgItemText(hwndDlg, IDC_SPACEFORHIBERNATEFILE,szSize);
77 }
78 }
79 else
80 {
81 if (LoadString(hApplet, IDS_SIZEBYTS, szTemp, MAX_PATH))
82 {
83 _stprintf(szSize,szTemp,msex.ullTotalPhys);
84 SetDlgItemText(hwndDlg, IDC_SPACEFORHIBERNATEFILE, szSize);
85 }
86 }
87
88 if (TotalNumberOfFreeBytes.QuadPart < msex.ullTotalPhys && !PowerCaps.HiberFilePresent)
89 {
90 EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), FALSE);
91 ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), TRUE);
92 }
93 else
94 {
95 ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), FALSE);
96 EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), TRUE);
97 }
98 }
99 }
100
101 INT_PTR
102 Hib_SaveData(HWND hwndDlg)
103 {
104 BOOLEAN bHibernate;
105
106 bHibernate = (BOOLEAN)(IsDlgButtonChecked(hwndDlg, IDC_HIBERNATEFILE) == BST_CHECKED);
107
108 if (CallNtPowerInformation(SystemReserveHiberFile,&bHibernate, sizeof(bHibernate), NULL, 0) == STATUS_SUCCESS)
109 {
110 Pos_InitData();
111 Adv_InitDialog();
112 Hib_InitDialog(hwndDlg);
113 return TRUE;
114 }
115
116 return FALSE;
117 }
118
119 /* Property page dialog callback */
120 INT_PTR CALLBACK
121 HibernateDlgProc(HWND hwndDlg,
122 UINT uMsg,
123 WPARAM wParam,
124 LPARAM lParam)
125 {
126 switch(uMsg)
127 {
128 case WM_INITDIALOG:
129 Hib_InitDialog(hwndDlg);
130 return TRUE;
131 case WM_COMMAND:
132 switch(LOWORD(wParam))
133 {
134 case IDC_HIBERNATEFILE:
135 if (HIWORD(wParam) == BN_CLICKED)
136 {
137 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
138 }
139 }
140 break;
141 case WM_NOTIFY:
142 {
143 LPNMHDR lpnm = (LPNMHDR)lParam;
144 if (lpnm->code == (UINT)PSN_APPLY)
145 {
146 return Hib_SaveData(hwndDlg);
147 }
148 }
149 }
150 return FALSE;
151 }