1 // PropVariantConvert.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 unsigned char c = 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 } 139