	IFND	LIBRARIES_XADMASTER_I
LIBRARIES_XADMASTER_I	SET	1

*
*	$VER: xadmaster.i 1.8 (16.03.1999)
*	xadmaster.library defines and structures
*
*	Copyright © 1998 by Dirk Stöcker
*	All Rights Reserved.
*

	IFND	EXEC_LIBRARIES_I
	INCLUDE	"exec/libraries.i"
	ENDC

	IFND	UTILITY_TAGITEM_I
	INCLUDE	"utility/tagitem.i"
	ENDC

* NOTE: The structures do not have size labels, as they have no fixed
* size. You always need to call xadAllocObject to get them

*************************************************************************
*                    							*
*    library base structure						*
*                    							*
*************************************************************************

	STRUCTURE xadMasterBase,LIB_SIZE
	APTR	xmb_SysBase
	APTR	xmb_DOSBase
	APTR	xmb_UtilityBase
	ULONG	xmb_RecogSize		* read only

*************************************************************************
*                    							*
*    tag-function call flags           					*
*                    							*
*************************************************************************

* input tags for xadGetInfo, only one can be specified per call
XAD_INSIZE		EQU	(TAG_USER+001) * input data size
XAD_INFILENAME		EQU	(TAG_USER+002)
XAD_INFILEHANDLE	EQU	(TAG_USER+003)
XAD_INMEMORY		EQU	(TAG_USER+004)
XAD_INHOOK		EQU	(TAG_USER+005)

* output tags, only one can be specified per call, xadXXXXUnArc
XAD_OUTSIZE		EQU	(TAG_USER+010) * output data size
XAD_OUTFILENAME		EQU	(TAG_USER+011)
XAD_OUTFILEHANDLE	EQU	(TAG_USER+012)
XAD_OUTMEMORY		EQU	(TAG_USER+013)
XAD_OUTHOOK		EQU	(TAG_USER+014)
XAD_OUTDEVICE		EQU	(TAG_USER+015) * for disk archives only

* object allocation tags for xadAllocObjectA
XAD_OBJNAMESIZE		EQU	(TAG_USER+020) * XADOBJ_FILEINFO, size of needed name space
XAD_OBJCOMMENTSIZE	EQU	(TAG_USER+021) * XADOBJ_FILEINFO, size of needed comment space
XAD_OBJPRIVINFOSIZE	EQU	(TAG_USER+022) * XADOBJ_FILEINFO & XADOBJ_DISKINFO, self use size
XAD_OBJBLOCKENTRIES	EQU	(TAG_USER+023) * XADOBJ_DISKINFO, number of needed entries

* tags for xadGetInfo, xadFileUnArc and xadDiskUnArc
XAD_NOEXTERN		EQU	(TAG_USER+050) * do not use extern clients
XAD_PASSWORD		EQU	(TAG_USER+051) * password when needed
XAD_ENTRYNUMBER		EQU	(TAG_USER+052) * number of wanted entry
XAD_PROGRESSHOOK	EQU	(TAG_USER+053) * the progress hook
XAD_OVERWRITE		EQU	(TAG_USER+054) * overwrite file ?
XAD_MAKEDIRECTORY	EQU	(TAG_USER+055) * create directory tree
XAD_IGNOREGEOMETRY	EQU	(TAG_USER+056) * ignore drive geometry ?
XAD_LOWCYLINDER		EQU	(TAG_USER+057) * lowest cylinder
XAD_HIGHCYLINDER	EQU	(TAG_USER+058) * highest cylinder
XAD_VERIFY		EQU	(TAG_USER+059) * verify for disk hook

* input tags for xadConvertDates, only one can be passed
XAD_DATEUNIX		EQU	(TAG_USER+070) * unix date variable
XAD_DATEAMIGA		EQU	(TAG_USER+071) * amiga date variable
XAD_DATEDATESTAMP	EQU	(TAG_USER+072) * struct DateStamp
XAD_DATEXADDATE		EQU	(TAG_USER+073) * struct xadDate
XAD_DATECLOCKDATA	EQU	(TAG_USER+074) * struct ClockData
XAD_DATECURRENTTIME	EQU	(TAG_USER+075) * input is system time

* output tags, there can be specified multiple tags for one call
XAD_GETDATEUNIX 	EQU	(TAG_USER+080) * unix date variable
XAD_GETDATEAMIGA	EQU	(TAG_USER+081) * amiga date variable
XAD_GETDATEDATESTAMP	EQU	(TAG_USER+082) * struct DateStamp
XAD_GETDATEXADDATE	EQU	(TAG_USER+083) * struct xadDate
XAD_GETDATECLOCKDATA	EQU	(TAG_USER+084) * struct ClockData

