mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
vfs multifile support
This commit is contained in:
parent
255bcd1299
commit
89528a5fc9
@ -547,6 +547,82 @@ find_subfile(const string &subfile_name) const {
|
|||||||
return (fi - _subfiles.begin());
|
return (fi - _subfiles.begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Multifile::has_directory
|
||||||
|
// Access: Published
|
||||||
|
// Description: Returns true if the indicated subfile name is the
|
||||||
|
// directory prefix to one or more files within the
|
||||||
|
// Multifile. That is, the Multifile contains at least
|
||||||
|
// one file named "subfile_name/...".
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
bool Multifile::
|
||||||
|
has_directory(const string &subfile_name) const {
|
||||||
|
string prefix = subfile_name;
|
||||||
|
if (!prefix.empty()) {
|
||||||
|
prefix += '/';
|
||||||
|
}
|
||||||
|
Subfile find_subfile(prefix);
|
||||||
|
Subfiles::const_iterator fi;
|
||||||
|
fi = _subfiles.upper_bound(&find_subfile);
|
||||||
|
if (fi == _subfiles.end()) {
|
||||||
|
// Not present.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// At least one subfile exists whose name sorts after prefix. If it
|
||||||
|
// contains prefix as the initial substring, then we have a match.
|
||||||
|
Subfile *subfile = (*fi);
|
||||||
|
return (subfile->_name.length() > prefix.length() &&
|
||||||
|
subfile->_name.substr(0, prefix.length()) == prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: Multifile::scan_directory
|
||||||
|
// Access: Published
|
||||||
|
// Description: Considers subfile_name to be the name of a
|
||||||
|
// subdirectory within the Multifile, but not a file
|
||||||
|
// itself; ills the given vector up with the sorted list
|
||||||
|
// of subdirectories or files within the named
|
||||||
|
// directory.
|
||||||
|
//
|
||||||
|
// Note that directories do not exist explicitly within
|
||||||
|
// a Multifile; this just checks for the existence of
|
||||||
|
// files with the given initial prefix.
|
||||||
|
//
|
||||||
|
// Returns true if successful, false otherwise.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
bool Multifile::
|
||||||
|
scan_directory(vector_string &contents, const string &subfile_name) const {
|
||||||
|
string prefix = subfile_name;
|
||||||
|
if (!prefix.empty()) {
|
||||||
|
prefix += '/';
|
||||||
|
}
|
||||||
|
Subfile find_subfile(prefix);
|
||||||
|
Subfiles::const_iterator fi;
|
||||||
|
fi = _subfiles.upper_bound(&find_subfile);
|
||||||
|
|
||||||
|
string previous = "";
|
||||||
|
while (fi != _subfiles.end()) {
|
||||||
|
Subfile *subfile = (*fi);
|
||||||
|
if (!(subfile->_name.length() > prefix.length() &&
|
||||||
|
subfile->_name.substr(0, prefix.length()) == prefix)) {
|
||||||
|
// We've reached the end of the list of subfiles beneath the
|
||||||
|
// indicated direcotry prefix.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t slash = subfile->_name.find('/', prefix.length());
|
||||||
|
string basename = subfile->_name.substr(prefix.length(), slash);
|
||||||
|
if (basename != previous) {
|
||||||
|
contents.push_back(basename);
|
||||||
|
previous = basename;
|
||||||
|
}
|
||||||
|
++fi;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: Multifile::remove_subfile
|
// Function: Multifile::remove_subfile
|
||||||
// Access: Published
|
// Access: Published
|
||||||
|
@ -63,6 +63,9 @@ PUBLISHED:
|
|||||||
|
|
||||||
int get_num_subfiles() const;
|
int get_num_subfiles() const;
|
||||||
int find_subfile(const string &subfile_name) const;
|
int find_subfile(const string &subfile_name) const;
|
||||||
|
bool has_directory(const string &subfile_name) const;
|
||||||
|
bool scan_directory(vector_string &contents,
|
||||||
|
const string &subfile_name) const;
|
||||||
void remove_subfile(int index);
|
void remove_subfile(int index);
|
||||||
const string &get_subfile_name(int index) const;
|
const string &get_subfile_name(int index) const;
|
||||||
size_t get_subfile_length(int index) const;
|
size_t get_subfile_length(int index) const;
|
||||||
|
@ -74,7 +74,7 @@ read_file(Datagram &data) const {
|
|||||||
util_cat.info()
|
util_cat.info()
|
||||||
<< "Error while reading " << get_filename() << "\n";
|
<< "Error while reading " << get_filename() << "\n";
|
||||||
}
|
}
|
||||||
return failed;
|
return !failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
@ -45,7 +45,9 @@ VirtualFileMountMultifile::
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
bool VirtualFileMountMultifile::
|
bool VirtualFileMountMultifile::
|
||||||
has_file(const Filename &file) const {
|
has_file(const Filename &file) const {
|
||||||
return false;
|
return (file.empty() ||
|
||||||
|
_multifile->find_subfile(file) >= 0 ||
|
||||||
|
_multifile->has_directory(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -56,7 +58,7 @@ has_file(const Filename &file) const {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
bool VirtualFileMountMultifile::
|
bool VirtualFileMountMultifile::
|
||||||
is_directory(const Filename &file) const {
|
is_directory(const Filename &file) const {
|
||||||
return false;
|
return (file.empty() || _multifile->has_directory(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -67,7 +69,7 @@ is_directory(const Filename &file) const {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
bool VirtualFileMountMultifile::
|
bool VirtualFileMountMultifile::
|
||||||
is_regular_file(const Filename &file) const {
|
is_regular_file(const Filename &file) const {
|
||||||
return false;
|
return (_multifile->find_subfile(file) >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -80,20 +82,23 @@ is_regular_file(const Filename &file) const {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
istream *VirtualFileMountMultifile::
|
istream *VirtualFileMountMultifile::
|
||||||
open_read_file(const Filename &file) const {
|
open_read_file(const Filename &file) const {
|
||||||
|
int subfile_index = _multifile->find_subfile(file);
|
||||||
|
if (subfile_index < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
return _multifile->open_read_subfile(subfile_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: VirtualFileMountMultifile::scan_directory
|
// Function: VirtualFileMountMultifile::scan_directory
|
||||||
// Access: Public, Virtual
|
// Access: Public, Virtual
|
||||||
// Description: Fills the given vector up with the sorted list of
|
// Description: Fills the given vector up with the list of filenames
|
||||||
// filenames that are local to this directory, if the
|
// that are local to this directory, if the filename is
|
||||||
// filename is a directory. Returns true if successful,
|
// a directory. Returns true if successful, or false if
|
||||||
// or false if the file is not a directory or cannot be
|
// the file is not a directory or cannot be read.
|
||||||
// read.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
bool VirtualFileMountMultifile::
|
bool VirtualFileMountMultifile::
|
||||||
scan_directory(vector_string &contents, const Filename &dir) const {
|
scan_directory(vector_string &contents, const Filename &dir) const {
|
||||||
return false;
|
return _multifile->scan_directory(contents, dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,11 +81,10 @@ open_read_file(const Filename &file) const {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: VirtualFileMountSystem::scan_directory
|
// Function: VirtualFileMountSystem::scan_directory
|
||||||
// Access: Public, Virtual
|
// Access: Public, Virtual
|
||||||
// Description: Fills the given vector up with the sorted list of
|
// Description: Fills the given vector up with the list of filenames
|
||||||
// filenames that are local to this directory, if the
|
// that are local to this directory, if the filename is
|
||||||
// filename is a directory. Returns true if successful,
|
// a directory. Returns true if successful, or false if
|
||||||
// or false if the file is not a directory or cannot be
|
// the file is not a directory or cannot be read.
|
||||||
// read.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
bool VirtualFileMountSystem::
|
bool VirtualFileMountSystem::
|
||||||
scan_directory(vector_string &contents, const Filename &dir) const {
|
scan_directory(vector_string &contents, const Filename &dir) const {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user