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