* following tags need locale.library to be installed
XAD_MAKEGMTDATE		EQU	(TAG_USER+090) * make local to GMT time
XAD_MAKELOCALDATE	EQU	(TAG_USER+091) * make GMT to local time

*************************************************************************
*                    							*
*    objects for xadAllocObjectA       					*
*                    							*
*************************************************************************

XADOBJ_ARCHIVEINFO	EQU	$0001 * struct xadArchiveInfo
XADOBJ_FILEINFO		EQU	$0002 * struct xadFileInfo
XADOBJ_DISKINFO		EQU	$0003 * struct xadDiskInfo
XADOBJ_HOOKPARAM	EQU	$0004 * struct HookParam
XADOBJ_DEVICEINFO	EQU	$0005 * struct xadDeviceInfo
XADOBJ_PROGRESSINFO	EQU	$0006 * struct xadProgressInfo
XADOBJ_TEXTINFO		EQU	$0007 * struct xadTextInfo

*************************************************************************
*                    							*
*    modes for xadCalcCRC126 and xadCalcCRC32				*
*                    							*
*************************************************************************

XADCRC16_ID1		EQU	$A001
XADCRC32_ID1		EQU	$EDB88320

*************************************************************************
*                    							*
*    hook related stuff 	       					*
*                    							*
*************************************************************************

XADHC_READ	EQU	1	* read data into buffer
XADHC_WRITE	EQU	2	* write buffer data to file/memory
XADHC_SEEK	EQU	3	* seek in file
XADHC_INIT	EQU	4	* initialize the hook
XADHC_FREE	EQU	5	* end up hook work, free stuff
XADHC_ABORT	EQU	6	* an error occured, delete partial stuff
XADHC_FULLSIZE	EQU	7	* complete input size is needed

	STRUCTURE xadHookParam,0
  	ULONG	xhp_Command
	ULONG	xhp_CommandData
	APTR	xhp_BufferPtr
  	LONG	xhp_BufferSize
  	LONG	xhp_DataPos	* current seek position
  	APTR	xhp_PrivatePtr

* xadHookAccess commands
XADAC_READ		EQU	10	* get data
XADAC_WRITE		EQU	11	* write data
XADAC_COPY		EQU	12	* copy input to ouput
XADAC_INPUTSEEK		EQU	13	* seek in input file
XADAC_OUTPUTSEEK	EQU	14	* seek in output file

*************************************************************************
*                    							*
*    support structures          					*
*                    							*
*************************************************************************

* Own date structure to cover all possible dates in a human friendly
* format. xadConvertDates may be used to convert between different date
* structures and variables.
	STRUCTURE xadDate,0
  	ULONG 	xd_Micros	* values 0 to 999999
  	LONG  	xd_Year	 	* values 1 to 2147483648
  	UBYTE 	xd_Month	* values 1 to 12
  	UBYTE 	xd_WeekDay	* values 1 to 7
  	UBYTE 	xd_Day		* values 1 to 31
  	UBYTE 	xd_Hour		* values 0 to 23
  	UBYTE 	xd_Minute	* values 0 to 60
  	UBYTE 	xd_Second	* values 0 to 60
  	LABEL 	xadDate_SIZE

XADDAY_MONDAY		EQU	1	* monday is the first day and
XADDAY_TUESDAY		EQU	2
XADDAY_WEDNESDAY	EQU	3
XADDAY_THURSDAY		EQU	4
XADDAY_FRIDAY		EQU	5
XADDAY_SATURDAY 	EQU	6
XADDAY_SUNDAY		EQU	7	* sunday the last day of a week

	STRUCTURE xadDeviceInfo,0	* for XAD_OUTDEVICE tag
	APTR	xdi_DeviceName	* name of device
	ULONG	xdi_Unit	* unit of device
	APTR	xdi_DOSName	* instead of Device+Unit, dos name without ':'

*************************************************************************
*                    							*
*    information structures          					*
*                    							*
*************************************************************************

	STRUCTURE xadArchiveInfo,0
  	APTR	xai_Client	  * pointer to unarchiving client
	APTR	xai_PrivateClient * private client data
	APTR	xai_Password	  * password for crypted archives
	ULONG	xai_Flags  	  * read only XADAIF_ flags
	ULONG	xai_LowCyl 	  * lowest cylinder to unarchive
	ULONG	xai_HighCyl	  * highest cylinder to unarchive
	ULONG	xai_InPos  	  * input position, read only
	ULONG	xai_InSize 	  * input size, read only
	ULONG	xai_OutPos 	  * output position, read only
	ULONG	xai_OutSize	  * output file size, read only
	APTR	xai_FileInfo	  * data pointer for file arcs
	APTR	xai_DiskInfo	  * data pointer for disk arcs
	APTR	xai_CurFile	  * data pointer for current file arc
	APTR	xai_CurDisk	  * data pointer for current disk arc

