]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/filename.cpp
Committing in .
[wxWidgets.git] / src / common / filename.cpp
index 34fafde83d8a2df7c3ba64b1e4a43bc85e02dee2..38f20fee49fd8de3840fbf243ddf0d65607349b3 100644 (file)
@@ -53,6 +53,8 @@
 #ifdef __UNIX_LIKE__
     #include <sys/types.h>
     #include <utime.h>
+    #include <sys/stat.h>
+    #include <unistd.h>
 #endif
 
 // ----------------------------------------------------------------------------
@@ -118,14 +120,32 @@ private:
 // convert between wxDateTime and FILETIME which is a 64-bit value representing
 // the number of 100-nanosecond intervals since January 1, 1601.
 
-static void ConvertWxToFileTime(FILETIME *ft, const wxDateTime& dt)
+// the number of milliseconds between the Unix Epoch (January 1, 1970) and the
+// FILETIME reference point (January 1, 1601)
+static const wxLongLong FILETIME_EPOCH_OFFSET = wxLongLong(0xa97, 0x30b66800);
+
+static void ConvertFileTimeToWx(wxDateTime *dt, const FILETIME &ft)
 {
-    // TODO
+    wxLongLong ll(ft.dwHighDateTime, ft.dwLowDateTime);
+
+    // convert 100ns to ms
+    ll /= 10000;
+
+    // move it to our Epoch
+    ll -= FILETIME_EPOCH_OFFSET;
+
+    *dt = wxDateTime(ll);
 }
 
-static void ConvertFileTimeToWx(wxDateTime *dt, const FILETIME &ft)
+static void ConvertWxToFileTime(FILETIME *ft, const wxDateTime& dt)
 {
-    // TODO
+    // do the reverse of ConvertFileTimeToWx()
+    wxLongLong ll = dt.GetValue();
+    ll *= 10000;
+    ll += FILETIME_EPOCH_OFFSET;
+
+    ft->dwHighDateTime = ll.GetHi();
+    ft->dwLowDateTime = ll.GetLo();
 }
 
 #endif // __WIN32__
@@ -791,7 +811,7 @@ wxPathFormat wxFileName::GetFormat( wxPathFormat format )
     {
 #if defined(__WXMSW__) || defined(__WXPM__)
         format = wxPATH_DOS;
-#elif defined(__WXMAC__)
+#elif defined(__WXMAC__) && !defined(__DARWIN__)
         format = wxPATH_MAC; 
 #else
         format = wxPATH_UNIX;
@@ -899,9 +919,17 @@ bool wxFileName::SetTimes(const wxDateTime *dtCreate,
                           const wxDateTime *dtMod)
 {
 #if defined(__UNIX_LIKE__)
+    if ( !dtAccess && !dtMod )
+    {
+        // can't modify the creation time anyhow, don't try
+        return TRUE;
+    }
+
+    // if dtAccess or dtMod is not specified, use the other one (which must be
+    // non NULL because of the test above) for both times
     utimbuf utm;
-    utm.actime = dtAccess ? dtAccess : dtAccess->GetTicks();
-    utm.modtime = dtMod ? dtMod : dtMod->GetTicks();
+    utm.actime = dtAccess ? dtAccess->GetTicks() : dtMod->GetTicks();
+    utm.modtime = dtMod ? dtMod->GetTicks() : dtAccess->GetTicks();
     if ( utime(GetFullPath(), &utm) == 0 )
     {
         return TRUE;