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