1 /*
2  * PROJECT:     ReactOS Applications
3  * LICENSE:     LGPL - See COPYING in the top level directory
4  * FILE:        base/applications/freeldrpage.c
5  * PURPOSE:     Freeloader configuration page message handler
6  * COPYRIGHT:   Copyright 2005-2006 Christoph von Wittich <Christoph@ApiViewer.de>
7  *
8  */
9 
10 #include <precomp.h>
11 
12 HWND hFreeLdrPage;
13 HWND hFreeLdrDialog;
14 
15 typedef struct
16 {
17     ULONG TimeOut;
18     WCHAR szDefaultOS[512];
19     ULONG szDefaultPos;
20     ULONG OSConfigurationCount;
21     BOOL  UseBootIni;
22 }FREELDR_SETTINGS;
23 
24 static FREELDR_SETTINGS Settings = { 0, {0}, 0 };
25 
26 
27 BOOL
28 LoadBootIni(WCHAR * szDrive, HWND hDlg)
29 {
30    WCHAR szBuffer[512];
31    HWND hDlgCtrl;
32    FILE * file;
33    UINT length;
34    LRESULT pos;
35 
36    wcscpy(szBuffer, szDrive);
37    wcscat(szBuffer, L"boot.ini");
38 
39    file = _wfopen(szBuffer, L"rt");
40    if (!file)
41        return FALSE;
42 
43    hDlgCtrl = GetDlgItem(hDlg, IDC_LIST_BOX);
44 
45    while(!feof(file))
46    {
47         if (fgetws(szBuffer, sizeof(szBuffer) / sizeof(WCHAR), file))
48         {
49             length = wcslen(szBuffer);
50             while(szBuffer[length] < 14) //FIXME remove line feeds
51                 szBuffer[length--] = 0;
52 
53             pos = SendMessageW(hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)szBuffer);
54 
55 
56             if (szBuffer[0] == L'[')
57                 continue;
58 
59             if (!wcsncmp(szBuffer, L"timeout=", 8))
60             {
61                 Settings.TimeOut = _wtoi(&szBuffer[8]);
62                 continue;
63             }
64 
65             if (!wcsncmp(szBuffer, L"default=", 8))
66             {
67                 wcscpy(Settings.szDefaultOS, &szBuffer[8]);
68                 continue;
69             }
70             if (pos != LB_ERR)
71                 SendMessage(hDlgCtrl, LB_SETITEMDATA, pos, 1); // indicate that this item is an boot entry
72             Settings.OSConfigurationCount++;
73         }
74    }
75 
76    fclose(file);
77    Settings.UseBootIni = TRUE;
78 
79    pos = SendMessageW(hDlgCtrl, LB_FINDSTRING, 3, (LPARAM)Settings.szDefaultOS);
80    if (pos != LB_ERR)
81    {
82        Settings.szDefaultPos = pos;
83        SendMessage(hDlgCtrl, LB_SETCURSEL, pos, 0);
84    }
85 
86    SetDlgItemInt(hDlg, IDC_TXT_BOOT_TIMEOUT, Settings.TimeOut, FALSE);
87    if (Settings.OSConfigurationCount < 2)
88    {
89         EnableWindow(GetDlgItem(hDlg, IDC_BTN_SET_DEFAULT_BOOT), FALSE);
90         EnableWindow(GetDlgItem(hDlg, IDC_BTN_MOVE_UP_BOOT_OPTION), FALSE);
91         EnableWindow(GetDlgItem(hDlg, IDC_BTN_MOVE_DOWN_BOOT_OPTION), FALSE);
92    }
93    return TRUE;
94 }
95 
96 
97 BOOL
98 InitializeDialog(HWND hDlg)
99 {
100    // FIXME
101    // find real boot drive and handle freeldr configuration ini
102     return LoadBootIni(L"C:\\", hDlg);
103 }
104 
105 
106 
107 INT_PTR CALLBACK
108 FreeLdrPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
109 {
110     LRESULT pos;
111 
112     UNREFERENCED_PARAMETER(lParam);
113     UNREFERENCED_PARAMETER(wParam);
114 
115     switch (message) {
116     case WM_INITDIALOG:
117         hFreeLdrDialog = hDlg;
118         SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
119         InitializeDialog(hDlg);
120         return TRUE;
121     case WM_COMMAND:
122         switch(HIWORD(wParam))
123         {
124             case LBN_SELCHANGE:
125                 pos = SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);
126                 if (pos != LB_ERR)
127                 {
128                     LPARAM res = SendMessage((HWND)lParam, LB_GETITEMDATA, pos, 0);
129                     if (!res) //line is not a default one
130                         SendMessage((HWND)lParam, LB_SETCURSEL, Settings.szDefaultPos, 0);
131                     else
132                         Settings.szDefaultPos = pos;
133 
134 
135                 }
136             break;
137         }
138     }
139     return 0;
140 }
141