/** @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)) {
      ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"hexedit", ProblemParam);
      FreePool (ProblemParam);
      ShellStatus = SHELL_INVALID_PARAMETER;
    } else {
      ASSERT (FALSE);
    }

    return ShellStatus;
  }

  //
  // Check for -d
  //
  if (ShellCommandLineGetFlag (Package, L"-d")) {
    if (ShellCommandLineGetCount (Package) < 4) {
      ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit");
      ShellStatus = SHELL_INVALID_PARAMETER;
    } else if (ShellCommandLineGetCount (Package) > 4) {
      ShellPrintHiiDefaultEx (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)) {
      ShellPrintHiiDefaultEx (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) {
      ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit");
      ShellStatus = SHELL_INVALID_PARAMETER;
    } else if (ShellCommandLineGetCount (Package) > 2) {
      ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit");
      ShellStatus = SHELL_INVALID_PARAMETER;
    } else {
      Name = ShellCommandLineGetRawValue (Package, 1);
      if ((Name == NULL) || !IsValidFileName (Name)) {
        ShellPrintHiiDefaultEx (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) {
      ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit");
      ShellStatus = SHELL_INVALID_PARAMETER;
    } else if (ShellCommandLineGetCount (Package) > 3) {
      ShellPrintHiiDefaultEx (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) {
      ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"hexedit");
      ShellStatus = SHELL_INVALID_PARAMETER;
    } else if (!IsValidFileName (Name)) {
      ShellPrintHiiDefaultEx (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;
      ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_NO_CWD), gShellDebug1HiiHandle, L"hexedit");
    } else {
      NewName  = EditGetDefaultFileName (L"bin");
      Name     = NewName;
      WhatToDo = FileTypeFileBuffer;
    }
  }

  if ((ShellStatus == SHELL_SUCCESS) && (WhatToDo == FileTypeNone)) {
    ShellPrintHiiDefaultEx (STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"hexedit");
    ShellStatus = SHELL_INVALID_PARAMETER;
  } else if ((WhatToDo == FileTypeFileBuffer) && (ShellGetCurrentDir (NULL) == NULL)) {
    ShellPrintHiiDefaultEx (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);
      ShellPrintHiiDefaultEx (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) {
      ShellPrintHiiDefaultEx (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
          //
          ShellPrintDefaultEx (L"%s", Buffer);
        } else {
          ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle);
        }
      } else {
        ShellPrintHiiDefaultEx (STRING_TOKEN (STR_HEXEDIT_UNKNOWN_EDITOR), gShellDebug1HiiHandle);
      }
    }
  }

  ShellCommandLineFreeVarList (Package);

  SHELL_FREE_NON_NULL (Buffer);
  SHELL_FREE_NON_NULL (NewName);
  return ShellStatus;
}
