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

 $AUT Holger Burkarth
 $DAT >>DosDev.h<<   24 Mar 1997    10:28:27 - (C) ProDAD
*******************************************************************/
#ifndef __INC_POS_PDOS_DOSTYPES_H
#include <pDOS/DosTypes.h>
#endif
#ifndef __INC_POS_PEXEC_DEVICE_H
#include <pExec/Device.h>
#endif
#ifndef __INC_POS_PEXEC_SEMA_H
#include <pExec/Sema.h>
#endif
#ifndef __INC_POS_PDOS_DATE_H
#include <pDOS/Date.h>
#endif
#ifndef __INC_POS_PDOS_DOSBASE_H
#include <pDOS/DosBase.h>
#endif



/*----------------------------------
  Size=66 Bytes
-----------------------------------*/
struct pOS_DosIOReq
{
  struct pOS_Message    dr_Message;
  struct pOS_DosDevice *dr_Device;      /* device node pointer  */
  struct pOS_Unit      *dr_Unit;        /* unit (driver private)*/
  UWORD                 dr_Command;     /* enum pOS_DosIOReqCommands */
  UBYTE                 dr_Flags;       /* enum pOS_IOReqFlags */
  SBYTE                 dr_Error2;      /* enum pOS_DosErrors */
  ULONG                 dr_UserData;    /* for Handler own use */
  ULONG                 dr_CretData;    /* creater own data */

/*\
*** Das Result-Argument steht immer an Offset 0x10.
\*/
  union {
    UBYTE dr_Reserved[24];  /* 8 Bytes Reserved */

    struct {  /*** DOSCMD_LockObject ***/
      const struct pOS_FileLock *drlk_CurrLock; /* CurrentDir-Lock oder NULL */
      const dosname_t           *drlk_Name;     /* local path */
            ULONG                drlk_Mode;     /* enum pOS_FileLockAccess */
            struct pOS_FileLock *drlk_ResLock;  /* Result */
    } dr_LockObj;

    struct {  /*** DOSCMD_UnlockObject ***/
      struct pOS_FileLock       *drul_Lock;
    } dr_UnlockObj;

    struct {  /*** DOSCMD_ExamineObject ***/
      const struct pOS_FileLock      *drex_Lock;    /* ==NULL => FH */
      const struct pOS_FileHandle    *drex_FH;
            struct pOS_FileInfoBlock *drex_FIB;
    } dr_ExamineObj;

    struct {  /*** DOSCMD_ExNextObject ***/
      const struct pOS_FileLock      *dren_Lock;
            UBYTE dren_d[4];
            struct pOS_FileInfoBlock *dren_FIB;
    } dr_ExNextObj;

    struct {  /*** DOSCMD_DupObjectLock ***/
      const struct pOS_FileLock      *drdp_Lock;
            UBYTE drdp_d[8];
            struct pOS_FileLock      *drdp_ResLock;  /* Result */
    } dr_DupObjLock;

    struct {  /*** DOSCMD_ParentObject ***/
      const struct pOS_FileLock    *drpr_Lock;
            UBYTE drpr_d[8];
            struct pOS_FileLock    *drpr_ResLock;  /* Result */
    } dr_ParentObj;

    struct {  /*** DOSCMD_LockName ***/
      const struct pOS_FileLock   *drna_Lock;
      const struct pOS_FileHandle *drna_FH;       /* drna_Lock==NULL => use this */
            dosname_t             *drna_Name;
            size_t                 drna_NameSize;
    } dr_LockName;


    struct {  /*** DOSCMD_OpenFH ***/
      const struct pOS_FileLock   *drop_CurrLock; /* CurrentDir-Lock oder NULL */
      const dosname_t             *drop_Name;     /* local path */
            UWORD                  drop_Mode;     /* enum pOS_FileHandleMode */
            UBYTE drop_d[2];
            struct pOS_FileHandle *drop_ResFH;    /* Result */
    } dr_OpenFH;

    struct {  /*** DOSCMD_CloseFH ***/
      struct pOS_FileHandle    *drcl_FH;    /*  */
    } dr_CloseFH;

    struct {  /*** DOSCMD_ReadFH ***/
      struct pOS_FileHandle   *drrd_FH;    /*  */
            VOID              *drrd_Adr;
            dossize_t          drrd_Size;
            dossize_t          drrd_ResSize;
    } dr_ReadFH;

