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

 $AUT Holger Burkarth
 $DAT >>MonDev.h<<   25 Jan 1997    09:34:07 - (C) ProDAD
*******************************************************************/
#ifndef __INC_POS_PEXEC_DEVICE_H
#include <pExec/Device.h>
#endif
#ifndef __INC_POS_PDOS_DOSTYPES_H
#include <pDos/DosTypes.h>
#endif


/*----------------------------------
-----------------------------------*/
struct pOS_MonIOReq
{
  struct pOS_Message    mr_Message;
  struct pOS_MonDevice *mr_Device;   /* device node pointer  */
  struct pOS_Unit      *mr_Unit;     /* unit (driver private) */
  UWORD                 mr_Command;  /* (enum pOS_MonitorIOReqCommands) */
  UBYTE                 mr_Flags;    /* (enum pOS_IOReqFlags) */
  SBYTE                 mr_Error2;   /* (enum pOS_DosErrors) */
  ULONG                 mr_UserData; /* for Handler own use */
  ULONG                 mr_CretData; /* creater own data */

  union {
    UBYTE mr_Reserved[24];

    struct {  /*** MONCMD_LockObject ***/
      const struct pOS_MonLock  *mrlk_CurrLock;
      const dosname_t           *mrlk_Name;
            ULONG                mrlk_Mode;     /* (enum pOS_MonLockAccess) */
            struct pOS_MonLock  *mrlk_ResLock;
    } mr_LockObj;

    struct {  /*** MONCMD_UnlockObject ***/
      struct pOS_MonLock        *mrul_Lock;
    } mr_UnlockObj;

    struct {  /*** MONCMD_ExamineObject ***/
      const struct pOS_MonLock      *mrex_Lock; /** ==NULL => File **/
      const struct pOS_MonFile      *mrex_FH;
            struct pOS_MonInfoBlock *mrex_MIB;
    } mr_ExamineObj;

    struct {  /*** MONCMD_ExNextObject ***/
      const struct pOS_MonLock      *mren_Lock;
            UBYTE dren_d[4];
            struct pOS_MonInfoBlock *mren_MIB;
    } mr_ExNextObj;

    struct {  /*** MONCMD_DupObjectLock ***/
      const struct pOS_MonLock      *mrdp_Lock;
            UBYTE drdp_d[8];
            struct pOS_MonLock      *mrdp_ResLock;  /* Result */
    } mr_DupObjLock;


    struct {  /*** MONCMD_OpenFH ***/
      const struct pOS_MonLock       *mrop_CurrLock; /* CurrentDir-Lock oder NULL */
      const dosname_t                *mrop_Name;      /* local path */
            UWORD                     mrop_Mode;     /* (enum pOS_MonFileMode) */
            UBYTE mrop_d[2];
            struct pOS_MonFile       *mrop_ResFH;    /* Result */
    } mr_OpenFH;

    struct {  /*** MONCMD_CloseFH ***/
            struct pOS_MonFile    *mrcl_FH;    /*  */
    } mr_CloseFH;


    struct {  /*** MONCMD_DupFH ***/
      const struct pOS_MonFile    *mrdf_FH;
            UBYTE mrdf_d[8];
            struct pOS_MonFile    *mrdf_ResFH;  /* Result */
    } mr_DupFH;


    struct {  /*** MONCMD_Form ***/
      struct pOS_MonForm  *mrfm_MF;
    } mr_Form;

    struct {  /*** MONCMD_UpdateView ***/
      struct pOS_MonFile *mruv_FH;    /*  */
      ULONG               mruv_Flags; /* enum pOS_MonitorUpdateViewFlags */
    } mr_UpView;

  } mr_U;

};



enum pOS_MonitorIOReqCommands
{
  MONCMD_LockObject =CMD_NONSTD,
  MONCMD_UnlockObject,
  MONCMD_ExamineObject,
  MONCMD_ExNextObject,
  MONCMD_DupObjectLock,
  MONCMD_Pad1,
  MONCMD_Pad2,
  MONCMD_OpenFH,
  MONCMD_CloseFH,
  MONCMD_DupFH,
  MONCMD_Pad3,
  MONCMD_Pad4,
  MONCMD_Pad5,
  MONCMD_OpenFromLock,
  MONCMD_Form,
  MONCMD_UpdateView,


