
/*
   The file is written by Lee Jones.  Distribution is unlimited.
*/

/* applefile.h - Data structures used by AppleSingle/AppleDouble
 * file format
 *
 * Written by Lee Jones, 22-Oct-1993
 *
 * For definitive information, see "AppleSingle/AppleDouble
 * Formats for Foreign Files Developer's Note"; Apple Computer
 * Inc.; (c) 1990.
 *
 * Other details were added from:
 *   Inside Macintosh [old version], volumes II to VI,
 *   Apple include files supplied with Think C 5.0.1,
 *   Microsoft MS-DOS Programmer's Reference, version 5, and
 *   Microsoft C 6.00a's dos.h include file.
 *
 * I don't have ProDOS or AFP Server documentation so related
 * entries may be a bit skimpy.
 *
 * Edit history:
 *
 * when       who  why
 * ---------  ---  ------------------------------------------
 * 22-Oct-93  LMJ  Pull together from Inside Macintosh,
 *                 Developer's Note, etc
 * 26-Oct-93  LMJ  Finish writing first version and list
 *                 references
 * 06-Feb-94  EEF  Very minor cleanup
 */

/* REMINDER: the Motorola 680x0 is a big-endian architecture! */

typedef Uint32 OSType;                  /* 32 bit field */

/* In the QuickDraw coordinate plane, each coordinate is
 * -32767..32767. Each point is at the intersection of a
 * horizontal grid line and a vertical grid line.  Horizontal
 * coordinates increase from left to right. Vertical
 * coordinates increase from top to bottom. This is the way
 * both a TV screen and page of English text are scanned:
 * from top left to bottom right.
 */

struct Point /* spot in QuickDraw 2-D grid */
{
    Sint16 v; /* vertical coordinate */
    Sint16 h; /* horizontal coordinate */
}; /* Point */

typedef struct Point Point;

/* See older Inside Macintosh, Volume II page 84 or Volume IV
 * page 104.
 */

struct FInfo /* Finder information */
{
    OSType fdType; /* File type, 4 ASCII chars */
    OSType fdCreator; /* File's creator, 4 ASCII chars */
    Uint16 fdFlags; /* Finder flag bits */
    Point  fdLocation; /* file's location in folder */
    Sint16 fdFldr; /* file 's folder (aka window) */
}; /* FInfo */

typedef struct FInfo FInfo;

/*
 * Masks for finder flag bits (field fdFlags in struct
 * FInfo).
 */

#define F_fOnDesk       0x0001 /* file is on desktop (HFS only) */
#define F_maskColor     0x000E /* color coding (3 bits) */
/*                      0x0010 /* reserved (System 7) */
#define F_fSwitchLaunch 0x0020 /* reserved (System 7) */
#define F_fShared       0x0040 /* appl available to multiple users */
#define F_fNoINITs      0x0080 /* file contains no INIT resources */
#define F_fBeenInited   0x0100 /* Finder has loaded bundle res. */
/*                      0x0200  /* reserved (System 7) */
#define F_fCustomIcom   0x0400 /* file contains custom icon */
#define F_fStationary   0x0800 /* file is a stationary pad */
#define F_fNameLocked   0x1000 /* file can't be renamed by Finder */
#define F_fHasBundle    0x2000 /* file has a bundle */
#define F_fInvisible    0x4000 /* file's icon is invisible */
#define F_fAlias        0x8000 /* file is an alias file (System 7) */

/* See older Inside Macintosh, Volume IV, page 105.
 */

struct FXInfo /* Extended finder information */

{
    Sint16 fdIconID; /* icon ID number */
    Sint16 fdUnused[3]; /* spare */
    Sint8  fdScript; /* scrip flag and code */
    Sint8  fdXFlags; /* reserved */
    Sint16 fdComment; /* comment ID number */
    Sint32 fdPutAway; /* home directory ID */
}; /* FXInfo */

typedef struct FXInfo FXInfo;

/* Pieces used by AppleSingle & AppleDouble (defined later). */

struct ASHeader /* header portion of AppleSingle */
{
    /* AppleSingle = 0x00051600; AppleDouble = 0x00051607 */
    Uint32 magicNum; /* internal file type tag */
    Uint32 versionNum; /* format version: 2 = 0x00020000 */
    Uint8  filler[16]; /* filler, currently all bits 0 */
    Uint16 numEntries; /* number of entries which follow */
}; /* ASHeader */

typedef struct ASHeader ASHeader;

