xref: /reactos/base/setup/usetup/mui.c (revision 44323e61)
1 /*
2  *  ReactOS kernel
3  *  Copyright (C) 2008 ReactOS Team
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License along
16  *  with this program; if not, write to the Free Software Foundation, Inc.,
17  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 /*
20  * COPYRIGHT:       See COPYING in the top level directory
21  * PROJECT:         ReactOS text-mode setup
22  * FILE:            base/setup/usetup/mui.c
23  * PURPOSE:         Text-mode setup
24  * PROGRAMMER:
25  */
26 
27 #include "usetup.h"
28 #include "muilanguages.h"
29 
30 #define NDEBUG
31 #include <debug.h>
32 
33 static
34 ULONG
35 FindLanguageIndex(VOID)
36 {
37     ULONG lngIndex = 0;
38 
39     if (SelectedLanguageId == NULL)
40     {
41         /* Default to en-US */
42         return 0;   // FIXME!!
43         // SelectedLanguageId = L"00000409";
44     }
45 
46     while (ResourceList[lngIndex].MuiPages != NULL)
47     {
48         if (_wcsicmp(ResourceList[lngIndex].LanguageID, SelectedLanguageId) == 0)
49         {
50             return lngIndex;
51         }
52 
53         lngIndex++;
54     }
55 
56     return 0;
57 }
58 
59 
60 #if 0
61 BOOLEAN
62 IsLanguageAvailable(
63     PWCHAR LanguageId)
64 {
65     ULONG lngIndex = 0;
66 
67     while (ResourceList[lngIndex].MuiPages != NULL)
68     {
69         if (_wcsicmp(ResourceList[lngIndex].LanguageID, LanguageId) == 0)
70             return TRUE;
71 
72         lngIndex++;
73     }
74 
75     return FALSE;
76 }
77 #endif
78 
79 
80 static
81 const MUI_ENTRY *
82 FindMUIEntriesOfPage(
83     IN ULONG PageNumber)
84 {
85     ULONG muiIndex = 0;
86     ULONG lngIndex;
87     const MUI_PAGE * Pages = NULL;
88 
89     lngIndex = max(FindLanguageIndex(), 0);
90     Pages = ResourceList[lngIndex].MuiPages;
91 
92     while (Pages[muiIndex].MuiEntry != NULL)
93     {
94         if (Pages[muiIndex].Number == PageNumber)
95             return Pages[muiIndex].MuiEntry;
96 
97         muiIndex++;
98     }
99 
100     return NULL;
101 }
102 
103 static
104 const MUI_ERROR *
105 FindMUIErrorEntries(VOID)
106 {
107     ULONG lngIndex = max(FindLanguageIndex(), 0);
108     return ResourceList[lngIndex].MuiErrors;
109 }
110 
111 static
112 const MUI_STRING *
113 FindMUIStringEntries(VOID)
114 {
115     ULONG lngIndex = max(FindLanguageIndex(), 0);
116     return ResourceList[lngIndex].MuiStrings;
117 }
118 
119 
120 VOID
121 MUIClearPage(
122     IN ULONG page)
123 {
124     const MUI_ENTRY * entry;
125     ULONG index;
126 
127     entry = FindMUIEntriesOfPage(page);
128     if (!entry)
129     {
130         PopupError("Error: Failed to find translated page",
131                    NULL,
132                    NULL,
133                    POPUP_WAIT_NONE);
134         return;
135     }
136 
137     index = 0;
138     while (entry[index].Buffer != NULL)
139     {
140         CONSOLE_ClearStyledText(entry[index].X,
141                                 entry[index].Y,
142                                 entry[index].Flags,
143                                 strlen(entry[index].Buffer));
144         index++;
145     }
146 }
147 
148 VOID
149 MUIDisplayPage(
150     IN ULONG page)
151 {
152     const MUI_ENTRY * entry;
153     ULONG index;
154 
155     entry = FindMUIEntriesOfPage(page);
156     if (!entry)
157     {
158         PopupError("Error: Failed to find translated page",
159                    NULL,
160                    NULL,
161                    POPUP_WAIT_NONE);
162         return;
163     }
164 
165     index = 0;
166     while (entry[index].Buffer != NULL)
167     {
168         CONSOLE_SetStyledText(entry[index].X,
169                               entry[index].Y,
170                               entry[index].Flags,
171                               entry[index].Buffer);
172 
173         index++;
174     }
175 }
176 
177 VOID
178 MUIDisplayErrorV(
179     IN ULONG ErrorNum,
180     OUT PINPUT_RECORD Ir,
181     IN ULONG WaitEvent,
182     IN va_list args)
183 {
184     const MUI_ERROR* entry;
185     CHAR Buffer[2048];
186 
187     if (ErrorNum >= ERROR_LAST_ERROR_CODE)
188     {
189         PopupError("Invalid error number provided",
190                    "Press ENTER to continue",
191                    Ir,
192                    POPUP_WAIT_ENTER);
193         return;
194     }
195 
196     entry = FindMUIErrorEntries();
197     if (!entry)
198     {
199         PopupError("Error: Failed to find translated error message",
200                    NULL,
201                    NULL,
202                    POPUP_WAIT_NONE);
203         return;
204     }
205 
206     vsprintf(Buffer, entry[ErrorNum].ErrorText, args);
207 
208     PopupError(Buffer,
209                entry[ErrorNum].ErrorStatus,
210                Ir,
211                WaitEvent);
212 }
213 
214 VOID
215 __cdecl
216 MUIDisplayError(
217     IN ULONG ErrorNum,
218     OUT PINPUT_RECORD Ir,
219     IN ULONG WaitEvent,
220     ...)
221 {
222     va_list arg_ptr;
223 
224     va_start(arg_ptr, WaitEvent);
225     MUIDisplayErrorV(ErrorNum, Ir, WaitEvent, arg_ptr);
226     va_end(arg_ptr);
227 }
228 
229 LPSTR
230 MUIGetString(
231     ULONG Number)
232 {
233     ULONG i;
234     const MUI_STRING * entry;
235     CHAR szErr[128];
236 
237     entry = FindMUIStringEntries();
238     if (entry)
239     {
240         for (i = 0; entry[i].Number != 0; i++)
241         {
242             if (entry[i].Number == Number)
243             {
244                 return entry[i].String;
245             }
246         }
247     }
248 
249     sprintf(szErr, "Error: failed find string id %lu for language index %lu\n", Number, FindLanguageIndex());
250 
251     PopupError(szErr,
252                NULL,
253                NULL,
254                POPUP_WAIT_NONE);
255 
256     return "<nostring>";
257 }
258 
259 VOID
260 SetConsoleCodePage(VOID)
261 {
262     UINT wCodePage;
263 
264 #if 0
265     ULONG lngIndex = 0;
266 
267     while (ResourceList[lngIndex].MuiPages != NULL)
268     {
269         if (_wcsicmp(ResourceList[lngIndex].LanguageID, SelectedLanguageId) == 0)
270         {
271             wCodePage = (UINT) wcstoul(ResourceList[lngIndex].OEMCPage, NULL, 10);
272             SetConsoleOutputCP(wCodePage);
273             return;
274         }
275 
276         lngIndex++;
277     }
278 #else
279     wCodePage = (UINT)wcstoul(MUIGetOEMCodePage(SelectedLanguageId), NULL, 10);
280     SetConsoleOutputCP(wCodePage);
281 #endif
282 }
283 
284 /* EOF */
285