Browse Source

Added Time::GetTimeSinceEpoch() and FileSystem::SetLastModifiedTime().

Lasse Öörni 11 years ago
parent
commit
3721ee0b10

+ 5 - 0
Source/Engine/Core/Timer.cpp

@@ -137,6 +137,11 @@ unsigned Time::GetSystemTime()
     return currentTime;
 }
 
+unsigned Time::GetTimeSinceEpoch()
+{
+    return (unsigned)time(NULL);
+}
+
 String Time::GetTimeStamp()
 {
     time_t sysTime;

+ 2 - 0
Source/Engine/Core/Timer.h

@@ -102,6 +102,8 @@ public:
     
     /// Get system time as milliseconds.
     static unsigned GetSystemTime();
+    /// Get system time as seconds since 1.1.1970.
+    static unsigned GetTimeSinceEpoch();
     /// Get a date/time stamp as a string.
     static String GetTimeStamp();
     /// Sleep for a number of milliseconds.

+ 31 - 10
Source/Engine/IO/FileSystem.cpp

@@ -35,6 +35,7 @@
 
 #include <cstdio>
 #include <cstring>
+#include <sys/stat.h>
 
 #ifdef WIN32
 #ifndef _MSC_VER
@@ -44,11 +45,13 @@
 #include <shellapi.h>
 #include <direct.h>
 #include <shlobj.h>
+#include <sys/types.h>
+#include <sys/utime.h>
 #else
 #include <dirent.h>
 #include <errno.h>
 #include <unistd.h>
-#include <sys/stat.h>
+#include <utime.h>
 #include <sys/wait.h>
 #define MAX_PATH 256
 #endif
@@ -534,15 +537,9 @@ unsigned FileSystem::GetLastModifiedTime(const String& fileName) const
         return 0;
 
     #ifdef WIN32
-    WIN32_FILE_ATTRIBUTE_DATA fileAttrData;
-    memset(&fileAttrData, 0, sizeof fileAttrData);
-    if (GetFileAttributesExW(WString(fileName).CString(), GetFileExInfoStandard, &fileAttrData))
-    {
-        ULARGE_INTEGER ull;
-        ull.LowPart = fileAttrData.ftLastWriteTime.dwLowDateTime;
-        ull.HighPart = fileAttrData.ftLastWriteTime.dwHighDateTime;
-        return (unsigned)(ull.QuadPart / 10000000ULL - 11644473600ULL);
-    }
+    struct _stat st;
+    if (!_stat(fileName.CString(), &st))
+        return (unsigned)st.st_mtime;
     else
         return 0;
     #else
@@ -721,6 +718,30 @@ void FileSystem::RegisterPath(const String& pathName)
     allowedPaths_.Insert(AddTrailingSlash(pathName));
 }
 
