| // Windows/TimeUtils.h |
| |
| #ifndef ZIP7_INC_WINDOWS_TIME_UTILS_H |
| #define ZIP7_INC_WINDOWS_TIME_UTILS_H |
| |
| #include "../Common/MyTypes.h" |
| #include "../Common/MyWindows.h" |
| #include "PropVariant.h" |
| |
| inline UInt64 FILETIME_To_UInt64(const FILETIME &ft) |
| { |
| return (((UInt64)ft.dwHighDateTime) << 32) + ft.dwLowDateTime; |
| } |
| |
| inline void FILETIME_Clear(FILETIME &ft) |
| { |
| ft.dwLowDateTime = 0; |
| ft.dwHighDateTime = 0; |
| } |
| |
| inline bool FILETIME_IsZero(const FILETIME &ft) |
| { |
| return (ft.dwHighDateTime == 0 && ft.dwLowDateTime == 0); |
| } |
| |
| |
| #ifdef _WIN32 |
| #define CFiTime FILETIME |
| #define Compare_FiTime ::CompareFileTime |
| inline void FiTime_To_FILETIME(const CFiTime &ts, FILETIME &ft) |
| { |
| ft = ts; |
| } |
| /* |
| inline void FILETIME_To_FiTime(const FILETIME &ft, CFiTime &ts) |
| { |
| ts = ft; |
| } |
| */ |
| inline void FiTime_Clear(CFiTime &ft) |
| { |
| ft.dwLowDateTime = 0; |
| ft.dwHighDateTime = 0; |
| } |
| #else |
| |
| #include <sys/stat.h> |
| |
| #if defined(_AIX) |
| #define CFiTime st_timespec |
| #else |
| #define CFiTime timespec |
| #endif |
| int Compare_FiTime(const CFiTime *a1, const CFiTime *a2); |
| bool FILETIME_To_timespec(const FILETIME &ft, CFiTime &ts); |
| void FiTime_To_FILETIME(const CFiTime &ts, FILETIME &ft); |
| void FiTime_To_FILETIME_ns100(const CFiTime &ts, FILETIME &ft, unsigned &ns100); |
| inline void FiTime_Clear(CFiTime &ft) |
| { |
| ft.tv_sec = 0; |
| ft.tv_nsec = 0; |
| } |
| |
| #ifdef __APPLE__ |
| #define ST_MTIME(st) st.st_mtimespec |
| #define ST_ATIME(st) st.st_atimespec |
| #define ST_CTIME(st) st.st_ctimespec |
| #elif defined(__QNXNTO__) && defined(__ARM__) && !defined(__aarch64__) |
| // QNX armv7le (32-bit) for "struct stat" timestamps uses time_t instead of timespec |
| inline CFiTime ST_MTIME(const struct stat &st) |
| { timespec ts; ts.tv_sec = st.st_mtime; ts.tv_nsec = 0; return ts; } |
| inline CFiTime ST_ATIME(const struct stat &st) |
| { timespec ts; ts.tv_sec = st.st_atime; ts.tv_nsec = 0; return ts; } |
| inline CFiTime ST_CTIME(const struct stat &st) |
| { timespec ts; ts.tv_sec = st.st_ctime; ts.tv_nsec = 0; return ts; } |
| #else |
| #define ST_MTIME(st) st.st_mtim |
| #define ST_ATIME(st) st.st_atim |
| #define ST_CTIME(st) st.st_ctim |
| #endif |
| |
| #endif |
| |
| // void FiTime_Normalize_With_Prec(CFiTime &ft, unsigned prec); |
| |
| namespace NWindows { |
| namespace NTime { |
| |
| bool DosTime_To_FileTime(UInt32 dosTime, FILETIME &fileTime) throw(); |
| bool UtcFileTime_To_LocalDosTime(const FILETIME &utc, UInt32 &dosTime) throw(); |
| bool FileTime_To_DosTime(const FILETIME &fileTime, UInt32 &dosTime) throw(); |
| |
| // UInt32 Unix Time : for dates 1970-2106 |
| UInt64 UnixTime_To_FileTime64(UInt32 unixTime) throw(); |
| void UnixTime_To_FileTime(UInt32 unixTime, FILETIME &fileTime) throw(); |
| |
| // Int64 Unix Time : negative values for dates before 1970 |
| UInt64 UnixTime64_To_FileTime64(Int64 unixTime) throw(); // no check |
| bool UnixTime64_To_FileTime64(Int64 unixTime, UInt64 &fileTime) throw(); |
| bool UnixTime64_To_FileTime(Int64 unixTime, FILETIME &fileTime) throw(); |
| |
| Int64 FileTime64_To_UnixTime64(UInt64 ft64) throw(); |
| bool FileTime_To_UnixTime(const FILETIME &fileTime, UInt32 &unixTime) throw(); |
| Int64 FileTime_To_UnixTime64(const FILETIME &ft) throw(); |
| Int64 FileTime_To_UnixTime64_and_Quantums(const FILETIME &ft, UInt32 &quantums) throw(); |
| |
| bool GetSecondsSince1601(unsigned year, unsigned month, unsigned day, |
| unsigned hour, unsigned min, unsigned sec, UInt64 &resSeconds) throw(); |
| |
| void GetCurUtc_FiTime(CFiTime &ft) throw(); |
| #ifdef _WIN32 |
| #define GetCurUtcFileTime GetCurUtc_FiTime |
| #else |
| void GetCurUtcFileTime(FILETIME &ft) throw(); |
| #endif |
| |
| }} |
| |
| inline void PropVariant_SetFrom_UnixTime(NWindows::NCOM::CPropVariant &prop, UInt32 unixTime) |
| { |
| FILETIME ft; |
| NWindows::NTime::UnixTime_To_FileTime(unixTime, ft); |
| prop.SetAsTimeFrom_FT_Prec(ft, k_PropVar_TimePrec_Unix); |
| } |
| |
| inline void PropVariant_SetFrom_NtfsTime(NWindows::NCOM::CPropVariant &prop, const FILETIME &ft) |
| { |
| prop.SetAsTimeFrom_FT_Prec(ft, k_PropVar_TimePrec_100ns); |
| } |
| |
| inline void PropVariant_SetFrom_FiTime(NWindows::NCOM::CPropVariant &prop, const CFiTime &fts) |
| { |
| #ifdef _WIN32 |
| PropVariant_SetFrom_NtfsTime(prop, fts); |
| #else |
| unsigned ns100; |
| FILETIME ft; |
| FiTime_To_FILETIME_ns100(fts, ft, ns100); |
| prop.SetAsTimeFrom_FT_Prec_Ns100(ft, k_PropVar_TimePrec_1ns, ns100); |
| #endif |
| } |
| |
| inline bool PropVariant_SetFrom_DosTime(NWindows::NCOM::CPropVariant &prop, UInt32 dosTime) |
| { |
| FILETIME localFileTime, utc; |
| if (!NWindows::NTime::DosTime_To_FileTime(dosTime, localFileTime)) |
| return false; |
| if (!LocalFileTimeToFileTime(&localFileTime, &utc)) |
| return false; |
| prop.SetAsTimeFrom_FT_Prec(utc, k_PropVar_TimePrec_DOS); |
| return true; |
| } |
| |
| #endif |