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