    struct {  /*** DOSCMD_WriteFH ***/
      struct pOS_FileHandle    *drwd_FH;    /*  */
      const VOID               *drwd_Adr;
            dossize_t           drwd_Size;
            dossize_t           drwd_ResSize;
    } dr_WriteFH;

    struct {  /*** DOSCMD_SeekFH ***/
      struct pOS_FileHandle    *drsk_FH;    /*  */
            SWORD               drsk_Mode;  /* enum pOS_FileHandleSeek */
            UBYTE drsk_d[2];
            dospos_t            drsk_Pos;   /* kann negativ sein */
            dossize_t           drsk_OldPos;
    } dr_SeekFH;

    struct {  /*** DOSCMD_CreateDir ***/
      const struct pOS_FileLock  *drcd_CurrLock; /* CurrentDir-Lock oder NULL */
      const dosname_t            *drcd_Name;     /* local path */
            UBYTE drcd_d[4];
            struct pOS_FileLock  *drcd_ResLock;  /* Result */
    } dr_CreateDir;

    struct {  /*** DOSCMD_DeleteObject ***/
      struct pOS_FileLock        *drdo_Lock;
    } dr_DeleteObj;

    struct {  /*** DOSCMD_RenameObject ***/
      const struct pOS_FileLock  *drrn_CurrLock; /* CurrentDir-Lock oder NULL */
            struct pOS_FileLock  *drrn_Obj;      /* zu änderndes Objekt */
      const dosname_t            *drrn_Name;     /* new object-name */
    } dr_RenameObj;

    struct {  /*** DOSCMD_DupFH ***/
      const struct pOS_FileHandle  *drdf_FH;
            UBYTE drdf_d[8];
            struct pOS_FileHandle  *drdf_ResFH;  /* Result */
    } dr_DupFH;

    struct {  /*** DOSCMD_SetDate ***/
            struct pOS_FileLock   *drsd_Lock;     /* zu änderndes Objekt */
            struct pOS_FileHandle *drsd_FH;       /* drsd_Lock==NULL => use this */
      const struct pOS_DateStamp  *drsd_Date;     /* neue Zeit */
    } dr_SetDate;

    struct {  /*** DOSCMD_SetSize ***/
            struct pOS_FileLock   *drss_Lock;     /* zu änderndes Objekt */
            struct pOS_FileHandle *drss_FH;       /* drss_Lock==NULL => use this */
            dossize_t              drss_Size;     /* neue Länge */
    } dr_SetSize;

    struct {  /*** DOSCMD_WaitForChar ***/
            struct pOS_FileHandle *drwc_FH;
      const struct pOS_TimeVal    *drwc_Time;
            dossize_t              drwc_ResSize;  /* Zeichen im Puffer */
    } dr_WaitForChar;

    struct {  /*** DOSCMD_InfoData ***/
      const struct pOS_FileLock    *drid_Lock;   /* NULL => use drid_FH */
      const struct pOS_FileHandle  *drid_FH;     /* NULL => use DDev direct */
            struct pOS_DosInfoData *drid_InfoData;
    } dr_InfoData;

    struct {  /*** DOSCMD_SetComment ***/
            struct pOS_FileLock   *drct_Lock;      /* zu änderndes Objekt */
            struct pOS_FileHandle *drct_FH;        /* drct_Lock==NULL => use this */
      const CHAR                  *drct_String;
    } dr_SetComment;

    struct {  /*** DOSCMD_SetProtection ***/
            struct pOS_FileLock   *drpt_Lock;      /* zu änderndes Objekt */
            struct pOS_FileHandle *drpt_FH;        /* drpt_Lock==NULL => use this */
            ULONG                  drpt_Bits;
    } dr_SetProtection;

    struct {  /*** DOSCMD_SameObject ***/
      const struct pOS_FileLock  *drso_Lock1;
      const struct pOS_FileLock  *drso_Lock2;
            ULONG                 drso_Result;    /* enum pOS_SameFileLockType */
    } dr_SameObject;

    struct {  /*** DOSCMD_AddBuffers ***/
            SLONG              drab_Add;         /* bytes */
            dossize_t          drab_OldBuffers;  /* bytes */
    } dr_AddBuffers;

    struct {  /*** DOSCMD_ChangeAccess ***/
            struct pOS_FileLock    *drca_Lock;      /* Lock==NULL => drca_FH is use */
            struct pOS_FileHandle  *drca_FH;
            ULONG                   drca_NewMode;   /* enum pOS_FileLockAccess or enum pOS_FileHandleMode */
    } dr_ChangeAccess;

