]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - include/ifilesystem.h
Merge remote branch 'origin/divVerent/zeroradiant-original' into divVerent/zeroradiant
[xonotic/netradiant.git] / include / ifilesystem.h
index 339c82f1aad65258f22e90f30b226625c0b5ad9a..4242b7011ec1c20eb6b56273d98b7eaf4f2814ff 100644 (file)
@@ -1,6 +1,6 @@
 /*
-Copyright (C) 2001-2006, William Joseph.
-All Rights Reserved.
+Copyright (C) 1999-2007 id Software, Inc. and contributors.
+For a list of contributors, see the accompanying CONTRIBUTORS file.
 
 This file is part of GtkRadiant.
 
@@ -19,115 +19,120 @@ along with GtkRadiant; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
 
-#if !defined(INCLUDED_IFILESYSTEM_H)
-#define INCLUDED_IFILESYSTEM_H
+#ifndef _IFILESYSTEM_H_
+#define _IFILESYSTEM_H_
 
-#include <cstddef>
-#include "generic/constant.h"
-#include "generic/callbackfwd.h"
+//
+// Plugin interface for the virtual filesystem used by Radiant
+//
 
-typedef Callback1<const char*> ArchiveNameCallback;
-typedef Callback1<const char*> FileNameCallback;
+// NOTE: If you want to write a VFS plugin then you must export
+// "QERPlug_ListInterfaces" and "QERPlug_RequestInterface"
+// (see qerplugin.h for more information)
 
-class ArchiveFile;
-class ArchiveTextFile;
-class Archive;
-
-class ModuleObserver;
-
-typedef struct _GSList GSList;
-
-/// The Virtual File System.
-class VirtualFileSystem
-{
-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 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) = 0;
-  virtual void forEachArchive(const ArchiveNameCallback& callback) = 0;
-};
-
-#include "modulesystem.h"
-
-template<typename Type>
-class GlobalModule;
-typedef GlobalModule<VirtualFileSystem> GlobalFileSystemModule;
-
-template<typename Type>
-class GlobalModuleRef;
-typedef GlobalModuleRef<VirtualFileSystem> GlobalFileSystemModuleRef;
-
-inline VirtualFileSystem& GlobalFileSystem()
-{
-  return GlobalFileSystemModule::getTable();
-}
+#ifdef _WIN32
+#define VFS_NATIVESEPARATOR '\\'
+#else
+#define VFS_NATIVESEPARATOR '/'
+#endif
 
+#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) ();
 
-/// \deprecated Use \c openFile.
-inline int vfsLoadFile(const char* filename, void** buffer, int index = 0)
+// VFS API
+struct _QERFileSystemTable
 {
-       return static_cast<int>(GlobalFileSystem().loadFile(filename, buffer));
+  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;
 };
 
-/// \deprecated Deprecated.
-inline void vfsFreeFile(void* p)
-{
-       GlobalFileSystem().freeFile(p);
-}
-
+#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
+
+#endif // _IFILESYSTEM_H_