1 #ifndef XPK_XPK_H
    2 #define XPK_XPK_H
    3 
    4 /*
    5 **	$VER: xpk/xpk.h 4.19 (28.10.1998) by SDI
    6 **
    7 **	(C) Copyright 1991-1998 by 
    8 **          Urban Dominik Mueller, Bryan Ford,
    9 **          Christian Schneider, Christian von Roques,
   10 **	    Dirk Stöcker
   11 **	    All Rights Reserved
   12 */
   13 
   14 #ifndef EXEC_LIBRARIES_H
   15   #include <exec/libraries.h>
   16 #endif
   17 
   18 #ifndef EXEC_LISTS_H
   19   #include <exec/lists.h>
   20 #endif
   21 
   22 #ifndef UTILITY_TAGITEM_H
   23   #include <utility/tagitem.h>
   24 #endif
   25 
   26 #ifndef UTILITY_HOOKS_H
   27   #include <utility/hooks.h>
   28 #endif
   29 
   30 #define XPKNAME "xpkmaster.library"
   31 
   32 /***************************************************************************
   33  *
   34  *
   35  *      The packing/unpacking tags
   36  *
   37  * (TRUE) or (FALSE) mean the default value given by xpkmaster.library
   38  *
   39  */
   40 
   41 #define XPK_TagBase	(TAG_USER + ('X'<<8) + 'P')
   42 #define XTAG(a)		(XPK_TagBase+a)
   43 
   44 /* Caller must supply ONE of these to tell Xpk#?ack where to get data from */
   45 #define XPK_InName	  XTAG(0x01) /* Process an entire named file */
   46 #define XPK_InFH	  XTAG(0x02) /* File handle - start from current position */
   47 				     /* If packing partial file, must also supply InLen */
   48 #define XPK_InBuf	  XTAG(0x03) /* Single unblocked memory buffer */
   49 				     /* Must also supply InLen */
   50 #define XPK_InHook	  XTAG(0x04) /* Call custom Hook to read data */
   51 				     /* Must also supply InLen, when hook
   52 				        cannot do! (not for XPK unpacking) */
   53 
   54 /* Caller must supply ONE of these to tell Xpk#?ackFile where to send data to */
   55 #define XPK_OutName	  XTAG(0x10) /* Write (or overwrite) this data file */
   56 #define XPK_OutFH	  XTAG(0x11) /* File handle - write from current position on */
   57 #define XPK_OutBuf	  XTAG(0x12) /* Unblocked buffer - must also supply OutBufLen */
   58 #define XPK_GetOutBuf	  XTAG(0x13) /* Master allocates OutBuf - ti_Data points to buf ptr */
   59 #define XPK_OutHook	  XTAG(0x14) /* Callback Hook to get output buffers */
   60 
   61 /* Other tags for Pack/Unpack */
   62 #define XPK_InLen	  XTAG(0x20) /* Length of data in input buffer  */
   63 #define XPK_OutBufLen	  XTAG(0x21) /* Length of output buffer         */
   64 #define XPK_GetOutLen	  XTAG(0x22) /* ti_Data points to long to receive OutLen    */
   65 #define XPK_GetOutBufLen  XTAG(0x23) /* ti_Data points to long to receive OutBufLen */
   66 #define XPK_Password	  XTAG(0x24) /* Password for de/encoding        */
   67 #define XPK_GetError	  XTAG(0x25) /* ti_Data points to buffer for error message  */
   68 #define XPK_OutMemType	  XTAG(0x26) /* Memory type for output buffer   */
   69 #define XPK_PassThru	  XTAG(0x27) /* Bool: Pass through unrecognized formats on unpack */
   70 #define XPK_StepDown	  XTAG(0x28) /* Bool: Step down pack method if necessary    */
   71 #define XPK_ChunkHook	  XTAG(0x29) /* Call this Hook between chunks   */
   72 #define XPK_PackMethod	  XTAG(0x2a) /* Do a FindMethod before packing  */
   73 #define XPK_ChunkSize	  XTAG(0x2b) /* Chunk size to try to pack with  */
   74 #define XPK_PackMode	  XTAG(0x2c) /* Packing mode for sublib to use  */
   75 #define XPK_NoClobber	  XTAG(0x2d) /* Don't overwrite existing files  */
   76 #define XPK_Ignore	  XTAG(0x2e) /* Skip this tag                   */
   77 #define XPK_TaskPri	  XTAG(0x2f) /* Change priority for (un)packing */
   78 #define XPK_FileName	  XTAG(0x30) /* File name for progress report   */
   79 #define XPK_ShortError	  XTAG(0x31) /* !!! obsolete !!!                */
   80 #define XPK_PackersQuery  XTAG(0x32) /* Query available packers         */
   81 #define XPK_PackerQuery	  XTAG(0x33) /* Query properties of a packer    */
   82 #define XPK_ModeQuery	  XTAG(0x34) /* Query properties of packmode    */
   83 #define XPK_LossyOK	  XTAG(0x35) /* Lossy packing permitted? (FALSE)*/
   84 #define XPK_NoCRC         XTAG(0x36) /* Ignore checksum                 */
   85 /* tags added for xfdmaster support (version 4 revision 25) */
   86 #define XPK_Key16	  XTAG(0x37) /* 16 bit key (unpack only)	*/
   87 #define XPK_Key32	  XTAG(0x38) /* 32 bit key (unpack only)	*/
   88 
   89 /* tag added to support seek (version 5) */
   90 #define XPK_NeedSeek	  XTAG(0x39) /* turn on Seek function usage	*/
   91 
   92 /* preference depending tags added for version 4 - their default value
   93  may depend on preferences, see <xpk/xpkprefs.h> for more info */
   94 
   95 #define XPK_UseXfdMaster  XTAG(0x40) /* Use xfdmaster.library (FALSE)   */
   96 #define XPK_UseExternals  XTAG(0x41) /* Use packers in extern dir (TRUE)*/
   97 #define XPK_PassRequest   XTAG(0x42) /* automatic password req.? (FALSE)*/
   98 #define XPK_Preferences   XTAG(0x43) /* use prefs semaphore ? (TRUE)    */
   99 #define XPK_ChunkReport	  XTAG(0x44) /* automatic chunk report ? (FALSE)*/
  100 
  101 /* tags XTAG(0x50) to XTAG(0x6F) are for XpkPassRequest -- see below */
  102 
  103 #define XPK_MARGIN	256	/* Safety margin for output buffer	*/
  104 
  105 /***************************************************************************
  106  *
  107  *
  108  *     The hook function interface
  109  *
  110  */
  111 
  112 /* Message passed to InHook and OutHook as the ParamPacket */
  113 struct XpkIOMsg {
  114 	ULONG xiom_Type		; /* Read/Write/Alloc/Free/Abort	*/
  115 	APTR  xiom_Ptr		; /* The mem area to read from/write to */
  116 	LONG  xiom_Size		; /* The size of the read/write		*/
  117 	ULONG xiom_IOError	; /* The IoErr() that occurred		*/
  118 	ULONG xiom_Reserved	; /* Reserved for future use		*/
  119 	ULONG xiom_Private1	; /* Hook specific, will be set to 0 by */
  120 	ULONG xiom_Private2	; /* master library before first use	*/
  121 	ULONG xiom_Private3	;
  122 	ULONG xiom_Private4	;
  123 }__attribute__((packed));
  124 
  125 /* The values for XpkIoMsg->Type */
  126 #define XIO_READ    1
  127 #define XIO_WRITE   2
  128 #define XIO_FREE    3
  129 #define XIO_ABORT   4
  130 #define XIO_GETBUF  5
  131 #define XIO_SEEK    6
  132 #define XIO_TOTSIZE 7
  133 
  134 /***************************************************************************
  135  *
  136  *
  137  *      The progress report interface
  138  *
  139  */
  140 
  141 /* Passed to ChunkHook as the ParamPacket */
  142 struct XpkProgress {
  143   ULONG	 xp_Type;	    /* Type of report: XPKPROG_#? numbers	  */
  144   STRPTR xp_PackerName;     /* Brief name of packer being used 		  */
  145   STRPTR xp_PackerLongName; /* Descriptive name of packer being used 	  */
  146   STRPTR xp_Activity;       /* Packing/unpacking message		  */
  147   STRPTR xp_FileName;       /* Name of file being processed, if available */
  148   ULONG	 xp_CCur;           /* Amount of packed data already processed	  */
  149   ULONG	 xp_UCur;           /* Amount of unpacked data already processed  */
  150   ULONG	 xp_ULen;	    /* Amount of unpacked data in file		  */
  151   LONG	 xp_CF;		    /* Compression factor so far		  */
  152   ULONG	 xp_Done;           /* Percentage done already			  */
  153   ULONG	 xp_Speed;          /* Bytes per second, from beginning of stream */
  154   ULONG	 xp_Reserved[8];    /* For future use				  */
  155 }__attribute__((packed));
  156 #define XPKPROG_START	1	/* crunching started */
  157 #define XPKPROG_MID	2	/* somewhere in the mid */
  158 #define XPKPROG_END	3	/* crunching is completed */
  159 
  160 /***************************************************************************
  161  *
  162  *
  163  *       The file info block
  164  *
  165  */
  166 
  167 struct XpkFib {
  168 	ULONG	xf_Type		; /* Unpacked, packed, archive?   */
  169 	ULONG	xf_ULen		; /* Uncompressed length          */
  170 	ULONG	xf_CLen		; /* Compressed length            */
  171 	ULONG	xf_NLen		; /* Next chunk len               */
  172 	ULONG	xf_UCur		; /* Uncompressed bytes so far    */
  173 	ULONG	xf_CCur		; /* Compressed bytes so far      */
  174 	ULONG	xf_ID		; /* 4 letter ID of packer        */
  175 	UBYTE	xf_Packer[6]	; /* 4 letter name of packer      */
  176 	UWORD	xf_SubVersion	; /* Required sublib version      */
  177 	UWORD	xf_MasVersion	; /* Required masterlib version   */
  178 	ULONG	xf_Flags	; /* Password?                    */
  179 	UBYTE	xf_Head[16]	; /* First 16 bytes of orig. file */
  180 	LONG	xf_Ratio	; /* Compression ratio            */
  181 	ULONG	xf_Reserved[8]	; /* For future use               */
  182 }__attribute__((packed));
  183 
  184 #define XPKTYPE_UNPACKED 0        /* Not packed                   */
  185 #define XPKTYPE_PACKED   1        /* Packed file                  */
  186 #define XPKTYPE_ARCHIVE  2        /* Archive                      */
  187 
  188 #define XPKFLAGS_PASSWORD (1<< 0) /* Password needed              */
  189 #define XPKFLAGS_NOSEEK   (1<< 1) /* Chunks are dependent         */
  190 #define XPKFLAGS_NONSTD   (1<< 2) /* Nonstandard file format      */
  191 /* defines added for xfdmaster support (version 4 revision 25) */
  192 #define XPKFLAGS_KEY16	  (1<< 3) /* 16 bit key - for decrunching */
  193 #define XPKFLAGS_KEY32	  (1<< 4) /* 32 bit key - for decrunching */
  194 
  195 /***************************************************************************
  196  *
  197  *
  198  *       The error messages
  199  *
  200  */
  201 
  202 #define XPKERR_OK	  0
  203 #define XPKERR_NOFUNC	   -1	/* This function not implemented	*/
  204 #define XPKERR_NOFILES	   -2	/* No files allowed for this function	*/
  205 #define XPKERR_IOERRIN	   -3	/* Input error happened			*/
  206 #define XPKERR_IOERROUT	   -4	/* Output error happened		*/
  207 #define XPKERR_CHECKSUM	   -5	/* Check sum test failed		*/
  208 #define XPKERR_VERSION	   -6	/* Packed file's version newer than lib */
  209 #define XPKERR_NOMEM	   -7	/* Out of memory			*/
  210 #define XPKERR_LIBINUSE	   -8	/* For not-reentrant libraries		*/
  211 #define XPKERR_WRONGFORM   -9	/* Was not packed with this library	*/
  212 #define XPKERR_SMALLBUF	   -10	/* Output buffer too small		*/
  213 #define XPKERR_LARGEBUF	   -11	/* Input buffer too large		*/
  214 #define XPKERR_WRONGMODE   -12	/* This packing mode not supported	*/
  215 #define XPKERR_NEEDPASSWD  -13	/* Password needed for decoding		*/
  216 #define XPKERR_CORRUPTPKD  -14	/* Packed file is corrupt		*/
  217 #define XPKERR_MISSINGLIB  -15	/* Required library is missing		*/
  218 #define XPKERR_BADPARAMS   -16	/* Caller's TagList was screwed up	*/
  219 #define XPKERR_EXPANSION   -17	/* Would have caused data expansion	*/
  220 #define XPKERR_NOMETHOD    -18	/* Cannot find requested method		*/
  221 #define XPKERR_ABORTED     -19	/* Operation aborted by user		*/
  222 #define XPKERR_TRUNCATED   -20	/* Input file is truncated		*/
  223 #define XPKERR_WRONGCPU    -21	/* Better CPU required for this library	*/
  224 #define XPKERR_PACKED      -22	/* Data are already XPacked		*/
  225 #define XPKERR_NOTPACKED   -23	/* Data not packed			*/
  226 #define XPKERR_FILEEXISTS  -24	/* File already exists			*/
  227 #define XPKERR_OLDMASTLIB  -25	/* Master library too old		*/
  228 #define XPKERR_OLDSUBLIB   -26	/* Sub library too old			*/
  229 #define XPKERR_NOCRYPT     -27	/* Cannot encrypt			*/
  230 #define XPKERR_NOINFO      -28	/* Can't get info on that packer	*/
  231 #define XPKERR_LOSSY       -29	/* This compression method is lossy	*/
  232 #define XPKERR_NOHARDWARE  -30	/* Compression hardware required	*/
  233 #define XPKERR_BADHARDWARE -31	/* Compression hardware failed		*/
  234 #define XPKERR_WRONGPW     -32	/* Password was wrong			*/
  235 #define XPKERR_UNKNOWN	   -33	/* unknown error cause			*/
  236 #define XPKERR_REQTIMEOUT  -34  /* password request reached time out	*/
  237 
  238 #define XPKERRMSGSIZE	80	/* Maximum size of an error message	*/
  239 
  240 /***************************************************************************
  241  *
  242  *
  243  *     The XpkQuery() call
  244  *
  245  */
  246 
  247 struct XpkPackerInfo {
  248 	UBYTE	xpi_Name[24]       ; /* Brief name of the packer          */
  249 	UBYTE	xpi_LongName[32]   ; /* Full name of the packer           */
  250 	UBYTE	xpi_Description[80]; /* One line description of packer    */
  251 	ULONG	xpi_Flags          ; /* Defined below                     */
  252 	ULONG	xpi_MaxChunk       ; /* Max input chunk size for packing  */
  253 	ULONG	xpi_DefChunk       ; /* Default packing chunk size        */
  254 	UWORD	xpi_DefMode        ; /* Default mode on 0..100 scale      */
  255 }__attribute__((packed));
  256 
  257 /* Defines for Flags */
  258 #define XPKIF_PK_CHUNK   (1<< 0) /* Library supplies chunk packing       */
  259 #define XPKIF_PK_STREAM  (1<< 1) /* Library supplies stream packing      */
  260 #define XPKIF_PK_ARCHIVE (1<< 2) /* Library supplies archive packing     */
  261 #define XPKIF_UP_CHUNK   (1<< 3) /* Library supplies chunk unpacking     */
  262 #define XPKIF_UP_STREAM  (1<< 4) /* Library supplies stream unpacking    */
  263 #define XPKIF_UP_ARCHIVE (1<< 5) /* Library supplies archive unpacking   */
  264 #define XPKIF_HOOKIO     (1<< 7) /* Uses full Hook I/O                   */
  265 #define XPKIF_CHECKING   (1<<10) /* Does its own data checking           */
  266 #define XPKIF_PREREADHDR (1<<11) /* Unpacker pre-reads the next chunkhdr */
  267 #define XPKIF_ENCRYPTION (1<<13) /* Sub library supports encryption      */
  268 #define XPKIF_NEEDPASSWD (1<<14) /* Sub library requires encryption      */
  269 #define XPKIF_MODES      (1<<15) /* Sub library has different XpkMode's  */
  270 #define XPKIF_LOSSY      (1<<16) /* Sub library does lossy compression   */
  271 #define XPKIF_NOSEEK	 (1<<17) /* unpacker does not support seeking	 */
  272 
  273 struct XpkMode {
  274   struct XpkMode *xm_Next;   /* Chain to next descriptor for ModeDesc list*/
  275   ULONG   xm_Upto;	     /* Maximum efficiency handled by this mode   */
  276   ULONG   xm_Flags;	     /* Defined below                             */
  277   ULONG   xm_PackMemory;     /* Extra memory required during packing      */
  278   ULONG   xm_UnpackMemory;   /* Extra memory during unpacking             */
  279   ULONG   xm_PackSpeed;      /* Approx packing speed in K per second      */
  280   ULONG   xm_UnpackSpeed;    /* Approx unpacking speed in K per second    */
  281   UWORD   xm_Ratio;	     /* CF in 0.1%				  */
  282   UWORD   xm_ChunkSize;	     /* Desired chunk size in K (!!) for this mode*/
  283   UBYTE   xm_Description[10];/* 7 character mode description              */
  284 }__attribute__((packed));
  285 
  286 /* Defines for XpkMode.Flags */
  287 #define XPKMF_A3000SPEED (1<< 0) /* Timings on old standard environment */
  288 				 /* obsolete */
  289 #define XPKMF_PK_NOCPU   (1<< 1) /* Packing not heavily CPU dependent	*/
  290 #define XPKMF_UP_NOCPU   (1<< 2) /* Unpacking... (i.e. hardware modes)	*/
  291 
  292 #define MAXPACKERS 100
  293 
  294 struct XpkPackerList {
  295 	ULONG	xpl_NumPackers;
  296 	UBYTE	xpl_Packer[MAXPACKERS][6];
  297 }__attribute__((packed));
  298 
  299 /***************************************************************************
  300  *
  301  *
  302  *     The XpkSeek() call (library version 5)
  303  *
  304  */
  305 
  306 #define XPKSEEK_BEGINNING	-1
  307 #define XPKSEEK_CURRENT		0
  308 #define XPKSEEK_END		1
  309 
  310 /***************************************************************************
  311  *
  312  *
  313  *     The XpkPassRequest() call (library version 4)
  314  *
  315  */
  316 
  317 #define XPK_PassChars	  XTAG(0x50) /* which chars should be used */
  318 #define XPK_PasswordBuf   XTAG(0x51) /* buffer to write password to */
  319 #define XPK_PassBufSize   XTAG(0x52) /* size of password buffer */
  320 #define XPK_Key16BitPtr	  XTAG(0x53) /* pointer to UWORD var for key data */
  321 #define XPK_Key32BitPtr	  XTAG(0x54) /* pointer to ULONG var for key data */
  322 #define XPK_PubScreen	  XTAG(0x55) /* pointer to struct Screen */
  323 #define XPK_PassTitle	  XTAG(0x56) /* Text shown in Screen title */
  324 #define XPK_TimeOut	  XTAG(0x57) /* Timeout time of requester in seconds */
  325 /* request position and verify tags (version 4 revision 25) */
  326 #define XPK_PassWinLeft	  XTAG(0x58) /* distance from left screen border */
  327 #define XPK_PassWinTop	  XTAG(0x59) /* distance form top screen border */
  328 #define XPK_PassWinWidth  XTAG(0x5A) /* width of requester window */
  329 #define XPK_PassWinHeight XTAG(0x5B) /* height of requester window */
  330 #define XPK_PassCenter    XTAG(0x5C) /* Left and Top are used as center coords */
  331 #define XPK_PassVerify	  XTAG(0x5D) /* force user to verify password */
  332 
  333 /* XPKPASSFF defines for XPK_PassChars. Do not use. Use XPKPASSFLG defines */
  334 
  335 #define XPKPASSFF_30x39		(1<< 0)	/* all numbers		*/
  336 #define XPKPASSFF_41x46		(1<< 1)	/* chars 'A' to 'F'	*/
  337 #define XPKPASSFF_61x66		(1<< 2)	/* chars 'a' to 'f'	*/
  338 #define XPKPASSFF_47x5A		(1<< 3)	/* chars 'G' to 'Z'	*/
  339 #define XPKPASSFF_67x7A		(1<< 4)	/* chars 'g' to 'z'	*/
  340 #define XPKPASSFF_20		(1<< 5)	/* space character	*/
  341 #define XPKPASSFF_SPECIAL7BIT	(1<< 6) /* special 7 bit chars  */
  342 		/* all chars 0x20 to 0x7E without above defined */
  343 
  344 #define XPKPASSFF_C0xDE		(1<< 7)	/* upper special chars	*/
  345 #define XPKPASSFF_DFxFF		(1<< 8)	/* lower special chars	*/
  346 #define XPKPASSFF_SPECIAL8BIT	(1<< 9)	/* special 8 bit chars	*/
  347 		/* all chars 0xA0 to 0xBF */
  348 
  349 /* Control characters (0x00 to 0x1F, 0x7F and 0x80 to 0x9F) are not
  350  * useable. This also means carriage return, linefeed, tab stop and
  351  * other controls are not usable.
  352  */
  353 
  354 /* flags for XPK_PassChars, XPKPASSFLG_PRINTABLE is default
  355  *
  356  * NUMERIC	: numbers
  357  * HEXADECIMAL	: hex numbers
  358  * ALPHANUMERIC	: numbers and letters
  359  * INTALPHANUM	: numbers and international letters
  360  * ASCII7	: 7 Bit ASCII
  361  * PRINTABLE	: all printable characters
  362  */
  363 
  364 #define XPKPASSFLG_NUMERIC	XPKPASSFF_30x39
  365 #define XPKPASSFLG_HEXADECIMAL	(XPKPASSFF_30x39|XPKPASSFF_41x46|XPKPASSFF_61x66)
  366 #define XPKPASSFLG_ALPHANUMERIC	(XPKPASSFLG_HEXADECIMAL|XPKPASSFF_47x5A|XPKPASSFF_67x7A)
  367 #define XPKPASSFLG_INTALPHANUM	(XPKPASSFLG_ALPHANUMERIC|XPKPASSFF_C0xDE|XPKPASSFF_DFxFF)
  368 #define XPKPASSFLG_ASCII7	(XPKPASSFLG_ALPHANUMERIC|XPKPASSFF_SPECIAL7BIT)
  369 #define XPKPASSFLG_PRINTABLE	(XPKPASSFLG_INTALPHANUM|XPKPASSFF_SPECIAL7BIT|XPKPASSFF_SPECIAL8BIT|XPKPASSFF_20)
  370 
  371 /***************************************************************************
  372  *
  373  *
  374  *     The XpkAllocObject() call (library version 4)
  375  *
  376  * use this always with library version >= 4, do NO longer allocate the
  377  * structures yourself
  378  *
  379  */
  380 
  381 #define XPKOBJ_FIB		0	/* XpkFib structure */
  382 #define XPKOBJ_PACKERINFO	1	/* XpkPackerInfo structure */
  383 #define XPKOBJ_MODE		2	/* XpkMode structure */
  384 #define XPKOBJ_PACKERLIST	3	/* XpkPackerList structure */
  385 
  386 #endif /* XPK_XPK_H */