#ifndef LIBRARIES_TRACKER_H
#define LIBRARIES_TRACKER_H

/*
** Filename: libraries/tracker.h
** Revision: 6.8
** Date: 94/06/11
**
** Definitions for use when using tracker.library
**
** (C) Arnold Schommer
**     Erikaweg 16
**     40670 Meerbusch-Strümp, Germany
*/

#ifndef EXEC_ALERTS_H
#include <exec/alerts.h>
#endif
#ifndef EXEC_TYPES_H
#include <exec/types.h>
#endif
#ifndef GRAPHICS_GFX_H
#include <graphics/gfx.h>	/* wegen PLANEPTR */
#endif
#ifndef DOS_DOS_H
#include <dos/dos.h>		/* wegen BPTR */
#endif
#ifndef UTILITY_TAGITEM_H
#include <utility/tagitem.h>	/* wegen Tag */
#endif

/* Prototypes: */

struct Library *TRK_OpenLibrary( UBYTE *libName, ULONG version );
struct Library *TRK_OpenStdLibrary( ULONG number, version );
void TRK_CloseLibrary( struct Library *library );
APTR TRK_AllocMem( ULONG byteSize, ULONG requirements );
void TRK_FreeMem( APTR memoryBlock );
BYTE TRK_OpenDevice( UBYTE *devName, ULONG unit,
		 struct IORequest *ioRequest, ULONG flags );
void TRK_CloseDevice( struct IORequest *ioRequest );
struct MsgPort *TRK_CreatePort( UBYTE *name, long pri );
void TRK_DeletePort( struct MsgPort *io );
struct IORequest *TRK_CreateExtIO( struct MsgPort *msg, long size );
void TRK_DeleteExtIO( struct IORequest *io );
#define TRK_CreateStdIO(port) \
 ( (struct IOStdReq *)TRK_CreateExtIO(port,sizeof(struct IOStdReq)) )
#define TRK_DeleteStdIO TRK_DeleteExtIO
struct WBStartup *TRK_GetWBMsg(void);
BYTE TRK_AllocSignal( long signalNum );
void TRK_FreeSignal( long signalNum );
BPTR TRK_Open( UBYTE *name, long accessMode );
BPTR TRK_OpenFromLock( BPTR lock );
LONG TRK_Close( BPTR file );
BPTR TRK_Lock( UBYTE *name, long type );
BPTR TRK_DupLock( BPTR lock );
BPTR TRK_DupLockFromFH( BPTR fh );
void TRK_UnLock( BPTR lock );
struct FileInfoBlock *TRK_Examine( BPTR lock );
struct FileInfoBlock *TRK_ExamineFH( BPTR fh );
struct FileInfoBlock *TRK_ExamineName( UBYTE *name );
LONG TRK_ExNext( struct FileInfoBlock *fileInfoBlock );
void TRK_FreeFIB( struct FileInfoBlock *fib );
struct InfoData *TRK_Info( BPTR lock );
struct InfoData *TRK_InfoName( UBYTE *name );
BPTR TRK_LoadSeg( UBYTE *name );
BPTR TRK_NewLoadSeg( UBYTE *file, struct TagItem *tags ),
     TRK_NewLoadSeg( UBYTE *file, Tag tag1, ...);
void TRK_UnLoadSeg( BPTR seglist );
APTR TRK_AllocDosObject( ULONG type, struct TagItem *tags ),
     TRK_AllocDosObjectTags( ULONG type, Tag tag1, ...);
void TRK_FreeDosObject( APTR ptr );
BOOL TRK_StartNotify( struct NotifyRequest *notify );
void TRK_EndNotify( struct NotifyRequest *notify );
struct TextFont *TRK_OpenFont( struct TextAttr *textAttr );
struct TextFont *TRK_OpenDiskFont( struct TextAttr *textAttr );
void TRK_CloseFont( struct TextFont *textFont );
PLANEPTR TRK_AllocRaster( ULONG width, ULONG height );
void TRK_FreeRaster( PLANEPTR p );
WORD TRK_GetSprite( struct SimpleSprite *sprite, long num );
void TRK_FreeSprite( long num );
struct Window *TRK_OpenWindow( struct NewWindow *newWindow ),
	      *TRK_OpenWindowTagList(struct NewWindow *newWindow,
				     struct TagItem *tagList),
	      *TRK_OpenWindowTags(struct NewWindow *newWindow, Tag tag1, ...);
	      *TRK_OpenWdOnPubScreen(struct NewWindow *newWindow,
				     UBYTE *pubscreen),
	      *TRK_OpenWdOnPSTagList(struct NewWindow *newWindow,
				     UBYTE *pubscreen,
				     struct TagItem *tagList),
	      *TRK_OpenWdOnPSTags(struct NewWindow *newWindow,
				  UBYTE *pubscreen, Tag tag1, ...);
