mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-06 17:15:00 -06:00
15.05
This commit is contained in:
committed by
Kornel Lesiński
parent
0713a3ab80
commit
54490d51d5
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user