// PropVariantConversions.cpp #include "StdAfx.h" // #include #include "PropVariantConversions.h" #include "Windows/Defs.h" #include "Common/StringConvert.h" #include "Common/IntToString.h" static UString ConvertUInt64ToString(UInt64 value) { wchar_t buffer[32]; ConvertUInt64ToString(value, buffer); return buffer; } static UString ConvertInt64ToString(Int64 value) { wchar_t buffer[32]; ConvertInt64ToString(value, buffer); return buffer; } static char *UIntToStringSpec(UInt32 value, char *s, int numPos) { char temp[16]; int pos = 0; do { temp[pos++] = (char)('0' + value % 10); value /= 10; } while (value != 0); int i; for (i = 0; i < numPos - pos; i++) *s++ = '0'; do *s++ = temp[--pos]; while (pos > 0); *s = '\0'; return s; } bool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime, bool includeSeconds) { s[0] = '\0'; SYSTEMTIME st; if(!BOOLToBool(FileTimeToSystemTime(&ft, &st))) return false; s = UIntToStringSpec(st.wYear, s, 4); *s++ = '-'; s = UIntToStringSpec(st.wMonth, s, 2); *s++ = '-'; s = UIntToStringSpec(st.wDay, s, 2); if (includeTime) { *s++ = ' '; s = UIntToStringSpec(st.wHour, s, 2); *s++ = ':'; s = UIntToStringSpec(st.wMinute, s, 2); if (includeSeconds) { *s++ = ':'; UIntToStringSpec(st.wSecond, s, 2); } } /* sprintf(s, "%04d-%02d-%02d", st.wYear, st.wMonth, st.wDay); if (includeTime) { sprintf(s + strlen(s), " %02d:%02d", st.wHour, st.wMinute); if (includeSeconds) sprintf(s + strlen(s), ":%02d", st.wSecond); } */ return true; } UString ConvertFileTimeToString(const FILETIME &fileTime, bool includeTime, bool includeSeconds) { char s[32]; ConvertFileTimeToString(fileTime, s, includeTime, includeSeconds); return GetUnicodeString(s); } UString ConvertPropVariantToString(const PROPVARIANT &propVariant) { switch (propVariant.vt) { case VT_EMPTY: return UString(); case VT_BSTR: return propVariant.bstrVal; case VT_UI1: return ConvertUInt64ToString(propVariant.bVal); case VT_UI2: return ConvertUInt64ToString(propVariant.uiVal); case VT_UI4: return ConvertUInt64ToString(propVariant.ulVal); case VT_UI8: return ConvertUInt64ToString(propVariant.uhVal.QuadPart); case VT_FILETIME: return ConvertFileTimeToString(propVariant.filetime, true, true); /* case VT_I1: return ConvertInt64ToString(propVariant.cVal); */ case VT_I2: return ConvertInt64ToString(propVariant.iVal); case VT_I4: return ConvertInt64ToString(propVariant.lVal); case VT_I8: return ConvertInt64ToString(propVariant.hVal.QuadPart); case VT_BOOL: return VARIANT_BOOLToBool(propVariant.boolVal) ? L"+" : L"-"; default: #ifndef _WIN32_WCE throw 150245; #else return UString(); #endif } } UInt64 ConvertPropVariantToUInt64(const PROPVARIANT &propVariant) { switch (propVariant.vt) { case VT_UI1: return propVariant.bVal; case VT_UI2: return propVariant.uiVal; case VT_UI4: return propVariant.ulVal; case VT_UI8: return (UInt64)propVariant.uhVal.QuadPart; default: #ifndef _WIN32_WCE throw 151199; #else return 0; #endif } }