  MONCMD_MAX
};



enum pOS_MonitorUpdateViewFlags /** MONCMD_UpdateView mruv_Flags **/
{
  MONUPVF_All      = ~0,
  MONUPVF_Colors   = 0x0001,
  MONUPVF_Sprits   = 0x0002,
  MONUPVF_Position = 0x0004
};


/*----------------------------------
-----------------------------------*/
struct pOS_MonDevice
{
  struct pOS_Library  mdv_Dev;

  UWORD               mdv_Type;     /* (enum pOS_MonDeviceTypes) */

  ULONG               mdv_LockCnt;  /* Lock-Counter (Handler privat) */
  ULONG               mdv_FHCnt;    /* FH-Counter   (Handler privat) */
  struct pOS_List     mdv_LockList; /* Liste der aktiven Locks (Handler privat) */
  struct pOS_List     mdv_FileList; /* Liste der aktiven FileHandle (Handler privat) */
  struct pOS_List     mdv_Lst;      /* Ist für Assigns, .... */
  struct pOS_MonIOReq mdv_IOMaster;

  union {
    UBYTE  mdv_Reserved2[32];

    struct {
            UBYTE mdvh_Pad[4];
      const struct pOS_MonMountDevice *mdvh_Mount;
    } mdv_Handler;

  } mdv_U;
};



enum pOS_MonDeviceTypes
{
  MDTYP_Handler=1,
  MDTYP_Assign
};




/*----------------------------------
-----------------------------------*/
struct pOS_MonMountDevice
{
  struct pOS_ExNode mmd_Node;    /* ln_Name, pOS_AllocVec() */

  UWORD             mmd_Type;    /* (enum pOS_MonMountDevType) */
  ULONG             mmd_Flags;   /* (enum pOS_MonMountDevFlags) */

  UBYTE             mmd_Reserved[12];

  union {
    UBYTE mmd_UReserved[128];

    struct { /* MMDTYP_StdGfx */
      const CHAR* mmstd_MDName;    /* MonDevice-Name (Handler) */
      APTR  mmstd_MDPrivate;       /* MonDevice-Private-Datas pOS_AllocVec() */
      CHAR *mmstd_Startup;         /* Startup-String pOS_AllocVec() */
      const CHAR* mmstd_LibName;   /* Gfx-Library */
    } mmd_StdGfx;



  } mmd_U;
};



enum pOS_MonMountDevType
{
  MMDTYP_StdGfx =0x21,  /* Standard-Device */
  MMDTYP_NetGfx =0x23   /* Network-Device */
};


enum pOS_MonMountDevFlags
{
  MMDF_NameAllocVec = 0x0001    /* ln_Name, pOS_AllocVec() */
};





/*----------------------------------
-----------------------------------*/
struct pOS_MonDevPathInfo
{
  const struct pOS_MonLock   *mopi_CurrDir;   /* Absoluter Pfad, kann null sein */
  const dosname_t            *mopi_PathName;  /* String-Name */
        dosname_t            *mopi_Buffer;
        size_t               mopi_BufSize;

  const struct pOS_MonLock   *mopi_ResDir;    /* Result-Lock */
  const dosname_t            *mopi_ResName;

        struct pOS_MonDevice *mopi_Device;
        struct pOS_MonDevice *mopi_2thDev;

        UBYTE mopi_Reserved[16];
};




/*----------------------------------
-----------------------------------*/
struct pOS_MonResidentLibInit
{
            size_t  mlit_DataSize;         /* device data space size */
  __CONST__ ULONG **mlit_FuncTable;        /* table of entry points   */
            VOID   *mlit_DataInit;         /* table of data initializers */
            BOOL  (*mlit_InitFunc)(_R_LB struct pOS_ExecBase*,_R_A0 struct pOS_MonDevice*); /* initialization function to run */
  const struct pOS_MonMountDevice* mlit_Mount;
  UBYTE mlit_Reserved[4];
};



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

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

  struct pOS_LibraryFunction Reserved1[8];

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


#define _pOS_GetStdMonDevFunction(dev) \
 ( (struct pOS_StdMonDevFunction*)((ULONG)(dev) - sizeof(struct pOS_StdMonDevFunction)) )


#endif
