#ifdef __UNIX_LIKE__
#include <sys/types.h>
#include <utime.h>
+ #include <sys/stat.h>
+ #include <unistd.h>
#endif
// ----------------------------------------------------------------------------
// 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__
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;