00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef VIRTUALFILESYSTEM_H
00016 #define VIRTUALFILESYSTEM_H
00017
00018 #include "pandabase.h"
00019
00020 #include "virtualFile.h"
00021 #include "virtualFileMount.h"
00022 #include "virtualFileList.h"
00023 #include "filename.h"
00024 #include "dSearchPath.h"
00025 #include "pointerTo.h"
00026 #include "config_express.h"
00027 #include "mutexImpl.h"
00028 #include "pvector.h"
00029
00030 class Multifile;
00031 class VirtualFileComposite;
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 class EXPCL_PANDAEXPRESS VirtualFileSystem {
00045 PUBLISHED:
00046 VirtualFileSystem();
00047 ~VirtualFileSystem();
00048
00049 enum MountFlags {
00050 MF_read_only = 0x0002,
00051 };
00052
00053 BLOCKING bool mount(Multifile *multifile, const Filename &mount_point, int flags);
00054 BLOCKING bool mount(const Filename &physical_filename, const Filename &mount_point,
00055 int flags, const string &password = "");
00056 BLOCKING bool mount_loop(const Filename &virtual_filename, const Filename &mount_point,
00057 int flags, const string &password = "");
00058 bool mount(VirtualFileMount *mount, const Filename &mount_point, int flags);
00059 BLOCKING int unmount(Multifile *multifile);
00060 BLOCKING int unmount(const Filename &physical_filename);
00061 int unmount(VirtualFileMount *mount);
00062 BLOCKING int unmount_point(const Filename &mount_point);
00063 BLOCKING int unmount_all();
00064
00065 int get_num_mounts() const;
00066 PT(VirtualFileMount) get_mount(int n) const;
00067 MAKE_SEQ(get_mounts, get_num_mounts, get_mount);
00068
00069 BLOCKING bool chdir(const Filename &new_directory);
00070 BLOCKING Filename get_cwd() const;
00071 BLOCKING bool make_directory(const Filename &filename);
00072 BLOCKING bool make_directory_full(const Filename &filename);
00073
00074 BLOCKING PT(VirtualFile) get_file(const Filename &filename, bool status_only = false) const;
00075 BLOCKING PT(VirtualFile) create_file(const Filename &filename);
00076 BLOCKING PT(VirtualFile) find_file(const Filename &filename,
00077 const DSearchPath &searchpath,
00078 bool status_only = false) const;
00079 BLOCKING bool delete_file(const Filename &filename);
00080 BLOCKING bool rename_file(const Filename &orig_filename, const Filename &new_filename);
00081 BLOCKING bool copy_file(const Filename &orig_filename, const Filename &new_filename);
00082
00083 BLOCKING bool resolve_filename(Filename &filename, const DSearchPath &searchpath,
00084 const string &default_extension = string()) const;
00085 BLOCKING int find_all_files(const Filename &filename, const DSearchPath &searchpath,
00086 DSearchPath::Results &results) const;
00087
00088 BLOCKING INLINE bool exists(const Filename &filename) const;
00089 BLOCKING INLINE bool is_directory(const Filename &filename) const;
00090 BLOCKING INLINE bool is_regular_file(const Filename &filename) const;
00091
00092 BLOCKING INLINE PT(VirtualFileList) scan_directory(const Filename &filename) const;
00093
00094 INLINE void ls(const Filename &filename) const;
00095 INLINE void ls_all(const Filename &filename) const;
00096
00097 void write(ostream &out) const;
00098
00099 static VirtualFileSystem *get_global_ptr();
00100
00101 #ifdef HAVE_PYTHON
00102 BLOCKING PyObject *__py__read_file(const Filename &filename, bool auto_unwrap) const;
00103 #endif // HAVE_PYTHON
00104 BLOCKING INLINE string read_file(const Filename &filename, bool auto_unwrap) const;
00105
00106 BLOCKING istream *open_read_file(const Filename &filename, bool auto_unwrap) const;
00107 BLOCKING static void close_read_file(istream *stream);
00108
00109 #ifdef HAVE_PYTHON
00110 BLOCKING PyObject *__py__write_file(const Filename &filename, PyObject *data, bool auto_wrap);
00111 #endif // HAVE_PYTHON
00112 BLOCKING INLINE bool write_file(const Filename &filename, const string &data, bool auto_wrap);
00113 BLOCKING ostream *open_write_file(const Filename &filename, bool auto_wrap, bool truncate);
00114 BLOCKING ostream *open_append_file(const Filename &filename);
00115 BLOCKING static void close_write_file(ostream *stream);
00116
00117 BLOCKING iostream *open_read_write_file(const Filename &filename, bool truncate);
00118 BLOCKING iostream *open_read_append_file(const Filename &filename);
00119 BLOCKING static void close_read_write_file(iostream *stream);
00120
00121 public:
00122 bool atomic_compare_and_exchange_contents(const Filename &filename, string &orig_contents, const string &old_contents, const string &new_contents);
00123 bool atomic_read_contents(const Filename &filename, string &contents) const;
00124
00125 INLINE bool read_file(const Filename &filename, string &result, bool auto_unwrap) const;
00126 INLINE bool read_file(const Filename &filename, pvector<unsigned char> &result, bool auto_unwrap) const;
00127 INLINE bool write_file(const Filename &filename, const unsigned char *data, size_t data_size, bool auto_wrap);
00128
00129 void scan_mount_points(vector_string &names, const Filename &path) const;
00130
00131 static void parse_options(const string &options,
00132 int &flags, string &password);
00133 static void parse_option(const string &option,
00134 int &flags, string &password);
00135
00136 public:
00137
00138
00139
00140 enum OpenFlags {
00141 OF_status_only = 0x0001,
00142 OF_create_file = 0x0002,
00143 OF_make_directory = 0x0004,
00144 OF_allow_nonexist = 0x0008,
00145 };
00146
00147
00148
00149
00150 ConfigVariableBool vfs_case_sensitive;
00151 ConfigVariableBool vfs_implicit_pz;
00152 ConfigVariableBool vfs_implicit_mf;
00153
00154 private:
00155 Filename normalize_mount_point(const Filename &mount_point) const;
00156 bool do_mount(VirtualFileMount *mount, const Filename &mount_point, int flags);
00157 PT(VirtualFile) do_get_file(const Filename &filename, int open_flags) const;
00158
00159 bool consider_match(PT(VirtualFile) &found_file, VirtualFileComposite *&composite_file,
00160 VirtualFileMount *mount, const Filename &local_filename,
00161 const Filename &original_filename, bool implicit_pz_file,
00162 int open_flags) const;
00163 bool consider_mount_mf(const Filename &filename);
00164
00165 MutexImpl _lock;
00166 typedef pvector<PT(VirtualFileMount) > Mounts;
00167 Mounts _mounts;
00168 unsigned int _mount_seq;
00169
00170 Filename _cwd;
00171
00172 static VirtualFileSystem *_global_ptr;
00173 };
00174
00175 #include "virtualFileSystem.I"
00176
00177 #endif