/***************************************** * * GOB File System * * Here's what Merriam-Webster says about "gob": --Chuck * Entry: gob * Function: noun * Etymology: Middle English gobbe, from Middle French gobe large piece of food, * back-formation from gobet * Date: 14th century * 1 : LUMP * 2 : a large amount -- usually used in plural * * Purpose: Provide fast, efficient disk access on a variety of platforms. * * Implementation: * The GOB system maintains two files -- GOB and GFC. The GOB file is actually * an archive of many files split into variable size, compressed blocks. The GFC, * GOB File Control, contains 3 tables -- a block table, basic file table, and * extended file table. The block table is analogous to a DOS FAT. The basic * file table contains a minimal set of file information to handle basic reading * tasks. The extended file table is optionally loaded and contains additional * file information. File names are case insensitive. * * Files can be read in a normal manner. Open, read, seek and close * operations are all provided. Files can only be written in a single * contiguous chunk of blocks at the end of an archive. Reads are processed * through a configurable number of read ahead buffers to in an effort to * minimize both reads and seeks. Other operations including delete, verify, * access, and get size are also supported on files inside an archive. * * The system supports read profiling. By supplying a file read callback * function, the library will output the block number of each read. This can * be used rearrange block in the archive to minimize seek times. The * GOBRearrange sorts files in an archive. * * Supports block based caching. Primarily aimed at caching files off a DVD/CD * to a faster hard disk. * * Future Work: * * Dependencies: vvInt, snprintf, zlib * Owner: Chris McEvoy * History: * 09/23/2001 Original version * 10/28/2002 Merged into vvtech * * Copyright (C) 2002, Vicarious Visions, Inc. All Rights Reserved. * * UNPUBLISHED -- Rights reserved under the copyright laws of the * United States. Use of a copyright notice is precautionary only and * does not imply publication or disclosure. * * THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION * OF VICARIOUS VISIONS, INC. ANY DUPLICATION, MODIFICATION, * DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR * EXPRESS WRITTEN PERMISSION OF VICARIOUS VISIONS, INC. * *****************************************/ /* This is an unofficial branch of GOB, for Jedi Academy Maintainer: Brian Osman */ #ifndef GOBLIB_H__ #define GOBLIB_H__ #ifdef __cplusplus extern "C" { #endif #define GOB_MAGIC_IDENTIFIER 0x8008 #define GOB_MAX_FILE_NAME_LEN 96 #define GOB_MAX_OPEN_FILES 16 #define GOB_MAX_CODECS 2 #define GOB_INFINITE_RATIO 1000 #define GOB_READ_RETRYS 3 #define GOB_MAX_FILES (16*1024) #define GOB_MAX_BLOCKS 32767 #define GOB_BLOCK_SIZE (64*1024) #define GOB_BLOCK_ALIGNMENT 2048 #define GOB_MEM_ALIGNMENT 64 #define GOB_COMPRESS_OVERHEAD 1024 #define GOB_INVALID_SIZE 0xFFFFFFFF #define GOB_INVALID_BLOCK 0xFFFFFFFF #define GOB_TRUE 1 #define GOB_FALSE 0 #define GOBERR_OK 0 #define GOBERR_NOT_INIT 1 #define GOBERR_FILE_NOT_FOUND 2 #define GOBERR_FILE_READ 3 #define GOBERR_FILE_WRITE 4 #define GOBERR_NO_MEMORY 5 #define GOBERR_ALREADY_INIT 6 #define GOBERR_ALREADY_OPEN 7 #define GOBERR_INVALID_ACCESS 8 #define GOBERR_NOT_GOB_FILE 9 #define GOBERR_NOT_OPEN 10 #define GOBERR_CANNOT_CREATE 11 #define GOBERR_TOO_MANY_OPEN 12 #define GOBERR_INVALID_SEEK 13 #define GOBERR_TOO_MANY_FILES 14 #define GOBERR_FILE_RENAME 15 #define GOBERR_PROFILE_OFF 16 #define GOBERR_PROFILE_ON 17 #define GOBERR_NO_EXTENDED 18 #define GOBERR_DUP_HASH 19 #define GOBERR_TOO_MANY_BLOCKS 20 #define GOBERR_COMPRESS_FAIL 21 #define GOBERR_NO_SUITABLE_CODEC 22 #define GOBACCESS_READ 0 #define GOBACCESS_WRITE 1 #define GOBACCESS_RW 2 #define GOBSEEK_START 0 #define GOBSEEK_CURRENT 1 #define GOBSEEK_END 2 #define GOB_CODEC_MASK(n) ((GOBUInt32)(1u<<(n))) #define GOB_CODEC_MASK_ANY ((GOBUInt32)(-1)) #define GOBMARKER_STARTBLOCK ('L' | 'B' << 8 | 'T' << 16 | 'S' << 24) #define GOBMARKER_ENDBLOCK ('L' | 'B' << 8 | 'N' << 16 | 'E' << 24) typedef int int32; typedef unsigned int uint32; //#define bool int //#define false 0 //#define true 1 typedef unsigned long ulong; typedef unsigned char byte; typedef int32 GOBInt32; typedef uint32 GOBUInt32; typedef char GOBChar; typedef bool GOBBool; typedef int32 GOBError; typedef int32 GOBSeekType; typedef int32 GOBHandle; typedef int32 GOBAccessType; typedef void* GOBFSHandle; typedef void GOBVoid; typedef GOBFSHandle (*GOBFileSysOpenFunc)(GOBChar*, GOBAccessType); typedef GOBBool (*GOBFileSysCloseFunc)(GOBFSHandle*); typedef GOBInt32 (*GOBFileSysReadFunc)(GOBFSHandle, GOBVoid*, GOBInt32); typedef GOBInt32 (*GOBFileSysWriteFunc)(GOBFSHandle, GOBVoid*, GOBInt32); typedef GOBInt32 (*GOBFileSysSeekFunc)(GOBFSHandle, GOBInt32, GOBSeekType); typedef GOBInt32 (*GOBFileSysRenameFunc)(GOBChar*, GOBChar*); typedef GOBVoid* (*GOBMemAllocFunc)(GOBUInt32); typedef GOBVoid (*GOBMemFreeFunc)(GOBVoid*); typedef GOBInt32 (*GOBCompressFunc)(GOBVoid*, GOBUInt32, GOBVoid*, GOBUInt32*); typedef GOBInt32 (*GOBDecompressFunc)(GOBVoid*, GOBUInt32, GOBVoid*, GOBUInt32*); typedef GOBBool (*GOBCacheFileOpenFunc)(GOBUInt32); typedef GOBBool (*GOBCacheFileCloseFunc)(GOBVoid); typedef GOBInt32 (*GOBCacheFileReadFunc)(GOBVoid*, GOBInt32); typedef GOBInt32 (*GOBCacheFileWriteFunc)(GOBVoid*, GOBInt32); typedef GOBInt32 (*GOBCacheFileSeekFunc)(GOBInt32); struct GOBBlockTableEntry { GOBUInt32 size; // compressed size GOBUInt32 offset; GOBUInt32 next; }; struct GOBFileTableBasicEntry { GOBUInt32 hash; GOBUInt32 size; // decompressed size GOBUInt32 block; }; struct GOBFileTableExtEntry { GOBChar name[GOB_MAX_FILE_NAME_LEN]; GOBUInt32 crc; GOBUInt32 time; }; struct GOBMemoryFuncSet { GOBMemAllocFunc alloc; GOBMemFreeFunc free; }; struct GOBSingleCodecDesc { GOBChar tag; GOBInt32 max_ratio; GOBCompressFunc compress; GOBDecompressFunc decompress; }; struct GOBCodecFuncSet { GOBInt32 codecs; struct GOBSingleCodecDesc codec[GOB_MAX_CODECS]; }; struct GOBFileSysFuncSet { GOBFileSysOpenFunc open; GOBFileSysCloseFunc close; GOBFileSysReadFunc read; GOBFileSysWriteFunc write; GOBFileSysSeekFunc seek; }; struct GOBCacheFileFuncSet { GOBCacheFileOpenFunc open; GOBCacheFileCloseFunc close; GOBCacheFileReadFunc read; GOBCacheFileWriteFunc write; GOBCacheFileSeekFunc seek; }; struct GOBReadStats { GOBUInt32 bufferUsed; GOBUInt32 bytesRead; GOBUInt32 cacheBytesRead; GOBUInt32 cacheBytesWrite; GOBUInt32 totalSeeks; GOBUInt32 farSeeks; GOBUInt32 filesOpened; }; extern GOBError GOBInit(struct GOBMemoryFuncSet* mem, struct GOBFileSysFuncSet* file, struct GOBCodecFuncSet* codec, struct GOBCacheFileFuncSet* cache); extern GOBError GOBShutdown(GOBVoid); extern GOBError GOBArchiveCreate(const GOBChar* file); extern GOBError GOBArchiveOpen(const GOBChar* file, GOBAccessType atype, GOBBool extended, GOBBool safe); extern GOBError GOBArchiveClose(GOBVoid); extern GOBError GOBArchiveCheckMarkers(GOBVoid); extern GOBError GOBOpen(GOBChar* file, GOBHandle* handle); extern GOBError GOBOpenCode(GOBInt32 code, GOBHandle* handle); extern GOBError GOBClose(GOBHandle handle); extern GOBUInt32 GOBRead(GOBVoid* buffer, GOBUInt32 size, GOBHandle handle); extern GOBError GOBSeek(GOBHandle handle, GOBUInt32 offset, GOBSeekType type, GOBUInt32* pos); extern GOBError GOBWrite(GOBVoid* buffer, GOBUInt32 size, GOBUInt32 mtime, const GOBChar* file, GOBUInt32 codec_mask); extern GOBError GOBDelete(const GOBChar* file); extern GOBError GOBRearrange(const GOBChar* file, const GOBUInt32* xlat, GOBFileSysRenameFunc _rename); extern GOBError GOBVerify(const GOBChar* file, GOBBool* status); extern GOBError GOBGetSize(const GOBChar* file, GOBUInt32* decomp, GOBUInt32* comp, GOBUInt32* slack); extern GOBError GOBGetTime(const GOBChar* file, GOBUInt32* time); extern GOBError GOBGetCRC(const GOBChar* file, GOBUInt32* crc); extern GOBError GOBAccess(const GOBChar* file, GOBBool* status); extern GOBInt32 GOBGetFileCode(const GOBChar* file); extern GOBError GOBGetFileTables(struct GOBFileTableBasicEntry** basic, struct GOBFileTableExtEntry** ext); extern GOBError GOBGetBlockTable(struct GOBBlockTableEntry** table, GOBUInt32* num); extern GOBUInt32 GOBGetSlack(GOBUInt32 x); extern GOBError GOBSetCacheSize(GOBUInt32 num); extern GOBError GOBSetReadBufferSize(GOBUInt32 size); extern struct GOBReadStats GOBGetReadStats(GOBVoid); typedef GOBVoid (*GOBProfileReadFunc)(GOBUInt32); struct GOBProfileFuncSet { GOBProfileReadFunc read; }; extern GOBVoid GOBSetProfileFuncs(struct GOBProfileFuncSet* fset); extern GOBError GOBStartProfile(GOBVoid); extern GOBError GOBStopProfile(GOBVoid); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* GOBLIB_H__ */