* This structure is nearly complete private to either xadmaster or its
* clients. An application program may access for reading only xai_Client,
* xai_Flags, xai_FileInfo and xai_DiskInfo. For xai_Flags only XADAIF_CRYPTED
* is useful. All the other stuff is private and should not be accessed!

	BITDEF XADAI,CRYPTED,0		* archive entries are encrypted
	BITDEF XADAI,FILECORRUPT,1	* file is corrupt, but valid entries are in the list
	BITDEF XADAI,FILEARCHIVE,2	* unarchive file entry
	BITDEF XADAI,DISKARCHIVE,3	* unarchive disk entry
	BITDEF XADAI,OVERWRITE,4	* overwrite the file
	BITDEF XADAI,MAKEDIRECTORY,5	* create directory when missing
	BITDEF XADAI,IGNOREGEOMETRY,6	* ignore drive geometry
	BITDEF XADAI,VERIFY,7		* verify is turned on for disk hook

	STRUCTURE xadFileInfo,0
	APTR	xfi_Next
	ULONG	xfi_EntryNumber	* number of entry, starts with 1
	APTR	xfi_EntryInfo  	* additional archiver text
	APTR	xfi_PrivateInfo	* client private, see XAD_OBJPRIVINFOSIZE
	ULONG	xfi_Flags      	* see XADFIF_xxx defines
	APTR	xfi_FileName   	* see XAD_OBJNAMESIZE tag
	APTR	xfi_Comment    	* see XAD_OBJCOMMENTSIZE tag
	ULONG  	xfi_Protection 	* OS 3 bits (including multiuser)
	ULONG	xfi_OwnerUID   	* user ID
	ULONG	xfi_OwnerGID   	* group ID
	APTR	xfi_UserName   	* user name
	APTR	xfi_GroupName  	* group name
	ULONG   xfi_Size       	* size of this file
	ULONG	xfi_GroupCrSize	* crunched size of group
	ULONG	xfi_CrunchSize 	* crunched size
	APTR	xfi_LinkName   	* name and path of link
	STRUCT	xfi_Date,xadDate_SIZE

	BITDEF XADFI,CRYPTED,0		* entry is crypted
	BITDEF XADFI,DIRECTORY,1	* entry is a directory
	BITDEF XADFI,LINK,2		* entry is a link
	BITDEF XADFI,INFOTEXT,3		* file is an information text
	BITDEF XADFI,GROUPED,4		* file is in a crunch group
	BITDEF XADFI,ENDOFGROUP,5	* crunch group ends here
	BITDEF XADFI,NODATE,6		* no date supported, current date is set

* NOTE: the texts passed with that structure must not always be printable.
* Although the clients should add an additional (not counted) zero at the text
* end, the whole file may contain other unprintable stuff (e.g. for DMS).
* So when printing this texts do it on a byte for byte base including
* printability checks.

	STRUCT xadTextInfo,0
	APTR	xti_Next
	ULONG	xti_Size	* maybe zero - no text - e.g. when crypted
	APTR	xti_Text	* and there is no password in xadGetInfo()
	ULONG	xti_Flags	* see XADTIF_xxx defines

	BITDEF	XADTI,CRYPTED,0	* entry is empty, as data was crypted
	BITDEF	XADTI,BANNER,1	* text is a banner
	BITDEF	XADTI,FILEDIZ,2	* text is a file description

	STRUCT xadDiskInfo,0
	APTR	xdi_Next
	ULONG	xdi_EntryNumber  	* number of entry, starts with 1
	APTR	xdi_EntryInfo    	* additional archiver text
	APTR	xdi_PrivateInfo  	* client private, see XAD_OBJPRIVINFOSIZE
	ULONG	xdi_Flags	 	* see XADDIF_xxx defines
	ULONG	xdi_SectorSize
	ULONG	xdi_TotalSectors	* see devices/trackdisk.h
	ULONG	xdi_Cylinders		* to find out what these
	ULONG	xdi_CylSectors	  	* fields mean, they are equal
	ULONG	xdi_Heads	  	* to struct DriveGeometry
	ULONG	xdi_TrackSectors
	ULONG	xdi_LowCyl       	* lowest cylinder stored
	ULONG	xdi_HighCyl      	* highest cylinder stored
	ULONG	xdi_BlockInfoSize	* number of BlockInfo entries
	APTR	xdi_BlockInfo    	* see XADBIF_xxx defines and XAD_OBJBLOCKENTRIES tag
	APTR	xdi_TextInfo		* linked list with info texts

