[BTRFS]
[reactos.git] / base / applications / msconfig_new / freeldrpage.c
1 /*
2 * PROJECT: ReactOS Applications
3 * LICENSE: LGPL - See COPYING in the top level directory
4 * FILE: base/applications/msconfig_new/freeldrpage.c
5 * PURPOSE: Freeloader configuration page message handler
6 * COPYRIGHT: Copyright 2005-2006 Christoph von Wittich <Christoph@ApiViewer.de>
7 * 2011 Gregor Schneider <Gregor.Schneider@reactos.org>
8 * Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
9 */
10
11 #include "precomp.h"
12 #include <share.h>
13
14 #include <wingdi.h>
15 #include "comctl32supp.h"
16
17 #include "utils.h"
18
19 static HWND hFreeLdrPage;
20
21 LPCWSTR lpszFreeLdrIni = L"%SystemDrive%\\freeldr.ini";
22 LPCWSTR lpszBootIni = L"%SystemDrive%\\boot.ini";
23
24 typedef struct _FREELDR_SETTINGS
25 {
26 ULONG TimeOut;
27 WCHAR szDefaultOS[512];
28 ULONG szDefaultPos;
29 ULONG OSConfigurationCount;
30 BOOL UseBootIni;
31 } FREELDR_SETTINGS;
32
33 static FREELDR_SETTINGS Settings = { 0, {0}, 0, 0, FALSE };
34
35 static BOOL
36 LoadIniFile(HWND hDlg,
37 LPCWSTR lpszIniFile)
38 {
39 DWORD dwNumOfChars;
40 LPWSTR lpszFileName;
41 FILE* file;
42
43 WCHAR szBuffer[512];
44 HWND hDlgCtrl;
45 SIZE_T length;
46 LRESULT pos;
47
48 SIZE size;
49 LONG horzExt;
50
51 HDC hDC;
52 HFONT hFont, hOldFont;
53
54 /*
55 * Open for read + write (without file creation if it didn't already exist)
56 * of a read-only text stream.
57 */
58 dwNumOfChars = ExpandEnvironmentStringsW(lpszIniFile, NULL, 0);
59 lpszFileName = (LPWSTR)MemAlloc(0, dwNumOfChars * sizeof(WCHAR));
60 ExpandEnvironmentStringsW(lpszIniFile, lpszFileName, dwNumOfChars);
61
62 file = _wfsopen(lpszFileName, L"rt", _SH_DENYWR); // r+t <-- read write text ; rt <-- read text
63 MemFree(lpszFileName);
64
65 if (!file) return FALSE;
66
67 hDlgCtrl = GetDlgItem(hDlg, IDC_LIST_BOX);
68
69 hDC = GetDC(hDlgCtrl);
70 hFont = (HFONT)SendMessageW(hDlgCtrl, WM_GETFONT, 0, 0);
71 hOldFont = (HFONT)SelectObject(hDC, hFont);
72
73 while (!feof(file) && fgetws(szBuffer, ARRAYSIZE(szBuffer), file))
74 {
75 length = wcslen(szBuffer);
76 if (length > 1)
77 {
78 /* Remove \r\n */
79 szBuffer[length-1] = szBuffer[length] = L'\0';
80
81 pos = ListBox_AddString(hDlgCtrl, szBuffer);
82
83 GetTextExtentPoint32W(hDC, szBuffer, (int)wcslen(szBuffer), &size);
84 horzExt = max((LONG)ListBox_GetHorizontalExtent(hDlgCtrl), size.cx + 5); // 5 to have a little room between the text and the end of the list box.
85 ListBox_SetHorizontalExtent(hDlgCtrl, horzExt);
86
87 if (szBuffer[0] == L'[')
88 continue;
89
90 if (!_wcsnicmp(szBuffer, L"timeout=", 8))
91 {
92 Settings.TimeOut = _wtoi(&szBuffer[8]);
93 continue;
94 }
95
96 if (!_wcsnicmp(szBuffer, L"default=", 8))
97 {
98 wcscpy(Settings.szDefaultOS, &szBuffer[8]);
99 continue;
100 }
101 if (pos != LB_ERR)
102 ListBox_SetItemData(hDlgCtrl, pos, 1); // indicate that this item is a boot entry
103
104 Settings.OSConfigurationCount++;
105 }
106 }
107
108 SelectObject(hDC, hOldFont);
109 ReleaseDC(hDlgCtrl, hDC);
110
111 fclose(file);
112 Settings.UseBootIni = TRUE;
113
114 /*
115 * Start to search for the string at the "operating systems" section
116 * (after the "boot loader" section, which takes 3 lines in the .INI file).
117 */
118 pos = ListBox_FindString(hDlgCtrl, 3, Settings.szDefaultOS);
119 if (pos != LB_ERR)
120 {
121 Settings.szDefaultPos = (ULONG)pos;
122 ListBox_SetCurSel(hDlgCtrl, pos);
123 // SendMessageW(hDlgCtrl, WM_VSCROLL, SB_LINEDOWN, 0); // Or use SetScroll...()
124 }
125
126 SetDlgItemInt(hDlg, IDC_TXT_BOOT_TIMEOUT, Settings.TimeOut, FALSE);
127 if (Settings.OSConfigurationCount < 2)
128 {
129 EnableWindow(GetDlgItem(hDlg, IDC_BTN_SET_DEFAULT_BOOT), FALSE);
130 EnableWindow(GetDlgItem(hDlg, IDC_BTN_MOVE_UP_BOOT_OPTION), FALSE);
131 EnableWindow(GetDlgItem(hDlg, IDC_BTN_MOVE_DOWN_BOOT_OPTION), FALSE);
132 }
133
134 return TRUE;
135 }
136
137 INT_PTR CALLBACK
138 FreeLdrPageWndProc(HWND hDlg,
139 UINT message,
140 WPARAM wParam,
141 LPARAM lParam)
142 {
143 switch (message)
144 {
145 case WM_INITDIALOG:
146 {
147 LPPROPSHEETPAGEW psp = (LPPROPSHEETPAGEW)lParam;
148
149 hFreeLdrPage = hDlg;
150 LoadIniFile(hDlg, (LPWSTR)(psp->lParam));
151 return TRUE;
152 }
153
154 case WM_COMMAND:
155 {
156 switch (LOWORD(wParam))
157 {
158 case IDC_BTN_ADVANCED_OPTIONS:
159 // DialogBoxW(hInst, MAKEINTRESOURCEW(IDD_FREELDR_ADVANCED_DIALOG), hDlg /* hMainWnd */, NULL /*FileExtractDialogWndProc*/);
160 break;
161
162 // default:
163 // return FALSE;
164 }
165
166 switch (HIWORD(wParam))
167 {
168 case LBN_SELCHANGE:
169 {
170 HWND hWnd = (HWND)lParam;
171 LRESULT pos;
172
173 pos = ListBox_GetCurSel(hWnd);
174 if (pos != LB_ERR)
175 {
176 if (!ListBox_GetItemData(hWnd, pos)) // Line is not a default one
177 ListBox_SetCurSel(hWnd, Settings.szDefaultPos);
178 else
179 Settings.szDefaultPos = (ULONG)pos;
180
181 // SendMessageW((HWND)lParam, WM_VSCROLL, SB_LINEDOWN, 0); // Or use SetScroll...()
182 }
183
184 return TRUE;
185 }
186 }
187 }
188
189 default:
190 return FALSE;
191 }
192
193 // return FALSE;
194 }