1*f6dc9357SAndroid Build Coastguard Worker // Windows/TimeUtils.h
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_WINDOWS_TIME_UTILS_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_WINDOWS_TIME_UTILS_H
5*f6dc9357SAndroid Build Coastguard Worker
6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyTypes.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyWindows.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "PropVariant.h"
9*f6dc9357SAndroid Build Coastguard Worker
FILETIME_To_UInt64(const FILETIME & ft)10*f6dc9357SAndroid Build Coastguard Worker inline UInt64 FILETIME_To_UInt64(const FILETIME &ft)
11*f6dc9357SAndroid Build Coastguard Worker {
12*f6dc9357SAndroid Build Coastguard Worker return (((UInt64)ft.dwHighDateTime) << 32) + ft.dwLowDateTime;
13*f6dc9357SAndroid Build Coastguard Worker }
14*f6dc9357SAndroid Build Coastguard Worker
FILETIME_Clear(FILETIME & ft)15*f6dc9357SAndroid Build Coastguard Worker inline void FILETIME_Clear(FILETIME &ft)
16*f6dc9357SAndroid Build Coastguard Worker {
17*f6dc9357SAndroid Build Coastguard Worker ft.dwLowDateTime = 0;
18*f6dc9357SAndroid Build Coastguard Worker ft.dwHighDateTime = 0;
19*f6dc9357SAndroid Build Coastguard Worker }
20*f6dc9357SAndroid Build Coastguard Worker
FILETIME_IsZero(const FILETIME & ft)21*f6dc9357SAndroid Build Coastguard Worker inline bool FILETIME_IsZero(const FILETIME &ft)
22*f6dc9357SAndroid Build Coastguard Worker {
23*f6dc9357SAndroid Build Coastguard Worker return (ft.dwHighDateTime == 0 && ft.dwLowDateTime == 0);
24*f6dc9357SAndroid Build Coastguard Worker }
25*f6dc9357SAndroid Build Coastguard Worker
26*f6dc9357SAndroid Build Coastguard Worker
27*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
28*f6dc9357SAndroid Build Coastguard Worker #define CFiTime FILETIME
29*f6dc9357SAndroid Build Coastguard Worker #define Compare_FiTime ::CompareFileTime
FiTime_To_FILETIME(const CFiTime & ts,FILETIME & ft)30*f6dc9357SAndroid Build Coastguard Worker inline void FiTime_To_FILETIME(const CFiTime &ts, FILETIME &ft)
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker ft = ts;
33*f6dc9357SAndroid Build Coastguard Worker }
34*f6dc9357SAndroid Build Coastguard Worker /*
35*f6dc9357SAndroid Build Coastguard Worker inline void FILETIME_To_FiTime(const FILETIME &ft, CFiTime &ts)
36*f6dc9357SAndroid Build Coastguard Worker {
37*f6dc9357SAndroid Build Coastguard Worker ts = ft;
38*f6dc9357SAndroid Build Coastguard Worker }
39*f6dc9357SAndroid Build Coastguard Worker */
FiTime_Clear(CFiTime & ft)40*f6dc9357SAndroid Build Coastguard Worker inline void FiTime_Clear(CFiTime &ft)
41*f6dc9357SAndroid Build Coastguard Worker {
42*f6dc9357SAndroid Build Coastguard Worker ft.dwLowDateTime = 0;
43*f6dc9357SAndroid Build Coastguard Worker ft.dwHighDateTime = 0;
44*f6dc9357SAndroid Build Coastguard Worker }
45*f6dc9357SAndroid Build Coastguard Worker #else
46*f6dc9357SAndroid Build Coastguard Worker
47*f6dc9357SAndroid Build Coastguard Worker #include <sys/stat.h>
48*f6dc9357SAndroid Build Coastguard Worker
49*f6dc9357SAndroid Build Coastguard Worker #if defined(_AIX)
50*f6dc9357SAndroid Build Coastguard Worker #define CFiTime st_timespec
51*f6dc9357SAndroid Build Coastguard Worker #else
52*f6dc9357SAndroid Build Coastguard Worker #define CFiTime timespec
53*f6dc9357SAndroid Build Coastguard Worker #endif
54*f6dc9357SAndroid Build Coastguard Worker int Compare_FiTime(const CFiTime *a1, const CFiTime *a2);
55*f6dc9357SAndroid Build Coastguard Worker bool FILETIME_To_timespec(const FILETIME &ft, CFiTime &ts);
56*f6dc9357SAndroid Build Coastguard Worker void FiTime_To_FILETIME(const CFiTime &ts, FILETIME &ft);
57*f6dc9357SAndroid Build Coastguard Worker void FiTime_To_FILETIME_ns100(const CFiTime &ts, FILETIME &ft, unsigned &ns100);
FiTime_Clear(CFiTime & ft)58*f6dc9357SAndroid Build Coastguard Worker inline void FiTime_Clear(CFiTime &ft)
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker ft.tv_sec = 0;
61*f6dc9357SAndroid Build Coastguard Worker ft.tv_nsec = 0;
62*f6dc9357SAndroid Build Coastguard Worker }
63*f6dc9357SAndroid Build Coastguard Worker
64*f6dc9357SAndroid Build Coastguard Worker #ifdef __APPLE__
65*f6dc9357SAndroid Build Coastguard Worker #define ST_MTIME(st) st.st_mtimespec
66*f6dc9357SAndroid Build Coastguard Worker #define ST_ATIME(st) st.st_atimespec
67*f6dc9357SAndroid Build Coastguard Worker #define ST_CTIME(st) st.st_ctimespec
68*f6dc9357SAndroid Build Coastguard Worker #else
69*f6dc9357SAndroid Build Coastguard Worker #define ST_MTIME(st) st.st_mtim
70*f6dc9357SAndroid Build Coastguard Worker #define ST_ATIME(st) st.st_atim
71*f6dc9357SAndroid Build Coastguard Worker #define ST_CTIME(st) st.st_ctim
72*f6dc9357SAndroid Build Coastguard Worker #endif
73*f6dc9357SAndroid Build Coastguard Worker
74*f6dc9357SAndroid Build Coastguard Worker #endif
75*f6dc9357SAndroid Build Coastguard Worker
76*f6dc9357SAndroid Build Coastguard Worker // void FiTime_Normalize_With_Prec(CFiTime &ft, unsigned prec);
77*f6dc9357SAndroid Build Coastguard Worker
78*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
79*f6dc9357SAndroid Build Coastguard Worker namespace NTime {
80*f6dc9357SAndroid Build Coastguard Worker
81*f6dc9357SAndroid Build Coastguard Worker bool DosTime_To_FileTime(UInt32 dosTime, FILETIME &fileTime) throw();
82*f6dc9357SAndroid Build Coastguard Worker bool UtcFileTime_To_LocalDosTime(const FILETIME &utc, UInt32 &dosTime) throw();
83*f6dc9357SAndroid Build Coastguard Worker bool FileTime_To_DosTime(const FILETIME &fileTime, UInt32 &dosTime) throw();
84*f6dc9357SAndroid Build Coastguard Worker
85*f6dc9357SAndroid Build Coastguard Worker // UInt32 Unix Time : for dates 1970-2106
86*f6dc9357SAndroid Build Coastguard Worker UInt64 UnixTime_To_FileTime64(UInt32 unixTime) throw();
87*f6dc9357SAndroid Build Coastguard Worker void UnixTime_To_FileTime(UInt32 unixTime, FILETIME &fileTime) throw();
88*f6dc9357SAndroid Build Coastguard Worker
89*f6dc9357SAndroid Build Coastguard Worker // Int64 Unix Time : negative values for dates before 1970
90*f6dc9357SAndroid Build Coastguard Worker UInt64 UnixTime64_To_FileTime64(Int64 unixTime) throw(); // no check
91*f6dc9357SAndroid Build Coastguard Worker bool UnixTime64_To_FileTime64(Int64 unixTime, UInt64 &fileTime) throw();
92*f6dc9357SAndroid Build Coastguard Worker bool UnixTime64_To_FileTime(Int64 unixTime, FILETIME &fileTime) throw();
93*f6dc9357SAndroid Build Coastguard Worker
94*f6dc9357SAndroid Build Coastguard Worker Int64 FileTime64_To_UnixTime64(UInt64 ft64) throw();
95*f6dc9357SAndroid Build Coastguard Worker bool FileTime_To_UnixTime(const FILETIME &fileTime, UInt32 &unixTime) throw();
96*f6dc9357SAndroid Build Coastguard Worker Int64 FileTime_To_UnixTime64(const FILETIME &ft) throw();
97*f6dc9357SAndroid Build Coastguard Worker Int64 FileTime_To_UnixTime64_and_Quantums(const FILETIME &ft, UInt32 &quantums) throw();
98*f6dc9357SAndroid Build Coastguard Worker
99*f6dc9357SAndroid Build Coastguard Worker bool GetSecondsSince1601(unsigned year, unsigned month, unsigned day,
100*f6dc9357SAndroid Build Coastguard Worker unsigned hour, unsigned min, unsigned sec, UInt64 &resSeconds) throw();
101*f6dc9357SAndroid Build Coastguard Worker
102*f6dc9357SAndroid Build Coastguard Worker void GetCurUtc_FiTime(CFiTime &ft) throw();
103*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
104*f6dc9357SAndroid Build Coastguard Worker #define GetCurUtcFileTime GetCurUtc_FiTime
105*f6dc9357SAndroid Build Coastguard Worker #else
106*f6dc9357SAndroid Build Coastguard Worker void GetCurUtcFileTime(FILETIME &ft) throw();
107*f6dc9357SAndroid Build Coastguard Worker #endif
108*f6dc9357SAndroid Build Coastguard Worker
109*f6dc9357SAndroid Build Coastguard Worker }}
110*f6dc9357SAndroid Build Coastguard Worker
PropVariant_SetFrom_UnixTime(NWindows::NCOM::CPropVariant & prop,UInt32 unixTime)111*f6dc9357SAndroid Build Coastguard Worker inline void PropVariant_SetFrom_UnixTime(NWindows::NCOM::CPropVariant &prop, UInt32 unixTime)
112*f6dc9357SAndroid Build Coastguard Worker {
113*f6dc9357SAndroid Build Coastguard Worker FILETIME ft;
114*f6dc9357SAndroid Build Coastguard Worker NWindows::NTime::UnixTime_To_FileTime(unixTime, ft);
115*f6dc9357SAndroid Build Coastguard Worker prop.SetAsTimeFrom_FT_Prec(ft, k_PropVar_TimePrec_Unix);
116*f6dc9357SAndroid Build Coastguard Worker }
117*f6dc9357SAndroid Build Coastguard Worker
PropVariant_SetFrom_NtfsTime(NWindows::NCOM::CPropVariant & prop,const FILETIME & ft)118*f6dc9357SAndroid Build Coastguard Worker inline void PropVariant_SetFrom_NtfsTime(NWindows::NCOM::CPropVariant &prop, const FILETIME &ft)
119*f6dc9357SAndroid Build Coastguard Worker {
120*f6dc9357SAndroid Build Coastguard Worker prop.SetAsTimeFrom_FT_Prec(ft, k_PropVar_TimePrec_100ns);
121*f6dc9357SAndroid Build Coastguard Worker }
122*f6dc9357SAndroid Build Coastguard Worker
PropVariant_SetFrom_FiTime(NWindows::NCOM::CPropVariant & prop,const CFiTime & fts)123*f6dc9357SAndroid Build Coastguard Worker inline void PropVariant_SetFrom_FiTime(NWindows::NCOM::CPropVariant &prop, const CFiTime &fts)
124*f6dc9357SAndroid Build Coastguard Worker {
125*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
126*f6dc9357SAndroid Build Coastguard Worker PropVariant_SetFrom_NtfsTime(prop, fts);
127*f6dc9357SAndroid Build Coastguard Worker #else
128*f6dc9357SAndroid Build Coastguard Worker unsigned ns100;
129*f6dc9357SAndroid Build Coastguard Worker FILETIME ft;
130*f6dc9357SAndroid Build Coastguard Worker FiTime_To_FILETIME_ns100(fts, ft, ns100);
131*f6dc9357SAndroid Build Coastguard Worker prop.SetAsTimeFrom_FT_Prec_Ns100(ft, k_PropVar_TimePrec_1ns, ns100);
132*f6dc9357SAndroid Build Coastguard Worker #endif
133*f6dc9357SAndroid Build Coastguard Worker }
134*f6dc9357SAndroid Build Coastguard Worker
PropVariant_SetFrom_DosTime(NWindows::NCOM::CPropVariant & prop,UInt32 dosTime)135*f6dc9357SAndroid Build Coastguard Worker inline bool PropVariant_SetFrom_DosTime(NWindows::NCOM::CPropVariant &prop, UInt32 dosTime)
136*f6dc9357SAndroid Build Coastguard Worker {
137*f6dc9357SAndroid Build Coastguard Worker FILETIME localFileTime, utc;
138*f6dc9357SAndroid Build Coastguard Worker if (!NWindows::NTime::DosTime_To_FileTime(dosTime, localFileTime))
139*f6dc9357SAndroid Build Coastguard Worker return false;
140*f6dc9357SAndroid Build Coastguard Worker if (!LocalFileTimeToFileTime(&localFileTime, &utc))
141*f6dc9357SAndroid Build Coastguard Worker return false;
142*f6dc9357SAndroid Build Coastguard Worker prop.SetAsTimeFrom_FT_Prec(utc, k_PropVar_TimePrec_DOS);
143*f6dc9357SAndroid Build Coastguard Worker return true;
144*f6dc9357SAndroid Build Coastguard Worker }
145*f6dc9357SAndroid Build Coastguard Worker
146*f6dc9357SAndroid Build Coastguard Worker #endif
147