    struct {  /*** DOSCMD_Inhibit ***/
            ULONG              drin_OnOff;
    } dr_Inhibit;

    struct {  /*** DOSCMD_Relabel ***/
      const CHAR              *drrb_VolName;
    } dr_Relabel;

    struct {  /*** DOSCMD_OpenFromLock ***/
   __ARID__ struct pOS_FileLock   *drol_Lock;     /* transform Lock => FH */
            UBYTE drol_d[8];
            struct pOS_FileHandle *drol_ResFH;    /* Result */
    } dr_OpenFromLock;

    struct {  /*** DOSCMD_SetScreenMode ***/
      struct pOS_FileHandle    *drsm_FH;
            ULONG               drsm_Mode;      /* 0==CON, 1==RAW */
    } dr_SetScreenMode;

    struct {  /*** DOSCMD_AddNotify ***/
      struct pOS_DosNotifyReq  *draf_Req;
    } dr_AddNotify;

    struct {  /*** DOSCMD_RemNotify ***/
      struct pOS_DosNotifyReq  *drrf_Req;
    } dr_RemNotify;

    struct {  /*** DOSCMD_IsFileSystem ***/
      const struct pOS_FileLock   *dris_Lock;   /* NULL => use dris_FH */
      const struct pOS_FileHandle *dris_FH;     /* NULL => use DDev direct */
            ULONG                  dris_Result; /* TRUE,FALSE */
    } dr_IsFileSys;

    struct {  /*** DOSCMD_GetUniqueID ***/
      const struct pOS_FileLock   *drgq_Lock;
      const struct pOS_FileHandle *drgq_FH;        /* drpt_Lock==NULL => use this */
            ULONG                  drgq_Result;    /* Result-ID */
    } dr_GetUniqueID;

    struct {  /*** DOSCMD_GetWindow ***/
      const struct pOS_FileLock   *drgw_Lock;
      const struct pOS_FileHandle *drgw_FH;        /* drpt_Lock==NULL => use this */
            struct pOS_Window     *drgw_ResWin;    /* Result-Window */
            UBYTE                  drgw_Reserved[4];
    } dr_GetWindow;

  } dr_U;
};







/*----------------------------------
-----------------------------------*/
struct pOS_DosDevice
{
  struct pOS_Library  ddv_Dev;      /* ln_Name => Device-Name */
                                    /* ddv_Dev.lib_OpenCnt num. of used */
  UWORD               ddv_Type;     /* (enum pOS_DosDeviceTypes) */

  ULONG               ddv_LockCnt;  /* Lock-Counter (Handler private) */
  ULONG               ddv_FHCnt;    /* FH-Counter   (Handler private) */
  struct pOS_List     ddv_LockList; /* List of pOS_FileLock (Handler private) */
  struct pOS_List     ddv_FileList; /* Liste of pOS_FileHandle (Handler private) */
  struct pOS_List     ddv_Lst;      /* custom for Assigns, .... */
  struct pOS_DosIOReq ddv_IOMaster; /* Master for pOS_InitDosIOReq() (internal) */
  UBYTE               ddv_Reserved1[32];

  union {
    UBYTE  ddv_Reserved2[32];

    struct {
      struct pOS_DateStamp  ddvv_Date;
      struct pOS_DosDevice *ddvv_Handler;
    } ddv_Volume;

    struct {
            struct pOS_DosDevice      *ddvh_ActVolume; /* inserted Volume */
      const struct pOS_DosMountDevice *ddvh_Mount;
    } ddv_Handler;

    struct {
      const dosname_t     *ddva_Name;   /* ddv_Lst => (struct pOS_AssignNode) */
      struct pOS_FileLock *ddva_Lock;
    } ddv_Assign;

  } ddv_U;
};



/*----------------------------------
-----------------------------------*/
struct pOS_AssignNode
{
  struct pOS_Node      an_Node;
  struct pOS_FileLock *an_Lock;
};




/*----------------------------------
-----------------------------------*/
struct pOS_DosMountDevice
{
  struct pOS_ExNode dmd_Node;    /* ln_Name, pOS_AllocVec() */

  UWORD       dmd_Type;    /* enum pOS_DosMountDevType */
  ULONG       dmd_Flags;   /* enum pOS_DosMountDevFlags */
  SBYTE       dmd_BootPri; /* Boot priority for autoboot */

  UBYTE       dmd_Reserved[11];

  union {
    UBYTE dmd_UReserved[128];

