//
// Copyright 2020 Electronic Arts Inc.
//
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is free 
// software: you can redistribute it and/or modify it under the terms of 
// the GNU General Public License as published by the Free Software Foundation, 
// either version 3 of the License, or (at your option) any later version.

// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed 
// in the hope that it will be useful, but with permitted additional restrictions 
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT 
// distributed with this program. You should have received a copy of the 
// GNU General Public License along with permitted additional restrictions 
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection

/***************************************************************************
;**   C O N F I D E N T I A L --- W E S T W O O D   A S S O C I A T E S   **
;***************************************************************************
;*                                                                         *
;*                 Project Name : Library - Filio header stuff.            *
;*                                                                         *
;*                    File Name : FILE.H                                 	*
;*                                                                         *
;*                   Programmer : Scott K. Bowen                           *
;*                                                                         *
;*                   Start Date : September 13, 1993                       *
;*                                                                         *
;*                  Last Update : April 11, 1994									*
;*                                                                         *
;*-------------------------------------------------------------------------*
;* Functions:                                                              *
;* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

#ifndef FILE_H
#include "file.h"
#endif

#ifndef _FILE_H
#define _FILE_H


/*=========================================================================*/
/* Fileio defines																				*/
/*=========================================================================*/

#define	LIB_CDROM TRUE

#define MODE_OLDFILE				(O_RDONLY | O_BINARY)
#define MODE_NEWFILE				(O_WRONLY | O_BINARY | O_CREAT | O_TRUNC)
#define MODE_READWRITE			(O_RDWR   | O_BINARY)

#define FILEOPENERROR			-1
#define FILEOPEN(f,m)			ibm_open(f, m, (((UWORD) m) == MODE_OLDFILE) ? S_IREAD : (S_IREAD | S_IWRITE))

#define FILECLOSE(fd)			ibm_close(fd)
#define FILEREAD(f,b,n)			ibm_read(f,b,(WORD)(n))
#define FILEWRITE(f,b,n)		ibm_write(f,b,(WORD)(n))
#define FILESEEK(f,b,n)			ibm_lseek(f, b, n)
#define FILEDELETE(f)			ibm_unlink(f)
#define CHANGEDIR(p)				ibm_chdir(p)

#define FILENAMESIZE				13
#define IO_CHUNK_SIZE			0xfff0UL

/* 
**	Maximum number of file handles 
*/
#define TABLE_MAX			20

 
/*=========================================================================*/
/* The file handle table */
/*=========================================================================*/
typedef struct {
	BOOL						Empty;		// Is this handle empty?
	WORD						Handle;		// DOS file handle (0 = resident).
	LONG						Pos;			// Current file position.
	LONG						Start;		// Offset of file from pointer.
	WORD						Index;		// FileData[] index.
	WORD						Mode;			// Access mode (WW).
	BYTE						*Name;		// File name pointer.
} FileHandleType;


/*=========================================================================*/
/* The following prototypes are for the file: FILEIO.CPP							*/
/*=========================================================================*/

WORD ibm_getdisk(VOID);
WORD ibm_setdisk(WORD drive);
WORD ibm_close(WORD handle);
WORD ibm_unlink(BYTE const *name);
LONG ibm_lseek(WORD handle, LONG offset, WORD where);
UWORD ibm_read(WORD handle, VOID *ptr, UWORD bytes);
UWORD ibm_write(WORD handle, VOID *ptr, UWORD bytes);
WORD ibm_open(BYTE const *name, UWORD mode, WORD attrib);
WORD ibm_chdir(BYTE const *path);

/*=========================================================================*/
/* The following prototypes are for the file: FILELIB.CPP						*/
/*=========================================================================*/

WORD cdecl Do_Open_Error(FileErrorType errormsgnum, BYTE const *file_name);
VOID cdecl Do_IO_Error(FileErrorType errormsgnum, BYTE const *filename);
LONG cdecl Read_File_With_Recovery( WORD handle, VOID *buf, UWORD bytes );
WORD cdecl Open_File_With_Recovery( BYTE const *file_name, UWORD mode );
BOOL cdecl Cache_File(WORD index, WORD file_handle);


/*=========================================================================*/
/* The following prototypes are for the file: DEVICES.ASM						*/
/*=========================================================================*/

#ifdef __cplusplus
extern "C" {
#endif

extern VOID Get_Devices(VOID);
extern WORD Is_Device_Real(WORD device);

#ifdef __cplusplus
}
#endif

/*=========================================================================*/
/* The following prototypes are for the file: DEVTABLE.ASM						*/
/*=========================================================================*/

#ifdef __cplusplus
extern "C" {
#endif

extern VOID Init_Device_Table(BYTE *table);
extern WORD Max_Device(VOID);


#ifdef __cplusplus
}
#endif


/*=========================================================================*/
/* The following prototypes are for the file: HARDERR.ASM						*/
/*=========================================================================*/

#ifdef __cplusplus
extern "C" {
#endif

extern VOID Install_Hard_Error_Handler(VOID);
extern VOID Remove_Hard_Error_Handler(VOID);

#ifdef __cplusplus
}
#endif


/*=========================================================================*/
/* Globale variables in the fileio system.						               */
/*=========================================================================*/

extern BYTE CallingDOSInt;					 
extern "C" extern BYTE MaxDevice,DefaultDrive;
extern BYTE MultiDriveSearch;	
extern FileDataType *FileDataPtr;
extern FileHandleType FileHandleTable[TABLE_MAX];
extern UWORD NumFiles;							 	// Number of files, except PAK, in file table.
extern UWORD NumPAKFiles;							// Number of PAK files in filetable.
extern VOID *FileCacheHeap;						// Pointer to the cache in memory.
extern WORD DiskNumber;						 
extern WORD MaxDirNum;


/*=========================================================================*/
	 


#endif // _FILE_H