* BlockInfo points to a UBYTE field for every track from first sector of
* lowest cylinder to last sector of highest cylinder. When not used,
* pointer must be 0. Do not use it, when there are no entries!
* This is just for information. The applications still asks the client
* to unarchive whole cylinders and not archived blocks are cleared for
* unarchiving.
	BITDEF XADDI,CRYPTED,0		* entry is crypted

* Some of the crunchers do not store all necessary information, so it
* may be needed to guess some of them. Set the following flags in that case
* and geometry check will ignore these fields.
	BITDEF XADDI,GUESSCYLINDERS,7	  * cylinder number is guessed
	BITDEF XADDI,GUESSCYLSECTORS,8	  * cylsectors is guessed
	BITDEF XADDI,GUESSHEADS,9	  * number of heads is guessed
	BITDEF XADDI,GUESSTRACKSECTORS,10 * tracksectors is guessed
	BITDEF XADDI,GUESSLOWCYL,11	  * lowcyl is guessed
	BITDEF XADDI,GUESSHIGHCYL,12	  * highcyl is guessed

* If it is impossible to set some of the fields, you not to set some of
* these flags. NOTE: XADDIB_NOCYLINDERS is really important, as this turns
* of usage of lowcyl and highcyl keywords. When you have cylinder information,
* you should not use these and instead use guess flags and calculate
* possible values for the missing fields.
	BITDEF XADDI,NOCYLINDERS,15	* cylinder number is not set
	BITDEF XADDI,NOCYLSECTORS,16	* cylsectors is not set
	BITDEF XADDI,NOHEADS,17		* number of heads is not set
	BITDEF XADDI,NOTRACKSECTORS,18	* tracksectors is not set
	BITDEF XADDI,NOLOWCYL,19	* lowcyl is not set
	BITDEF XADDI,NOHIGHCYL,20	* highcyl is not set

* defines for BlockInfo
	BITDEF XADBI,CLEARED,0	* this block was cleared for archiving
	BITDEF XADBI,UNUSED,1	* this block was not archived

*************************************************************************
*                    							*
*    progress report stuff          					*
*                    							*
*************************************************************************

	STRUCTURE xadProgressInfo,0
	ULONG	xpi_Mode	* work modus
	APTR	xpi_Client	* the client doing the work
	APTR	xpi_DiskInfo	* current diskinfo, for disks
	APTR	xpi_FileInfo	* current info for files
	ULONG	xpi_CurrentSize	* current filesize
	ULONG	xpi_LowCyl	* for disks only
	ULONG	xpi_HighCyl	* for disks only
	ULONG	xpi_Status	* see XADPIF flags
	LONG	xpi_Error	* any of the error codes
* NOTE: For disks CurrentSize is Sector*SectorSize, where SectorSize can
* be found in xadDiskInfo structure. So you may output the sector value.

* different progress modes
XADPMODE_ASK		EQU	1
XADPMODE_PROGRESS	EQU	2
XADPMODE_END		EQU	3
XADPMODE_ERROR		EQU	4

* flags for progress hook and ProgressInfo status field
	BITDEF XADPI,OVERWRITE,0	* overwrite the file
	BITDEF XADPI,MAKEDIRECTORY,1	* create the directory
	BITDEF XADPI,IGNOREGEOMETRY,2	* ignore drive geometry
	BITDEF XADPI,OK,16		* all ok, proceed
	BITDEF XADPI,SKIP,17		* skip file

*************************************************************************
*                    							*
*    errors			       					*
*                    							*
*************************************************************************

