/** @file
  Entrypoint of "http" shell standalone application.

  Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved. <BR>
  Copyright (c) 2015, ARM Ltd. All rights reserved.<BR>
  Copyright (c) 2020, Broadcom. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/
#include "Http.h"

/*
 * String token ID of help message text.
 * Shell supports to find help message in the resource section of an
 * application image if * .MAN file is not found.
 * This global variable is added to make build tool recognizes
 * that the help string is consumed by user and then build tool will
 * add the string into the resource section.
 * Thus the application can use '-?' option to show help message in Shell.
 */
GLOBAL_REMOVE_IF_UNREFERENCED
EFI_STRING_ID  mStringHelpTokenId = STRING_TOKEN (STR_GET_HELP_HTTP);

/**
  Entry point of Http standalone application.

  @param ImageHandle            The image handle of the process.
  @param SystemTable            The EFI System Table pointer.

  @retval EFI_SUCCESS           Http command is executed successfully.
  @retval EFI_ABORTED           HII package was failed to initialize.
  @retval others                Other errors when executing http command.
**/
EFI_STATUS
EFIAPI
HttpAppInitialize (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  EFI_STATUS    Status;
  SHELL_STATUS  ShellStatus;

  mHttpHiiHandle = InitializeHiiPackage (ImageHandle);
  if (mHttpHiiHandle == NULL) {
    return EFI_ABORTED;
  }

  Status = EFI_SUCCESS;

  ShellStatus = RunHttp (ImageHandle, SystemTable);

  HiiRemovePackages (mHttpHiiHandle);

  if (Status != SHELL_SUCCESS) {
    Status = ENCODE_ERROR (ShellStatus);
  }

  return Status;
}
