Home | History | Annotate | Download | only in Windows
      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