X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=include%2Fifilesystem.h;h=d7e128e6e1791a83f40dcc81102a01acbfb26fc3;hb=fea0d2e6575b21945c4800805d66e43a2247ded5;hp=4242b7011ec1c20eb6b56273d98b7eaf4f2814ff;hpb=04c7eb042d5ec261681dc62d862ac8465f5afd85;p=xonotic%2Fnetradiant.git diff --git a/include/ifilesystem.h b/include/ifilesystem.h index 4242b701..d7e128e6 100644 --- a/include/ifilesystem.h +++ b/include/ifilesystem.h @@ -1,138 +1,134 @@ /* -Copyright (C) 1999-2007 id Software, Inc. and contributors. -For a list of contributors, see the accompanying CONTRIBUTORS file. + Copyright (C) 2001-2006, William Joseph. + All Rights Reserved. -This file is part of GtkRadiant. + This file is part of GtkRadiant. -GtkRadiant is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + GtkRadiant is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. -GtkRadiant is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + GtkRadiant is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with GtkRadiant; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ + You should have received a copy of the GNU General Public License + along with GtkRadiant; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ -#ifndef _IFILESYSTEM_H_ -#define _IFILESYSTEM_H_ +#if !defined( INCLUDED_IFILESYSTEM_H ) +#define INCLUDED_IFILESYSTEM_H -// -// Plugin interface for the virtual filesystem used by Radiant -// +#include +#include "generic/constant.h" +#include "generic/callback.h" -// NOTE: If you want to write a VFS plugin then you must export -// "QERPlug_ListInterfaces" and "QERPlug_RequestInterface" -// (see qerplugin.h for more information) +typedef Callback ArchiveNameCallback; +typedef Callback FileNameCallback; -#ifdef _WIN32 -#define VFS_NATIVESEPARATOR '\\' -#else -#define VFS_NATIVESEPARATOR '/' -#endif +class ArchiveFile; +class ArchiveTextFile; +class Archive; + +class ModuleObserver; + +typedef struct _GSList GSList; -#define VFS_MAJOR "VFS" - -// return the file system supported by the plugin, for example: "quake1" or "quake3" -//typedef const char* (WINAPI* PFN_VFSGETFORMAT) (); -// add all files from a directory to the vfs -typedef void (* PFN_VFSINITDIRECTORY) (const char *path); -// free all resources used by the plugin -typedef void (* PFN_VFSSHUTDOWN) (); -// free memory allocated by VFS for this pointer -typedef void (* PFN_VFSFREEFILE) (void *p); -// return a GSList with all the directories under basedir -typedef GSList* (* PFN_VFSGETDIRLIST) (const char *basedir); -// return a GSList with all the files under basedir (extension can be NULL) -typedef GSList* (* PFN_VFSGETFILELIST) (const char *basedir, const char *extension); -// free a dirlist or filelist returned from one of the above functions -typedef void (* PFN_VFSCLEARFILEDIRLIST) (GSList **lst); -#define VFS_SEARCH_PAK 0x1 -#define VFS_SEARCH_DIR 0x2 -/*! -\brief return the number of files with the exact name described in filename -there can be several hits for a given file, or this can be used to check for existence -\param flags is optional and can be used with VFS_SEARCH_* bits, if flag is 0, everything is searched, else only the specified bits -paks are searched first, then search directories -*/ -typedef int (* PFN_VFSGETFILECOUNT) (const char *filename, int flags); -/*! -\brief load file, allocate buffer -\return -1 if fails or the size of the buffer allocated -\param index is used to load the i-th file in the search directories (see vfsGetFileCount) -this will scan in the search directories first, then it will search in the pak files -WARNING: the allocated buffer must be freed with a g_free call -NOTE TTimo: the g_free release is utter horror -*/ -typedef int (* PFN_VFSLOADFILE) (const char *filename, void **buffer, int index); -// load a file from it's full path into the buffer, returns the file size or -1 -// the allocated buffer must be freed with a g_free call -typedef int (* PFN_VFSLOADFULLPATHFILE) (const char *filename, void **buffer); -// takes an absolute file path, returns a shortened relative file path if the absolute path matches a valid basedir or NULL if an error occured -typedef char* (* PFN_VFSEXTRACTRELATIVEPATH) (const char *in); -/*! -\return the full path (in a static buff) to a file given it's relative path (NULL if not found) -\param index if several files are matching (as returned in a call to vfsGetFileCount), get the index-th file -\param flag 0 or a combination of VFS_SEARCH_PAK or VFS_SEARCH_DIR -HYDRA: - this now searches VFS/PAK files in addition to the filesystem - if FLAG is 0 then ONLY dirs are searched. - PAK's are searched before DIRs to mimic engine behaviour - index is ignored when searching PAK files. - when searching VFS, files are searched case insensitive. - -WARNING: if you use index from vfsGetFileCount, it works only with a vfsGetFileCount for the search directories only (not the pak files) -FIXME TTimo our VFS names are case insensitive. - this function is not able to build the full path from case-insensitive name -*/ -typedef char* (* PFN_VFSGETFULLPATH) (const char *in, int index, int flag); -/*! -these return a static char*, doesn't need to be freed or anything -get the base path to use when raising file dialogs -we manually add "maps/" or "sounds/" or "mapobjects/models/" etc. -FIXME: I'm not sure this is used / relevant anymore -*/ -typedef const char* (* PFN_VFSBASEPROMPTPATH) (); - -// VFS API -struct _QERFileSystemTable +/// The Virtual File System. +class VirtualFileSystem { - int m_nSize; - PFN_VFSINITDIRECTORY m_pfnInitDirectory; - PFN_VFSSHUTDOWN m_pfnShutdown; - PFN_VFSFREEFILE m_pfnFreeFile; - PFN_VFSGETDIRLIST m_pfnGetDirList; - PFN_VFSGETFILELIST m_pfnGetFileList; - PFN_VFSCLEARFILEDIRLIST m_pfnClearFileDirList; - PFN_VFSGETFILECOUNT m_pfnGetFileCount; - PFN_VFSLOADFILE m_pfnLoadFile; - PFN_VFSLOADFULLPATHFILE m_pfnLoadFullPathFile; - PFN_VFSEXTRACTRELATIVEPATH m_pfnExtractRelativePath; - PFN_VFSGETFULLPATH m_pfnGetFullPath; - PFN_VFSBASEPROMPTPATH m_pfnBasePromptPath; +public: +INTEGER_CONSTANT( Version, 1 ); +STRING_CONSTANT( Name, "VFS" ); + +/// \brief Adds a root search \p path. +/// Called before \c initialise. +virtual void initDirectory( const char *path ) = 0; +/// \brief Initialises the filesystem. +/// Called after all root search paths have been added. +virtual void initialise() = 0; +/// \brief Clear the filesystem if supported +virtual void clear() = 0; +/// \brief Reload the filesystem if supported +virtual void refresh() = 0; +/// \brief Shuts down the filesystem. +virtual void shutdown() = 0; + +/// \brief Returns the file identified by \p filename opened in binary mode, or 0 if not found. +/// The caller must \c release() the file returned if it is not 0. +virtual ArchiveFile* openFile( const char* filename ) = 0; +/// \brief Returns the file identified by \p filename opened in text mode, or 0 if not found. +/// The caller must \c release() the file returned if it is not 0. +virtual ArchiveTextFile* openTextFile( const char* filename ) = 0; + +/// \brief Opens the file identified by \p filename and reads it into \p buffer, or sets *\p buffer to 0 if not found. +/// Returns the size of the buffer allocated, or undefined value if *\p buffer is 0; +/// The caller must free the allocated buffer by calling \c freeFile +/// \deprecated Deprecated - use \c openFile. +virtual std::size_t loadFile( const char *filename, void **buffer ) = 0; +/// \brief Frees the buffer returned by \c loadFile. +/// \deprecated Deprecated. +virtual void freeFile( void *p ) = 0; + +/// \brief Calls \p callback for each directory under \p basedir. +virtual void forEachDirectory( const char* basedir, const FileNameCallback& callback, std::size_t depth = 1 ) = 0; +/// \brief Calls \p callback for each file under \p basedir matching \p extension. +/// Use "*" as \p extension to match all file extensions. +virtual void forEachFile( const char* basedir, const char* extension, const FileNameCallback& callback, std::size_t depth = 1 ) = 0; + +/// \brief Returns a list containing the relative names of all the directories under \p basedir. +/// The caller must free the returned list by calling \c clearFileDirList; +/// \deprecated Deprecated - use \c forEachDirectory. +virtual GSList* getDirList( const char *basedir ) = 0; +/// \brief Returns a list containing the relative names of the files under \p basedir (\p extension can be "*" for all files). +/// The caller must free the returned list by calling \c clearFileDirList. +/// \deprecated Deprecated - use \c forEachFile. +virtual GSList* getFileList( const char *basedir, const char *extension ) = 0; +/// \brief Frees the \p list returned from \c getDirList or \c getFileList. +/// \deprecated Deprecated. +virtual void clearFileDirList( GSList **list ) = 0; + +/// \brief Returns the absolute filename for a relative \p name, or "" if not found. +virtual const char* findFile( const char* name ) = 0; +/// \brief Returns the filesystem root for an absolute \p name, or "" if not found. +/// This can be used to convert an absolute name to a relative name. +virtual const char* findRoot( const char* name ) = 0; + +/// \brief Attach an \p observer whose realise() and unrealise() methods will be called when the filesystem is initialised or shut down. +virtual void attach( ModuleObserver& observer ) = 0; +/// \brief Detach an \p observer previously-attached by calling \c attach. +virtual void detach( ModuleObserver& observer ) = 0; + +virtual Archive* getArchive( const char* archiveName, bool pakonly = true ) = 0; +virtual void forEachArchive( const ArchiveNameCallback& callback, bool pakonly = true, bool reverse = false ) = 0; }; -#ifdef USE_VFSTABLE_DEFINE -#ifndef __VFSTABLENAME -#define __VFSTABLENAME g_FileSystemTable -#endif -#define vfsInitDirectory __VFSTABLENAME.m_pfnInitDirectory -#define vfsShutdown __VFSTABLENAME.m_pfnShutdown -#define vfsFreeFile __VFSTABLENAME.m_pfnFreeFile -#define vfsGetDirList __VFSTABLENAME.m_pfnGetDirList -#define vfsGetFileList __VFSTABLENAME.m_pfnGetFileList -#define vfsClearFileDirList __VFSTABLENAME.m_pfnClearFileDirList -#define vfsGetFileCount __VFSTABLENAME.m_pfnGetFileCount -#define vfsLoadFile __VFSTABLENAME.m_pfnLoadFile -#define vfsLoadFullPathFile __VFSTABLENAME.m_pfnLoadFullPathFile -#define vfsExtractRelativePath __VFSTABLENAME.m_pfnExtractRelativePath -#define vfsGetFullPath __VFSTABLENAME.m_pfnGetFullPath -#define vfsBasePromptPath __VFSTABLENAME.m_pfnBasePromptPath -#endif +#include "modulesystem.h" + +template +class GlobalModule; +typedef GlobalModule GlobalFileSystemModule; + +template +class GlobalModuleRef; +typedef GlobalModuleRef GlobalFileSystemModuleRef; -#endif // _IFILESYSTEM_H_ +inline VirtualFileSystem& GlobalFileSystem(){ + return GlobalFileSystemModule::getTable(); +} + + +/// \deprecated Use \c openFile. +inline int vfsLoadFile( const char* filename, void** buffer, int index = 0 ){ + return static_cast( GlobalFileSystem().loadFile( filename, buffer ) ); +} + +/// \deprecated Deprecated. +inline void vfsFreeFile( void* p ){ + GlobalFileSystem().freeFile( p ); +} + +#endif