1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// PropVariantConversions.cpp 2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h" 4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "Common/IntToString.h" 6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "Common/StringConvert.h" 7baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "Windows/Defs.h" 9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "PropVariantConversions.h" 11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 12baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic UString ConvertUInt64ToString(UInt64 value) 13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 14baa3858d3f5d128a5c8466b700098109edcad5f2repo sync wchar_t buffer[32]; 15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync ConvertUInt64ToString(value, buffer); 16baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return buffer; 17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 19baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic UString ConvertInt64ToString(Int64 value) 20baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync wchar_t buffer[32]; 22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync ConvertInt64ToString(value, buffer); 23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return buffer; 24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 26baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic char *UIntToStringSpec(char c, UInt32 value, char *s, int numPos) 27baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 28baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (c != 0) 29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync *s++ = c; 30baa3858d3f5d128a5c8466b700098109edcad5f2repo sync char temp[16]; 31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync int pos = 0; 32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync do 33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync temp[pos++] = (char)('0' + value % 10); 35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync value /= 10; 36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync while (value != 0); 38baa3858d3f5d128a5c8466b700098109edcad5f2repo sync int i; 39baa3858d3f5d128a5c8466b700098109edcad5f2repo sync for (i = 0; i < numPos - pos; i++) 40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync *s++ = '0'; 41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync do 42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync *s++ = temp[--pos]; 43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync while (pos > 0); 44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync *s = '\0'; 45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return s; 46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 48baa3858d3f5d128a5c8466b700098109edcad5f2repo syncbool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime, bool includeSeconds) 49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync s[0] = '\0'; 51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync SYSTEMTIME st; 52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (!BOOLToBool(FileTimeToSystemTime(&ft, &st))) 53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return false; 54baa3858d3f5d128a5c8466b700098109edcad5f2repo sync s = UIntToStringSpec(0, st.wYear, s, 4); 55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync s = UIntToStringSpec('-', st.wMonth, s, 2); 56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync s = UIntToStringSpec('-', st.wDay, s, 2); 57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (includeTime) 58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync s = UIntToStringSpec(' ', st.wHour, s, 2); 60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync s = UIntToStringSpec(':', st.wMinute, s, 2); 61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (includeSeconds) 62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UIntToStringSpec(':', st.wSecond, s, 2); 63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return true; 65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 66baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 67baa3858d3f5d128a5c8466b700098109edcad5f2repo syncUString ConvertFileTimeToString(const FILETIME &ft, bool includeTime, bool includeSeconds) 68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync char s[32]; 70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync ConvertFileTimeToString(ft, s, includeTime, includeSeconds); 71baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return GetUnicodeString(s); 72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 74baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 75baa3858d3f5d128a5c8466b700098109edcad5f2repo syncUString ConvertPropVariantToString(const PROPVARIANT &prop) 76baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 77baa3858d3f5d128a5c8466b700098109edcad5f2repo sync switch (prop.vt) 78baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 79baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_EMPTY: return UString(); 80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_BSTR: return prop.bstrVal; 81baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI1: return ConvertUInt64ToString(prop.bVal); 82baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI2: return ConvertUInt64ToString(prop.uiVal); 83baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI4: return ConvertUInt64ToString(prop.ulVal); 84baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI8: return ConvertUInt64ToString(prop.uhVal.QuadPart); 85baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_FILETIME: return ConvertFileTimeToString(prop.filetime, true, true); 86baa3858d3f5d128a5c8466b700098109edcad5f2repo sync // case VT_I1: return ConvertInt64ToString(prop.cVal); 87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_I2: return ConvertInt64ToString(prop.iVal); 88baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_I4: return ConvertInt64ToString(prop.lVal); 89baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_I8: return ConvertInt64ToString(prop.hVal.QuadPart); 90baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_BOOL: return VARIANT_BOOLToBool(prop.boolVal) ? L"+" : L"-"; 91baa3858d3f5d128a5c8466b700098109edcad5f2repo sync default: throw 150245; 92baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 93baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 94baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 95baa3858d3f5d128a5c8466b700098109edcad5f2repo syncUInt64 ConvertPropVariantToUInt64(const PROPVARIANT &prop) 96baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 97baa3858d3f5d128a5c8466b700098109edcad5f2repo sync switch (prop.vt) 98baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 99baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI1: return prop.bVal; 100baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI2: return prop.uiVal; 101baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI4: return prop.ulVal; 102baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI8: return (UInt64)prop.uhVal.QuadPart; 103baa3858d3f5d128a5c8466b700098109edcad5f2repo sync default: throw 151199; 104baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 105baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 106