#ifndef SYSTEM_SYSOBJECT_H
#define SYSTEM_SYSOBJECT_H TRUE

/*
**  $VER: sysobject.h V1.0
**
**  (C) Copyright 1996-1998 DreamWorld Productions.
**      All Rights Reserved.
**
*/

#ifndef DPKERNEL_H
#include <dpkernel/dpkernel.h>
#endif

/****************************************************************************
** The SysObject structure.
*/

#define VER_SYSOBJECT  1
#define TAGS_SYSOBJECT ((ID_SPCTAGS<<16)|ID_SYSOBJECT)

struct SysObject {
  struct Head Head;
  struct SysObject *Prev;  /* Previous object in list */
  struct SysObject *Next;  /* Next object in list */
  WORD   ObjectID;         /* ID of this object, eg ID_PICTURE if master, or ID_HIDDEN if child */
  WORD   ClassID;          /* Class reference ID, use ID_HIDDEN if no class */
  BYTE   *Name;            /* Standard name of the object, eg "Picture", "Universe"... */

  #ifdef _DCC
    LONG  (*CopyToUnv)(__A0 struct Universe *,  __A1 struct Head *);
    LONG  (*CopyFromUnv)(__A0 struct Universe *, __A1 struct Head *);
    WORD  (*CheckFile)(__A0 struct File *, __A1 APTR Buffer);
    struct Head * (*Load)(__A0 struct File *);
    LONG  (*Show)(__A0 APTR Object);
    struct Head * (*Get)(__A0 struct Stats *);
    void  (*Free)(__A0 APTR Object);
    LONG  (*Init)(__A0 APTR Object, __A1 APTR Container);
    LONG  (*Read)(__A0 APTR Object, __A1 APTR Buffer, __D0 LONG Length);
    LONG  (*Write)(__A0 APTR Object, __A1 APTR Buffer, __D0 LONG Length);
    LONG  (*Rename)(__A0 APTR Object __A1 BYTE *Name);
    void  (*Hide)(__A0 APTR Object);
    void  (*yy03)(void);
    LONG  (*SaveToFile)(__A0 APTR Object, __A1 struct File *DestFile);
    LONG  (*Query)(__A0 APTR Object);
    LONG  (*Activate)(__A0 APTR Object);
    LONG  (*Deactivate)(__A0 APTR Object);
    LONG  (*Draw)(__A0 APTR Object);
    LONG  (*Clear)(__A0 APTR Object);
    LONG  (*Reset)(__A0 APTR Object);
    LONG  (*Flush)(__A0 APTR Object);
    LONG  (*TagTrigger)(__A0 LONG *TagPos, __A1 struct Head *);
    struct SysObject *Master; /* Reference to the master sysobject if this is a child */
    LONG  yy00;
    void  (*Unlock)(__A0 APTR Object);
    LONG  (*DetachParent)(__A0 APTR Child, __A1 APTR Parent);
    LONG  (*DetachChild)(__A0 APTR Child, __A1 APTR Parent);
    LONG  (*Unhook)(__A0 APTR Object, __A1 APTR Chain);
    void  (*MoveToBack)(__A0 APTR Object);
    void  (*MoveToFront)(__A0 APTR Object);
    BYTE  *FileExtension;
    BYTE  *FileDesc;
    LONG  (*Copy)(__A0 APTR Source, __A1 APTR Dest);
    ECODE (*Lock)(__A0 APTR Object, __D0 WORD LockCount);
    LONG  (*Seek)(__A0 APTR Object, __D0 LONG Offset, __D1 WORD Position);
    ECODE (*AttemptExclusive)(__A0 APTR Object);
    LONG  yy01;
    void  (*FreeExclusive)(__A0 APTR Object);

