This commit is contained in:
Igor Pavlov
2015-06-15 00:00:00 +00:00
committed by Kornel Lesiński
parent 0713a3ab80
commit 54490d51d5
591 changed files with 34932 additions and 16390 deletions

View File

@@ -19,30 +19,57 @@
using namespace NWindows;
static void ConvertSizeToString(UInt64 value, wchar_t *dest)
{
char s[32];
ConvertUInt64ToString(value, s);
unsigned i = MyStringLen(s);
unsigned pos = ARRAY_SIZE(s);
s[--pos] = 0;
while (i > 3)
{
s[--pos] = s[--i];
s[--pos] = s[--i];
s[--pos] = s[--i];
s[--pos] = L' ';
}
while (i > 0)
s[--pos] = s[--i];
#define INT_TO_STR_SPEC(v) \
while (v >= 10) { temp[i++] = (unsigned char)('0' + (unsigned)(v % 10)); v /= 10; } \
*s++ = (unsigned char)('0' + (unsigned)v);
for (;;)
static void ConvertSizeToString(UInt64 val, wchar_t *s) throw()
{
unsigned char temp[32];
unsigned i = 0;
if (val <= (UInt32)0xFFFFFFFF)
{
char c = s[pos++];
*dest++ = (unsigned char)c;
if (c == 0)
break;
UInt32 val32 = (UInt32)val;
INT_TO_STR_SPEC(val32)
}
else
{
INT_TO_STR_SPEC(val)
}
if (i < 3)
{
if (i != 0)
{
*s++ = temp[i - 1];
if (i == 2)
*s++ = temp[0];
}
*s = 0;
return;
}
unsigned r = i % 3;
if (r != 0)
{
s[0] = temp[--i];
if (r == 2)
s[1] = temp[--i];
s += r;
}
do
{
s[0] = ' ';
s[1] = temp[i - 1];
s[2] = temp[i - 2];
s[3] = temp[i - 3];
s += 4;
}
while (i -= 3);
*s = 0;
}
UString ConvertSizeToString(UInt64 value)
@@ -52,29 +79,62 @@ UString ConvertSizeToString(UInt64 value)
return s;
}
static inline char GetHex(Byte value)
static inline unsigned GetHex(unsigned v)
{
return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10)));
return (v < 10) ? ('0' + v) : ('A' + (v - 10));
}
void HexToString(char *dest, const Byte *data, UInt32 size)
/*
static void HexToString(char *dest, const Byte *data, UInt32 size)
{
for (UInt32 i = 0; i < size; i++)
{
Byte b = data[i];
dest[0] = GetHex((Byte)((b >> 4) & 0xF));
dest[1] = GetHex((Byte)(b & 0xF));
unsigned b = data[i];
dest[0] = GetHex((b >> 4) & 0xF);
dest[1] = GetHex(b & 0xF);
dest += 2;
}
*dest = 0;
}
*/
bool IsSizeProp(UINT propID) throw()
{
switch (propID)
{
case kpidSize:
case kpidPackSize:
case kpidNumSubDirs:
case kpidNumSubFiles:
case kpidOffset:
case kpidLinks:
case kpidNumBlocks:
case kpidNumVolumes:
case kpidPhySize:
case kpidHeadersSize:
case kpidTotalSize:
case kpidFreeSpace:
case kpidClusterSize:
case kpidNumErrors:
case kpidNumStreams:
case kpidNumAltStreams:
case kpidAltStreamsSize:
case kpidVirtualSize:
case kpidUnpackSize:
case kpidTotalPhySize:
case kpidTailSize:
case kpidEmbeddedStubSize:
return true;
}
return false;
}
LRESULT CPanel::SetItemText(LVITEMW &item)
{
if (_dontShowMode)
return 0;
UInt32 realIndex = GetRealIndex(item);
/*
if ((item.mask & LVIF_IMAGE) != 0)
{
@@ -107,10 +167,31 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
if ((item.mask & LVIF_TEXT) == 0)
return 0;
if (realIndex == kParentIndex)
LPWSTR text = item.pszText;
if (item.cchTextMax > 0)
text[0] = 0;
if (item.cchTextMax <= 1)
return 0;
const CItemProperty &property = _visibleProperties[item.iSubItem];
PROPID propID = property.ID;
if (realIndex == kParentIndex)
{
if (propID == kpidName)
{
if (item.cchTextMax > 2)
{
text[0] = '.';
text[1] = '.';
text[2] = 0;
}
}
return 0;
}
if (property.IsRawProp)
{
@@ -118,10 +199,10 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
UInt32 dataSize;
UInt32 propType;
RINOK(_folderRawProps->GetRawProp(realIndex, propID, &data, &dataSize, &propType));
int limit = item.cchTextMax - 1;
unsigned limit = item.cchTextMax - 1;
if (dataSize == 0)
{
item.pszText[0] = 0;
text[0] = 0;
return 0;
}
@@ -131,15 +212,15 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
ConvertNtReparseToString((const Byte *)data, dataSize, s);
if (!s.IsEmpty())
{
int i;
unsigned i;
for (i = 0; i < limit; i++)
{
wchar_t c = s[i];
if (c == 0)
break;
item.pszText[i] = c;
text[i] = c;
}
item.pszText[i] = 0;
text[i] = 0;
return 0;
}
}
@@ -149,45 +230,45 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
ConvertNtSecureToString((const Byte *)data, dataSize, s);
if (!s.IsEmpty())
{
int i;
unsigned i;
for (i = 0; i < limit; i++)
{
wchar_t c = s[i];
wchar_t c = (Byte)s[i];
if (c == 0)
break;
item.pszText[i] = c;
text[i] = c;
}
item.pszText[i] = 0;
text[i] = 0;
return 0;
}
}
{
const UInt32 kMaxDataSize = 64;
const unsigned kMaxDataSize = 64;
if (dataSize > kMaxDataSize)
{
char temp[64];
char temp[32];
MyStringCopy(temp, "data:");
ConvertUInt32ToString(dataSize, temp + 5);
int i;
unsigned i;
for (i = 0; i < limit; i++)
{
wchar_t c = temp[i];
wchar_t c = (Byte)temp[i];
if (c == 0)
break;
item.pszText[i] = c;
text[i] = c;
}
item.pszText[i] = 0;
text[i] = 0;
}
else
{
if ((int)dataSize > limit)
if (dataSize > limit)
dataSize = limit;
WCHAR *dest = item.pszText;
WCHAR *dest = text;
for (UInt32 i = 0; i < dataSize; i++)
{
Byte b = ((const Byte *)data)[i];
dest[0] = GetHex((Byte)((b >> 4) & 0xF));
dest[1] = GetHex((Byte)(b & 0xF));
unsigned b = ((const Byte *)data)[i];
dest[0] = (WCHAR)GetHex((b >> 4) & 0xF);
dest[1] = (WCHAR)GetHex(b & 0xF);
dest += 2;
}
*dest = 0;
@@ -230,11 +311,7 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
*/
if (item.cchTextMax < 32)
{
if (item.cchTextMax > 0)
item.pszText[0] = 0;
return 0;
}
if (propID == kpidName)
{
@@ -245,35 +322,36 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
_folderGetItemName->GetItemName(realIndex, &name, &nameLen);
if (name)
{
int dest = 0;
int limit = item.cchTextMax - 1;
for (int i = 0; dest < limit;)
unsigned dest = 0;
unsigned limit = item.cchTextMax - 1;
for (unsigned i = 0; dest < limit;)
{
wchar_t c = name[i++];
if (c == 0)
break;
item.pszText[dest++] = c;
text[dest++] = c;
if (c != ' ')
continue;
if (name[i + 1] != ' ')
continue;
int t = 2;
unsigned t = 2;
for (; name[i + t] == ' '; t++);
if (t >= 4 && dest + 4 <= limit)
{
item.pszText[dest++] = '.';
item.pszText[dest++] = '.';
item.pszText[dest++] = '.';
item.pszText[dest++] = ' ';
text[dest++] = '.';
text[dest++] = '.';
text[dest++] = '.';
text[dest++] = ' ';
i += t;
}
}
item.pszText[dest] = 0;
text[dest] = 0;
return 0;
}
}
}
if (propID == kpidPrefix)
{
if (_folderGetItemName)
@@ -283,73 +361,65 @@ LRESULT CPanel::SetItemText(LVITEMW &item)
_folderGetItemName->GetItemPrefix(realIndex, &name, &nameLen);
if (name)
{
int dest = 0;
int limit = item.cchTextMax - 1;
for (int i = 0; dest < limit;)
unsigned dest = 0;
unsigned limit = item.cchTextMax - 1;
for (unsigned i = 0; dest < limit;)
{
wchar_t c = name[i++];
if (c == 0)
break;
item.pszText[dest++] = c;
text[dest++] = c;
}
item.pszText[dest] = 0;
text[dest] = 0;
return 0;
}
}
}
HRESULT res = _folder->GetProperty(realIndex, propID, &prop);
if (res != S_OK)
{
MyStringCopy(item.pszText, L"Error: ");
MyStringCopy(text, L"Error: ");
// s = UString(L"Error: ") + HResultToMessage(res);
}
else if ((prop.vt == VT_UI8 || prop.vt == VT_UI4 || prop.vt == VT_UI2) && (
propID == kpidSize ||
propID == kpidPackSize ||
propID == kpidNumSubDirs ||
propID == kpidNumSubFiles ||
propID == kpidPosition ||
propID == kpidNumBlocks ||
propID == kpidClusterSize ||
propID == kpidTotalSize ||
propID == kpidFreeSpace ||
propID == kpidUnpackSize
))
else if ((prop.vt == VT_UI8 || prop.vt == VT_UI4 || prop.vt == VT_UI2) && IsSizeProp(propID))
{
UInt64 v = 0;
ConvertPropVariantToUInt64(prop, v);
ConvertSizeToString(v, item.pszText);
ConvertSizeToString(v, text);
}
else if (prop.vt == VT_BSTR)
{
int limit = item.cchTextMax - 1;
unsigned limit = item.cchTextMax - 1;
const wchar_t *src = prop.bstrVal;
int i;
unsigned i;
for (i = 0; i < limit; i++)
{
wchar_t c = src[i];
if (c == 0) break;
if (c == 0xA) c = ' ';
if (c == 0xD) c = ' ';
item.pszText[i] = c;
text[i] = c;
}
item.pszText[i] = 0;
text[i] = 0;
}
else
{
char temp[64];
ConvertPropertyToShortString(temp, prop, propID, false);
int i;
int limit = item.cchTextMax - 1;
unsigned i;
unsigned limit = item.cchTextMax - 1;
for (i = 0; i < limit; i++)
{
wchar_t c = temp[i];
wchar_t c = (Byte)temp[i];
if (c == 0)
break;
item.pszText[i] = c;
text[i] = c;
}
item.pszText[i] = 0;
text[i] = 0;
}
return 0;
}
@@ -606,7 +676,7 @@ void CPanel::Refresh_StatusBar()
if (indices.Size() > 0)
{
// for (int ttt = 0; ttt < 1000; ttt++) {
// for (unsigned ttt = 0; ttt < 1000; ttt++) {
UInt64 totalSize = 0;
FOR_VECTOR (i, indices)
totalSize += GetItemSize(indices[i]);
@@ -632,10 +702,10 @@ void CPanel::Refresh_StatusBar()
char dateString2[32];
dateString2[0] = 0;
ConvertPropertyToShortString(dateString2, prop, kpidMTime, false);
for (int i = 0;; i++)
for (unsigned i = 0;; i++)
{
char c = dateString2[i];
dateString[i] = c;
dateString[i] = (Byte)c;
if (c == 0)
break;
}