/** @file
  Main entry point of editor

  (C) Copyright 2014-2015 Hewlett-Packard Development Company, L.P.<BR>
  Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include "UefiShellDebug1CommandsLib.h"
#include "HexEditor.h"

//
// Global Variables
//
STATIC CONST SHELL_PARAM_ITEM  ParamList[] = {
  { L"-f", TypeFlag },
  { L"-d", TypeFlag },
  { L"-m", TypeFlag },
  { NULL,  TypeMax  }
};

/**
  Function for 'hexedit' command.

  @param[in] ImageHandle  Handle to the Image (NULL if Internal).
  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
**/
SHELL_STATUS
EFIAPI
ShellCommandRunHexEdit (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  EFI_STATUS      Status;
  CHAR16          *Buffer;
  CHAR16          *ProblemParam;
  SHELL_STATUS    ShellStatus;
  LIST_ENTRY      *Package;
  CHAR16          *NewName;
  CONST CHAR16    *Name;
  UINTN           Offset;
  UINTN           Size;
  EDIT_FILE_TYPE  WhatToDo;

  Buffer      = NULL;
  ShellStatus = SHELL_SUCCESS;
  NewName     = NULL;
  Buffer      = NULL;
  Name        = NULL;
  Offset      = 0;
  Size        = 0;
  WhatToDo    = FileTypeNone;

  //
  // initialize the shell lib (we must be in non-auto-init...)
  //
  Status = ShellInitialize ();
  ASSERT_EFI_ERROR (Status);

  Status = CommandInit ();
  ASSERT_EFI_ERROR (Status);

  //
  // parse the command line
  //
  Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
  if (EFI_ERROR (Status)) {
    if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"hexedit", ProblemParam);
      FreePool (ProblemParam);
      ShellStatus = SHELL_INVALID_PARAMETER;
    } else {
      ASSERT (FALSE);
    }
  } else {
    //
    // Check for -d
    //
    if (ShellCommandLineGetFlag (Package, L"-d")) {
      if (ShellCommandLineGetCount (Package) < 4) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit");
        ShellStatus = SHELL_INVALID_PARAMETER;
      } else if (ShellCommandLineGetCount (Package) > 4) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit");
        ShellStatus = SHELL_INVALID_PARAMETER;
      } else {
        WhatToDo = FileTypeDiskBuffer;
        Name     = ShellCommandLineGetRawValue (Package, 1);
        Offset   = ShellStrToUintn (ShellCommandLineGetRawValue (Package, 2));
        Size     = ShellStrToUintn (ShellCommandLineGetRawValue (Package, 3));
      }

      if ((Offset == (UINTN)-1) || (Size == (UINTN)-1)) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"hexedit", L"-d");
        ShellStatus = SHELL_INVALID_PARAMETER;
      }
    }

    //
    // check for -f
    //
    if (ShellCommandLineGetFlag (Package, L"-f") && (WhatToDo == FileTypeNone)) {
      if (ShellCommandLineGetCount (Package) < 2) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit");
        ShellStatus = SHELL_INVALID_PARAMETER;
      } else if (ShellCommandLineGetCount (Package) > 2) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit");
        ShellStatus = SHELL_INVALID_PARAMETER;
      } else {
        Name = ShellCommandLineGetRawValue (Package, 1);
        if ((Name == NULL) || !IsValidFileName (Name)) {
          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"hexedit", Name);
          ShellStatus = SHELL_INVALID_PARAMETER;
        } else {
          WhatToDo = FileTypeFileBuffer;
        }
      }
    }

    //
    // check for -m
    //
    if (ShellCommandLineGetFlag (Package, L"-m") && (WhatToDo == FileTypeNone)) {
      if (ShellCommandLineGetCount (Package) < 3) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit");
        ShellStatus = SHELL_INVALID_PARAMETER;
      } else if (ShellCommandLineGetCount (Package) > 3) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit");
        ShellStatus = SHELL_INVALID_PARAMETER;
      } else {
        WhatToDo = FileTypeMemBuffer;
        Offset   = ShellStrToUintn (ShellCommandLineGetRawValue (Package, 1));
        Size     = ShellStrToUintn (ShellCommandLineGetRawValue (Package, 2));
      }
    }

    Name = ShellCommandLineGetRawValue (Package, 1);
    if ((WhatToDo == FileTypeNone) && (Name != NULL)) {
      if (ShellCommandLineGetCount (Package) > 2) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit");
        ShellStatus = SHELL_INVALID_PARAMETER;
      } else if (!IsValidFileName (Name)) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"hexedit", Name);
        ShellStatus = SHELL_INVALID_PARAMETER;
      } else {
        WhatToDo = FileTypeFileBuffer;
      }
    } else if (WhatToDo == FileTypeNone) {
      if (gEfiShellProtocol->GetCurDir (NULL) == NULL) {
        ShellStatus = SHELL_NOT_FOUND;
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellDebug1HiiHandle, L"hexedit");
      } else {
        NewName  = EditGetDefaultFileName (L"bin");
        Name     = NewName;
        WhatToDo = FileTypeFileBuffer;
      }
    }

    if ((ShellStatus == SHELL_SUCCESS) && (WhatToDo == FileTypeNone)) {
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit");
      ShellStatus = SHELL_INVALID_PARAMETER;
    } else if ((WhatToDo == FileTypeFileBuffer) && (ShellGetCurrentDir (NULL) == NULL)) {
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellDebug1HiiHandle, L"hexedit");
      ShellStatus = SHELL_INVALID_PARAMETER;
    }

    if (ShellStatus == SHELL_SUCCESS) {
      //
      // Do the editor
      //
      Status = HMainEditorInit ();
      if (EFI_ERROR (Status)) {
        gST->ConOut->ClearScreen (gST->ConOut);
        gST->ConOut->EnableCursor (gST->ConOut, TRUE);
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_INIT_FAILED), gShellDebug1HiiHandle);
      } else {
        HMainEditorBackup ();
        switch (WhatToDo) {
          case FileTypeFileBuffer:
            Status = HBufferImageRead (
                       Name == NULL ? L"" : Name,
                       NULL,
                       0,
                       0,
                       0,
                       0,
                       FileTypeFileBuffer,
                       FALSE
                       );
            break;

          case FileTypeDiskBuffer:
            Status = HBufferImageRead (
                       NULL,
                       Name == NULL ? L"" : Name,
                       Offset,
                       Size,
                       0,
                       0,
                       FileTypeDiskBuffer,
                       FALSE
                       );
            break;

          case FileTypeMemBuffer:
            Status = HBufferImageRead (
                       NULL,
                       NULL,
                       0,
                       0,
                       (UINT32)Offset,
                       Size,
                       FileTypeMemBuffer,
                       FALSE
                       );
            break;

          default:
            Status = EFI_NOT_FOUND;
            break;
        }

        if (!EFI_ERROR (Status)) {
          HMainEditorRefresh ();
          Status = HMainEditorKeyInput ();
        }

        if (Status != EFI_OUT_OF_RESOURCES) {
          //
          // back up the status string
          //
          Buffer = CatSPrint (NULL, L"%s\r\n", StatusBarGetString ());
        }
      }

      //
      // cleanup
      //
      HMainEditorCleanup ();

      if (EFI_ERROR (Status)) {
        if (ShellStatus == SHELL_SUCCESS) {
          ShellStatus = SHELL_UNSUPPORTED;
        }
      }

      //
      // print editor exit code on screen
      //
      if (Status == EFI_OUT_OF_RESOURCES) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"hexedit");
      } else if (EFI_ERROR (Status)) {
        if (Buffer != NULL) {
          if (StrCmp (Buffer, L"") != 0) {
            //
            // print out the status string
            //
            ShellPrintEx (-1, -1, L"%s", Buffer);
          } else {
            ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle);
          }
        } else {
          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle);
        }
      }
    }

    ShellCommandLineFreeVarList (Package);
  }

  SHELL_FREE_NON_NULL (Buffer);
  SHELL_FREE_NON_NULL (NewName);
  return ShellStatus;
}