void TRK_CloseWindow( struct Window *window );
struct Screen *TRK_OpenScreen( struct NewScreen *newScreen );
struct Screen *TRK_OpenScreenTagList( struct NewScreen *newScreen,
				      struct TagItem *tagList ),
	      *TRK_OpenScreenTags(struct NewScreen *newScreen, Tag tag1, ...);
BOOL TRK_CloseScreen( struct Screen *screen );
BOOL TRK_SetMenuStrip( struct Window *window, struct Menu *menu );
void TRK_ClearMenuStrip( struct Window *window );
BOOL TRK_ResetMenuStrip( struct Window *window, struct Menu *menu );
BOOL TRK_Request( struct Requester *requester, struct Window *window );
void TRK_EndRequest( struct Requester *requester );
BOOL TRK_SetDMRequest( struct Window *window, struct Requester *requester );
BOOL TRK_ClearDMRequest( struct Window *window );
struct Window *TRK_BuildSysRequest( struct Window *window,
		struct IntuiText *body, *posText, *negText,
		ULONG flags, width, height );
void TRK_FreeSysRequest( struct Window *window );
struct Preferences *TRK_GetPrefs(long size), *TRK_GetDefPrefs(long size),
		   *TRK_SetPrefs( struct Preferences *preferences,
				  long inform, BOOL freeflag );
void TRK_FreePrefs( struct Preferences *prefs );
struct Screen *TRK_LockPubScreen( UBYTE *name );
void TRK_UnlockPubScreen( struct Screen *screen );
struct DrawInfo *TRK_GetScreenDrawInfo( struct Screen *screen ),
		*TRK_GetScDIPubScreen( UBYTE *psname );
void TRK_FreeScreenDrawInfo( struct DrawInfo *drawInfo );

void TRK_AddIntServer(long intNumber, struct Interrupt *interrupt);
void TRK_RemIntServer(struct Interrupt *interrupt);

APTR TRK_AllocAslRequest(ULONG type, struct TagItem *ptags),
     TRK_AllocAslRequestTags(ULONG type, Tag tag1, ...);
void TRK_FreeAslRequest(APTR request);
struct FileRequester *TRK_AllocFileRequest(void);
#define TRK_FreeFileRequest TRK_FreeAslRequest
APTR TRK_AslRequest(ULONG type, struct TagItem *ptags),
     TRK_AslRequestTags(ULONG type, Tag tag1, ...);
#define TRK_FreeRequest TRK_FreeAslRequest

struct RDArgs *TRK_ReadArgs(UBYTE *template, LONG *array, struct RDArgs *args);
void TRK_FreeArgs(struct RDArgs *args);

APTR TRK_GetVisualInfoA(struct Screen *screen, struct TagItem *taglist),
     TRK_GetVisualInfo(struct Screen *screen, Tag tag1, ...),
     TRK_GetVIPubScreenA(UBYTE *name, struct TagItem *taglist),
     TRK_GetVIPubScreen(UBYTE *name, Tag tag1, ...);
void TRK_FreeVisualInfo(APTR vi);
struct Gadget *TRK_CreateContext(struct Gadget **glistptr);
void TRK_FreeGadgets(struct Gadget **gad);
struct Menu *TRK_CreateMenusA(struct NewMenu *newmenu, struct TagItem *taglist),
	    *TRK_CreateMenus(struct NewMenu *newmenu, Tag tag1, ...);
void TRK_FreeMenus(struct Menu *menu);

UWORD SetTrackingLevel(UWORD newlevel), GetTrackingLevel(void),
      PushTrackingLevel(void), PopTrackingLevel(void),
      PopTrackingLevels(void), DecTrackingLevel(void),
      NewTrackingLevel(void), HighestTrackingLevel(void);
void FreeTrackingLevel(UWORD level), FreeTrackingLevels(UWORD minlevel),
     FreeCurrentTrackingLevel(void), FreeUpperTrackingLevels(void);

