
/*
**   $Filename: xpkarchive.h $
**   $Release: 1.0 $
**
**
**
**   (C) Copyright 1993 Matthias Meixner
**       All Rights Reserved
*/

#ifndef LIBRARIES_XAR_H
#define LIBRARIES_XAR_H

#include <libraries/xpk.h>
#include <proto/exec.h>
#include <exec/types.h>
#include <exec/lists.h>
#include <exec/memory.h>
#include <proto/dos.h>
#include <dos/dos.h>

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#include <libraries/dos.h>
#include <libraries/dosextens.h>

#define SYS_AMIGA        ('A'<<8|'M')
#define SYS_ATARI_ST     ('S'<<8|'T')
#define SYS_ARCHIMEDES   ('A'<<8|'R')
#define SYS_MS_DOS       ('M'<<8|'S')
#define SYS_UNIX         ('U'<<8|'X')
#define SYS_MACINTOSH    ('M'<<8|'A')
#define SYS_HELIOS       ('H'<<8|'E')

struct Time {
   UBYTE Year,Month,Day;
   UBYTE Hour,Min,Sec;
};

struct FileData {
   UBYTE CHKSum;           /* FileData-Checksum */
   UBYTE Method,Version;   /* Method=1 , Version=XpkBase->lib_Version  */
   UBYTE Generation;       /* Generation of the file                   */
   USHORT SysID;           /* SystemID : SYS_AMIGA                     */
   ULONG Filesize;         /* original Filesize                        */
   struct Time Time;       /* Date of the file                         */
   USHORT CRC;             /* Checksum of the file (optional)          */
   ULONG Protection;       /* Protectionbits                           */
};

#ifndef LIBRARIES_XAR_PRIVATE_H

typedef void XarHandle;
typedef void XarLock;

#endif

#ifndef TAG_DONE
#define TAG_DONE   (0L)     /* terminates array of TagItems. ti_Data unused */
#define TAG_IGNORE (1L)     /* ignore this item, not end of array           */
#define TAG_USER   (1L<<31) /* differentiates user tags from system tags    */
#endif

#define XAR_TagBase (TAG_USER + 'A'*256 + 'R')
#define ATAG(a)     (XAR_TagBase+a)

#define XAR_FileName           ATAG(1)
#define XAR_FileNote           ATAG(2)
#define XAR_TimeDay            ATAG(3)
#define XAR_TimeMonth          ATAG(4)
#define XAR_TimeYear           ATAG(5)
#define XAR_TimeHour           ATAG(6)
#define XAR_TimeMin            ATAG(7)
#define XAR_TimeSec            ATAG(8)
#define XAR_DateStamp          ATAG(9)
#define XAR_CRC                ATAG(10)
#define XAR_Protection         ATAG(11)
#define XAR_Generation         ATAG(12)
#define XAR_Error              ATAG(13)
#define XAR_ArcLock            ATAG(14)
#define XAR_Archive            ATAG(15)
#define XAR_DestArchive        ATAG(16)
#define XAR_ArchiveMode        ATAG(17)
#define XAR_NewGeneration      ATAG(18)
#define XAR_FileIndex          ATAG(19)
#define XAR_NewName            ATAG(20)
#define XAR_CurrentTime        ATAG(21)
#define XAR_AutoNextGen        ATAG(22)
#define XAR_ArchiveName        ATAG(23)

#define XAR_ModeOldArchive     0
#define XAR_ModeNewArchive     1
#define XAR_ModeAppend         2

#define XAR_InFH             XPK_InFH
#define XAR_InName           XPK_InName
#define XAR_InBuf            XPK_InBuf
#define XAR_InHook           XPK_InHook
#define XAR_InLen            XPK_InLen
#define XAR_OutFH            XPK_OutFH
#define XAR_OutName          XPK_OutName
#define XAR_OutBuf           XPK_OutBuf
#define XAR_OutHook          XPK_OutHook


#define XPK_COMPRESSION 1    /* Compressionmode for FileData */
#define XAR_FileDeleted 255

#define XARERR_NO_ERROR                0L

/* Informational */
#define XARINF_NEW_ARCHIVE             1L   /* new archive was created  */
#define XARINF_NOT_EXCLUSIVE           2L
#define XARINF_ARCHIVE_CORRUPT         3L

/* Warnings */
#define XARWARNING_LEVEL       (1L<<8)
#define XARWARN_DUPLICATE_ARCTYPE      (XARWARNING_LEVEL+1L) /* duplicate archive-type   */
#define XARWARN_DUPLICATE_FILEDATA     (XARWARNING_LEVEL+2L) /* duplicate filedata-chunk */
#define XARWARN_DUPLICATE_FILENOTE     (XARWARNING_LEVEL+3L) /* duplicate filenote-chunk */
#define XARWARN_INVALID_FILENOTE       (XARWARNING_LEVEL+4L) /* invalid filenote         */
#define XARWARN_BODY_WITHOUT_FILEDATA  (XARWARNING_LEVEL+5L) /* file without informationheader */
#define XARWARN_ARCHIVE_CORRUPT        (XARWARNING_LEVEL+6L) /* archive corrupt */
#define XARWARN_FILEDATA_WITHOUT_BODY  (XARWARNING_LEVEL+7L) /* fileheader without file */

