Panda3D
Loading...
Searching...
No Matches
virtualFileSystem.h
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file virtualFileSystem.h
10 * @author drose
11 * @date 2002-08-03
12 */
13
14#ifndef VIRTUALFILESYSTEM_H
15#define VIRTUALFILESYSTEM_H
16
17#include "pandabase.h"
18
19#include "virtualFile.h"
20#include "virtualFileMount.h"
21#include "virtualFileList.h"
22#include "filename.h"
23#include "dSearchPath.h"
24#include "pointerTo.h"
25#include "config_express.h"
26#include "mutexImpl.h"
27#include "pvector.h"
28
29class Multifile;
31
32/**
33 * A hierarchy of directories and files that appears to be one continuous file
34 * system, even though the files may originate from several different sources
35 * that may not be related to the actual OS's file system.
36 *
37 * For instance, a VirtualFileSystem can transparently mount one or more
38 * Multifiles as their own subdirectory hierarchies.
39 */
40class EXPCL_PANDA_EXPRESS VirtualFileSystem {
41PUBLISHED:
42 VirtualFileSystem();
43 ~VirtualFileSystem();
44
45 enum MountFlags {
46 MF_read_only = 0x0002,
47 };
48
49 BLOCKING bool mount(Multifile *multifile, const Filename &mount_point, int flags);
50 BLOCKING bool mount(const Filename &physical_filename, const Filename &mount_point,
51 int flags, const std::string &password = "");
52 BLOCKING bool mount_loop(const Filename &virtual_filename, const Filename &mount_point,
53 int flags, const std::string &password = "");
54 bool mount(VirtualFileMount *mount, const Filename &mount_point, int flags);
55 BLOCKING int unmount(Multifile *multifile);
56 BLOCKING int unmount(const Filename &physical_filename);
58 BLOCKING int unmount_point(const Filename &mount_point);
59 BLOCKING int unmount_all();
60
61 int get_num_mounts() const;
62 PT(VirtualFileMount) get_mount(int n) const;
63 MAKE_SEQ(get_mounts, get_num_mounts, get_mount);
64 MAKE_SEQ_PROPERTY(mounts, get_num_mounts, get_mount);
65
66 BLOCKING bool chdir(const Filename &new_directory);
67 BLOCKING Filename get_cwd() const;
68 BLOCKING bool make_directory(const Filename &filename);
69 BLOCKING bool make_directory_full(const Filename &filename);
70
71 BLOCKING PT(VirtualFile) get_file(const Filename &filename, bool status_only = false) const;
72 BLOCKING PT(VirtualFile) create_file(const Filename &filename);
73 BLOCKING PT(VirtualFile) find_file(const Filename &filename,
74 const DSearchPath &searchpath,
75 bool status_only = false) const;
76 BLOCKING bool delete_file(const Filename &filename);
77 BLOCKING bool rename_file(const Filename &orig_filename, const Filename &new_filename);
78 BLOCKING bool copy_file(const Filename &orig_filename, const Filename &new_filename);
79
80 BLOCKING bool resolve_filename(Filename &filename, const DSearchPath &searchpath,
81 const std::string &default_extension = std::string()) const;
82 BLOCKING int find_all_files(const Filename &filename, const DSearchPath &searchpath,
83 DSearchPath::Results &results) const;
84
85 BLOCKING INLINE bool exists(const Filename &filename) const;
86 BLOCKING INLINE bool is_directory(const Filename &filename) const;
87 BLOCKING INLINE bool is_regular_file(const Filename &filename) const;
88
89 BLOCKING INLINE PT(VirtualFileList) scan_directory(const Filename &filename) const;
90
91 INLINE void ls(const Filename &filename) const;
92 INLINE void ls_all(const Filename &filename) const;
93
94 void write(std::ostream &out) const;
95
96 static VirtualFileSystem *get_global_ptr();
97
98 EXTENSION(PyObject *read_file(const Filename &filename, bool auto_unwrap) const);
99 BLOCKING std::istream *open_read_file(const Filename &filename, bool auto_unwrap) const;
100 BLOCKING static void close_read_file(std::istream *stream);
101
102 EXTENSION(PyObject *write_file(const Filename &filename, PyObject *data, bool auto_wrap));
103 BLOCKING std::ostream *open_write_file(const Filename &filename, bool auto_wrap, bool truncate);
104 BLOCKING std::ostream *open_append_file(const Filename &filename);
105 BLOCKING static void close_write_file(std::ostream *stream);
106
107 BLOCKING std::iostream *open_read_write_file(const Filename &filename, bool truncate);
108 BLOCKING std::iostream *open_read_append_file(const Filename &filename);
109 BLOCKING static void close_read_write_file(std::iostream *stream);
110
111public:
112 // We provide Python versions of these as efficient extension methods,
113 // above.
114 BLOCKING INLINE std::string read_file(const Filename &filename, bool auto_unwrap) const;
115 BLOCKING INLINE bool write_file(const Filename &filename, const std::string &data, bool auto_wrap);
116
117 bool atomic_compare_and_exchange_contents(const Filename &filename, std::string &orig_contents, const std::string &old_contents, const std::string &new_contents);
118 bool atomic_read_contents(const Filename &filename, std::string &contents) const;
119
120 INLINE bool read_file(const Filename &filename, std::string &result, bool auto_unwrap) const;
121 INLINE bool read_file(const Filename &filename, vector_uchar &result, bool auto_unwrap) const;
122 INLINE bool write_file(const Filename &filename, const unsigned char *data, size_t data_size, bool auto_wrap);
123
124 void scan_mount_points(vector_string &names, const Filename &path) const;
125
126 static void parse_options(const std::string &options,
127 int &flags, std::string &password);
128 static void parse_option(const std::string &option,
129 int &flags, std::string &password);
130
131public:
132 // These flags are passed to do_get_file() and
133 // VirtualFileMount::make_virtual_file() to quality the kind of VirtualFile
134 // pointer we want to get.
135 enum OpenFlags {
136 OF_status_only = 0x0001,
137 OF_create_file = 0x0002,
138 OF_make_directory = 0x0004,
139 OF_allow_nonexist = 0x0008,
140 };
141
142 // These are declared as class instances, instead of as globals, to
143 // guarantee they will be initialized by the time the VirtualFileSystem's
144 // constructor runs.
145 ConfigVariableBool vfs_case_sensitive;
146 ConfigVariableBool vfs_implicit_pz;
147 ConfigVariableBool vfs_implicit_mf;
148
149private:
150 Filename normalize_mount_point(const Filename &mount_point) const;
151 bool do_mount(VirtualFileMount *mount, const Filename &mount_point, int flags);
152 PT(VirtualFile) do_get_file(const Filename &filename, int open_flags) const;
153
154 bool consider_match(PT(VirtualFile) &found_file, VirtualFileComposite *&composite_file,
155 VirtualFileMount *mount, const Filename &local_filename,
156 const Filename &original_filename, bool implicit_pz_file,
157 int open_flags) const;
158 bool consider_mount_mf(const Filename &filename);
159
160 mutable MutexImpl _lock;
161 typedef pvector<PT(VirtualFileMount) > Mounts;
162 Mounts _mounts;
163 unsigned int _mount_seq;
164
165 Filename _cwd;
166
167 static VirtualFileSystem *_global_ptr;
168};
169
170#include "virtualFileSystem.I"
171
172#endif
This is a convenience class to specialize ConfigVariable as a boolean type.
This class stores a list of directories that can be searched, in order, to locate a particular file.
Definition dSearchPath.h:28
The name of a file, such as a texture file or an Egg file.
Definition filename.h:44
A file that contains a set of files.
Definition multifile.h:37
A composite directory within the VirtualFileSystem: this maps to more than one directory on different...
A list of VirtualFiles, as returned by VirtualFile::scan_directory().
The abstract base class for a mount definition used within a VirtualFileSystem.
A hierarchy of directories and files that appears to be one continuous file system,...
bool rename_file(const Filename &orig_filename, const Filename &new_filename)
Attempts to move or rename the indicated file or directory.
static void close_write_file(std::ostream *stream)
Closes a file opened by a previous call to open_write_file().
std::iostream * open_read_write_file(const Filename &filename, bool truncate)
Convenience function; returns a newly allocated iostream if the file exists and can be written,...
int unmount_point(const Filename &mount_point)
Unmounts all systems attached to the given mount point from the file system.
Filename get_cwd() const
Returns the current directory name.
void write(std::ostream &out) const
Print debugging information.
bool exists(const Filename &filename) const
Convenience function; returns true if the named file exists in the virtual file system hierarchy.
int unmount(Multifile *multifile)
Unmounts all appearances of the indicated Multifile from the file system.
int find_all_files(const Filename &filename, const DSearchPath &searchpath, DSearchPath::Results &results) const
Searches all the directories in the search list for the indicated file, in order.
bool is_regular_file(const Filename &filename) const
Convenience function; returns true if the named file exists as a regular file in the virtual file sys...
PointerTo< VirtualFile > find_file(const Filename &filename, const DSearchPath &searchpath, bool status_only=false) const
Uses the indicated search path to find the file within the file system.
bool resolve_filename(Filename &filename, const DSearchPath &searchpath, const std::string &default_extension=std::string()) const
Searches the given search path for the filename.
std::ostream * open_append_file(const Filename &filename)
Works like open_write_file(), but the file is opened in append mode.
std::ostream * open_write_file(const Filename &filename, bool auto_wrap, bool truncate)
Convenience function; returns a newly allocated ostream if the file exists and can be written,...
static void close_read_file(std::istream *stream)
Closes a file opened by a previous call to open_read_file().
static void close_read_write_file(std::iostream *stream)
Closes a file opened by a previous call to open_read_write_file().
static void parse_options(const std::string &options, int &flags, std::string &password)
Parses all of the option flags in the options list on the vfs-mount Config.prc line.
PointerTo< VirtualFile > create_file(const Filename &filename)
Attempts to create a file by the indicated name in the filesystem, if possible, and returns it.
static void parse_option(const std::string &option, int &flags, std::string &password)
Parses one of the option flags in the options list on the vfs-mount Config.prc line.
std::iostream * open_read_append_file(const Filename &filename)
Works like open_read_write_file(), but the file is opened in append mode.
bool mount_loop(const Filename &virtual_filename, const Filename &mount_point, int flags, const std::string &password="")
This is similar to mount(), but it receives the name of a Multifile that already appears within the v...
void scan_mount_points(vector_string &names, const Filename &path) const
Adds to names a list of all the mount points in use that are one directory below path,...
get_mount
Returns the nth mount in the system.
bool is_directory(const Filename &filename) const
Convenience function; returns true if the named file exists as a directory in the virtual file system...
bool chdir(const Filename &new_directory)
Changes the current directory.
get_num_mounts
Returns the number of individual mounts in the system.
bool atomic_compare_and_exchange_contents(const Filename &filename, std::string &orig_contents, const std::string &old_contents, const std::string &new_contents)
See Filename::atomic_compare_and_exchange_contents().
PointerTo< VirtualFile > get_file(const Filename &filename, bool status_only=false) const
Looks up the file by the indicated name in the file system.
std::istream * open_read_file(const Filename &filename, bool auto_unwrap) const
Convenience function; returns a newly allocated istream if the file exists and can be read,...
bool delete_file(const Filename &filename)
Attempts to delete the indicated file or directory.
bool make_directory_full(const Filename &filename)
Attempts to create a directory within the file system.
bool make_directory(const Filename &filename)
Attempts to create a directory within the file system.
bool mount(Multifile *multifile, const Filename &mount_point, int flags)
Mounts the indicated Multifile at the given mount point.
bool copy_file(const Filename &orig_filename, const Filename &new_filename)
Attempts to copy the contents of the indicated file to the indicated file.
int unmount_all()
Unmounts all files from the file system.
static VirtualFileSystem * get_global_ptr()
Returns the default global VirtualFileSystem.
bool atomic_read_contents(const Filename &filename, std::string &contents) const
See Filename::atomic_read_contents().
The abstract base class for a file or directory within the VirtualFileSystem.
Definition virtualFile.h:35
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.