diff options
author | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2021-12-27 00:00:00 +0000 |
---|---|---|
committer | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2022-03-18 15:35:13 +0500 |
commit | f19f813537c7aea1c20749c914e756b54a9c3cf5 (patch) | |
tree | 816ba62ca7c0fa19f2eb46d9e9d6f7dd7c3a744d /CPP/Windows/PropVariantConv.cpp | |
parent | 98e06a519b63b81986abe76d28887f6984a7732b (diff) | |
download | 7zip-f19f813537c7aea1c20749c914e756b54a9c3cf5.tar.gz 7zip-f19f813537c7aea1c20749c914e756b54a9c3cf5.tar.bz2 7zip-f19f813537c7aea1c20749c914e756b54a9c3cf5.zip |
'21.07'21.07
Diffstat (limited to 'CPP/Windows/PropVariantConv.cpp')
-rw-r--r-- | CPP/Windows/PropVariantConv.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/CPP/Windows/PropVariantConv.cpp b/CPP/Windows/PropVariantConv.cpp new file mode 100644 index 0000000..b58d37e --- /dev/null +++ b/CPP/Windows/PropVariantConv.cpp | |||
@@ -0,0 +1,138 @@ | |||
1 | // PropVariantConv.cpp | ||
2 | |||
3 | #include "StdAfx.h" | ||
4 | |||
5 | #include "../Common/IntToString.h" | ||
6 | |||
7 | #include "Defs.h" | ||
8 | #include "PropVariantConv.h" | ||
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; } | ||
11 | |||
12 | bool ConvertUtcFileTimeToString(const FILETIME &utc, char *s, int level) throw() | ||
13 | { | ||
14 | *s = 0; | ||
15 | FILETIME ft; | ||
16 | if (!FileTimeToLocalFileTime(&utc, &ft)) | ||
17 | return false; | ||
18 | |||
19 | SYSTEMTIME st; | ||
20 | if (!BOOLToBool(FileTimeToSystemTime(&ft, &st))) | ||
21 | return false; | ||
22 | |||
23 | { | ||
24 | unsigned val = st.wYear; | ||
25 | if (val >= 10000) | ||
26 | { | ||
27 | *s++ = (char)('0' + val / 10000); | ||
28 | val %= 10000; | ||
29 | } | ||
30 | s[3] = (char)('0' + val % 10); val /= 10; | ||
31 | s[2] = (char)('0' + val % 10); val /= 10; | ||
32 | s[1] = (char)('0' + val % 10); | ||
33 | s[0] = (char)('0' + val / 10); | ||
34 | s += 4; | ||
35 | } | ||
36 | UINT_TO_STR_2('-', st.wMonth); | ||
37 | UINT_TO_STR_2('-', st.wDay); | ||
38 | |||
39 | if (level > kTimestampPrintLevel_DAY) | ||
40 | { | ||
41 | UINT_TO_STR_2(' ', st.wHour); | ||
42 | UINT_TO_STR_2(':', st.wMinute); | ||
43 | |||
44 | if (level >= kTimestampPrintLevel_SEC) | ||
45 | { | ||
46 | UINT_TO_STR_2(':', st.wSecond); | ||
47 | |||
48 | if (level > kTimestampPrintLevel_SEC) | ||
49 | { | ||
50 | *s++ = '.'; | ||
51 | /* | ||
52 | { | ||
53 | unsigned val = st.wMilliseconds; | ||
54 | s[2] = (char)('0' + val % 10); val /= 10; | ||
55 | s[1] = (char)('0' + val % 10); | ||
56 | s[0] = (char)('0' + val / 10); | ||
57 | s += 3; | ||
58 | } | ||
59 | *s++ = ' '; | ||
60 | */ | ||
61 | |||
62 | { | ||
63 | unsigned numDigits = 7; | ||
64 | UInt32 val = (UInt32)((((UInt64)ft.dwHighDateTime << 32) + ft.dwLowDateTime) % 10000000); | ||
65 | for (unsigned i = numDigits; i != 0;) | ||
66 | { | ||
67 | i--; | ||
68 | s[i] = (char)('0' + val % 10); val /= 10; | ||
69 | } | ||
70 | if (numDigits > (unsigned)level) | ||
71 | numDigits = (unsigned)level; | ||
72 | s += numDigits; | ||
73 | } | ||
74 | } | ||
75 | } | ||
76 | } | ||
77 | |||
78 | *s = 0; | ||
79 | return true; | ||
80 | } | ||
81 | |||
82 | |||
83 | bool ConvertUtcFileTimeToString(const FILETIME &ft, wchar_t *dest, int level) throw() | ||
84 | { | ||
85 | char s[32]; | ||
86 | bool res = ConvertUtcFileTimeToString(ft, s, level); | ||
87 | for (unsigned i = 0;; i++) | ||
88 | { | ||
89 | Byte c = (Byte)s[i]; | ||
90 | dest[i] = c; | ||
91 | if (c == 0) | ||
92 | break; | ||
93 | } | ||
94 | return res; | ||
95 | } | ||
96 | |||
97 | |||
98 | void ConvertPropVariantToShortString(const PROPVARIANT &prop, char *dest) throw() | ||
99 | { | ||
100 | *dest = 0; | ||
101 | switch (prop.vt) | ||
102 | { | ||
103 | case VT_EMPTY: return; | ||
104 | case VT_BSTR: dest[0] = '?'; dest[1] = 0; return; | ||
105 | case VT_UI1: ConvertUInt32ToString(prop.bVal, dest); return; | ||
106 | case VT_UI2: ConvertUInt32ToString(prop.uiVal, dest); return; | ||
107 | case VT_UI4: ConvertUInt32ToString(prop.ulVal, dest); return; | ||
108 | case VT_UI8: ConvertUInt64ToString(prop.uhVal.QuadPart, dest); return; | ||
109 | case VT_FILETIME: ConvertUtcFileTimeToString(prop.filetime, dest); return; | ||
110 | // case VT_I1: return ConvertInt64ToString(prop.cVal, dest); return; | ||
111 | case VT_I2: ConvertInt64ToString(prop.iVal, dest); return; | ||
112 | case VT_I4: ConvertInt64ToString(prop.lVal, dest); return; | ||
113 | case VT_I8: ConvertInt64ToString(prop.hVal.QuadPart, dest); return; | ||
114 | case VT_BOOL: dest[0] = VARIANT_BOOLToBool(prop.boolVal) ? '+' : '-'; dest[1] = 0; return; | ||
115 | default: dest[0] = '?'; dest[1] = ':'; ConvertUInt64ToString(prop.vt, dest + 2); | ||
116 | } | ||
117 | } | ||
118 | |||
119 | void ConvertPropVariantToShortString(const PROPVARIANT &prop, wchar_t *dest) throw() | ||
120 | { | ||
121 | *dest = 0; | ||
122 | switch (prop.vt) | ||
123 | { | ||
124 | case VT_EMPTY: return; | ||
125 | case VT_BSTR: dest[0] = '?'; dest[1] = 0; return; | ||
126 | case VT_UI1: ConvertUInt32ToString(prop.bVal, dest); return; | ||
127 | case VT_UI2: ConvertUInt32ToString(prop.uiVal, dest); return; | ||
128 | case VT_UI4: ConvertUInt32ToString(prop.ulVal, dest); return; | ||
129 | case VT_UI8: ConvertUInt64ToString(prop.uhVal.QuadPart, dest); return; | ||
130 | case VT_FILETIME: ConvertUtcFileTimeToString(prop.filetime, dest); return; | ||
131 | // case VT_I1: return ConvertInt64ToString(prop.cVal, dest); return; | ||
132 | case VT_I2: ConvertInt64ToString(prop.iVal, dest); return; | ||
133 | case VT_I4: ConvertInt64ToString(prop.lVal, dest); return; | ||
134 | case VT_I8: ConvertInt64ToString(prop.hVal.QuadPart, dest); return; | ||
135 | case VT_BOOL: dest[0] = VARIANT_BOOLToBool(prop.boolVal) ? (wchar_t)'+' : (wchar_t)'-'; dest[1] = 0; return; | ||
136 | default: dest[0] = '?'; dest[1] = ':'; ConvertUInt32ToString(prop.vt, dest + 2); | ||
137 | } | ||
138 | } | ||