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 */