Panda3D

virtualFile.h

00001 // Filename: virtualFile.h
00002 // Created by:  drose (03Aug02)
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) Carnegie Mellon University.  All rights reserved.
00008 //
00009 // All use of this software is subject to the terms of the revised BSD
00010 // license.  You should have received a copy of this license along
00011 // with this source code in a file named "LICENSE."
00012 //
00013 ////////////////////////////////////////////////////////////////////
00014 
00015 #ifndef VIRTUALFILE_H
00016 #define VIRTUALFILE_H
00017 
00018 #include "pandabase.h"
00019 
00020 #include "filename.h"
00021 #include "pointerTo.h"
00022 #include "typedReferenceCount.h"
00023 #include "ordered_vector.h"
00024 #include "pvector.h"
00025 
00026 class VirtualFileMount;
00027 class VirtualFileList;
00028 class VirtualFileSystem;
00029 
00030 
00031 ////////////////////////////////////////////////////////////////////
00032 //       Class : VirtualFile
00033 // Description : The abstract base class for a file or directory
00034 //               within the VirtualFileSystem.
00035 ////////////////////////////////////////////////////////////////////
00036 class EXPCL_PANDAEXPRESS VirtualFile : public TypedReferenceCount {
00037 public:
00038   INLINE VirtualFile();
00039 
00040 PUBLISHED:
00041   virtual VirtualFileSystem *get_file_system() const=0;
00042   virtual Filename get_filename() const=0;
00043   INLINE const Filename &get_original_filename() const;
00044 
00045   virtual bool has_file() const;
00046   virtual bool is_directory() const;
00047   virtual bool is_regular_file() const;
00048 
00049   BLOCKING PT(VirtualFileList) scan_directory() const;
00050 
00051   void output(ostream &out) const;
00052   BLOCKING void ls(ostream &out = cout) const;
00053   BLOCKING void ls_all(ostream &out = cout) const;
00054 
00055   BLOCKING INLINE string read_file(bool auto_unwrap) const;
00056   BLOCKING virtual istream *open_read_file(bool auto_unwrap) const;
00057   BLOCKING void close_read_file(istream *stream) const;
00058   virtual bool was_read_successful() const;
00059   BLOCKING virtual off_t get_file_size(istream *stream) const;
00060   BLOCKING virtual off_t get_file_size() const;
00061   BLOCKING virtual time_t get_timestamp() const;
00062 
00063 public:
00064   INLINE void set_original_filename(const Filename &filename);
00065   bool read_file(string &result, bool auto_unwrap) const;
00066   virtual bool read_file(pvector<unsigned char> &result, bool auto_unwrap) const;
00067 
00068   static bool simple_read_file(istream *stream, pvector<unsigned char> &result);
00069   static bool simple_read_file(istream *stream, pvector<unsigned char> &result, size_t max_bytes);
00070 
00071 
00072 protected:
00073   virtual bool scan_local_directory(VirtualFileList *file_list, 
00074                                     const ov_set<string> &mount_points) const;
00075 
00076 private:
00077   void r_ls_all(ostream &out, const Filename &root) const;
00078 
00079   Filename _original_filename;
00080 
00081 
00082 public:
00083   virtual TypeHandle get_type() const {
00084     return get_class_type();
00085   }
00086   virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00087   static TypeHandle get_class_type() {
00088     return _type_handle;
00089   }
00090   static void init_type() {
00091     TypedReferenceCount::init_type();
00092     register_type(_type_handle, "VirtualFile",
00093                   TypedReferenceCount::get_class_type());
00094   }
00095 
00096 private:
00097   static TypeHandle _type_handle;
00098 
00099   friend class VirtualFileComposite;
00100 };
00101 
00102 INLINE ostream &operator << (ostream &out, const VirtualFile &file);
00103 
00104 
00105 #include "virtualFile.I"
00106 
00107 #endif
 All Classes Functions Variables Enumerations