1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// PropIDUtils.cpp
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h"
4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "Common/IntToString.h"
6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
7baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "Windows/FileFind.h"
8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "Windows/PropVariantConversions.h"
9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../PropID.h"
11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
12baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "PropIDUtils.h"
13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
14baa3858d3f5d128a5c8466b700098109edcad5f2repo syncusing namespace NWindows;
15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
16baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid ConvertUInt32ToHex(UInt32 value, wchar_t *s)
17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (int i = 0; i < 8; i++)
19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
20baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    int t = value & 0xF;
21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    value >>= 4;
22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    s[7 - i] = (wchar_t)((t < 10) ? (L'0' + t) : (L'A' + (t - 10)));
23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  s[8] = L'\0';
25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
26baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
27baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic const char g_WinAttrib[17] = "RHS8DAdNTsrCOnE_";
28baa3858d3f5d128a5c8466b700098109edcad5f2repo sync/*
29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync0 READONLY
30baa3858d3f5d128a5c8466b700098109edcad5f2repo sync1 HIDDEN
31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync3 SYSTEM
32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync4 DIRECTORY
34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync5 ARCHIVE
35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync6 DEVICE
36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync7 NORMAL
37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync8 TEMPORARY
38baa3858d3f5d128a5c8466b700098109edcad5f2repo sync9 SPARSE_FILE
39baa3858d3f5d128a5c8466b700098109edcad5f2repo sync10 REPARSE_POINT
40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync11 COMPRESSED
41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync12 OFFLINE
42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync13 NOT_CONTENT_INDEXED
43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync14 ENCRYPTED
44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync16 VIRTUAL
46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync*/
47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
48baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic const char kPosixTypes[16] = { '0', 'p', 'c', '3', 'd', '5', 'b', '7', '-', '9', 'l', 'B', 's', 'D', 'E', 'F' };
49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#define MY_ATTR_CHAR(a, n, c) ((a )& (1 << (n))) ? c : L'-';
50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
51baa3858d3f5d128a5c8466b700098109edcad5f2repo syncUString ConvertPropertyToString(const PROPVARIANT &prop, PROPID propID, bool full)
52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  switch(propID)
54baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case kpidCTime:
56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case kpidATime:
57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case kpidMTime:
58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (prop.vt != VT_FILETIME)
60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        break;
61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      FILETIME localFileTime;
62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if ((prop.filetime.dwHighDateTime == 0 &&
63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          prop.filetime.dwLowDateTime == 0) ||
64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          !::FileTimeToLocalFileTime(&prop.filetime, &localFileTime))
65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        return UString();
66baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return ConvertFileTimeToString(localFileTime, true, full);
67baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case kpidCRC:
69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (prop.vt != VT_UI4)
71baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        break;
72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      wchar_t temp[12];
73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      ConvertUInt32ToHex(prop.ulVal, temp);
74baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return temp;
75baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
76baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case kpidAttrib:
77baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
78baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (prop.vt != VT_UI4)
79baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        break;
80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      UInt32 a = prop.ulVal;
81baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      wchar_t sz[32];
82baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      int pos = 0;
83baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      for (int i = 0; i < 16; i++)
84baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        if (a & (1 << i) && i != 7)
85baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          sz[pos++] = g_WinAttrib[i];
86baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      sz[pos] = '\0';
87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return sz;
88baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
89baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    case kpidPosixAttrib:
90baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
91baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (prop.vt != VT_UI4)
92baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        break;
93baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      UString res;
94baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      UInt32 a = prop.ulVal;
95baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      wchar_t temp[16];
96baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
97baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      temp[0] = kPosixTypes[(a >> 12) & 0xF];
98baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      for (int i = 6; i >= 0; i -= 3)
99baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      {
100baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        temp[7 - i] = MY_ATTR_CHAR(a, i + 2, L'r');
101baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        temp[8 - i] = MY_ATTR_CHAR(a, i + 1, L'w');
102baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        temp[9 - i] = MY_ATTR_CHAR(a, i + 0, L'x');
103baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      }
104baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if ((a & 0x800) != 0) temp[3] = ((a & (1 << 6)) ? 's' : 'S');
105baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if ((a & 0x400) != 0) temp[6] = ((a & (1 << 3)) ? 's' : 'S');
106baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if ((a & 0x200) != 0) temp[9] = ((a & (1 << 0)) ? 't' : 'T');
107baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      temp[10] = 0;
108baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      res = temp;
109baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
110baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      a &= ~(UInt32)0xFFFF;
111baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      if (a != 0)
112baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      {
113baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        ConvertUInt32ToHex(a, temp);
114baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        res = UString(temp) + L' ' + res;
115baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      }
116baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      return res;
117baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
118baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
119baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return ConvertPropVariantToString(prop);
120baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
121