1 /** @file
2   Main file for Mode shell Debug1 function.
3 
4   (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5   Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
6   SPDX-License-Identifier: BSD-2-Clause-Patent
7 
8 **/
9 
10 #include "UefiShellDebug1CommandsLib.h"
11 
12 /**
13   Function for 'mode' command.
14 
15   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
16   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
17 **/
18 SHELL_STATUS
19 EFIAPI
ShellCommandRunMode(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)20 ShellCommandRunMode (
21   IN EFI_HANDLE        ImageHandle,
22   IN EFI_SYSTEM_TABLE  *SystemTable
23   )
24 {
25   EFI_STATUS          Status;
26   LIST_ENTRY          *Package;
27   CHAR16              *ProblemParam;
28   SHELL_STATUS        ShellStatus;
29   UINTN               NewCol;
30   UINTN               NewRow;
31   UINTN               Col;
32   UINTN               Row;
33   CONST CHAR16        *Temp;
34   BOOLEAN             Done;
35   INT32               LoopVar;
36 
37   ShellStatus         = SHELL_SUCCESS;
38   Status              = EFI_SUCCESS;
39 
40   //
41   // initialize the shell lib (we must be in non-auto-init...)
42   //
43   Status = ShellInitialize();
44   ASSERT_EFI_ERROR(Status);
45 
46   Status = CommandInit();
47   ASSERT_EFI_ERROR(Status);
48 
49   //
50   // parse the command line
51   //
52   Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);
53   if (EFI_ERROR(Status)) {
54     if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
55       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"mode", ProblemParam);
56       FreePool(ProblemParam);
57       ShellStatus = SHELL_INVALID_PARAMETER;
58     } else {
59       ASSERT(FALSE);
60     }
61   } else {
62     if (ShellCommandLineGetCount(Package) > 3) {
63       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"mode");
64       ShellStatus = SHELL_INVALID_PARAMETER;
65     } else if (ShellCommandLineGetCount(Package) == 2) {
66       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"mode");
67       ShellStatus = SHELL_INVALID_PARAMETER;
68     } else if (ShellCommandLineGetCount(Package) == 3) {
69       Temp = ShellCommandLineGetRawValue(Package, 1);
70       if (!ShellIsHexOrDecimalNumber(Temp, FALSE, FALSE)) {
71         ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mode", Temp);
72         ShellStatus = SHELL_INVALID_PARAMETER;
73       }
74       NewCol = ShellStrToUintn(Temp);
75       Temp = ShellCommandLineGetRawValue(Package, 2);
76       if (!ShellIsHexOrDecimalNumber(Temp, FALSE, FALSE)) {
77         ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"mode", Temp);
78         ShellStatus = SHELL_INVALID_PARAMETER;
79       }
80       NewRow = ShellStrToUintn(Temp);
81 
82       for (LoopVar = 0, Done = FALSE; LoopVar < gST->ConOut->Mode->MaxMode && ShellStatus == SHELL_SUCCESS ; LoopVar++) {
83         Status = gST->ConOut->QueryMode(gST->ConOut, LoopVar, &Col, &Row);
84         if (EFI_ERROR(Status)) {
85           continue;
86         }
87         if (Col == NewCol && Row == NewRow) {
88           Status = gST->ConOut->SetMode(gST->ConOut, LoopVar);
89           if (EFI_ERROR(Status)) {
90             ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MODE_SET_FAIL), gShellDebug1HiiHandle, L"mode");
91             ShellStatus = SHELL_DEVICE_ERROR;
92           } else {
93             // worked fine...
94             Done = TRUE;
95           }
96           break;
97         }
98       }
99 
100       if (!Done) {
101         ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MODE_NO_MATCH), gShellDebug1HiiHandle, L"mode");
102         ShellStatus = SHELL_INVALID_PARAMETER;
103       }
104 
105     } else if (ShellCommandLineGetCount(Package) == 1) {
106       //
107       // print out valid
108       //
109       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MODE_LIST_HEAD), gShellDebug1HiiHandle);
110       for (LoopVar = 0, Done = FALSE; LoopVar < gST->ConOut->Mode->MaxMode && ShellStatus == SHELL_SUCCESS ; LoopVar++) {
111         Status = gST->ConOut->QueryMode(gST->ConOut, LoopVar, &Col, &Row);
112         if (EFI_ERROR(Status)) {
113           continue;
114         }
115         ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MODE_LIST_ITEM), gShellDebug1HiiHandle, Col, Row, LoopVar == gST->ConOut->Mode->Mode?L'*':L' ');
116       }
117     }
118     ShellCommandLineFreeVarList (Package);
119   }
120 
121   return (ShellStatus);
122 }
123