/** @file
  Library functions that perform file IO. Memory buffer, file system, and
  firmware volume operations are supported.

  Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
  Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

  Basic support for opening files on different device types. The device string
  is in the form of DevType:Path. Current DevType is required as there is no
  current mounted device concept of current working directory concept implement
  by this library.

  Device names are case insensitive and only check the leading characters for
  unique matches. Thus the following are all the same:
    LoadFile0:
    l0:
    L0:
    Lo0:

  Supported Device Names:
  A0x1234:0x12 - A memory buffer starting at address 0x1234 for 0x12 bytes
  l1:          - EFI LoadFile device one.
  B0:          - EFI BlockIo zero.
  fs3:         - EFI Simple File System device 3
  Fv2:         - EFI Firmware Volume device 2
  1.2.3.4:name - TFTP IP and file name

**/

#ifndef __EFI_FILE_LIB_H__
#define __EFI_FILE_LIB_H__

#include <PiDxe.h>
#include <Protocol/FirmwareVolume2.h>
#include <Protocol/FirmwareVolumeBlock.h>
#include <Protocol/BlockIo.h>
#include <Protocol/LoadFile.h>
#include <Protocol/LoadFile.h>
#include <Protocol/SimpleFileSystem.h>
#include <Guid/FileInfo.h>
#include <Guid/FileSystemInfo.h>

#define MAX_PATHNAME  0x200

/// Type of the file that has been opened
typedef enum {
  EfiOpenLoadFile,
  EfiOpenMemoryBuffer,
  EfiOpenFirmwareVolume,
  EfiOpenFileSystem,
  EfiOpenBlockIo,
  EfiOpenTftp,
  EfiOpenMaxValue
} EFI_OPEN_FILE_TYPE;

/// Public information about the open file
typedef struct {
  UINTN                            Version;       // Common information
  EFI_OPEN_FILE_TYPE               Type;
  EFI_DEVICE_PATH_PROTOCOL         *DevicePath;
  EFI_STATUS                       LastError;
  EFI_HANDLE                       EfiHandle;
  CHAR8                            *DeviceName;
  CHAR8                            *FileName;

  UINT64                           CurrentPosition; // Information for Seek
  UINT64                           MaxPosition;

  UINTN                            BaseOffset;    // Base offset for hexdump command

  UINTN                            Size;          // Valid for all types other than l#:
  UINT8                            *Buffer;       // Information valid for A#:

  EFI_FIRMWARE_VOLUME2_PROTOCOL    *Fv;           // Information valid for Fv#:
  EFI_GUID                         FvNameGuid;
  EFI_SECTION_TYPE                 FvSectionType;
  EFI_FV_FILETYPE                  FvType;
  EFI_FV_FILE_ATTRIBUTES           FvAttributes;

  EFI_PHYSICAL_ADDRESS             FvStart;
  UINTN                            FvSize;
  UINTN                            FvHeaderSize;

  EFI_FILE                         *FsFileHandle; // Information valid for Fs#:
  EFI_FILE_SYSTEM_INFO             *FsInfo;
  EFI_FILE_INFO                    *FsFileInfo;
  EFI_BLOCK_IO_MEDIA               *FsBlockIoMedia; // Information valid for Fs#: or B#:
  EFI_BLOCK_IO_PROTOCOL            *FsBlockIo;      // Information valid for Fs#: or B#:

  UINTN                            DiskOffset;    // Information valid for B#:

  EFI_LOAD_FILE_PROTOCOL           *LoadFile;     // Information valid for l#:

  EFI_IP_ADDRESS                   ServerIp;      // Information valid for t:
  BOOLEAN                          IsDirty;
  BOOLEAN                          IsBufferValid;
} EFI_OPEN_FILE;

/// Type of Seek to perform
typedef enum {
  EfiSeekStart,
  EfiSeekCurrent,
  EfiSeekEnd,
  EfiSeekMax
} EFI_SEEK_TYPE;

/**
  Open a device named by PathName. The PathName includes a device name and
  path separated by a :. See file header for more details on the PathName
  syntax. There is no checking to prevent a file from being opened more than
  one type.

  SectionType is only used to open an FV. Each file in an FV contains multiple
  sections and only the SectionType section is opened.

  For any file that is opened with EfiOpen() must be closed with EfiClose().

  @param  PathName    Path to parse to open
  @param  OpenMode    Same as EFI_FILE.Open()
  @param  SectionType Section in FV to open.

  @return NULL  Open failed
  @return Valid EFI_OPEN_FILE handle

**/
EFI_OPEN_FILE *
EfiOpen (
  IN        CHAR8             *PathName,
  IN  CONST UINT64            OpenMode,
  IN  CONST EFI_SECTION_TYPE  SectionType
  );

EFI_STATUS
EfiCopyFile (
  IN        CHAR8  *DestinationFile,
  IN        CHAR8  *SourceFile
  );

/**
  Use DeviceType and Index to form a valid PathName and try and open it.

  @param  DeviceType  Device type to open
  @param  Index       Device Index to use. Zero relative.

  @return NULL  Open failed
  @return Valid EFI_OPEN_FILE handle

**/
EFI_OPEN_FILE  *
EfiDeviceOpenByType (
  IN  EFI_OPEN_FILE_TYPE  DeviceType,
  IN  UINTN               Index
  );

