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

 $AUT Holger Burkarth
 $DAT >>DClass.h<<   23 Jan 1997    12:06:30 - (C) ProDAD
*******************************************************************/
#ifndef __INC_POS_PEXEC_CLASS_H
#include <pExec/Class.h>
#endif
#ifndef __INC_POS_PDOS_DOSTYPES_H
#include <pDOS/DosTypes.h>
#endif


/*----------------------------------
-----------------------------------*/
struct pOS_DClassInfo
{
  const CHAR             *dci_Format;  /* pOS_DTFORM_xxx */

  union {
    const dosname_t       *dci_FileName;
    struct pOS_FileHandle *dci_FH;
    struct pOS_IOStruct   *dci_IO;
  } dci_U;

  ULONG                   dci_Flags;   /* (enum pOS_DClassInfoFlags) */
  APTR                    dci_Data;    /* (struct pOS_DtTypeXXX *) */
  ULONG                   dci_Result;  /* (enum pOS_DtTypeClassResult) */

  ULONG dci_Reserved[4];  /* NULL */
};

#define pOS_DCLASSINFO(dci)  \
 (dci)->dci_Reserved[0]=0;  (dci)->dci_Reserved[1]=0; \
 (dci)->dci_Reserved[2]=0;  (dci)->dci_Reserved[3]=0;



enum pOS_DClassInfoFlags
{
  DCLINFOF_HandleMask = 0x00ff,
  DCLINFOF_None       = 0x0000,
  DCLINFOF_FileName   = 0x0001,
  DCLINFOF_FH         = 0x0002,
  DCLINFOF_IO         = 0x0003
};




/*----------------------------------
-----------------------------------*/
struct pOS_DtTypeMethod
{
  ULONG  dtth_Method;  /* (enum pOS_DtTypeClassMethods) */

  union {
    UBYTE dtth_Reserved[32];

    struct { /* DCLMTH_New */
            ULONG              *dtnw_Pad;
      const struct pOS_TagItem *dtnw_Tags;
    } dtth_New;

    /* DCLMTH_Dispose */

    struct { /* DCLMTH_Get */
            ULONG           dtgt_ID;
            ULONG          *dtgt_Variable;
    } dtth_Get;

/*******************************************************/

    /** DCLMTH_Reset **/


    struct { /* DCLMTH_Load, DCLMTH_XLoad */
      const struct pOS_DClassInfo *dtld_Info;
      const struct pOS_TagItem    *dtld_Tags;
            UBYTE                  dtld_Pad[12];
            ULONG                  dtld_Result;
    } dtth_Load;


    struct { /* DCLMTH_Save, DCLMTH_XSave */
      const struct pOS_DClassInfo *dtsv_Info;
      const struct pOS_TagItem    *dtsv_Tags;
            UBYTE                  dtsv_Pad[12];
            ULONG                  dtsv_Result;
    } dtth_Save;


    struct { /* DCLMTH_Obtain, DCLMTH_XObtain */
      const struct pOS_DClassInfo *dtob_Info;
      const struct pOS_TagItem    *dtob_Tags;
            UBYTE                  dtob_Pad[12];
            ULONG                  dtob_Result;
    } dtth_Obtain;


    struct { /* DCLMTH_Read, DCLMTH_XRead, DCLMTH_TstRead, DCLMTH_XTstRead */
      const struct pOS_DClassInfo *dtrd_Info;
      const struct pOS_TagItem    *dtrd_Tags;
            APTR                   dtrd_Data;    /* (struct pOS_DtTypeXXXFrame*) */
            UBYTE                  dtrd_Pad[8];
            ULONG                  dtrd_Result;
    } dtth_Read;


    struct { /* DCLMTH_Write, DCLMTH_XWrite */
      const struct pOS_DClassInfo *dtwd_Info;
      const struct pOS_TagItem    *dtwd_Tags;
      const VOID                  *dtwd_Data;    /* (struct pOS_DtTypeXXXFrame*) */
            UBYTE                  dtwd_Pad[8];
            ULONG                  dtwd_Result;
    } dtth_Write;


    struct { /* DCLMTH_Clone, DCLMTH_XClone */
      const struct pOS_DataType    *dtcl_Master; /* only set by DCLMTH_XClone */
      const struct pOS_TagItem     *dtcl_Tags;
      __ARID__ struct pOS_DataType *dtcl_Result;
    } dtth_Clone;                                /* Result of pOS_CLASSERR => Clone error */


    struct { /* DCLMTH_GetIObj, DCLMTH_XGetIObj */
            ULONG                   dtgo_Pad;
      const struct pOS_TagItem     *dtgo_Tags;
      __ARID__ struct pOS_IntuiObj *dtgo_Result;
    } dtth_GetIObj;


  } dtth_U;
};



/*\
*** Help-Define to calc own offset by DCLMTH_XClone.
\*/
#define _DTTCLONEOFFSET(mth,obj) \
   ( (ULONG)(mth)->dtth_U.dtth_Clone.dtcl_Master + (ULONG)(obj) - (ULONG)(mth)->dtth_U.dtth_Clone.dtcl_Result )



enum pOS_DtTypeClassResult
{
  DCLMTHR_None=0,

  DCLMTHR_Ok=           0x0001,
  DCLMTHR_Match=        0x0004, /* wird von DCLMTH_Obtain zurückgegeben
                                ** Obtain wurde erfolgreich durchgeführt.
                                */
  DCLMTHR_Warn=         0x0008  /* Operation teilweise fehlerhaft */
};




/*----------------------------------
None X-Methodes for Apps.
X-Methods for DtTypes (DataType internal work)
-----------------------------------*/
enum pOS_DtTypeClassMethods
{
  DCLMTH_Dummy=  0x100,
  DCLMTH_New,          /* construct */
  DCLMTH_Dispose,      /* destruct */
  DCLMTH_Pad1,
  DCLMTH_Get,

  DCLMTH_Reset=0x300,
  DCLMTH_Load,
  DCLMTH_XLoad,
  DCLMTH_Save,
  DCLMTH_XSave,
  DCLMTH_Obtain,
  DCLMTH_XObtain,
  DCLMTH_Read,
  DCLMTH_XRead,
  DCLMTH_Write,
  DCLMTH_XWrite,
  DCLMTH_Clone,
  DCLMTH_XClone,
  DCLMTH_GetIObj,
  DCLMTH_XGetIObj,
  DCLMTH_TstRead,    /* Test-Read, same as DCLMTH_Read, but without fill GfxMaps */
  DCLMTH_XTstRead
};


/*\
*** Qualität der Bearbeitung.
*** Je besser die Qualität, desto aufwendiger die Berechnung und die Wartezeit.
*** Bei Qualität==0 soll die Berechnung am schnellsten erfolgen.
*** pOS_QUALITY_MID => Qualität und Berechnungszeit sind ausgewogen 50% - 50%
\*/
#define pOS_QUALITY_MAX 255
#define pOS_QUALITY_MID 127
#define pOS_QUALITY_MIN   0


#endif
