#ifndef __INC_POS_PDOS_FILES_H
#define __INC_POS_PDOS_FILES_H
/*******************************************************************
 Includes Release 24
 (C) Copyright 1995-1997 proDAD
     All Rights Reserved

 $AUT Holger Burkarth
 $DAT >>Files.h<<   24 Mar 1997    10:13:22 - (C) ProDAD
*******************************************************************/
#ifndef __INC_POS_PDOS_DOSTYPES_H
#include <pDOS/DosTypes.h>
#endif
#ifndef __INC_POS_PDOS_DOSERRORS_H
#include <pDOS/DosErrors.h>
#endif
#ifndef __INC_POS_PEXEC_LIST_H
#include <pExec/List.h>
#endif
#ifndef __INC_POS_PDOS_DOSBASE_H
#include <pDOS/DosBase.h>
#endif
 #ifndef __INC_POS_PDOS_DOSDEV_H
 #include <pDOS/DosDev.h>
 #endif



/*----------------------------------
-----------------------------------*/
struct pOS_FileHandle
{
  struct pOS_Node       fh_Node;
  struct pOS_DosDevice *fh_DosDev;
  UBYTE                 fh_Access;     /* (enum pOS_FileHandleMode) */
  UBYTE                 fh_Flags;      /* (enum pOS_FileHandleFlags) */
  UWORD                 fh_Count;      /* Mehrfachnutzung */

  dossize_t             fh_Size;       /* Gesamtlänge der Datei in Bytes */
  dossize_t             fh_Pos;        /* Position in der Datei [0,... fh_Size-1], fh_Pos==fh_Size => EOF */

  struct pOS_FHManage  *fh_Manage;
  UBYTE                *fh_Buffer;
  UBYTE                 fh_BufType;    /* (enum pOS_FileHandleBufType)  */
  UBYTE                 fh_BufFlags;   /* (enum pOS_FileHandleBufFlags) */
  size_t                fh_BufMaxSize; /* Buffer-Size */
  size_t                fh_BufSize;    /* Used Size */
  size_t                fh_BufPos;     /* Position in Buffer (0,1,...fh_BufMaxSize-1) */
  dossize_t             fh_BufFPt;     /* FilePointer auf Buffer-Start */

  UBYTE fh_Reserved2[32]; /* *** must be null */
};


enum pOS_FileHandleFlags  /** fh_Flags **/
{
  FILEHDF_Interactive  =0x01,
  FILEHDF_ANSI0        =0x02,   /* File versteht ANSI-Codes */
  FILEHDF_Net          =0x04    /* File is Net-File */
};


/** pOS_OpenFile() **/
enum pOS_FileHandleMode /** fh_Access **/
{
  FILEHDMOD_Unknown=0,
  FILEHDMOD_Read,
  FILEHDMOD_Write,
  FILEHDMOD_ReadWrite,
  FILEHDMOD_Append,

  FILEHDMOD_AcMsk = 0x0f,       /* Mask for Access-Mode */

  FILEHDMOD_GBuffer = 0x0100,   /* FH has greate read/write-buffers (64kB) else (4kB) */
  FILEHDMOD_DobBuf  = 0x0200,   /* double-buffering */
  FILEHDMOD_Unique  = 0x0400,   /* MultiAssigns werden NICHT berücksichtigt */
  FILEHDMOD_NoReq   = 0x0800    /* Es wird kein Report-Requester geöffnet */

};


/** pOS_SeekFile(fh,pos,enum ) **/
enum pOS_FileHandleSeek
{
  FILEHDSEK_Begin  =-1,
  FILEHDSEK_Current= 0,
  FILEHDSEK_End    = 1
};



enum pOS_FileHandleBufType /** fh_BufType **/
{
  FILEHDBUFTYP_None=0,
  FILEHDBUFTYP_Std,
  FILEHDBUFTYP_LF,

  FILEHDBUFTYP_TMask=0x7f
};


enum pOS_FileHandleBufFlags /** fh_BufFlags **/
{
  FILEHDBUFF_FreeBuffer = 0x01,
  FILEHDBUFF_Update     = 0x02  /* Buffer-Inhalt stimmt mit File nicht mehr überein */
};




/*----------------------------------
-----------------------------------*/
struct pOS_FHManage
{
  struct pOS_ExNode fhm_Node;

  UBYTE fhm_Reserved1[16];

  VOID  (*fhm_Init_func)   (_R_LB struct pOS_DosBase*,_R_A0 struct pOS_FileHandle*,_R_D0 ULONG mode); /* Daten nullen */
  VOID  (*fhm_Rem_func)    (_R_LB struct pOS_DosBase*,_R_A0 struct pOS_FileHandle*); /* eigenen Puffer freigeben */
  VOID  (*fhm_Read_func)   (_R_LB struct pOS_DosBase*,_R_A0 struct pOS_DosIOReq*);
  VOID  (*fhm_Write_func)  (_R_LB struct pOS_DosBase*,_R_A0 struct pOS_DosIOReq*);
  VOID  (*fhm_Seek_func)   (_R_LB struct pOS_DosBase*,_R_A0 struct pOS_DosIOReq*);
  VOID  (*fhm_Close_func)  (_R_LB struct pOS_DosBase*,_R_A0 struct pOS_DosIOReq*);
  SLONG (*fhm_SetVBuf_func)(_R_LB struct pOS_DosBase*,_R_A0 struct pOS_FileHandle*,_R_A1 UBYTE*,_R_D0 ULONG,_R_D1 size_t);
  SLONG (*fhm_Flush_func)  (_R_LB struct pOS_DosBase*,_R_A0 struct pOS_FileHandle*);

  UBYTE fhm_Reserved2[64];
};


#endif