  #else
    LIBPTR LONG  (*CopyToUnv)(mreg(__a0) struct Universe *, mreg(__a1) struct Head *);
    LIBPTR LONG  (*CopyFromUnv)(mreg(__a0) struct Universe *, mreg(__a1) struct Head *);
    LIBPTR WORD  (*CheckFile)(mreg(__a0) struct File *, mreg(__a1) APTR Buffer);
    LIBPTR struct Head * (*Load)(mreg(__a0) struct File *);
    LIBPTR LONG  (*Show)(mreg(__a0) APTR Object);
    LIBPTR struct Head * (*Get)(mreg(__a0) struct Stats *);
    LIBPTR void  (*Free)(mreg(__a0) APTR Object);
    LIBPTR LONG  (*Init)(mreg(__a0) APTR Object, mreg(__a1) APTR Container);
    LIBPTR LONG  (*Read)(mreg(__a0) APTR Object, mreg(__a1) APTR Buffer, mreg(__d0) LONG Length);
    LIBPTR LONG  (*Write)(mreg(__a0) APTR Object, mreg(__a1) APTR Buffer, mreg(__d0) LONG Length);
    LIBPTR LONG  (*Rename)(mreg(__a0) APTR Object, mreg(__a1) BYTE *Name);
    LIBPTR void  (*Hide)(mreg(__a0) APTR Object);
    LIBPTR void  (*yy03)(void);
    LIBPTR LONG  (*SaveToFile)(mreg(__a0) APTR Object, mreg(__a1) struct File *DestFile);
    LIBPTR LONG  (*Query)(mreg(__a0) APTR Object);
    LIBPTR LONG  (*Activate)(mreg(__a0) APTR Object);
    LIBPTR LONG  (*Deactivate)(mreg(__a0) APTR Object);
    LIBPTR LONG  (*Draw)(mreg(__a0) APTR Object);
    LIBPTR LONG  (*Clear)(mreg(__a0) APTR Object);
    LIBPTR LONG  (*Reset)(mreg(__a0) APTR Object);
    LIBPTR LONG  (*Flush)(mreg(__a0) APTR Object);
    LIBPTR LONG  (*TagTrigger)(mreg(__a0) LONG *TagPos, mreg(__a1) struct Head *);
    struct SysObject *Master;
    LONG   yy00;
    LIBPTR void  (*Unlock)(mreg(__a0) APTR Object);
    LIBPTR LONG  (*DetachParent)(mreg(__a0) APTR Child, mreg(__a1) APTR Parent);
    LIBPTR LONG  (*DetachChild)(mreg(__a0) APTR Child, mreg(__a1) APTR Parent);
    LIBPTR LONG  (*Unhook)(mreg(__a0) APTR Object, mreg(__a1) APTR Chain);
    LIBPTR void  (*MoveToBack)(mreg(__a0) APTR Object);
    LIBPTR void  (*MoveToFront)(mreg(__a0) APTR Object);
    BYTE   *FileExtension;
    BYTE   *FileDesc;
    LIBPTR LONG  (*Copy)(mreg(__a0) APTR Source, mreg(__a1) APTR Dest);
    LIBPTR ECODE (*Lock)(mreg(__a0) APTR Object, mreg(__d0) WORD LockCount);
    LIBPTR LONG  (*Seek)(mreg(__a0) APTR Object, mreg(__d0) LONG Offset, mreg(__d1) WORD Position);
    LIBPTR ECODE (*AttemptExclusive)(mreg(__a0) APTR Object);
    LONG   yy01;
    LIBPTR void  (*FreeExclusive)(mreg(__a0) APTR Object);
  #endif
};

#define SOA_Prev             (TAPTR|12)
#define SOA_Next             (TAPTR|16)
#define SOA_CopyToUnv        (TAPTR|28)
#define SOA_CopyFromUnv      (TAPTR|32)
#define SOA_CheckFile        (TAPTR|36)
#define SOA_Load             (TAPTR|40)
#define SOA_Show             (TAPTR|44)
#define SOA_Get              (TAPTR|48)
#define SOA_Free             (TAPTR|52)
#define SOA_Init             (TAPTR|56)
#define SOA_Read             (TAPTR|60)
#define SOA_Write            (TAPTR|64)
#define SOA_Rename           (TAPTR|68)
#define SOA_Hide             (TAPTR|72)
#define SOA_yy03             (TAPTR|76)
#define SOA_SaveToFile       (TAPTR|80)
#define SOA_Query            (TAPTR|84)
#define SOA_Activate         (TAPTR|88)
#define SOA_Deactivate       (TAPTR|92)
#define SOA_Draw             (TAPTR|96)
#define SOA_Clear            (TAPTR|100)
#define SOA_Reset            (TAPTR|104)
#define SOA_Flush            (TAPTR|108)
#define SOA_TagTrigger       (TAPTR|112)
#define SOA_Master           (TAPTR|116)
#define SOA_yy00             (TAPTR|120)
#define SOA_Unlock           (TAPTR|124)
#define SOA_DetachParent     (TAPTR|128)
#define SOA_DetachChild      (TAPTR|132)
#define SOA_Unhook           (TAPTR|136)
#define SOA_MoveToBack       (TAPTR|140)
#define SOA_MoveToFront      (TAPTR|144)
#define SOA_FileExtension    (TAPTR|148)
#define SOA_FileDesc         (TAPTR|152)
#define SOA_Copy             (TAPTR|156)
#define SOA_Lock             (TAPTR|160)
#define SOA_Seek             (TAPTR|164)
#define SOA_AttemptExclusive (TAPTR|168)
#define SOA_yy01             (TAPTR|172)
#define SOA_FreeExclusive    (TAPTR|176)

#endif /* SYSTEM_SYSOBJECT_H */
