1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
// 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
#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
|