From cbe7ee13d64ee39126bd6ccf7624e3ff996b0c5b Mon Sep 17 00:00:00 2001 From: Robert MacGregor Date: Sat, 18 Dec 2021 23:37:49 -0500 Subject: [PATCH] * Adjustment: Change several filesystem functions to use the VFS. * Feature: Initial implementation of a VFS dump directories function. --- Engine/source/console/fileSystemFunctions.cpp | 44 +++---- Engine/source/core/memVolume.h | 2 +- Engine/source/core/util/zip/zipVolume.h | 2 +- Engine/source/core/volume.cpp | 111 ++++++++++++++++-- Engine/source/core/volume.h | 13 +- 5 files changed, 130 insertions(+), 42 deletions(-) diff --git a/Engine/source/console/fileSystemFunctions.cpp b/Engine/source/console/fileSystemFunctions.cpp index 34fd77bc5..7a9ffeb23 100644 --- a/Engine/source/console/fileSystemFunctions.cpp +++ b/Engine/source/console/fileSystemFunctions.cpp @@ -368,15 +368,11 @@ DefineEngineFunction(getFileCRC, S32, ( const char* fileName ),, "@ingroup FileSystem") { - String cleanfilename(Torque::Path::CleanSeparators(fileName)); - Con::expandScriptFilename(sgScriptFilenameBuffer, sizeof(sgScriptFilenameBuffer), cleanfilename.c_str()); - - Torque::Path givenPath(Torque::Path::CompressPath(sgScriptFilenameBuffer)); - Torque::FS::FileNodeRef fileRef = Torque::FS::GetFileNode( givenPath ); + Torque::FS::FileNodeRef fileRef = Torque::FS::GetFileNode( fileName ); if ( fileRef == NULL ) { - Con::errorf("getFileCRC() - could not access file: [%s]", givenPath.getFullPath().c_str() ); + Con::errorf("getFileCRC() - could not access file: [%s]", fileName ); return -1; } @@ -391,11 +387,7 @@ DefineEngineFunction(isFile, bool, ( const char* fileName ),, "@ingroup FileSystem") { - String cleanfilename(Torque::Path::CleanSeparators(fileName)); - Con::expandScriptFilename(sgScriptFilenameBuffer, sizeof(sgScriptFilenameBuffer), cleanfilename.c_str()); - - Torque::Path givenPath(Torque::Path::CompressPath(sgScriptFilenameBuffer)); - return Torque::FS::IsFile(givenPath); + return Torque::FS::IsFile(fileName); } DefineEngineFunction(isScriptFile, bool, (const char* fileName), , @@ -406,11 +398,7 @@ DefineEngineFunction(isScriptFile, bool, (const char* fileName), , "@ingroup FileSystem") { - String cleanfilename(Torque::Path::CleanSeparators(fileName)); - Con::expandScriptFilename(sgScriptFilenameBuffer, sizeof(sgScriptFilenameBuffer), cleanfilename.c_str()); - - Torque::Path givenPath(Torque::Path::CompressPath(sgScriptFilenameBuffer)); - return Torque::FS::IsScriptFile(givenPath.getFullPath()); + return Torque::FS::IsScriptFile(fileName); } DefineEngineFunction( IsDirectory, bool, ( const char* directory ),, @@ -423,11 +411,7 @@ DefineEngineFunction( IsDirectory, bool, ( const char* directory ),, "@ingroup FileSystem") { - String dir(Torque::Path::CleanSeparators(directory)); - Con::expandScriptFilename(sgScriptFilenameBuffer, sizeof(sgScriptFilenameBuffer), dir.c_str()); - - Torque::Path givenPath(Torque::Path::CompressPath(sgScriptFilenameBuffer)); - return Torque::FS::IsDirectory( givenPath ); + return Torque::FS::IsDirectory( directory ); } DefineEngineFunction(isWriteableFileName, bool, ( const char* fileName ),, @@ -438,14 +422,7 @@ DefineEngineFunction(isWriteableFileName, bool, ( const char* fileName ),, "@ingroup FileSystem") { - String filename(Torque::Path::CleanSeparators(fileName)); - Con::expandScriptFilename(sgScriptFilenameBuffer, sizeof(sgScriptFilenameBuffer), filename.c_str()); - - Torque::Path givenPath(Torque::Path::CompressPath(sgScriptFilenameBuffer)); - Torque::FS::FileSystemRef fs = Torque::FS::GetFileSystem(givenPath); - Torque::Path path = fs->mapTo(givenPath); - - return !Torque::FS::IsReadOnly(path); + return !Torque::FS::IsReadOnly(fileName); } DefineEngineFunction(startFileChangeNotifications, void, (),, @@ -840,7 +817,11 @@ DefineEngineFunction( getCurrentDirectory, String, (),, "@see getWorkingDirectory()" "@ingroup FileSystem") { +#ifdef TORQUE_SECURE_VFS + return Torque::FS::GetCwd(); +#else return Platform::getCurrentDirectory(); +#endif } //----------------------------------------------------------------------------- @@ -853,8 +834,11 @@ DefineEngineFunction( setCurrentDirectory, bool, ( const char* path ),, "@note Only present in a Tools build of Torque.\n" "@ingroup FileSystem") { +#ifdef TORQUE_SECURE_VFS + return Torque::FS::SetCwd(path); +#else return Platform::setCurrentDirectory( StringTable->insert( path ) ); - +#endif } //----------------------------------------------------------------------------- diff --git a/Engine/source/core/memVolume.h b/Engine/source/core/memVolume.h index 0a20fa84f..bc45bcec2 100644 --- a/Engine/source/core/memVolume.h +++ b/Engine/source/core/memVolume.h @@ -129,4 +129,4 @@ namespace Torque } // Namespace } // Namespace -#endif \ No newline at end of file +#endif diff --git a/Engine/source/core/util/zip/zipVolume.h b/Engine/source/core/util/zip/zipVolume.h index 6f949df5e..db1a7faab 100644 --- a/Engine/source/core/util/zip/zipVolume.h +++ b/Engine/source/core/util/zip/zipVolume.h @@ -75,4 +75,4 @@ private: } -#endif \ No newline at end of file +#endif diff --git a/Engine/source/core/volume.cpp b/Engine/source/core/volume.cpp index a0a4570d7..090dc43f7 100644 --- a/Engine/source/core/volume.cpp +++ b/Engine/source/core/volume.cpp @@ -255,6 +255,64 @@ File::~File() {} Directory::Directory() {} Directory::~Directory() {} +bool Directory::dump(Vector& out) +{ + const Path sourcePath = getName(); + + FileNode::Attributes currentAttributes; + while (read(¤tAttributes)) + { + Path currentPath = sourcePath; + currentPath.appendPath(currentPath.getFileName()); + currentPath.setFileName(currentAttributes.name); + + out.push_back(currentPath); + } + + return true; +} + +bool Directory::dumpFiles(Vector& out) +{ + const Path sourcePath = getName(); + + FileNode::Attributes currentAttributes; + while (read(¤tAttributes)) + { + Path currentPath = sourcePath; + currentPath.appendPath(currentPath.getFileName()); + currentPath.setFileName(currentAttributes.name); + + if (IsFile(currentPath)) + { + out.push_back(currentPath); + } + } + + return true; +} + +bool Directory::dumpDirectories(Vector& out) +{ + const Path sourcePath = getName(); + + FileNode::Attributes currentAttributes; + while (read(¤tAttributes)) + { + Path currentPath = sourcePath; + currentPath.appendPath(currentPath.getFileName()); + currentPath.setFileName(currentAttributes.name); + + const bool result = IsDirectory(currentPath); + if (result) + { + out.push_back(currentPath); + } + } + + return true; +} + FileNode::FileNode() : mChecksum(0) @@ -534,6 +592,39 @@ bool MountSystem::copyFile(const Path& source, const Path& destination, bool noO return success; } +bool MountSystem::_dumpDirectories(DirectoryRef directory, Vector& directories, S32 depth, bool noBasePath, S32 currentDepth, const Path& basePath) +{ + Vector directoryPaths; + if (!directory->dumpDirectories(directoryPaths)) + { + return false; + } + + for (U32 iteration = 0; iteration < directoryPaths.size(); ++iteration) + { + directories.push_back(StringTable->insert(directoryPaths[iteration].getFullPath().c_str(), true)); + + if (currentDepth <= depth) + { + DirectoryRef nextDirectory = OpenDirectory(directoryPaths[iteration]); + _dumpDirectories(nextDirectory, directories, depth, noBasePath, currentDepth + 1, basePath); + } + } + + return true; +} + +bool MountSystem::dumpDirectories(const Path& path, Vector& directories, S32 depth, bool noBasePath) +{ + if (!isDirectory(path)) + { + return false; + } + + DirectoryRef sourceDirectory = openDirectory(path); + return _dumpDirectories(sourceDirectory, directories, depth, noBasePath, 0, path); +} + FileRef MountSystem::createFile(const Path& path) { Path np = _normalize(path); @@ -830,22 +921,19 @@ bool MountSystem::isDirectory(const Path& path, FileSystemRef fsRef) { FileNode::Attributes attr; + bool result = false; if (fsRef.isNull()) { - if (getFileAttributes(path,&attr)) - return attr.flags & FileNode::Directory; - return false; + if (getFileAttributes(path, &attr)) + result = (attr.flags & FileNode::Directory) != 0; } else { FileNodeRef fnRef = fsRef->resolve(path); - if (fnRef.isNull()) - return false; - - if (fnRef->getAttributes(&attr)) - return attr.flags & FileNode::Directory; - return false; + if (!fnRef.isNull() && fnRef->getAttributes(&attr)) + result = (attr.flags & FileNode::Directory) != 0; } + return result; } bool MountSystem::isReadOnly(const Path& path) @@ -948,6 +1036,11 @@ bool CopyFile(const Path& source, const Path& destination, bool noOverwrite) return sgMountSystem.copyFile(source, destination, noOverwrite); } +bool DumpDirectories(const Path& path, Vector& directories, S32 depth, bool noBasePath) +{ + return sgMountSystem.dumpDirectories(path, directories, depth, noBasePath); +} + DirectoryRef CreateDirectory(const Path &path) { return sgMountSystem.createDirectory(path); diff --git a/Engine/source/core/volume.h b/Engine/source/core/volume.h index 4766439c6..d6369660e 100644 --- a/Engine/source/core/volume.h +++ b/Engine/source/core/volume.h @@ -203,7 +203,11 @@ public: // Functions virtual bool open() = 0; virtual bool close() = 0; - virtual bool read(Attributes*) = 0; + virtual bool read(Attributes*) = 0; + + bool dump(Vector& out); + bool dumpFiles(Vector& out); + bool dumpDirectories(Vector& out); }; typedef WeakRefPtr DirectoryPtr; @@ -338,6 +342,8 @@ public: FileRef createFile(const Path& path); bool copyFile(const Path& source, const Path& destination, bool noOverwrite); + bool dumpDirectories(const Path& path, Vector& directories, S32 depth, bool noBasePath); + DirectoryRef createDirectory(const Path& path, FileSystemRef fs = NULL); virtual bool createPath(const Path& path); @@ -377,6 +383,8 @@ public: void startFileChangeNotifications(); void stopFileChangeNotifications(); +private: + bool _dumpDirectories(DirectoryRef directory, Vector& directories, S32 depth, bool noBasePath, S32 currentDepth, const Path& basePath); protected: virtual void _log(const String& msg); @@ -544,6 +552,9 @@ FileRef CreateFile(const Path &file); /// Copy a file from one location to another. bool CopyFile(const Path& source, const Path& destination, bool noOverride); +/// Retrieve list of directories in the specified directory. +bool DumpDirectories(const Path& path, Vector& directories, S32 depth, bool noBasePath); + /// Create a directory. /// The directory object is returned in a closed state. ///@ingroup VolumeSystem