[KSPROXY]
[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 BOOLEAN Pos_InitData();
30 void Adv_InitDialog();
31
32
33 static VOID
34 Hib_InitDialog(HWND hwndDlg)
35 {
36 SYSTEM_POWER_CAPABILITIES PowerCaps;
37 MEMORYSTATUSEX msex;
38 TCHAR szSize[MAX_PATH];
39 TCHAR szTemp[MAX_PATH];
40 ULARGE_INTEGER FreeBytesAvailable, TotalNumberOfBytes, TotalNumberOfFreeBytes;
41
42 if (GetPwrCapabilities(&PowerCaps))
43 {
44 CheckDlgButton(hwndDlg,
45 IDC_HIBERNATEFILE,
46 PowerCaps.HiberFilePresent ? BST_CHECKED : BST_UNCHECKED);
47
48 msex.dwLength = sizeof(msex);
49 if (!GlobalMemoryStatusEx(&msex))
50 {
51 return; //FIXME
52 }
53
54 if (GetWindowsDirectory(szTemp,MAX_PATH))
55 {
56 if (!GetDiskFreeSpaceEx(szTemp,&FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes))
57 TotalNumberOfFreeBytes.QuadPart = 0;
58 }
59 else
60 {
61 if (!GetDiskFreeSpaceEx(NULL,&FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes))
62 TotalNumberOfFreeBytes.QuadPart = 0;
63 }
64
65 if (TotalNumberOfFreeBytes.QuadPart > 0x100000)
66 {
67 if (LoadString(hApplet, IDS_SIZEMB, szTemp, MAX_PATH))
68 {
69 _stprintf(szSize,szTemp,TotalNumberOfFreeBytes.QuadPart / 0x100000);
70 SetDlgItemText(hwndDlg, IDC_FREESPACE, szSize);
71 }
72 }
73 else
74 {
75 if (LoadString(hApplet, IDS_SIZEBYTS, szTemp, MAX_PATH))
76 {
77 _stprintf(szSize,szTemp,TotalNumberOfFreeBytes.QuadPart);
78 SetDlgItemText(hwndDlg, IDC_FREESPACE, szSize);
79 }
80 }
81
82 if (msex.ullTotalPhys>0x100000)
83 {
84 if (LoadString(hApplet, IDS_SIZEMB, szTemp, MAX_PATH))
85 {
86 _stprintf(szSize,szTemp,msex.ullTotalPhys/0x100000);
87 SetDlgItemText(hwndDlg, IDC_SPACEFORHIBERNATEFILE,szSize);
88 }
89 }
90 else
91 {
92 if (LoadString(hApplet, IDS_SIZEBYTS, szTemp, MAX_PATH))
93 {
94 _stprintf(szSize,szTemp,msex.ullTotalPhys);
95 SetDlgItemText(hwndDlg, IDC_SPACEFORHIBERNATEFILE, szSize);
96 }
97 }
98
99 if (TotalNumberOfFreeBytes.QuadPart < msex.ullTotalPhys && !PowerCaps.HiberFilePresent)
100 {
101 EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), FALSE);
102 ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), TRUE);
103 }
104 else
105 {
106 ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), FALSE);
107 EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), TRUE);
108 }
109 }
110 }
111
112 INT_PTR
113 Hib_SaveData(HWND hwndDlg)
114 {
115 BOOLEAN bHibernate;
116
117 bHibernate = (BOOLEAN)(IsDlgButtonChecked(hwndDlg, IDC_HIBERNATEFILE) == BST_CHECKED);
118
119 if (CallNtPowerInformation(SystemReserveHiberFile,&bHibernate, sizeof(bHibernate), NULL, 0) == STATUS_SUCCESS)
120 {
121 Pos_InitData();
122 Adv_InitDialog();
123 Hib_InitDialog(hwndDlg);
124 return TRUE;
125 }
126
127 return FALSE;
128 }
129
130 /* Property page dialog callback */
131 INT_PTR CALLBACK
132 HibernateDlgProc(HWND hwndDlg,
133 UINT uMsg,
134 WPARAM wParam,
135 LPARAM lParam)
136 {
137 switch(uMsg)
138 {
139 case WM_INITDIALOG:
140 Hib_InitDialog(hwndDlg);
141 return TRUE;
142 case WM_COMMAND:
143 switch(LOWORD(wParam))
144 {
145 case IDC_HIBERNATEFILE:
146 if (HIWORD(wParam) == BN_CLICKED)
147 {
148 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
149 }
150 }
151 break;
152 case WM_NOTIFY:
153 {
154 LPNMHDR lpnm = (LPNMHDR)lParam;
155 if (lpnm->code == (UINT)PSN_APPLY)
156 {
157 return Hib_SaveData(hwndDlg);
158 }
159 }
160 }
161 return FALSE;
162 }