    struct { /* DMDTYP_Pico */
      const CHAR* dmpic_DDName;    /* DosDevice-Name (Handler) */
      APTR  dmpic_DDPrivate;       /* DosDevice-Private-Datas pOS_AllocVec() */
      CHAR *dmpic_Startup;         /* Startup-String pOS_AllocVec() */
    } dmd_Pico;


    struct { /* DMDTYP_BOD */
      const CHAR* dmbod_DDName;    /* DosDevice-Name (Handler) */
      APTR  dmbod_DDPrivate;       /* DosDevice-Private-Datas pOS_AllocVec() */
      CHAR *dmbod_Startup;         /* Startup-String pOS_AllocVec() */

      ULONG dmbod_BytesPerBlock;   /* Bytes pro Block */
      ULONG dmbod_BlockPerCyl;     /* Block pro Zylinder */
      ULONG dmbod_StartCyl;        /* Start-Zylinder */
      ULONG dmbod_EndCyl;          /* End-Zylinder */
      ULONG dmbod_Surfaces;        /*  */
      UWORD dmbod_StartReserved;   /* Reservierte Blocks am Anfang */
      UWORD dmbod_EndReserved;     /* Reservierte Blocks am Ende */
      UWORD dmbod_Interleave;
      ULONG dmbod_BufferSize;      /* Bytes for buffers */
      ULONG dmbod_BufMemType;      /* type of mem to allocate for buffers */
      ULONG dmbod_MaxTransfer;     /* Max number of bytes to transfer at a time */
      ULONG dmbod_Mask;            /* Address Mask to block out certain memory */
      UWORD dmbod_BootBlocks;      /* Number of blocks containing boot code */
      UBYTE dmbod_UnitNum;         /* exec device-unit number */
      UBYTE dmbod_Pad1;
      const CHAR* dmbod_DevName;   /* exec device-name */
      ULONG dmbod_Flags;           /* flags for pOS_OpenDevice() */
    } dmd_BOD;


    struct { /* DMDTYP_Net */
      const CHAR* dmnet_DDName;    /* DosDevice-Name (Handler) */
      APTR  dmnet_DDPrivate;       /* DosDevice-Private-Datas pOS_AllocVec() */
      CHAR *dmnet_Startup;         /* Startup-String pOS_AllocVec() */
      UBYTE dmnet_UnitNum;         /* Net device-unit number */
      UBYTE dmnet_AckgTimeout;     /* Net-Timeout (1/10) sec. */
      const CHAR* dmnet_DevName;   /* Net device-name */
      ULONG dmnet_Flags;           /* flags for pOS_OpenDevice() */
    } dmd_Net;

  } dmd_U;
};



enum pOS_DosMountDevType
{
  DMDTYP_Pico=1,        /* Minimal-Device */
  DMDTYP_BOD,           /* Block orientiertes Device */
  DMDTYP_Net            /* Network-Device */
};

enum pOS_DosMountDevFlags
{
  DMDF_NameAllocVec = 0x0001,   /* ln_Name, pOS_AllocVec() */
  DMDF_EnableBoot   = 0x0002    /* Device ist boot-fähig */
};





/*----------------------------------
-----------------------------------*/
struct pOS_DosDevPathInfo
{
  const struct pOS_FileLock  *dopi_CurrDir;  /* Absolutly path, NULL are possible */
  const dosname_t            *dopi_PathName; /* String-Name */
        dosname_t            *dopi_Buffer;
        size_t                dopi_BufSize;

  const struct pOS_FileLock  *dopi_ResDir;   /* Result-Lock */
  const dosname_t            *dopi_ResName;

        struct pOS_DosDevice *dopi_Device;
        struct pOS_DosDevice *dopi_2thDev;

        UBYTE dopi_Reserved[8];
};


/*----------------------------------
-----------------------------------*/
struct pOS_DosDefDevice
{
  struct pOS_ExNode  dfd_Node;

  struct pOS_DosDevice* (*GetDevice_func)(_R_LB struct pOS_DosBase*,_R_A0 struct pOS_DosDefDevice*,_R_A1 struct pOS_DosDevPathInfo*);
};




enum pOS_DosDeviceTypes
{
  DDTYP_Handler=1,
  DDTYP_Assign,
  DDTYP_Volume,
  DDTYP_LateAssign,
  DDTYP_NonBindingAssign,
  DDTYP_Foreign
};





