/* ================= FS_Read Properly handles partial reads ================= */ int FS_Read( void *buffer, int len, fileHandle_t f ) { FS_CheckInit(); FS_CheckUsed(f); if ( !f ) { return 0; } if ( f <= 0 || f >= MAX_FILE_HANDLES ) { Com_Error( ERR_FATAL, "FS_Read: Invalid handle %d\n", f ); } if (fsh[f].gob) { GOBUInt32 size = GOBRead(buffer, len, fsh[f].ghandle); if (size == GOB_INVALID_SIZE) { #if defined(FINAL_BUILD) extern void ERR_DiscFail(bool); ERR_DiscFail(false); #else Com_Error( ERR_FATAL, "Failed to read from GOB" ); #endif } return size; } else { return WF_Read(buffer, len, fsh[f].whandle); } }
//Drain sound main memory into ARAM. void S_DrainRawSoundData(void) { extern int s_soundStarted; if (!s_soundStarted) return; do { S_UpdateLoading(); #ifdef _GAMECUBE extern void ERR_DiscFail(bool); ERR_DiscFail(true); #endif } while (s_LoadListSize); }
int WF_Read(void* buffer, int len, wfhandle_t handle) { assert(handle >= 0 && handle < WF_MAX_OPEN_FILES && s_FileTable[handle].m_bUsed); DWORD bytes; if (!ReadFile(s_FileTable[handle].m_Handle, buffer, len, &bytes, 0) && s_FileTable[handle].m_bErrorsFatal) { #if defined(FINAL_BUILD) extern void ERR_DiscFail(bool); ERR_DiscFail(false); #else assert(0); #endif } return bytes; }
/* ================ FS_Startup ================ */ void FS_Startup( const char *gameName ) { Com_Printf( "----- FS_Startup -----\n" ); fs_openorder = Cvar_Get( "fs_openorder", "0", 0 ); fs_debug = Cvar_Get( "fs_debug", "0", 0 ); fs_copyfiles = Cvar_Get( "fs_copyfiles", "0", CVAR_INIT ); fs_cdpath = Cvar_Get ("fs_cdpath", Sys_DefaultCDPath(), CVAR_INIT ); fs_basepath = Cvar_Get ("fs_basepath", Sys_DefaultBasePath(), CVAR_INIT ); fs_gamedirvar = Cvar_Get ("fs_game", "base", CVAR_INIT|CVAR_SERVERINFO ); fs_restrict = Cvar_Get ("fs_restrict", "", CVAR_INIT ); gi_handles = new gi_handleTable[MAX_FILE_HANDLES]; for (int f = 0; f < MAX_FILE_HANDLES; ++f) { fsh[f].used = false; gi_handles[f].used = false; } zi_stackBase = (char*)Z_Malloc(ZI_STACKSIZE, TAG_FILESYS, qfalse); GOBMemoryFuncSet mem; mem.alloc = gi_alloc; mem.free = gi_free; GOBFileSysFuncSet file; file.close = gi_close; file.open = gi_open; file.read = gi_read; file.seek = gi_seek; file.write = NULL; GOBCacheFileFuncSet cache; cache.close = cache_close; cache.open = cache_open; cache.read = cache_read; cache.seek = cache_seek; cache.write = cache_write; GOBCodecFuncSet codec = { 2, // codecs { { // Codec 0 - zlib 'z', GOB_INFINITE_RATIO, // tag, ratio (ratio is meaningless for decomp) NULL, gi_decompress_zlib, }, { // Codec 1 - null '0', GOB_INFINITE_RATIO, // tag, ratio (ratio is meaningless for decomp) NULL, gi_decompress_null, }, } }; if ( #ifdef _XBOX GOBInit(&mem, &file, &codec, &cache) #else GOBInit(&mem, &file, &codec, NULL) #endif != GOBERR_OK) { Com_Error( ERR_FATAL, "Could not initialize GOB" ); } #ifdef CUSTOM_MP_GOBS char* archive = FS_BuildOSPath( "assets_mp" ); #else char* archive = FS_BuildOSPath( "assets" ); #endif if (GOBArchiveOpen(archive, GOBACCESS_READ, GOB_FALSE, GOB_TRUE) != GOBERR_OK) { #if defined(FINAL_BUILD) extern void ERR_DiscFail(bool); ERR_DiscFail(false); #else //Com_Error( ERR_FATAL, "Could not initialize GOB" ); Cvar_Set("fs_openorder", "1"); #endif } GOBSetCacheSize(1); GOBSetReadBufferSize(32 * 1024); #ifdef GOB_PROFILE GOBProfileFuncSet profile = { gi_profileread }; GOBSetProfileFuncs(&profile); GOBStartProfile(); #endif Com_Printf( "----------------------\n" ); }