struct ASEntry /* one AppleSingle entry descriptor */
{
    Uint32 entryID; /* entry type: see list, 0 invalid */
    Uint32 entryOffset; /* offset, in octets, from beginning */
                        /* of file to this entry's data */
    Uint32 entryLength; /* length of data in octets */
}; /* ASEntry */

typedef struct ASEntry ASEntry;

/* Apple reserves the range of entry IDs from 1 to 0x7FFFFFFF.
 * Entry ID 0 is invalid.  The rest of the range is available
 * for applications to define their own entry types.  "Apple does
 * not arbitrate the use of the rest of the range."
 */

#define AS_DATA         1 /* data fork */
#define AS_RESOURCE     2 /* resource fork */
#define AS_REALNAME     3 /* File's name on home file system */
#define AS_COMMENT      4 /* standard Mac comment */
#define AS_ICONBW       5 /* Mac black & white icon */
#define AS_ICONCOLOR    6 /* Mac color icon */
        /*              7       /* not used */
#define AS_FILEDATES    8 /* file dates; create, modify, etc */
#define AS_FINDERINFO   9 /* Mac Finder info & extended info */
#define AS_MACINFO      10 /* Mac file info, attributes, etc */
#define AS_PRODOSINFO   11 /* Pro-DOS file info, attrib., etc */
#define AS_MSDOSINFO    12 /* MS-DOS file info, attributes, etc */
#define AS_AFPNAME      13 /* Short name on AFP server */
#define AS_AFPINFO      14 /* AFP file info, attrib., etc */

#define AS_AFPDIRID     15 /* AFP directory ID */

/* matrix of entry types and their usage:
 *
 *                   Macintosh    Pro-DOS    MS-DOS    AFP server
 *                   ---------    -------    ------    ----------
 *  1   AS_DATA         xxx         xxx       xxx         xxx
 *  2   AS_RESOURCE     xxx         xxx
 *  3   AS_REALNAME     xxx         xxx       xxx         xxx
 *
 *  4   AS_COMMENT      xxx
 *  5   AS_ICONBW       xxx
 *  6   AS_ICONCOLOR    xxx
 *
 *  8   AS_FILEDATES    xxx         xxx       xxx         xxx
 *  9   AS_FINDERINFO   xxx
 * 10   AS_MACINFO      xxx
 *
 * 11   AS_PRODOSINFO               xxx
 * 12   AS_MSDOSINFO                          xxx
 *
 * 13   AS_AFPNAME                                        xxx
 * 14   AS_AFPINFO                                        xxx
 * 15   AS_AFPDIRID                                       xxx
 */

/* entry ID 1, data fork of file - arbitrary length octet string */

/* entry ID 2, resource fork - arbitrary length opaque octet string;
 *              as created and managed by Mac O.S. resoure manager
 */

/* entry ID 3, file's name as created on home file system - arbitrary
 *              length octet string; usually short, printable ASCII
 */

/* entry ID 4, standard Macintosh comment - arbitrary length octet
 *              string; printable ASCII, claimed 200 chars or less
 */

/* This is probably a simple duplicate of the 128 octet bitmap
 * stored as the 'ICON' resource or the icon element from an 'ICN#'
 * resource.
 */

struct ASIconBW /* entry ID 5, standard Mac black and white icon */
{
    Uint32 bitrow[32]; /* 32 rows of 32 1-bit pixels */
}; /* ASIconBW */

typedef struct ASIconBW ASIconBW;

/* entry ID 6, "standard" Macintosh color icon - several competing
 *              color icons are defined.  Given the copyright dates
 * of the Inside Macintosh volumes, the 'cicn' resource predominated
 * when the AppleSingle Developer's Note was written (most probable
 * candidate).  See Inside Macintosh, Volume V, pages 64 & 80-81 for
 * a description of 'cicn' resources.
 *
 * With System 7, Apple introduced icon families.  They consist of:
 *      large (32x32) B&W icon, 1-bit/pixel,    type 'ICN#',
 *      small (16x16) B&W icon, 1-bit/pixel,    type 'ics#',
 *      large (32x32) color icon, 4-bits/pixel, type 'icl4',
 *      small (16x16) color icon, 4-bits/pixel, type 'ics4',
 *      large (32x32) color icon, 8-bits/pixel, type 'icl8', and
 *      small (16x16) color icon, 8-bits/pixel, type 'ics8'.
 * If entry ID 6 is one of these, take your pick.  See Inside
 * Macintosh, Volume VI, pages 2-18 to 2-22 and 9-9 to 9-13, for
 * descriptions.
 */

/* entry ID 7, not used */

/* Times are stored as a "signed number of seconds before of after
 * 12:00 a.m. (midnight), January 1, 2000 Greenwich Mean Time (GMT).
 * Applications must convert to their native date and time
 * conventions." Any unknown entries are set to 0x80000000
 * (earliest reasonable time).
 */