XADERR_OK		EQU	$0000 * no error
XADERR_UNKNOWN		EQU	$0001 * unknown error
XADERR_INPUT		EQU	$0002 * input data buffers border exceeded
XADERR_OUTPUT		EQU	$0003 * output data buffers border exceeded
XADERR_BADPARAMS	EQU	$0004 * function called with illegal parameters
XADERR_NOMEMORY		EQU	$0005 * not enough memory available
XADERR_ILLEGALDATA	EQU	$0006 * data is corrupted
XADERR_NOTSUPPORTED	EQU	$0007 * command is not supported
XADERR_RESOURCE		EQU	$0008 * required resource missing
XADERR_DECRUNCH		EQU	$0009 * error on decrunching
XADERR_FILETYPE		EQU	$000A * unknown file type
XADERR_OPENFILE		EQU	$000B * opening file failed
XADERR_SKIP		EQU	$000C * file, disk has been skipped
XADERR_BREAK		EQU	$000D * user break in progress hook
XADERR_FILEEXISTS	EQU	$000E * file already exists
XADERR_PASSWORD		EQU	$000F * missing or wrong password
XADERR_MAKEDIR		EQU	$0010 * could not create directory
XADERR_CHECKSUM		EQU	$0011 * wrong checksum
XADERR_VERIFY		EQU	$0012 * verify failed (disk hook)
XADERR_GEOMETRY		EQU	$0013 * wrong drive geometry

*************************************************************************
*                    							*
*    client related stuff       					*
*                    							*
*************************************************************************

	STRUCTURE xadForeman,0
	ULONG	xfm_Security	* should be XADFOREMAN_SECURITY
	ULONG	xfm_ID	      	* must be XADFOREMAN_ID
	UWORD	xfm_Version     * set to XADFOREMAN_VERSION
	UWORD	xfm_Reserved
	APTR	xfm_VersString  * pointer to $VER: string
	APTR	xfm_FirstClient * pointer to first client
	LABEL	xadForman_SIZE

XADFOREMAN_SECURITY	EQU	$70FF4E75 * MOVEQ #-1,D0 and RTS
XADFOREMAN_ID		EQU	$58414446 * 'XADF' identification ID
XADFOREMAN_VERSION	EQU	1

	STRUCTURE xadClient,0
	APTR	xc_Next
	UWORD	xc_Version	* set to XADCLIENT_VERSION
	UWORD	xc_MasterVersion
	UWORD	xc_ClientVersion
	UWORD	xc_ClientRevision
	ULONG	xc_RecogSize	* needed size to recog the type
	ULONG	xc_Flags	* see XADCF_xxx defines
	ULONG	xc_Identifier	* ID of internal clients
	APTR	xc_ArchiverName
	APTR	xc_RecogData
	APTR	xc_GetInfo
	APTR	xc_UnArchive
	APTR	xc_Free
	LABEL	xadClient_SIZE

* xc_RecogData returns 1 when recognized and 0 when not, all the others
* return 0 when ok and XADERR values on error. xc_FinishUnArc has no
* return value.

* function interface
* ASM(BOOL) xc_RecogData(REG(d0, ULONG size), REG(a0, STRPTR data),
*		REG(a6, struct xadMasterBase *xadMasterBase))
* ASM(LONG) xc_GetInfo(REG(a0, struct xadArchiveInfo *ai),
*		REG(a6, struct xadMasterBase *xadMasterBase))
* ASM(LONG) xc_UnArchive(REG(a0, struct xadArchiveInfo *ai),
*		REG(a6, struct xadMasterBase *xadMasterBase))
* ASM(void) xc_Free(REG(a0, struct xadArchiveInfo *ai),
*		REG(a6, struct xadMasterBase *xadMasterBase))

XADCLIENT_VERSION	EQU	1

	BITDEF XADC,FILEARCHIVER,0	* archiver is a file archiver
	BITDEF XADC,DISKARCHIVER,1	* archiver is a disk archiver
	BITDEF XADC,EXTERN,2		* external client, set by xadmaster

*************************************************************************
*                    							*
*    client ID's		       					*
*                    							*
*************************************************************************

* If an external client has set the xc_Identifier field, the internal
* client is replaced.

* disk archivers start with 1000
XADCID_XMASH			EQU	1000
XADCID_SUPERDUPER3		EQU	1001
XADCID_XDISK			EQU	1002
XADCID_PACKDEV			EQU	1003
XADCID_ZOOM			EQU	1004
XADCID_ZOOM5			EQU	1005

* file archivers start with 5000
XADCID_TAR			EQU	5000
XADCID_SDSSFX			EQU	5001
XADCID_LZX			EQU	5002
XADCID_MXMSIMPLEARC		EQU	5003
XADCID_LHPAK			EQU	5004
XADCID_AMIGAPLUSUNPACK		EQU	5005
XADCID_AMIPACK			EQU	5006

* mixed archivers start with 9000
XADCID_DMS			EQU	9000
XADCID_DMSSFX			EQU	9001

	ENDC	; LIBRARIES_XADMASTER_I
