xref: /reactos/dll/cpl/powercfg/hibernate.c (revision 0f92924a)
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 static VOID
15 Hib_InitDialog(HWND hwndDlg)
16 {
17     SYSTEM_POWER_CAPABILITIES PowerCaps;
18     MEMORYSTATUSEX msex;
19     TCHAR szTemp[MAX_PATH];
20     LPTSTR lpRoot;
21     ULARGE_INTEGER FreeBytesAvailable, TotalNumberOfBytes, TotalNumberOfFreeBytes;
22 
23     if (GetPwrCapabilities(&PowerCaps))
24     {
25         CheckDlgButton(hwndDlg,
26                    IDC_HIBERNATEFILE,
27                    PowerCaps.HiberFilePresent ? BST_CHECKED : BST_UNCHECKED);
28 
29         msex.dwLength = sizeof(msex);
30         if (!GlobalMemoryStatusEx(&msex))
31         {
32             return; // FIXME
33         }
34 
35         if (GetWindowsDirectory(szTemp,MAX_PATH))
36             lpRoot = szTemp;
37         else
38             lpRoot = NULL;
39 
40         // Get available space and size of selected volume.
41         if (!GetDiskFreeSpaceEx(lpRoot, &FreeBytesAvailable, &TotalNumberOfBytes, &TotalNumberOfFreeBytes))
42             TotalNumberOfFreeBytes.QuadPart = 0;
43 
44         // Print the free available space into selected volume.
45         StrFormatByteSize(TotalNumberOfFreeBytes.QuadPart, szTemp, _countof(szTemp));
46         SetDlgItemText(hwndDlg, IDC_FREESPACE, szTemp);
47 
48         // Print the amount of space required for hibernation.
49         StrFormatByteSize(msex.ullTotalPhys, szTemp, _countof(szTemp));
50         SetDlgItemText(hwndDlg, IDC_SPACEFORHIBERNATEFILE, szTemp);
51 
52         if (TotalNumberOfFreeBytes.QuadPart < msex.ullTotalPhys && !PowerCaps.HiberFilePresent)
53         {
54             EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), FALSE);
55             ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), TRUE);
56         }
57         else
58         {
59             ShowWindow(GetDlgItem(hwndDlg, IDC_TOLESSFREESPACE), FALSE);
60             EnableWindow(GetDlgItem(hwndDlg, IDC_HIBERNATEFILE), TRUE);
61         }
62     }
63 }
64 
65 INT_PTR
66 Hib_SaveData(HWND hwndDlg)
67 {
68     BOOLEAN bHibernate;
69 
70     bHibernate = (BOOLEAN)(IsDlgButtonChecked(hwndDlg, IDC_HIBERNATEFILE) == BST_CHECKED);
71 
72     if (CallNtPowerInformation(SystemReserveHiberFile, &bHibernate, sizeof(bHibernate), NULL, 0) == STATUS_SUCCESS)
73     {
74         Hib_InitDialog(hwndDlg);
75         return TRUE;
76     }
77 
78     return FALSE;
79 }
80 
81 /* Property page dialog callback */
82 INT_PTR CALLBACK
83 HibernateDlgProc(HWND hwndDlg,
84                  UINT uMsg,
85                  WPARAM wParam,
86                  LPARAM lParam)
87 {
88     switch (uMsg)
89     {
90         case WM_INITDIALOG:
91             Hib_InitDialog(hwndDlg);
92             return TRUE;
93 
94         case WM_COMMAND:
95             switch (LOWORD(wParam))
96             {
97                 case IDC_HIBERNATEFILE:
98                     if (HIWORD(wParam) == BN_CLICKED)
99                     {
100                         PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
101                     }
102                     break;
103             }
104             break;
105 
106         case WM_NOTIFY:
107             if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY)
108             {
109                 return Hib_SaveData(hwndDlg);
110             }
111             break;
112     }
113 
114     return FALSE;
115 }
116