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