struct ASFileDates      /* entry ID 8, file dates info */
{
    Sint32 create; /* file creation date/time */
    Sint32 modify; /* last modification date/time */
    Sint32 backup; /* last backup date/time */
    Sint32 access; /* last access date/time */
}; /* ASFileDates */

typedef struct ASFileDates ASFileDates;

/* See older Inside Macintosh, Volume II, page 115 for
 * PBGetFileInfo(), and Volume IV, page 155, for PBGetCatInfo().
 */

/* entry ID 9, Macintosh Finder info & extended info */
struct ASFinderInfo
{
    FInfo ioFlFndrInfo; /* PBGetFileInfo() or PBGetCatInfo() */
    FXInfo ioFlXFndrInfo; /* PBGetCatInfo() (HFS only) */
}; /* ASFinderInfo */

typedef struct ASFinderInfo ASFinderInfo;

struct ASMacInfo        /* entry ID 10, Macintosh file information */
{
    Uint8  filler[3]; /* filler, currently all bits 0 */
    Uint8  ioFlAttrib; /* PBGetFileInfo() or PBGetCatInfo() */
}; /* ASMacInfo */

typedef struct ASMacInfo ASMacInfo;

#define AS_PROTECTED    0x0002 /* protected bit */
#define AS_LOCKED       0x0001 /* locked bit */

/* NOTE: ProDOS-16 and GS/OS use entire fields.  ProDOS-8 uses low
 * order half of each item (low byte in access & filetype, low word
 * in auxtype); remainder of each field should be zero filled.
 */

struct ASProdosInfo     /* entry ID 11, ProDOS file information */
{
    Uint16 access; /* access word */
    Uint16 filetype; /* file type of original file */
    Uint32 auxtype; /* auxiliary type of the orig file */
}; /* ASProDosInfo */

typedef struct ASProdosInfo ASProdosInfo;

/* MS-DOS file attributes occupy 1 octet; since the Developer Note
 * is unspecific, I've placed them in the low order portion of the
 * field (based on example of other ASMacInfo & ASProdosInfo).
 */

struct ASMsdosInfo      /* entry ID 12, MS-DOS file information */
{
    Uint8  filler; /* filler, currently all bits 0 */
    Uint8  attr; /* _dos_getfileattr(), MS-DOS */
                                /* interrupt 21h function 4300h */
}; /* ASMsdosInfo */

typedef struct ASMsdosInfo ASMsdosInfo;

#define AS_DOS_NORMAL   0x00 /* normal file (all bits clear) */
#define AS_DOS_READONLY 0x01 /* file is read-only */
#define AS_DOS_HIDDEN   0x02 /* hidden file (not shown by DIR) */
#define AS_DOS_SYSTEM   0x04 /* system file (not shown by DIR) */
#define AS_DOS_VOLID    0x08 /* volume label (only in root dir) */
#define AS_DOS_SUBDIR   0x10 /* file is a subdirectory */
#define AS_DOS_ARCHIVE  0x20 /* new or modified (needs backup) */

/* entry ID 13, short file name on AFP server - arbitrary length
 *              octet string; usualy printable ASCII starting with
 *              '!' (0x21)
 */

struct ASAfpInfo   /* entry ID 12, AFP server file information */
{
    Uint8  filler[3]; /* filler, currently all bits 0 */
    Uint8  attr; /* file attributes */
}; /* ASAfpInfo */

typedef struct ASAfpInfo ASAfpInfo;

#define AS_AFP_Invisible    0x01 /* file is invisible */
#define AS_AFP_MultiUser    0x02 /* simultaneous access allowed */
#define AS_AFP_System       0x04 /* system file */
#define AS_AFP_BackupNeeded 0x40 /* new or modified (needs backup) */

struct ASAfpDirId       /* entry ID 15, AFP server directory ID */
{
    Uint32 dirid; /* file's directory ID on AFP server */
}; /* ASAfpDirId */

typedef struct ASAfpDirId ASAfpDirId;

/*
 * The format of an AppleSingle/AppleDouble header
 */
struct AppleSingle /* format of disk file */
{
    ASHeader header; /* AppleSingle header part */
    ASEntry  entry[1]; /* array of entry descriptors */
/* Uint8   filedata[];          /* followed by rest of file */
}; /* AppleSingle */

typedef struct AppleSingle AppleSingle;

/*
 * FINAL REMINDER: the Motorola 680x0 is a big-endian architecture!
 */

/* End of applefile.h */