struct IFFHandle *TRK_AllocIFF(void),
	*TRK_CreateIFFasDOS(LONG rwMode, UBYTE *filename, long accessMode),
	*TRK_CreateIFFasClip(LONG rwMode, LONG unit);
void TRK_FreeIFF(struct IFFHandle *iff),
     TRK_DeleteDOSIFF(struct IFFHandle *iff),
     TRK_DeleteClipIFF(struct IFFHandle *iff);
LONG TRK_OpenIFF(struct IFFHandle *iff, LONG rwMode);
void TRK_CloseIFF(struct IFFHandle *iff);
LONG TRK_PushChunk(struct IFFHandle *iff, LONG type, LONG id, LONG size),
     TRK_PopChunk(struct IFFHandle *iff);
struct ClipboardHandle *TRK_OpenClipboard(LONG unitNum);
void TRK_CloseClipboard(struct ClipboardHandle *clipboard);
struct LocalContextItem *TRK_AllocLocalItem(LONG type, LONG id, LONG ident,
					    LONG usize);
void TRK_FreeLocalItem(struct LocalContextItem *localItem);

struct IORequest *TRK_GetDevice(UBYTE *devName, ULONG unit, ULONG flags,
				UWORD size);

struct DiskObject *TRK_GetDiskObject(char *name),
		  *TRK_GetDefDiskObject(LONG type),
		  *TRK_GetDiskObjectNew(char *name);
BOOL TRK_PutDiskObject(char *name, struct DiskObject *diskobj),
     TRK_PutDefDiskObject(struct DiskObject *diskobj);
void TRK_FreeDiskObject(struct DiskObject *diskobj);

/* Schlüsselnummern für die Standard-Libraries bei OpenStdLibrary: */

#define STDLIB_ASL		  0
#define STDLIB_COMMODITIES	  4
/* #define STDLIB_CX		     8 diese library gibt's garnicht */
#define STDLIB_DISKFONT 	 12
#define STDLIB_DOS		 16
#define STDLIB_EXPANSION	 20
#define STDLIB_GADTOOLS 	 24
#define STDLIB_GRAPHICS 	 28
#define STDLIB_ICON		 32
#define STDLIB_IFFPARSE 	 36
#define STDLIB_INFO		 40
#define STDLIB_INTUITION	 44
#define STDLIB_KEYMAP		 48
#define STDLIB_LAYERS		 52
#define STDLIB_MATHFFP		 56
#define STDLIB_MATHIEEEDOUBBAS	 60
#define STDLIB_MATHIEEEDOUBTRANS 64
#define STDLIB_MATHIEEESINGBAS	 68
#define STDLIB_MATHIEEESINGTRANS 72
#define STDLIB_MATHTRANS	 76
#define STDLIB_REXXSUPPORT	 80
#define STDLIB_REXXSYSLIB	 84
#define STDLIB_TRANSLATOR	 88
#define STDLIB_UTILITY		 92
#define STDLIB_VERSION		 96
#define STDLIB_WORKBENCH	100
#define STDLIB_ARP		104
#define STDLIB_REQ		108
#define STDLIB_REQTOOLS 	112

/* Kennung für TrackerLib-Alerts: */

#define AN_TrackerLib 0x0C000000
/* Ein Task will auf die Library zugreifen, obwohl er sie nicht geöffnet
   hat: 								 */
#define AN_Tracker_illegal_Task (AT_DeadEnd|AN_TrackerLib|0x01)
/* Etwas soll freigegeben werden, ist aber garnicht registriert: */
#define AN_Tracker_double_free	(AT_DeadEnd|AN_TrackerLib|0x02)
/* Etwas von unbekanntem Typ soll freigegeben werden: */
#define AN_Tracker_illegal_Type (AT_DeadEnd|AN_TrackerLib|0x03)
/* Unterlauf des TrackingLevels (in DecTrackingLevel): */
#define AN_Tracker_Level_underflow (AN_TrackerLib|0x04)
/* Überlauf des TrackingLevels (in PushTrackingLevel): */
#define AN_Tracker_Level_overflow (AN_TrackerLib|0x05)
/* Kein freier TrackingLevel gefunden (in NewTrackingLevel): */
#define AN_Tracker_Levels_full	(AN_TrackerLib|0x06)

#endif
