]> git.proxmox.com Git - mirror_edk2.git/blame - EdkUnixPkg/Dxe/UnixThunk/Bus/Console/ConsoleOut.c
Fix component name bugs when input Controller Name is invalid
[mirror_edk2.git] / EdkUnixPkg / Dxe / UnixThunk / Bus / Console / ConsoleOut.c
CommitLineData
c9093a06 1/*++\r
2\r
3Copyright (c) 2004, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 ConsoleOut.c\r
15\r
16Abstract:\r
17\r
377fc2ae 18 Console based on Posix APIs. \r
c9093a06 19\r
377fc2ae 20 This file creates an Posix window and attaches a SimpleTextOut protocol.\r
c9093a06 21\r
22--*/\r
23\r
24#include "Console.h"\r
25//\r
26// Private worker functions.\r
27//\r
28\r
29#if 0
30STATIC\r
31VOID\r
32UnixSimpleTextOutScrollScreen (\r
33 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console\r
34 );\r
35\r
36#endif
37STATIC\r
38VOID\r
39UnixSimpleTextOutPutChar (\r
40 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console,\r
41 IN CHAR16 Char\r
42 );\r
43\r
44STATIC\r
45EFI_STATUS\r
46EFIAPI\r
47UnixSimpleTextOutSetAttribute (\r
48 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
49 IN UINTN Attribute\r
50 );\r
51STATIC\r
52EFI_STATUS\r
53EFIAPI\r
54UnixSimpleTextOutSetMode (\r
55 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
56 IN UINTN ModeNumber\r
57 );\r
58
59//\r
60// Modeule Global for Simple Text Out Mode.\r
61//\r
62#define MAX_SIMPLE_TEXT_OUT_MODE \\r
63 (sizeof(mUnixSimpleTextOutSupportedModes)/sizeof(UNIX_SIMPLE_TEXT_OUT_MODE))\r
64\r
65STATIC UNIX_SIMPLE_TEXT_OUT_MODE mUnixSimpleTextOutSupportedModes[] = {\r
66 { 80, 25 }, \r
67#if 0
68 { 80, 50 }, \r
69 { 80, 43 }, \r
70 { 100, 100 }, \r
71 { 100, 999 } \r
72#endif
73};\r
74\r
75STATIC\r
76EFI_STATUS\r
77EFIAPI\r
78UnixSimpleTextOutReset (\r
79 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
80 IN BOOLEAN ExtendedVerification\r
81 )\r
82/*++\r
83\r
84Routine Description:\r
85\r
86 TODO: Add function description\r
87\r
88Arguments:\r
89\r
90 This - TODO: add argument description\r
91 ExtendedVerification - TODO: add argument description\r
92\r
93Returns:\r
94\r
95 EFI_SUCCESS - TODO: Add description for return value\r
96\r
97--*/\r
98{\r
99 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
100\r
101 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
102\r
103 UnixSimpleTextOutSetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));\r
104\r
105 UnixSimpleTextOutSetMode (This, 0);\r
106 return EFI_SUCCESS;\r
107}\r
108\r
109STATIC\r
110EFI_STATUS\r
111EFIAPI\r
112UnixSimpleTextOutOutputString (\r
113 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
114 IN CHAR16 *String\r
115 )\r
116/*++\r
117\r
118Routine Description:\r
119\r
120 TODO: Add function description\r
121\r
122Arguments:\r
123\r
124 This - TODO: add argument description\r
125 String - TODO: add argument description\r
126\r
127Returns:\r
128\r
129 EFI_SUCCESS - TODO: Add description for return value\r
130\r
131--*/\r
132{\r
133 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
134 CHAR16 *Str;\r
135\r
136 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
137\r
138 for (Str = String; *Str != '\0'; Str++) {\r
139 switch (*Str) {\r
140#if 0
141 case '\n':\r
142 if (Private->Position.Y == (Private->MaxScreenSize.Y - 1)) {\r
143 UnixSimpleTextOutScrollScreen (Private);\r
144 }\r
145\r
146 if (Private->Position.Y < (Private->MaxScreenSize.Y - 1)) {\r
147 Private->Position.Y++;\r
148 This->Mode->CursorRow++;\r
149 }\r
150 break;\r
151\r
152 case '\r':\r
153 Private->Position.X = 0;\r
154 This->Mode->CursorColumn = 0;\r
155 break;\r
156\r
157 case '\b':\r
158 if (Private->Position.X > 0) {\r
159 Private->Position.X--;\r
160 This->Mode->CursorColumn--;\r
161 }\r
162 break;\r
163\r
164#endif
165 default:\r
166 UnixSimpleTextOutPutChar (Private, *Str);\r
167 }\r
168 }\r
169\r
170 return EFI_SUCCESS;\r
171}\r
172\r
173STATIC\r
174VOID\r
175UnixSimpleTextOutPutChar (\r
176 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console,\r
177 IN CHAR16 Char\r
178 )\r
179/*++\r
180\r
181Routine Description:\r
182\r
183 TODO: Add function description\r
184\r
185Arguments:\r
186\r
187 Console - TODO: add argument description\r
188 Char - TODO: add argument description\r
189\r
190Returns:\r
191\r
192 TODO: add return values\r
193\r
194--*/\r
195{\r
196 char c = Char;
197 Console->UnixThunk->Write (1, &c, 1);
198}\r
199\r
200#if 0
201STATIC\r
202VOID\r
203UnixSimpleTextOutScrollScreen (\r
204 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console\r
205 )\r
206/*++\r
207\r
208Routine Description:\r
209\r
210 TODO: Add function description\r
211\r
212Arguments:\r
213\r
214 Console - TODO: add argument description\r
215\r
216Returns:\r
217\r
218 TODO: add return values\r
219\r
220--*/\r
221{\r
222}\r
223#endif
224
225\r
226STATIC\r
227EFI_STATUS\r
228EFIAPI\r
229UnixSimpleTextOutTestString (\r
230 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
231 IN CHAR16 *String\r
232 )\r
233/*++\r
234\r
235Routine Description:\r
236\r
237 TODO: Add function description\r
238\r
239Arguments:\r
240\r
241 This - TODO: add argument description\r
242 String - TODO: add argument description\r
243\r
244Returns:\r
245\r
246 EFI_SUCCESS - TODO: Add description for return value\r
247\r
248--*/\r
249{\r
250 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
251\r
252 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
253\r
254 //\r
255 // BugBug: The correct answer would be a function of what code pages\r
256 // are currently loaded? For now we will just return success.\r
257 //\r
258 return EFI_SUCCESS;\r
259}\r
260\r
261STATIC\r
262EFI_STATUS\r
263EFIAPI\r
264UnixSimpleTextOutQueryMode (\r
265 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
266 IN UINTN ModeNumber,\r
267 OUT UINTN *Columns,\r
268 OUT UINTN *Rows\r
269 )\r
270/*++\r
271\r
272Routine Description:\r
273\r
274 TODO: Add function description\r
275\r
276Arguments:\r
277\r
278 This - TODO: add argument description\r
279 ModeNumber - TODO: add argument description\r
280 Columns - TODO: add argument description\r
281 Rows - TODO: add argument description\r
282\r
283Returns:\r
284\r
285 EFI_INVALID_PARAMETER - TODO: Add description for return value\r
286 EFI_SUCCESS - TODO: Add description for return value\r
287\r
288--*/\r
289{\r
290 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
291\r
292 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
293\r
294 if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {\r
295 return EFI_INVALID_PARAMETER;\r
296 }\r
297\r
298 *Columns = mUnixSimpleTextOutSupportedModes[ModeNumber].ColumnsX;\r
299 *Rows = mUnixSimpleTextOutSupportedModes[ModeNumber].RowsY;\r
300\r
301 return EFI_SUCCESS;\r
302}\r
303\r
304STATIC\r
305EFI_STATUS\r
306EFIAPI\r
307UnixSimpleTextOutSetMode (\r
308 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
309 IN UINTN ModeNumber\r
310 )\r
311/*++\r
312\r
313Routine Description:\r
314\r
315 TODO: Add function description\r
316\r
317Arguments:\r
318\r
319 This - TODO: add argument description\r
320 ModeNumber - TODO: add argument description\r
321\r
322Returns:\r
323\r
324 EFI_INVALID_PARAMETER - TODO: Add description for return value\r
325 EFI_SUCCESS - TODO: Add description for return value\r
326\r
327--*/\r
328{\r
329 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
330\r
331 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
332\r
333 if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {\r
334 return EFI_INVALID_PARAMETER;\r
335 }\r
336\r
337\r
338 This->Mode->Mode = (INT32) ModeNumber;\r
339\r
340 This->EnableCursor (This, TRUE);\r
341 This->ClearScreen (This);\r
342 return EFI_SUCCESS;\r
343}\r
344\r
345STATIC\r
346EFI_STATUS\r
347EFIAPI\r
348UnixSimpleTextOutSetAttribute (\r
349 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
350 IN UINTN Attribute\r
351 )\r
352/*++\r
353\r
354Routine Description:\r
355\r
356 TODO: Add function description\r
357\r
358Arguments:\r
359\r
360 This - TODO: add argument description\r
361 Attribute - TODO: add argument description\r
362\r
363Returns:\r
364\r
365 EFI_SUCCESS - TODO: Add description for return value\r
366\r
367--*/\r
368{\r
369 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
370\r
371 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
372\r
373#if 0
374 Private->Attribute = (WORD) Attribute;\r
375#endif
376 This->Mode->Attribute = (INT32) Attribute;\r
377\r
378 return EFI_SUCCESS;\r
379}\r
380\r
381STATIC\r
382EFI_STATUS\r
383EFIAPI\r
384UnixSimpleTextOutClearScreen (\r
385 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This\r
386 )\r
387/*++\r
388\r
389Routine Description:\r
390\r
391 TODO: Add function description\r
392\r
393Arguments:\r
394\r
395 This - TODO: add argument description\r
396\r
397Returns:\r
398\r
399 EFI_SUCCESS - TODO: Add description for return value\r
400\r
401--*/\r
402{\r
403 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
404 // DWORD ConsoleWindow;\r
405\r
406 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
407\r
408 This->SetCursorPosition (This, 0, 0);\r
409 Private->UnixThunk->Write (1, "\e[2J", 4);
410
411\r
412#if 0
413 Private->UnixThunk->FillConsoleOutputCharacter (\r
414 Private->NtOutHandle,\r
415 ' ',\r
416 Private->MaxScreenSize.X * Private->MaxScreenSize.Y,\r
417 Private->Possition,\r
418 &ConsoleWindow\r
419 );\r
420 Private->UnixThunk->FillConsoleOutputAttribute (\r
421 Private->NtOutHandle,\r
422 Private->Attribute,\r
423 Private->MaxScreenSize.X * Private->MaxScreenSize.Y,\r
424 Private->Possition,\r
425 &ConsoleWindow\r
426 );\r
427#endif
428\r
429 return EFI_SUCCESS;\r
430}\r
431\r
432STATIC\r
433EFI_STATUS\r
434EFIAPI\r
435UnixSimpleTextOutSetCursorPosition (\r
436 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
437 IN UINTN Column,\r
438 IN UINTN Row\r
439 )\r
440/*++\r
441\r
442Routine Description:\r
443\r
444 TODO: Add function description\r
445\r
446Arguments:\r
447\r
448 This - TODO: add argument description\r
449 Column - TODO: add argument description\r
450 Row - TODO: add argument description\r
451\r
452Returns:\r
453\r
454 EFI_SUCCESS - TODO: Add description for return value\r
455\r
456--*/\r
457{\r
458 char buf[12];
459 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
460\r
461 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
462\r
463#if 0
464 Private->Position.X = (WORD) Column;\r
465#endif
466 This->Mode->CursorColumn = (INT32) Column;\r
467\r
468#if 0
469 Private->Position.Y = (WORD) Row;\r
470#endif
471 This->Mode->CursorRow = (INT32) Row;\r
472#if 0
473 Private->UnixThunk->SetConsoleCursorPosition (Private->NtOutHandle, Private->Possition);\r
474#endif
475\r
476 buf[0] = '\e';
477 buf[1] = '[';
478 buf[2] = '0' + ((Row / 100) % 10);
479 buf[3] = '0' + ((Row / 10) % 10);
480 buf[4] = '0' + ((Row / 1) % 10);
481 buf[5] = ';';
482 buf[6] = '0' + ((Column / 100) % 10);
483 buf[7] = '0' + ((Column / 10) % 10);
484 buf[8] = '0' + ((Column / 1) % 10);
485 buf[9] = 'H';
486 Private->UnixThunk->Write (1, buf, 10);
487
488 return EFI_SUCCESS;\r
489}\r
490\r
491STATIC\r
492EFI_STATUS\r
493EFIAPI\r
494UnixSimpleTextOutEnableCursor (\r
495 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
496 IN BOOLEAN Enable\r
497 )\r
498/*++\r
499\r
500Routine Description:\r
501\r
502 TODO: Add function description\r
503\r
504Arguments:\r
505\r
506 This - TODO: add argument description\r
507 Enable - TODO: add argument description\r
508\r
509Returns:\r
510\r
511 EFI_SUCCESS - TODO: Add description for return value\r
512\r
513--*/\r
514{\r
515 UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
516#if 0
517 CONSOLE_CURSOR_INFO Info;\r
518#endif
519\r
520 Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
521 Private->CursorEnable = Enable;\r
522 This->Mode->CursorVisible = Enable;\r
523\r
524#if 0
525 Private->UnixThunk->GetConsoleCursorInfo (Private->NtOutHandle, &Info);\r
526 Info.bVisible = Enable;\r
527 Private->UnixThunk->SetConsoleCursorInfo (Private->NtOutHandle, &Info);\r
528#endif
529\r
530 return EFI_SUCCESS;\r
531}\r
532\r
533EFI_STATUS\r
534UnixSimpleTextOutOpenWindow (\r
535 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private\r
536 )\r
537/*++\r
538\r
539Routine Description:\r
540\r
541 TODO: Add function description\r
542\r
543Arguments:\r
544\r
545 Private - TODO: add argument description\r
546\r
547Returns:\r
548\r
549 TODO: add return values\r
550\r
551--*/\r
552{\r
553 EFI_SIMPLE_TEXT_OUT_PROTOCOL *SimpleTextOut;\r
554 CHAR16 *WindowName;\r
555\r
556 //WindowName = Private->UnixIo->EnvString;\r
557#if 0
558 Private->Attribute = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;\r
559 if (*WindowName == '?') {\r
560 Private->Attribute = BACKGROUND_RED | FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN;\r
561 WindowName = L"EFI Emulator Error Console";\r
562 }\r
563#endif
564 WindowName = L"EFI Emulator Error Console";\r
565\r
566 AddUnicodeString (\r
567 "eng",\r
568 gUnixConsoleComponentName.SupportedLanguages,\r
569 &Private->ControllerNameTable,\r
570 WindowName\r
571 );\r
572\r
573 //\r
574 // Fill in protocol member functions\r
575 //\r
576 SimpleTextOut = &Private->SimpleTextOut;\r
577 SimpleTextOut->Reset = UnixSimpleTextOutReset;\r
578 SimpleTextOut->OutputString = UnixSimpleTextOutOutputString;\r
579 SimpleTextOut->TestString = UnixSimpleTextOutTestString;\r
580 SimpleTextOut->QueryMode = UnixSimpleTextOutQueryMode;\r
581 SimpleTextOut->SetMode = UnixSimpleTextOutSetMode;\r
582 SimpleTextOut->SetAttribute = UnixSimpleTextOutSetAttribute;\r
583 SimpleTextOut->ClearScreen = UnixSimpleTextOutClearScreen;\r
584 SimpleTextOut->SetCursorPosition = UnixSimpleTextOutSetCursorPosition;\r
585 SimpleTextOut->EnableCursor = UnixSimpleTextOutEnableCursor;\r
586\r
587 //\r
588 // Initialize SimpleTextOut protocol mode structure\r
589 //\r
590 SimpleTextOut->Mode = &Private->SimpleTextOutMode;\r
591 SimpleTextOut->Mode->MaxMode = MAX_SIMPLE_TEXT_OUT_MODE;\r
592 SimpleTextOut->Mode->Attribute = 0; //FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;\r
593\r
594#if 0
595 //\r
596 // Open the window an initialize it!\r
597 //\r
598 Private->NtOutHandle = Private->UnixThunk->CreateConsoleScreenBuffer (\r
599 GENERIC_WRITE | GENERIC_READ,\r
600 FILE_SHARE_WRITE | FILE_SHARE_READ,\r
601 NULL,\r
602 CONSOLE_TEXTMODE_BUFFER,\r
603 NULL\r
604 );\r
605 Private->UnixThunk->SetConsoleTitle (WindowName);\r
606#endif
607\r
608 return SimpleTextOut->SetMode (SimpleTextOut, 0);\r
609}\r
610\r
611EFI_STATUS\r
612UnixSimpleTextOutCloseWindow (\r
613 IN OUT UNIX_SIMPLE_TEXT_PRIVATE_DATA *Console\r
614 )\r
615/*++\r
616\r
617Routine Description:\r
618\r
619 TODO: Add function description\r
620\r
621Arguments:\r
622\r
623 Console - TODO: add argument description\r
624\r
625Returns:\r
626\r
627 EFI_SUCCESS - TODO: Add description for return value\r
628\r
629--*/\r
630{\r
631#if 0
632 Console->UnixThunk->CloseHandle (Console->NtOutHandle);\r
633#endif
634 return EFI_SUCCESS;\r
635}\r