/*
 *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 *  SCR_File.h
 *  Scripts, Beaudet Christophe
 *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 */
 
#ifndef __SCR_File_h__Types
#define __SCR_File_h__Types
 
#ifndef __Only_Types__
#define __SCR_File_h__Undef
#define __Only_Types__
#endif /* !__Only_Types__ */
 
/*
 *=================================================================================================
 *  Includes.
 *=================================================================================================
 */
 
#include <io.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "SCR_DyAr.h"
#include "SCR_Hash.h"
#include "SCR_Page.h"
#include "SCR_Pars.h"
#include "SCR_CFil.h"
 
#ifdef __SCR_File_h__Undef
#undef __Only_Types__
#undef __SCR_File_h__Undef
#endif /* __SCR_File_h__Undef */
 
/*
 *=================================================================================================
 *  Constants.
 *=================================================================================================
 */
 
/*
 *  To export code.
 */
#undef CPA_EXPORT
#if defined(CPA_WANTS_IMPORT)
#define CPA_EXPORT __declspec(dllimport)
#elif defined(CPA_WANTS_EXPORT)
#define CPA_EXPORT __declspec(dllexport)
#else /* CPA_WANTS_IMPORT */
#define CPA_EXPORT
#endif /* CPA_WANTS_IMPORT */
 
/*
 *=================================================================================================
 *  Types.
 *=================================================================================================
 */
 
/* MP: BINARY */
typedef struct SCR_tdst_Refs_
{
	char								**a_szRefName;					/* MP BINARY : array of strings for refs */
	short								sRefCount; 
} SCR_tdst_Refs;
 
 
/*
 * Structure that describes a file to parse.
 */
typedef struct SCR_tdst_File_Description_
{
    SCR_tdst_File_Handle     			*p_stHandle;					/* Handle of file (address of stHandle field) */
    char								a_szFileName[_MAX_PATH];        /* User file name */
    char								a_szOpenFileName[_MAX_PATH];    /* Open file name */
    SCR_tdst_Page_Description			*d_stFirstPage;                 /* First page of list */
    SCR_tdst_Page_Description			*d_stLastPage;                  /* Last page of list */
    SCR_tdst_Page_Description			*d_stCurPage;                   /* Current page */
    long								iCurPosInPage;                  /* Current position in page */
	char								bBinaryMode;					/* MP - FALSE if file is TEXT, True if BINARY */
	SCR_tdst_Refs						*p_stRefs;
	long lChangeInPos;
	long lToEndSection;
	long lCountEndSections;
} SCR_tdst_File_Description;
 
/*
 *  Structure that describes an open file.
 */
typedef struct SCR_tdst_File_Open_
{
	SCR_tdst_DyAr_Header				stHeader;				/* Header of element */
    char                                a_szBuffer[SCR_CV_ui_Cfg_SizeBufferFile];
    struct SCR_tdst_File_Description_   stFile;                 /* File */
    SCR_tda_st_Hash_Table               a_stHashSectionsDes;    /* To retrieve sections */
 
	/* !!! When delete this field, all clients will need to be compile !!! */
    SCR_tda_st_Hash_Table               DUMMY;
 
    struct SCR_tdst_DyAr_Description_   stSectionsDes;          /* Array of sections in file */
    struct SCR_tdst_Pars_Infos_         stParsingInfos;         /* Parsing infos for that file */
    SCR_tdst_Cxt_Values                 stFileValues;           /* Values for that file */
    SCR_tdx_Hash_Key                    xHashKey;               /* Hash key code */
    unsigned int                        uiIndexOfHashValue;     /* Index of hash value in table */
    long                                lSeekWhenClosed;        /* Seek when file was closed */
} SCR_tdst_File_Open;
 
/* 
 *  Structure that describes a path.
 */
typedef struct SCR_tdst_File_Path_
{
	SCR_tdst_DyAr_Header	stHeader;					/* Header of element */
    char					a_szPathName[_MAX_PATH];    /* Name of path */
} SCR_tdst_File_Path;
 
#endif /* !__SCR_File_h__Types */
 
/*
 *=================================================================================================
 *  Global variables.
 *=================================================================================================
 */
 
#if !defined(__SCR_File_h__Globals) && !defined(__Only_Types__)
#define __SCR_File_h__Globals
 
CPA_EXPORT extern SCR_tdst_DyAr_Description     SCR_g_st_File_ArrayOpen;
CPA_EXPORT extern SCR_tda_st_Hash_Table         SCR_g_a_st_File_HashTableOpen;
CPA_EXPORT extern SCR_tdst_DyAr_Description     SCR_g_st_File_ArrayPaths;
CPA_EXPORT extern char							SCR_g_a_sz_File_PriorityPath[_MAX_PATH];
CPA_EXPORT extern unsigned char					SCR_g_uc_File_CurrentPriority;
 
#endif /* !__SCR_File_h__Globals && !__OnlyTypes */
 
/*
 *=================================================================================================
 *  Protos.
 *=================================================================================================
 */
 
#if !defined(__SCR_File_h__Protos) && !defined(__Only_Types__)
#define __SCR_File_h__Protos
 
extern void                 fn_v_File_InitModule(void);
extern void                 fn_v_File_CloseModule(void);
CPA_EXPORT extern void      SCR_fn_v_File_InitFileDes(SCR_tdst_File_Description *, char *, SCR_FILE);
CPA_EXPORT extern void		SCR_fn_v_File_CloseFileDes(SCR_tdst_File_Description *);
 
extern SCR_tdst_File_Open   *fnp_st_File_AddOpen(char *, SCR_tdx_Hash_Key);
extern void					fn_v_File_DeleteInsideOpen(SCR_tdst_File_Open *);
extern void					fn_v_File_DeleteInsideOpenWithMemLevel(SCR_tdst_File_Open *, unsigned char, unsigned char);
extern void                 fn_v_File_DeleteOpen(SCR_tdst_File_Open *);
extern SCR_tdst_File_Open   *fnp_st_File_SearchOpen(char *, SCR_tdx_Hash_Key);
extern SCR_tdst_File_Open   *fnp_st_File_SearchOpenWithPath(char *, SCR_tdx_Hash_Key);
 
extern void					fn_v_File_ClearPath(char *, char *);
extern SCR_tdst_File_Path   *fnp_st_File_AddPath(char *);
extern void                 fn_v_File_DeletePath(SCR_tdst_File_Path *);
extern SCR_tdst_File_Path   *fnp_st_File_SearchPath(char *);
 
extern void                 fn_v_File_ForceOpenFile(SCR_tdst_File_Open *);
extern SCR_tdst_File_Open   *fnp_st_File_OpenFile(char *);
extern void                 fn_v_File_CloseAllHandles(void);
 
extern char                 fn_c_File_TryToOpen(SCR_tdst_File_Open *);
extern void                 fn_v_File_ReallyOpen(SCR_tdst_File_Open *);
 
extern void                 fn_v_File_TransformFileName(char *);
extern void                 fn_v_File_ComputeFileSectionName(char *, char *, char *);
 
extern void					fn_v_File_ReduceMemory(void);
extern void					fn_v_File_DeleteWithMemLevel(unsigned char, unsigned char);
 
#endif /* !__SCR_File_h__Protos && !__Only_Types__ */