/**
  Close a file handle opened by EfiOpen() and free all resources allocated by
  EfiOpen().

  @param  Stream    Open File Handle

  @return EFI_INVALID_PARAMETER  Stream is not an Open File
  @return EFI_SUCCESS            Steam closed

**/
EFI_STATUS
EfiClose (
  IN  EFI_OPEN_FILE  *Stream
  );

/**
  Return the size of the file represented by Stream. Also return the current
  Seek position. Opening a file will enable a valid file size to be returned.
  LoadFile is an exception as a load file size is set to zero.

  @param  Stream    Open File Handle

  @return 0         Stream is not an Open File or a valid LoadFile handle

**/
UINTN
EfiTell (
  IN  EFI_OPEN_FILE  *Stream,
  OUT UINT64         *CurrentPosition   OPTIONAL
  );

/**
  Seek to the Offset location in the file. LoadFile and FV device types do
  not support EfiSeek(). It is not possible to grow the file size using
  EfiSeek().

  SeekType defines how use Offset to calculate the new file position:
  EfiSeekStart  : Position = Offset
  EfiSeekCurrent: Position is Offset bytes from the current position
  EfiSeekEnd    : Only supported if Offset is zero to seek to end of file.

  @param  Stream    Open File Handle
  @param  Offset    Offset to seek too.
  @param  SeekType  Type of seek to perform


  @return EFI_INVALID_PARAMETER  Stream is not an Open File
  @return EFI_UNSUPPORTED        LoadFile and FV does not support Seek
  @return EFI_NOT_FOUND          Seek past the end of the file.
  @return EFI_SUCCESS            Steam closed

**/
EFI_STATUS
EfiSeek (
  IN  EFI_OPEN_FILE  *Stream,
  IN  EFI_LBA        Offset,
  IN  EFI_SEEK_TYPE  SeekType
  );

/**
  Read BufferSize bytes from the current location in the file. For load file
  and FV case you must read the entire file.

  @param  Stream      Open File Handle
  @param  Buffer      Caller allocated buffer.
  @param  BufferSize  Size of buffer in bytes.


  @return EFI_SUCCESS           Stream is not an Open File
  @return EFI_END_OF_FILE Tried to read past the end of the file
  @return EFI_INVALID_PARAMETER Stream is not an open file handle
  @return EFI_BUFFER_TOO_SMALL  Buffer is not big enough to do the read
  @return "other"               Error returned from device read

**/
EFI_STATUS
EfiRead (
  IN  EFI_OPEN_FILE  *Stream,
  OUT VOID           *Buffer,
  OUT UINTN          *BufferSize
  );

/**
  Read the entire file into a buffer. This routine allocates the buffer and
  returns it to the user full of the read data.

  This is very useful for load file where it's hard to know how big the buffer
  must be.

  @param  Stream      Open File Handle
  @param  Buffer      Pointer to buffer to return.
  @param  BufferSize  Pointer to Size of buffer return..


  @return EFI_SUCCESS           Stream is not an Open File
  @return EFI_END_OF_FILE       Tried to read past the end of the file
  @return EFI_INVALID_PARAMETER Stream is not an open file handle
  @return EFI_BUFFER_TOO_SMALL  Buffer is not big enough to do the read
  @return "other"               Error returned from device read

**/
EFI_STATUS
EfiReadAllocatePool (
  IN  EFI_OPEN_FILE  *Stream,
  OUT VOID           **Buffer,
  OUT UINTN          *BufferSize
  );

/**
  Write data back to the file.

  @param  Stream      Open File Handle
  @param  Buffer      Pointer to buffer to return.
  @param  BufferSize  Pointer to Size of buffer return..


  @return EFI_SUCCESS           Stream is not an Open File
  @return EFI_END_OF_FILE       Tried to read past the end of the file
  @return EFI_INVALID_PARAMETER Stream is not an open file handle
  @return EFI_BUFFER_TOO_SMALL  Buffer is not big enough to do the read
  @return "other"               Error returned from device write

**/
EFI_STATUS
EfiWrite (
  IN  EFI_OPEN_FILE  *Stream,
  OUT VOID           *Buffer,
  OUT UINTN          *BufferSize
  );

/**
  Return the number of devices of the current type active in the system

  @param  Type      Device type to check

  @return 0         Invalid type

**/
UINTN
EfiGetDeviceCounts (
  IN  EFI_OPEN_FILE_TYPE  Type
  );

/**
  Set the Current Working Directory (CWD). If a call is made to EfiOpen () and
  the path does not contain a device name, The CWD is prepended to the path.

  @param  Cwd     Current Working Directory to set


  @return EFI_SUCCESS           CWD is set
  @return EFI_INVALID_PARAMETER Cwd is not a valid device:path

**/
EFI_STATUS
EfiSetCwd (
  IN  CHAR8  *Cwd
  );

/**
  Set the Current Working Directory (CWD). If a call is made to EfiOpen () and
  the path does not contain a device name, The CWD is prepended to the path.

  @param  Cwd     Current Working Directory


  @return NULL    No CWD set
  @return 'other' malloc'ed buffer contains CWD.

**/
CHAR8 *
EfiGetCwd (
  VOID
  );

#endif
