1a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey/** @file
2a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  Main file for Ver shell level 3 function.
3a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
4c011b6c9e2baf57fc0557117e9875ceb3dca55a3Tapan Shah  (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
5a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
6a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  This program and the accompanying materials
7a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  are licensed and made available under the terms and conditions of the BSD License
8a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  which accompanies this distribution.  The full text of the license may be found at
9a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  http://opensource.org/licenses/bsd-license.php
10a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
11a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
14a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey**/
15a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
16a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey#include "UefiShellLevel3CommandsLib.h"
17a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
18a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey#include <Library/ShellLib.h>
19a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
20a405b86d274d32b92f69842bfb9a1ab143128f57jcarseySTATIC CONST SHELL_PARAM_ITEM ParamList[] = {
21a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  {L"-s", TypeFlag},
22a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  {L"-terse", TypeFlag},
23a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  {L"-t", TypeFlag},
24a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  {L"-_pa", TypeFlag},
25a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  {NULL, TypeMax}
26a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  };
27a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
28a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey/**
29a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  Function for 'ver' command.
30a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
31a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  @param[in] ImageHandle  Handle to the Image (NULL if Internal).
32a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
33a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey**/
34a405b86d274d32b92f69842bfb9a1ab143128f57jcarseySHELL_STATUS
35a405b86d274d32b92f69842bfb9a1ab143128f57jcarseyEFIAPI
36a405b86d274d32b92f69842bfb9a1ab143128f57jcarseyShellCommandRunVer (
37a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  IN EFI_HANDLE        ImageHandle,
38a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  IN EFI_SYSTEM_TABLE  *SystemTable
39a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  )
40a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey{
41a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  EFI_STATUS          Status;
42a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  LIST_ENTRY          *Package;
43a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  CHAR16              *ProblemParam;
44a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  SHELL_STATUS        ShellStatus;
45a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  UINT8               Level;
46a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
47a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  Level = PcdGet8(PcdShellSupportLevel);
48a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  ProblemParam        = NULL;
49a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  ShellStatus         = SHELL_SUCCESS;
50a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
51a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  //
52a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  // initialize the shell lib (we must be in non-auto-init...)
53a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  //
54a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  Status = ShellInitialize();
55a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  ASSERT_EFI_ERROR(Status);
56a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
57a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  Status = CommandInit();
58a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  ASSERT_EFI_ERROR(Status);
59a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
60a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  //
61a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  // parse the command line
62a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  //
63a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
64a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  if (EFI_ERROR(Status)) {
65a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
66e54a10bbcaa3e2ee3d8e3ee2e7763a59f0e4d216Tapan Shah      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"ver", ProblemParam);
67a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      FreePool(ProblemParam);
68a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
69a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    } else {
70a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      ASSERT(FALSE);
71a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    }
72a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  } else {
73a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    //
74a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    // check for "-?"
75a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    //
76a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    if (ShellCommandLineGetFlag(Package, L"-?")) {
77a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      ASSERT(FALSE);
78a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    }
79a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    if (ShellCommandLineGetRawValue(Package, 1) != NULL) {
80a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      //
81a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      // we have too many parameters
82a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      //
83e54a10bbcaa3e2ee3d8e3ee2e7763a59f0e4d216Tapan Shah      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"ver");
84a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
85a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    } else {
86a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      if (ShellCommandLineGetFlag(Package, L"-s")) {
87a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey        ShellPrintHiiEx (
88a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          0,
89a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          gST->ConOut->Mode->CursorRow,
90a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          NULL,
91a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          STRING_TOKEN (STR_VER_OUTPUT_SIMPLE),
92a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          gShellLevel3HiiHandle,
93a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          gEfiShellProtocol->MajorVersion,
94a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          gEfiShellProtocol->MinorVersion
95a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey         );
96a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      } else {
97a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey        ShellPrintHiiEx (
98a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          0,
99a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          gST->ConOut->Mode->CursorRow,
100a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          NULL,
101a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          STRING_TOKEN (STR_VER_OUTPUT_SHELL),
102a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          gShellLevel3HiiHandle,
103a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          SupportLevel[Level],
104a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          gEfiShellProtocol->MajorVersion,
105a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          gEfiShellProtocol->MinorVersion
106a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey         );
107a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey        if (!ShellCommandLineGetFlag(Package, L"-terse") && !ShellCommandLineGetFlag(Package, L"-t")){
108a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          ShellPrintHiiEx(
109a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey            -1,
110a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey            -1,
111a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey            NULL,
112284e034f4f43530e85b38c74322772e669f561d6Chris Phillips            STRING_TOKEN (STR_VER_OUTPUT_SUPPLIER),
113284e034f4f43530e85b38c74322772e669f561d6Chris Phillips            gShellLevel3HiiHandle,
114284e034f4f43530e85b38c74322772e669f561d6Chris Phillips            (CHAR16 *) PcdGetPtr (PcdShellSupplier)
115a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey           );
116a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
117a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
118a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey          ShellPrintHiiEx (
119a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey            -1,
120a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey            -1,
121a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey            NULL,
122a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey            STRING_TOKEN (STR_VER_OUTPUT_UEFI),
123a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey            gShellLevel3HiiHandle,
124a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey            (gST->Hdr.Revision&0xffff0000)>>16,
125a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey            (gST->Hdr.Revision&0x0000ffff),
126a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey            gST->FirmwareVendor,
127a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey            gST->FirmwareRevision
128a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey           );
129a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey        }
130a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      }
131a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      //
132a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      // implementation specific support for displaying processor architecture
133a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      //
134a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      if (ShellCommandLineGetFlag(Package, L"-_pa")) {
135a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey        ShellPrintEx(-1, -1, L"%d\r\n", sizeof(UINTN)==sizeof(UINT64)?64:32);
136a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey      }
137a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    }
138a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
139a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    //
140a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    // free the command line package
141a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    //
142a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey    ShellCommandLineFreeVarList (Package);
143a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  }
144a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
145a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey  return (ShellStatus);
146a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey}
147a405b86d274d32b92f69842bfb9a1ab143128f57jcarsey
148