aboutsummaryrefslogtreecommitdiff
path: root/CPP/Windows/PropVariantConv.cpp
diff options
context:
space:
mode:
authorIgor Pavlov <87184205+ip7z@users.noreply.github.com>2024-05-14 00:00:00 +0000
committerIgor Pavlov <87184205+ip7z@users.noreply.github.com>2024-05-15 23:55:04 +0500
commitfc662341e6f85da78ada0e443f6116b978f79f22 (patch)
tree1be1cc402a7a9cbc18d4eeea6b141354c2d559e3 /CPP/Windows/PropVariantConv.cpp
parent5b39dc76f1bc82f941d5c800ab9f34407a06b53a (diff)
download7zip-fc662341e6f85da78ada0e443f6116b978f79f22.tar.gz
7zip-fc662341e6f85da78ada0e443f6116b978f79f22.tar.bz2
7zip-fc662341e6f85da78ada0e443f6116b978f79f22.zip
24.0524.05
Diffstat (limited to 'CPP/Windows/PropVariantConv.cpp')
-rw-r--r--CPP/Windows/PropVariantConv.cpp104
1 files changed, 94 insertions, 10 deletions
diff --git a/CPP/Windows/PropVariantConv.cpp b/CPP/Windows/PropVariantConv.cpp
index 5fb96a7..21a7b4e 100644
--- a/CPP/Windows/PropVariantConv.cpp
+++ b/CPP/Windows/PropVariantConv.cpp
@@ -9,12 +9,45 @@
9 9
10#define UINT_TO_STR_2(c, val) { s[0] = (c); s[1] = (char)('0' + (val) / 10); s[2] = (char)('0' + (val) % 10); s += 3; } 10#define UINT_TO_STR_2(c, val) { s[0] = (c); s[1] = (char)('0' + (val) / 10); s[2] = (char)('0' + (val) % 10); s += 3; }
11 11
12bool ConvertUtcFileTimeToString2(const FILETIME &utc, unsigned ns100, char *s, int level) throw() 12static const unsigned k_TimeStringBufferSize = 64;
13
14bool g_Timestamp_Show_UTC;
15#if 0
16bool g_Timestamp_Show_DisableZ;
17bool g_Timestamp_Show_TDelimeter;
18bool g_Timestamp_Show_ZoneOffset;
19#endif
20
21Z7_NO_INLINE
22bool ConvertUtcFileTimeToString2(const FILETIME &utc, unsigned ns100, char *s, int level, unsigned flags) throw()
13{ 23{
14 *s = 0; 24 *s = 0;
15 FILETIME ft; 25 FILETIME ft;
16 if (!FileTimeToLocalFileTime(&utc, &ft)) 26
17 return false; 27#if 0
28 Int64 bias64 = 0;
29#endif
30
31 const bool show_utc =
32 (flags & kTimestampPrintFlags_Force_UTC) ? true :
33 (flags & kTimestampPrintFlags_Force_LOCAL) ? false :
34 g_Timestamp_Show_UTC;
35
36 if (show_utc)
37 ft = utc;
38 else
39 {
40 if (!FileTimeToLocalFileTime(&utc, &ft))
41 return false;
42#if 0
43 if (g_Timestamp_Show_ZoneOffset)
44 {
45 const UInt64 utc64 = (((UInt64)utc.dwHighDateTime) << 32) + utc.dwLowDateTime;
46 const UInt64 loc64 = (((UInt64) ft.dwHighDateTime) << 32) + ft.dwLowDateTime;
47 bias64 = (Int64)utc64 - (Int64)loc64;
48 }
49#endif
50 }
18 51
19 SYSTEMTIME st; 52 SYSTEMTIME st;
20 if (!BOOLToBool(FileTimeToSystemTime(&ft, &st))) 53 if (!BOOLToBool(FileTimeToSystemTime(&ft, &st)))
@@ -41,7 +74,12 @@ bool ConvertUtcFileTimeToString2(const FILETIME &utc, unsigned ns100, char *s, i
41 74
42 if (level > kTimestampPrintLevel_DAY) 75 if (level > kTimestampPrintLevel_DAY)
43 { 76 {
44 UINT_TO_STR_2(' ', st.wHour) 77 const char setChar =
78#if 0
79 g_Timestamp_Show_TDelimeter ? 'T' : // ISO 8601
80#endif
81 ' ';
82 UINT_TO_STR_2(setChar, st.wHour)
45 UINT_TO_STR_2(':', st.wMinute) 83 UINT_TO_STR_2(':', st.wMinute)
46 84
47 if (level >= kTimestampPrintLevel_SEC) 85 if (level >= kTimestampPrintLevel_SEC)
@@ -84,6 +122,52 @@ bool ConvertUtcFileTimeToString2(const FILETIME &utc, unsigned ns100, char *s, i
84 } 122 }
85 } 123 }
86 124
125 if (show_utc)
126 {
127 if ((flags & kTimestampPrintFlags_DisableZ) == 0
128#if 0
129 && !g_Timestamp_Show_DisableZ
130#endif
131 )
132 *s++ = 'Z';
133 }
134#if 0
135 else if (g_Timestamp_Show_ZoneOffset)
136 {
137#if 1
138 {
139 char c;
140 if (bias64 < 0)
141 {
142 bias64 = -bias64;
143 c = '+';
144 }
145 else
146 c = '-';
147 UInt32 bias = (UInt32)((UInt64)bias64 / (10000000 * 60));
148#else
149 TIME_ZONE_INFORMATION zi;
150 const DWORD dw = GetTimeZoneInformation(&zi);
151 if (dw <= TIME_ZONE_ID_DAYLIGHT) // == 2
152 {
153 // UTC = LOCAL + Bias
154 Int32 bias = zi.Bias;
155 char c;
156 if (bias < 0)
157 {
158 bias = -bias;
159 c = '+';
160 }
161 else
162 c = '-';
163#endif
164 const UInt32 hours = (UInt32)bias / 60;
165 const UInt32 mins = (UInt32)bias % 60;
166 UINT_TO_STR_2(c, hours)
167 UINT_TO_STR_2(':', mins)
168 }
169 }
170#endif
87 *s = 0; 171 *s = 0;
88 return true; 172 return true;
89} 173}
@@ -96,11 +180,11 @@ bool ConvertUtcFileTimeToString(const FILETIME &utc, char *s, int level) throw()
96 180
97bool ConvertUtcFileTimeToString2(const FILETIME &ft, unsigned ns100, wchar_t *dest, int level) throw() 181bool ConvertUtcFileTimeToString2(const FILETIME &ft, unsigned ns100, wchar_t *dest, int level) throw()
98{ 182{
99 char s[32]; 183 char s[k_TimeStringBufferSize];
100 bool res = ConvertUtcFileTimeToString2(ft, ns100, s, level); 184 const bool res = ConvertUtcFileTimeToString2(ft, ns100, s, level);
101 for (unsigned i = 0;; i++) 185 for (unsigned i = 0;; i++)
102 { 186 {
103 Byte c = (Byte)s[i]; 187 const Byte c = (Byte)s[i];
104 dest[i] = c; 188 dest[i] = c;
105 if (c == 0) 189 if (c == 0)
106 break; 190 break;
@@ -110,11 +194,11 @@ bool ConvertUtcFileTimeToString2(const FILETIME &ft, unsigned ns100, wchar_t *de
110 194
111bool ConvertUtcFileTimeToString(const FILETIME &ft, wchar_t *dest, int level) throw() 195bool ConvertUtcFileTimeToString(const FILETIME &ft, wchar_t *dest, int level) throw()
112{ 196{
113 char s[32]; 197 char s[k_TimeStringBufferSize];
114 bool res = ConvertUtcFileTimeToString(ft, s, level); 198 const bool res = ConvertUtcFileTimeToString(ft, s, level);
115 for (unsigned i = 0;; i++) 199 for (unsigned i = 0;; i++)
116 { 200 {
117 Byte c = (Byte)s[i]; 201 const Byte c = (Byte)s[i];
118 dest[i] = c; 202 dest[i] = c;
119 if (c == 0) 203 if (c == 0)
120 break; 204 break;