enum pOS_DosIOReqCommands
{
  DOSCMD_INVALID   = 0,
  DOSCMD_RESET     = 1, /* unused */
  DOSCMD_READ      = 2, /* unused */
  DOSCMD_WRITE     = 3, /* unused */
  DOSCMD_UPDATE    = 4, /* unused */
  DOSCMD_CLEAR     = 5, /* unused */
  DOSCMD_STOP      = 6, /* unused */
  DOSCMD_START     = 7, /* unused */
  DOSCMD_FLUSH     = 8, /* unused */

  DOSCMD_NONSTD    = 9, /* unused */

  DOSCMD_LockObject,            /* dr_LockObj */
  DOSCMD_UnlockObject,          /* dr_UnlockObj */
  DOSCMD_ExamineObject,         /* dr_ExamineObj */
  DOSCMD_ExNextObject,          /* dr_ExNextObj */
  DOSCMD_DupObjectLock,         /* dr_DupObjLock */
  DOSCMD_ParentObject,          /* dr_ParentObj */
  DOSCMD_LockName,              /* dr_LockName */
  DOSCMD_OpenFH,                /* dr_OpenFH */
  DOSCMD_CloseFH,               /* dr_CloseFH */
  DOSCMD_ReadFH,                /* dr_ReadFH */
  DOSCMD_WriteFH,               /* dr_WriteFH */
  DOSCMD_SeekFH,                /* dr_SeekFH */
  DOSCMD_IsFileSystem,          /* dr_IsFileSys */
  DOSCMD_CreateDir,             /* dr_CreateDir */
  DOSCMD_DeleteObject,          /* dr_DeleteObj */
  DOSCMD_RenameObject,          /* dr_RenameObj */
  DOSCMD_DupFH,                 /* dr_DupFH */
  DOSCMD_SetDate,               /* dr_SetDate */
  DOSCMD_SetSize,               /* dr_SetSize */
  DOSCMD_WaitForChar,           /* dr_WaitForCharz */
  DOSCMD_InfoData,              /* dr_InfoData */
  DOSCMD_SetComment,            /* dr_SetComment */
  DOSCMD_SetProtection,         /* dr_SetProtection */
  DOSCMD_SameObject,            /* dr_SameObject */
  DOSCMD_AddBuffers,            /* dr_AddBuffers */
  DOSCMD_ChangeAccess,          /* dr_ChangeAccess */
  DOSCMD_Inhibit,               /* dr_Inhibit */
  DOSCMD_Relabel,               /* dr_Relabel */
  DOSCMD_OpenFromLock,          /* dr_OpenFromLock */
  DOSCMD_SetScreenMode,         /* dr_SetScreenMode */
  DOSCMD_AddNotify,             /* dr_AddNotify */
  DOSCMD_RemNotify,             /* dr_RemNotify */
  DOSCMD_GetUniqueID,           /* dr_GetUniqueID */
  DOSCMD_GetWindow,             /* dr_GetWindow */

  DOSCMD_MAX
};










/*----------------------------------
-----------------------------------*/
struct pOS_DosResidentLibInit
{
            size_t  dlit_DataSize;         /* device data space size */
  __CONST__ ULONG **dlit_FuncTable;        /* table of entry points   */
            VOID   *dlit_DataInit;         /* table of data initializers */
            BOOL  (*dlit_InitFunc)(_R_LB struct pOS_ExecBase*,_R_A0 struct pOS_DosDevice*); /* initialization function to run */
  const struct pOS_DosMountDevice* dlit_Mount;
  UBYTE dlit_Reserved[4];
};





/*----------------------------------
-----------------------------------*/
struct pOS_StdDosDevFunction
{
  struct pOS_LibraryFunction Reserved2[8];

  VOID  (*AbortIO_func)(_R_LB struct pOS_DosDevice*,_R_A0 struct pOS_DosIOReq*);
  UBYTE _d5[8];
  VOID  (*BeginIO_func)(_R_LB struct pOS_DosDevice*,_R_A0 struct pOS_DosIOReq*);
  UBYTE _d4[8];

  struct pOS_LibraryFunction Reserved1[8];

  struct pOS_SegmentLst* (*Expunge_func)(_R_LB struct pOS_DosDevice*);
  UBYTE _d3[8];
  struct pOS_LibraryFunction Res2;
  struct pOS_LibraryFunction Res1;
};


#define _pOS_GetStdDosDevFunction(dev) \
 ( (struct pOS_StdDosDevFunction*)((ULONG)(dev) - sizeof(struct pOS_StdDosDevFunction)) )


#endif
