1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
// PropVariantConversions.cpp
#include "StdAfx.h"
#include "Common/IntToString.h"
#include "Common/StringConvert.h"
#include "Windows/Defs.h"
#include "PropVariantConversions.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;
}
#ifdef _WIN32
static char *UIntToStringSpec(char c, UInt32 value, char *s, int numPos)
{
if (c != 0)
*s++ = c;
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;
}
#endif
bool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime, bool includeSeconds)
{
#ifdef _WIN32
s[0] = '\0';
SYSTEMTIME st;
if (!BOOLToBool(FileTimeToSystemTime(&ft, &st)))
return false;
s = UIntToStringSpec(0, st.wYear, s, 4);
s = UIntToStringSpec('-', st.wMonth, s, 2);
s = UIntToStringSpec('-', st.wDay, s, 2);
if (includeTime)
{
s = UIntToStringSpec(' ', st.wHour, s, 2);
s = UIntToStringSpec(':', st.wMinute, s, 2);
if (includeSeconds)
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);
}
*/
#else
BOOLEAN WINAPI RtlTimeToSecondsSince1970( const LARGE_INTEGER *Time, DWORD *Seconds );
FILETIME filetime;
LocalFileTimeToFileTime(&ft, &filetime);
LARGE_INTEGER ltime;
ltime.QuadPart = filetime.dwHighDateTime;
ltime.QuadPart = (ltime.QuadPart << 32) | filetime.dwLowDateTime;
DWORD dw;
RtlTimeToSecondsSince1970(<ime, &dw );
time_t timep = (time_t)dw;
struct tm * date = localtime(&timep);
sprintf(s, "%04d-%02d-%02d", date->tm_year+1900, date->tm_mon+1,date->tm_mday);
if (includeTime)
{
sprintf(s + strlen(s), " %02d:%02d", date->tm_hour,date->tm_min);
if (includeSeconds)
sprintf(s + strlen(s), ":%02d", date->tm_sec);
}
#endif
return true;
}
UString ConvertFileTimeToString(const FILETIME &ft, bool includeTime, bool includeSeconds)
{
char s[32];
ConvertFileTimeToString(ft, s, includeTime, includeSeconds);
return GetUnicodeString(s);
}
UString ConvertPropVariantToString(const PROPVARIANT &prop)
{
switch (prop.vt)
{
case VT_EMPTY: return UString();
case VT_BSTR: return prop.bstrVal;
case VT_UI1: return ConvertUInt64ToString(prop.bVal);
case VT_UI2: return ConvertUInt64ToString(prop.uiVal);
case VT_UI4: return ConvertUInt64ToString(prop.ulVal);
case VT_UI8: return ConvertUInt64ToString(prop.uhVal.QuadPart);
case VT_FILETIME: return ConvertFileTimeToString(prop.filetime, true, true);
// case VT_I1: return ConvertInt64ToString(prop.cVal);
case VT_I2: return ConvertInt64ToString(prop.iVal);
case VT_I4: return ConvertInt64ToString(prop.lVal);
case VT_I8: return ConvertInt64ToString(prop.hVal.QuadPart);
case VT_BOOL: return VARIANT_BOOLToBool(prop.boolVal) ? L"+" : L"-";
default: throw 150245;
}
}
UInt64 ConvertPropVariantToUInt64(const PROPVARIANT &prop)
{
switch (prop.vt)
{
case VT_UI1: return prop.bVal;
case VT_UI2: return prop.uiVal;
case VT_UI4: return prop.ulVal;
case VT_UI8: return (UInt64)prop.uhVal.QuadPart;
default: throw 151199;
}
}
|