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