+bool FileSystem::SetLastModifiedTime(const String& fileName, unsigned newTime)
+{
+    if (fileName.Empty() || !CheckAccess(fileName))
+        return false;
+
+    #ifdef WIN32
+    struct _stat oldTime;
+    struct _utimbuf newTimes;
+    if (_stat(fileName.CString(), &oldTime) != 0)
+        return false;
+    newTimes.actime = oldTime.st_atime;
+    newTimes.modtime = newTime;
+    return _utime(fileName.CString(), &newTimes) == 0;
+    #else
+    struct stat oldTime;
+    struct utimbuf newTimes;
+    if (stat(fileName.CString(), &oldTime) != 0)
+        return false;
+    newTimes.actime = oldTime.st_atime;
+    newTimes.modtime = newTime;
+    return utime(fileName.CString(), &newTimes) == 0;
+    #endif
+}
+
 void FileSystem::ScanDirInternal(Vector<String>& result, String path, const String& startPath,
     const String& filter, unsigned flags, bool recursive) const
 {

+ 2 - 0
Source/Engine/IO/FileSystem.h

@@ -73,6 +73,8 @@ public:
     bool Delete(const String& fileName);
     /// Register a path as allowed to access. If no paths are registered, all are allowed. Registering allowed paths is considered securing the Urho3D execution environment: running programs and opening files externally through the system will fail afterward.
     void RegisterPath(const String& pathName);
+    /// Set a file's last modified time as seconds since 1.1.1970. Return true on success.
+    bool SetLastModifiedTime(const String& fileName, unsigned newTime);
     
     /// Return the absolute current working directory.
     String GetCurrentDir() const;

+ 2 - 1
Source/Engine/LuaScript/pkgs/Core/Timer.pkg

@@ -7,8 +7,9 @@ class Time : public Object
     float GetTimeStep() const;
     unsigned GetTimerPeriod() const;
     float GetElapsedTime();
-    
+
     static unsigned GetSystemTime();
+    static unsigned GetTimeSinceEpoch();
     static String GetTimeStamp();
     static void Sleep(unsigned mSec);
     

+ 1 - 1
Source/Engine/LuaScript/pkgs/IO/FileSystem.pkg

@@ -17,7 +17,7 @@ class FileSystem : public Object
     bool Copy(const String srcFileName, const String destFileName);
     bool Rename(const String srcFileName, const String destFileName);
     bool Delete(const String fileName);
-    void RegisterPath(const String pathName);
+    bool SetLastModifiedTime(const String fileName, unsigned newTime);
     String GetCurrentDir() const;
     bool GetExecuteConsoleCommands() const;
     bool HasRegisteredPaths() const;

+ 6 - 0
Source/Engine/Script/CoreAPI.cpp

@@ -650,6 +650,11 @@ static unsigned TimeGetSystemTime(Time* time)
     return Time::GetSystemTime();
 }
 
+static unsigned TimeGetTimeSinceEpoch(Time* time)
+{
+    return Time::GetTimeSinceEpoch();
+}
+
 static String TimeGetTimeStamp(Time* time)
 {
     return Time::GetTimeStamp();
@@ -667,6 +672,7 @@ static void RegisterTimer(asIScriptEngine* engine)
     engine->RegisterObjectMethod("Time", "float get_timeStep() const", asMETHOD(Time, GetTimeStep), asCALL_THISCALL);
     engine->RegisterObjectMethod("Time", "float get_elapsedTime()", asMETHOD(Time, GetElapsedTime), asCALL_THISCALL);
     engine->RegisterObjectMethod("Time", "uint get_systemTime() const", asFUNCTION(TimeGetSystemTime), asCALL_CDECL_OBJLAST);
+    engine->RegisterObjectMethod("Time", "uint get_timeSinceEpoch() const", asFUNCTION(TimeGetTimeSinceEpoch), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("Time", "String get_timeStamp() const", asFUNCTION(TimeGetTimeStamp), asCALL_CDECL_OBJLAST);
     engine->RegisterGlobalFunction("Time@+ get_time()", asFUNCTION(GetTime), asCALL_CDECL);
 }

+ 1 - 0
Source/Engine/Script/IOAPI.cpp

@@ -333,6 +333,7 @@ void RegisterFileSystem(asIScriptEngine* engine)
     RegisterObject<FileSystem>(engine, "FileSystem");
     engine->RegisterObjectMethod("FileSystem", "bool FileExists(const String&in) const", asMETHOD(FileSystem, FileExists), asCALL_THISCALL);
     engine->RegisterObjectMethod("FileSystem", "bool DirExists(const String&in) const", asMETHOD(FileSystem, DirExists), asCALL_THISCALL);
+    engine->RegisterObjectMethod("FileSystem", "bool SetLastModifiedTime(const String&in, uint)", asMETHOD(FileSystem, SetLastModifiedTime), asCALL_THISCALL);
     engine->RegisterObjectMethod("FileSystem", "uint GetLastModifiedTime(const String&in) const", asMETHOD(FileSystem, GetLastModifiedTime), asCALL_THISCALL);
     engine->RegisterObjectMethod("FileSystem", "Array<String>@ ScanDir(const String&in, const String&in, uint, bool) const", asFUNCTION(FileSystemScanDir), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("FileSystem", "bool CreateDir(const String&in)", asMETHOD(FileSystem, CreateDir), asCALL_THISCALL);