/* =========== FS_FOpenFileAppend =========== */ fileHandle_t FS_FOpenFileAppend( const char *filename ) { char *ospath; fileHandle_t f; if ( !fs_searchpaths ) { Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); } f = FS_HandleForFile(); fsh[f].zipFile = qfalse; Q_strncpyz( fsh[f].name, filename, sizeof( fsh[f].name ) ); // don't let sound stutter S_ClearSoundBuffer(); #ifdef _XBOX ospath = FS_BuildOSPath( filename ); #else ospath = FS_BuildOSPath( fs_basepath->string, fs_gamedir, filename ); #endif if ( fs_debug->integer ) { Com_Printf( "FS_FOpenFileAppend: %s\n", ospath ); } FS_CreatePath( ospath ); fsh[f].handleFiles.file.o = fopen( ospath, "ab" ); fsh[f].handleSync = qfalse; if (!fsh[f].handleFiles.file.o) { f = 0; } return f; }
fileHandle_t FS_FOpenFileWrite( const char *filename ) { FS_CheckInit(); fileHandle_t f = FS_HandleForFile(); char* osname = FS_BuildOSPath( filename ); fsh[f].whandle = WF_Open(osname, false, false); if (fsh[f].whandle >= 0) { fsh[f].used = qtrue; fsh[f].gob = qfalse; return f; } return 0; }
/* =========== FS_SV_FOpenFileRead =========== */ int FS_SV_FOpenFileRead( const char *filename, fileHandle_t *fp ) { char *ospath; fileHandle_t f; if ( !fs_searchpaths ) { Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); } f = FS_HandleForFile(); fsh[f].zipFile = qfalse; Q_strncpyz( fsh[f].name, filename, sizeof( fsh[f].name ) ); // don't let sound stutter S_ClearSoundBuffer(); #ifdef _XBOX ospath = FS_BuildOSPath( filename ); #else ospath = FS_BuildOSPath( fs_basepath->string, filename, "" ); #endif // remove trailing slash ospath[strlen(ospath)-1] = '\0'; if ( fs_debug->integer ) { Com_Printf( "FS_SV_FOpenFileRead: %s\n", ospath ); } fsh[f].handleFiles.file.o = fopen( ospath, "rb" ); fsh[f].handleSync = qfalse; if (!fsh[f].handleFiles.file.o) { f = 0; } *fp = f; if (f) { return FS_filelength(f); } return 0; }
/* * Finds the file in the search path. Returns filesize and an open FILE *. Used * for streaming data out of either a pak file or a seperate file. */ int FS_FOpenFile(const char *name, fileHandle_t *f, fsMode_t mode) { int size = 0; fsHandle_t *handle; handle = FS_HandleForFile(name, f); Q_strlcpy(handle->name, name, sizeof(handle->name)); handle->mode = mode; switch (mode) { case FS_READ: size = FS_FOpenFileRead(handle); break; case FS_WRITE: size = FS_FOpenFileWrite(handle); break; case FS_APPEND: size = FS_FOpenFileAppend(handle); break; default: Com_Error(ERR_FATAL, "FS_FOpenFile: bad mode (%i)", mode); break; } if (size != -1) { return size; } /* Couldn't open, so free the handle. */ memset(handle, 0, sizeof(*handle)); *f = 0; return -1; }
/* =========== FS_FOpenFileRead Finds the file in the search path. Returns filesize and an open FILE pointer. Used for streaming data out of either a separate file or a ZIP file. =========== */ int FS_FOpenFileRead( const char *filename, fileHandle_t *file, qboolean uniqueFILE ) { FS_CheckInit(); if ( file == NULL ) { Com_Error( ERR_FATAL, "FS_FOpenFileRead: NULL 'file' parameter passed\n" ); } if ( !filename ) { Com_Error( ERR_FATAL, "FS_FOpenFileRead: NULL 'filename' parameter passed\n" ); } *file = FS_HandleForFile(); int len; if (fs_openorder->integer == 0) { // Release mode -- read from GOB first len = FS_FOpenFileReadGOB(filename, *file); if (len < 0) len = FS_FOpenFileReadOS(filename, *file); } else { // Debug mode -- external files override GOB len = FS_FOpenFileReadOS(filename, *file); if (len < 0) len = FS_FOpenFileReadGOB(filename, *file); } if (len >= 0) return len; Com_DPrintf ("Can't find %s\n", filename); *file = 0; return -1; }
/* * Finds the file in the search path. Returns filesize and an open FILE *. Used * for streaming data out of either a pak file or a seperate file. */ int FS_FOpenFile(const char *name, fileHandle_t *f, qboolean gamedir_only) { char path[MAX_OSPATH]; fsHandle_t *handle; fsPack_t *pack; fsSearchPath_t *search; int i; file_from_pak = 0; #ifdef ZIP file_from_pk3 = 0; #endif handle = FS_HandleForFile(name, f); Q_strlcpy(handle->name, name, sizeof(handle->name)); handle->mode = FS_READ; /* Search through the path, one element at a time. */ for (search = fs_searchPaths; search; search = search->next) { if (gamedir_only) { if (strstr(search->path, FS_Gamedir()) == NULL) { continue; } } /* Search inside a pack file. */ if (search->pack) { pack = search->pack; for (i = 0; i < pack->numFiles; i++) { if (Q_stricmp(pack->files[i].name, handle->name) == 0) { /* Found it! */ Com_FilePath(pack->name, fs_fileInPath, sizeof(fs_fileInPath)); fs_fileInPack = true; if (fs_debug->value) { Com_Printf("FS_FOpenFile: '%s' (found in '%s').\n", handle->name, pack->name); } if (pack->pak) { /* PAK */ file_from_pak = 1; handle->file = fopen(pack->name, "rb"); if (handle->file) { fseek(handle->file, pack->files[i].offset, SEEK_SET); return pack->files[i].size; } } #ifdef ZIP else if (pack->pk3) { /* PK3 */ file_from_pk3 = 1; Q_strlcpy(file_from_pk3_name, strrchr(pack->name, '/') + 1, sizeof(file_from_pk3_name)); handle->zip = unzOpen(pack->name); if (handle->zip) { if (unzLocateFile(handle->zip, handle->name, 2) == UNZ_OK) { if (unzOpenCurrentFile(handle->zip) == UNZ_OK) { return pack->files[i].size; } } unzClose(handle->zip); } } #endif Com_Error(ERR_FATAL, "Couldn't reopen '%s'", pack->name); } } } else { /* Search in a directory tree. */ Com_sprintf(path, sizeof(path), "%s/%s", search->path, handle->name); handle->file = fopen(path, "rb"); if (!handle->file) { Q_strlwr(path); handle->file = fopen(path, "rb"); } if (!handle->file) { continue; } if (handle->file) { /* Found it! */ Q_strlcpy(fs_fileInPath, search->path, sizeof(fs_fileInPath)); fs_fileInPack = false; if (fs_debug->value) { Com_Printf("FS_FOpenFile: '%s' (found in '%s').\n", handle->name, search->path); } return FS_FileLength(handle->file); } } } /* Not found! */ fs_fileInPath[0] = 0; fs_fileInPack = false; if (fs_debug->value) { Com_Printf("FS_FOpenFile: couldn't find '%s'.\n", handle->name); } /* Couldn't open, so free the handle. */ memset(handle, 0, sizeof(*handle)); *f = 0; return -1; }
/* =========== FS_SV_FOpenFileRead =========== */ int FS_SV_FOpenFileRead( const char *filename, fileHandle_t *fp ) { char *ospath; fileHandle_t f = 0; if ( !fs_searchpaths ) { Com_Error( ERR_FATAL, "Filesystem call made without initialization\n" ); } f = FS_HandleForFile(); fsh[f].zipFile = qfalse; Q_strncpyz( fsh[f].name, filename, sizeof( fsh[f].name ) ); // don't let sound stutter S_ClearSoundBuffer(); ospath = FS_BuildOSPath( fs_homepath->string, filename, "" ); // remove trailing slash ospath[strlen(ospath)-1] = '\0'; if ( fs_debug->integer ) { Com_Printf( "FS_SV_FOpenFileRead: %s\n", ospath ); } fsh[f].handleFiles.file.o = fopen( ospath, "rb" ); fsh[f].handleSync = qfalse; if (!fsh[f].handleFiles.file.o) { // NOTE TTimo on non *nix systems, fs_homepath == fs_basepath, might want to avoid if (Q_stricmp(fs_homepath->string,fs_basepath->string)) { // search basepath ospath = FS_BuildOSPath( fs_basepath->string, filename, "" ); ospath[strlen(ospath)-1] = '\0'; if ( fs_debug->integer ) { Com_Printf( "FS_SV_FOpenFileRead (fs_basepath): %s\n", ospath ); } fsh[f].handleFiles.file.o = fopen( ospath, "rb" ); fsh[f].handleSync = qfalse; if ( !fsh[f].handleFiles.file.o ) { f = 0; } } } if (!fsh[f].handleFiles.file.o) { // search cd path ospath = FS_BuildOSPath( fs_cdpath->string, filename, "" ); ospath[strlen(ospath)-1] = '\0'; if (fs_debug->integer) { Com_Printf( "FS_SV_FOpenFileRead (fs_cdpath) : %s\n", ospath ); } fsh[f].handleFiles.file.o = fopen( ospath, "rb" ); fsh[f].handleSync = qfalse; if( !fsh[f].handleFiles.file.o ) { f = 0; } } *fp = f; if (f) { return FS_filelength(f); } return 0; }