Explorar o código

* BugFix: When querying against root with Torque::FS::DumpDirectories, correctly return directories with their path.
* Adjustment: Add commenting to some of the new programming.
* Adjustment: Tweak fileCreatedTime and fileModifiedTime functions to use the VFS.

Robert MacGregor %!s(int64=3) %!d(string=hai) anos
pai
achega
0e93373824

+ 22 - 22
Engine/source/console/fileSystemFunctions.cpp

@@ -532,20 +532,20 @@ DefineEngineFunction( fileModifiedTime, String, ( const char* fileName ),,
    "@return Formatted string (OS specific) containing modified time, \"9/3/2010 12:33:47 PM\" for example\n"
    "@ingroup FileSystem")
 {
-   Con::expandScriptFilename(sgScriptFilenameBuffer, sizeof(sgScriptFilenameBuffer), fileName);
+   Torque::FS::FileNodeRef node = Torque::FS::GetFileNode(fileName);
 
-   FileTime ft = {0};
-   Platform::getFileTimes( sgScriptFilenameBuffer, NULL, &ft );
+   if (node)
+   {
+      Platform::LocalTime lt = node->getModifiedTime().toLocalTime();
 
-   Platform::LocalTime lt = {0};
-   Platform::fileToLocalTime( ft, &lt );   
-   
-   String fileStr = Platform::localTimeToString( lt );
-   
-   char *buffer = Con::getReturnBuffer( fileStr.size() );
-   dStrcpy( buffer, fileStr, fileStr.size() );
-   
-   return buffer;
+      String fileStr = Platform::localTimeToString(lt);
+
+      char *buffer = Con::getReturnBuffer(fileStr.size());
+      dStrcpy(buffer, fileStr, fileStr.size());
+
+      return buffer;
+   }
+   return "";
 }
 
 DefineEngineFunction( fileCreatedTime, String, ( const char* fileName ),,
@@ -555,20 +555,20 @@ DefineEngineFunction( fileCreatedTime, String, ( const char* fileName ),,
    "@return Formatted string (OS specific) containing created time, \"9/3/2010 12:33:47 PM\" for example\n"
    "@ingroup FileSystem")
 {
-   Con::expandScriptFilename( sgScriptFilenameBuffer, sizeof(sgScriptFilenameBuffer), fileName );
+   Torque::FS::FileNodeRef node = Torque::FS::GetFileNode(fileName);
 
-   FileTime ft = {0};
-   Platform::getFileTimes( sgScriptFilenameBuffer, &ft, NULL );
-
-   Platform::LocalTime lt = {0};
-   Platform::fileToLocalTime( ft, &lt );   
+   if (node)
+   {
+      Platform::LocalTime lt = node->getCreatedTime().toLocalTime();
 
-   String fileStr = Platform::localTimeToString( lt );
+      String fileStr = Platform::localTimeToString(lt);
 
-   char *buffer = Con::getReturnBuffer( fileStr.size() );
-   dStrcpy( buffer, fileStr, fileStr.size() );
+      char *buffer = Con::getReturnBuffer(fileStr.size());
+      dStrcpy(buffer, fileStr, fileStr.size());
 
-   return buffer;
+      return buffer;
+   }
+   return "";
 }
 
 DefineEngineFunction(compareFileTimes, S32, (const char* fileA, const char* fileB), ("", ""),

+ 25 - 0
Engine/source/core/util/timeClass.cpp

@@ -195,4 +195,29 @@ void Time::get(S32 *pyear, S32 *pmonth, S32 *pday, S32 *phour, S32 *pminute, S32
       *pmicrosecond = time % OneSecond;
 }
 
+Platform::LocalTime Time::toLocalTime()
+{
+   Platform::LocalTime result;
+   result.isdst = false;
+
+   S32 year;
+   S32 month;
+   S32 day;
+   S32 hour;
+   S32 minute;
+   S32 second;
+   S32 microsecond;
+
+   get(&year, &month, &day, &hour, &minute, &second, &microsecond);
+   result.year = year - 1900;
+   result.month = month - 1;
+   result.yearday = day;
+   result.hour = hour;
+   result.min = minute;
+   result.sec = second;
+   result.monthday = day % 32;
+   result.weekday = day % 7;
+   return result;
+}
+
 } // Namespace

+ 5 - 1
Engine/source/core/util/timeClass.h

@@ -26,7 +26,9 @@
 #ifndef _TORQUE_TYPES_H_
 #include "platform/types.h"
 #endif
-
+#ifndef _PLATFORM_H_
+#include "platform/platform.h"
+#endif
 
 #if defined(TORQUE_COMPILER_VISUALC)
    #define TORQUE_CONSTANT_S64(a) (a##I64)
@@ -105,6 +107,8 @@ public:
    S64 getMicroseconds() const;
    S64 getInternalRepresentation() const;
 
+   Platform::LocalTime toLocalTime();
+
 private:
    class Tester
    {

+ 10 - 2
Engine/source/core/volume.cpp

@@ -600,17 +600,24 @@ bool MountSystem::_dumpDirectories(DirectoryRef directory, Vector<StringTableEnt
       return false;
    }
 
+   // Queries against / will return a directory count of 1, but the code relies on actual directory entries (Eg. /data) so we handle that special case
+   const U32 basePathDirectoryCount = String::compare(basePath.getFullPathWithoutRoot(), "/") == 0 ? basePath.getDirectoryCount() - 1 : basePath.getDirectoryCount();
+
    for (U32 iteration = 0; iteration < directoryPaths.size(); ++iteration)
    {
       const Path& directoryPath = directoryPaths[iteration];
 
+      // Load the full path to the directory unless we're not supposed to include base paths
       String directoryPathString = directoryPath.getFullPath().c_str();
       if (noBasePath)
       {
+         // Build a path representing the directory tree *after* the base path query but excluding the base
+         // So if we queried for data/ and are currently processing data/ExampleModule/datablocks we want to output
+         // ExampleModule/datablocks
          Path newDirectoryPath;
-         for (U32 iteration = basePath.getDirectoryCount(); iteration < directoryPath.getDirectoryCount(); ++iteration)
+         for (U32 iteration = basePathDirectoryCount; iteration < directoryPath.getDirectoryCount(); ++iteration)
          {
-            if (iteration > basePath.getDirectoryCount())
+            if (iteration > basePathDirectoryCount)
             {
                newDirectoryPath.setPath(newDirectoryPath.getPath() + "/");
             }
@@ -622,6 +629,7 @@ bool MountSystem::_dumpDirectories(DirectoryRef directory, Vector<StringTableEnt
          directoryPathString = newDirectoryPath.getFullPathWithoutRoot();
       }
 
+      // Output result and enumerate subdirectories if we're not too deep according to the depth parameter
       directories.push_back(StringTable->insert(directoryPathString, true));
       if (currentDepth <= depth)
       {

+ 1 - 6
Engine/source/platform/platformVolume.cpp

@@ -50,12 +50,7 @@ bool  MountDefaults()
       return false;
 
 #ifdef TORQUE_SECURE_VFS
-   // Set working directory to where the executable is
-   StringTableEntry executablePath = Platform::getExecutablePath();
-   SetCwd(executablePath);
-
-   // FIXME: Should we use the asset path here as well?
-   mounted = Mount("/", createNativeFS(executablePath));
+   mounted = Mount("/", createNativeFS(path));
    if (!mounted)
    {
       return false;

+ 11 - 3
Engine/source/windowManager/sdl/sdlWindowMgr.cpp

@@ -52,8 +52,7 @@ PlatformWindowManagerSDL::DragAndDropFSInfo::DragAndDropFSInfo(String rootName,
 
 PlatformWindowManagerSDL::DragAndDropFSInfo::~DragAndDropFSInfo()
 {
-// FIXME: Cleanup - we can't simply do this unmount due to the way the hash mapping works
-//   Torque::FS::Unmount(mDragAndDropFS);
+
 }
 #endif
 
@@ -88,6 +87,15 @@ PlatformWindowManagerSDL::PlatformWindowManagerSDL()
 
 PlatformWindowManagerSDL::~PlatformWindowManagerSDL()
 {
+   // Unmount all drag and drop FS mounts
+   for (auto iteration = mActiveDragAndDropFSByPath.begin(); iteration != mActiveDragAndDropFSByPath.end(); ++iteration)
+   {
+      auto&& mapping = *iteration;
+      Torque::FS::Unmount(mapping.value.mDragAndDropFS);
+   }
+   mActiveDragAndDropByRoot.clear();
+   mActiveDragAndDropFSByPath.clear();
+
    // Kill all our windows first.
    while(mWindowListHead)
       // The destructors update the list, so this works just fine.
@@ -473,7 +481,7 @@ void PlatformWindowManagerSDL::_process()
                while (search != mActiveDragAndDropByRoot.end())
                {
                   char buffer[32];
-                  dSprintf(buffer, 32, "%u", rootCounter);
+                  dSprintf(buffer, sizeof(buffer), "%u", rootCounter);
                   chosenRootName = directoryName + buffer;
 
                   search = mActiveDragAndDropByRoot.find(chosenRootName);

+ 3 - 0
Engine/source/windowManager/sdl/sdlWindowMgr.h

@@ -111,7 +111,10 @@ protected:
    KeyboardInputState mInputState;
 
 #ifdef TORQUE_SECURE_VFS
+   /// Used to check if a root is already used when generating root names.
    HashMap<String, DragAndDropFSInfo> mActiveDragAndDropByRoot;
+
+   /// Used to keep track of what mounts are handling a given path.
    HashMap<Torque::Path, DragAndDropFSInfo> mActiveDragAndDropFSByPath;
 #endif