/* Errorrcodes */
#define XARERROR_LEVEL        (1L<<9)
#define XARERR_NO_MEMORY            (XARERROR_LEVEL+1L)  /* No Memory                                                     */
#define XARERR_CANNOT_CREATE        (XARERROR_LEVEL+2L)  /* Cannot create archive                                         */
#define XARERR_CANNOT_OPEN          (XARERROR_LEVEL+3L)  /* Cannot open archive                                           */
#define XARERR_WRITE_ERROR          (XARERROR_LEVEL+4L)  /* Write error                                                   */
#define XARERR_READ_ERROR           (XARERROR_LEVEL+5L)  /* Read error                                                    */
#define XARERR_NO_ARCHIVE           (XARERROR_LEVEL+6L)  /* File specified is no archive supported by xpkarchive.library  */
#define XARERR_INTERNAL_ERROR       (XARERROR_LEVEL+7L)  /* Internal error, should never occur                            */
#define XARERR_INVALID_TAGS         (XARERROR_LEVEL+8L)  /* Incomplete tags                                               */
#define XARERR_FILE_NOT_FOUND       (XARERROR_LEVEL+9L)  /* File not found                                                */
#define XARERR_INVALID_FILEINDEX    (XARERROR_LEVEL+10L) /* The fileindex is out of range                                 */
#define XARERR_CANNOT_EXAMINE       (XARERROR_LEVEL+11L) /* The dos function Examine() failed                             */
#define XARERR_ARCHIVE_CORRUPT      (XARERROR_LEVEL+12L) /* Archive corrupt                                               */
#define XARERR_INVALID_TYPE         (XARERROR_LEVEL+13L) /* Invalid type of the archive                                   */
#define XARERR_SAME_SRC_AND_DST     (XARERROR_LEVEL+14L) /* The source and destination archive is the same                */
#define XARERR_DIFFERENT_TYPES      (XARERROR_LEVEL+15L) /* The types of the source and destination archive is different  */

#ifndef LIBRARIES_XAR_PRIVATE_H

#ifndef NO_XAR_PROTO
XarHandle *XarOpenArchiveA(struct TagItem *);
XarHandle *XarOpenArchive(ULONG,...);
XarLock   *XarGetLock(XarHandle *);
XarLock   *XarNextLock(XarLock *);
XarLock   *XarGetPrevLock(XarLock *);
XarLock   *XarFindFileA(struct TagItem *);
XarLock   *XarFindFile(ULONG,...);
XarLock   *XarCopyFileA(struct TagItem *);
XarLock   *XarCopyFile(ULONG,...);

LONG XarCloseArchive(XarHandle *);
LONG XarSetGenerationA(struct TagItem *);
LONG XarSetGeneration(ULONG,...);
LONG XarModifyFileDataA(struct TagItem *);
LONG XarModifyFileData(ULONG,...);
LONG XarNextGenerationA(struct TagItem *);
LONG XarNextGeneration(ULONG,...);
LONG XarRenameFileA(struct TagItem *);
LONG XarRenameFile(ULONG,...);
LONG XarSetFileNoteA(struct TagItem *);
LONG XarSetFileNote(ULONG,...);

XarLock  * XarAddFileA(struct TagItem *);
XarLock  * XarAddFile(ULONG,...);
LONG  XarExtractFileA(struct TagItem *);
LONG  XarExtractFile(ULONG,...);

UBYTE  *XarGetType(XarHandle *);
UBYTE  *XarGetFileName(XarLock *);
UBYTE  *XarGetFileNote(XarLock *);
ULONG   XarGetFileSize(XarLock *);
ULONG   XarGetFileIndex(XarLock *);
UBYTE  XarIsXpkArchive(XarHandle *);

struct FileData  *XarGetFileData(XarLock *);
LONG  XarExamine(XarLock *,struct XpkFib *);
#endif

#ifndef NO_XAR_PRAGMAS
#pragma libcall XpkArchiveBase XarAddFileA 1E 801
#pragma libcall XpkArchiveBase XarCloseArchive 24 801
#pragma libcall XpkArchiveBase XarCopyFileA 2A 801
#pragma libcall XpkArchiveBase XarExamine 30 9802
#pragma libcall XpkArchiveBase XarExtractFileA 36 801
#pragma libcall XpkArchiveBase XarFindFileA 3C 801
#pragma libcall XpkArchiveBase XarGetFileData 42 801
#pragma libcall XpkArchiveBase XarGetFileIndex 48 801
#pragma libcall XpkArchiveBase XarGetFileName 4E 801
#pragma libcall XpkArchiveBase XarGetFileNote 54 801
#pragma libcall XpkArchiveBase XarGetFileSize 5A 801
#pragma libcall XpkArchiveBase XarGetLock 60 801
#pragma libcall XpkArchiveBase XarGetType 66 801
#pragma libcall XpkArchiveBase XarIsXpkArchive 6C 801
#pragma libcall XpkArchiveBase XarModifyFileDataA 72 801
#pragma libcall XpkArchiveBase XarNextGenerationA 78 801
#pragma libcall XpkArchiveBase XarNextLock 7E 801
#pragma libcall XpkArchiveBase XarOpenArchiveA 84 801
#pragma libcall XpkArchiveBase XarPrevLock 8A 801
#pragma libcall XpkArchiveBase XarRenameFileA 90 801
#pragma libcall XpkArchiveBase XarSetFileNoteA 96 801
#endif

#endif

#endif
