mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-10 16:07:09 -06:00
Update to 7-Zip Version 22.00
See: https://sourceforge.net/p/sevenzip/discussion/45797/thread/9c2d9061ce/
This commit is contained in:
@@ -1591,14 +1591,14 @@ STDMETHODIMP CHandler::GetRawProp(UInt32 index, PROPID propID, const void **data
|
||||
static void TimeRecordToProp(const CItem &item, unsigned stampIndex, NCOM::CPropVariant &prop)
|
||||
{
|
||||
unsigned size;
|
||||
int offset = item.FindExtra(NExtraID::kTime, size);
|
||||
const int offset = item.FindExtra(NExtraID::kTime, size);
|
||||
if (offset < 0)
|
||||
return;
|
||||
|
||||
const Byte *p = item.Extra + (unsigned)offset;
|
||||
UInt64 flags;
|
||||
{
|
||||
unsigned num = ReadVarInt(p, size, &flags);
|
||||
const unsigned num = ReadVarInt(p, size, &flags);
|
||||
if (num == 0)
|
||||
return;
|
||||
p += num;
|
||||
@@ -1610,8 +1610,8 @@ static void TimeRecordToProp(const CItem &item, unsigned stampIndex, NCOM::CProp
|
||||
|
||||
unsigned numStamps = 0;
|
||||
unsigned curStamp = 0;
|
||||
unsigned i;
|
||||
for (i = 0; i < 3; i++)
|
||||
|
||||
for (unsigned i = 0; i < 3; i++)
|
||||
if ((flags & (NTimeRecord::NFlags::kMTime << i)) != 0)
|
||||
{
|
||||
if (i == stampIndex)
|
||||
@@ -1620,20 +1620,28 @@ static void TimeRecordToProp(const CItem &item, unsigned stampIndex, NCOM::CProp
|
||||
}
|
||||
|
||||
FILETIME ft;
|
||||
|
||||
|
||||
unsigned timePrec = 0;
|
||||
unsigned ns100 = 0;
|
||||
|
||||
if ((flags & NTimeRecord::NFlags::kUnixTime) != 0)
|
||||
{
|
||||
curStamp *= 4;
|
||||
if (curStamp + 4 > size)
|
||||
return;
|
||||
const Byte *p2 = p + curStamp;
|
||||
UInt64 val = NTime::UnixTimeToFileTime64(Get32(p2));
|
||||
p += curStamp;
|
||||
UInt64 val = NTime::UnixTime_To_FileTime64(Get32(p));
|
||||
numStamps *= 4;
|
||||
timePrec = k_PropVar_TimePrec_Unix;
|
||||
if ((flags & NTimeRecord::NFlags::kUnixNs) != 0 && numStamps * 2 <= size)
|
||||
{
|
||||
const UInt32 ns = Get32(p2 + numStamps) & 0x3FFFFFFF;
|
||||
const UInt32 ns = Get32(p + numStamps) & 0x3FFFFFFF;
|
||||
if (ns < 1000000000)
|
||||
{
|
||||
val += ns / 100;
|
||||
ns100 = (unsigned)(ns % 100);
|
||||
timePrec = k_PropVar_TimePrec_1ns;
|
||||
}
|
||||
}
|
||||
ft.dwLowDateTime = (DWORD)val;
|
||||
ft.dwHighDateTime = (DWORD)(val >> 32);
|
||||
@@ -1643,12 +1651,12 @@ static void TimeRecordToProp(const CItem &item, unsigned stampIndex, NCOM::CProp
|
||||
curStamp *= 8;
|
||||
if (curStamp + 8 > size)
|
||||
return;
|
||||
const Byte *p2 = p + curStamp;
|
||||
ft.dwLowDateTime = Get32(p2);
|
||||
ft.dwHighDateTime = Get32(p2 + 4);
|
||||
p += curStamp;
|
||||
ft.dwLowDateTime = Get32(p);
|
||||
ft.dwHighDateTime = Get32(p + 4);
|
||||
}
|
||||
|
||||
prop = ft;
|
||||
prop.SetAsTimeFrom_FT_Prec_Ns100(ft, timePrec, ns100);
|
||||
}
|
||||
|
||||
|
||||
@@ -1715,21 +1723,13 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val
|
||||
{
|
||||
TimeRecordToProp(item, NTimeRecord::k_Index_MTime, prop);
|
||||
if (prop.vt == VT_EMPTY && item.Has_UnixMTime())
|
||||
{
|
||||
FILETIME ft;
|
||||
NWindows::NTime::UnixTimeToFileTime(item.UnixMTime, ft);
|
||||
prop = ft;
|
||||
}
|
||||
PropVariant_SetFrom_UnixTime(prop, item.UnixMTime);
|
||||
if (prop.vt == VT_EMPTY && ref.Parent >= 0)
|
||||
{
|
||||
const CItem &baseItem = _items[_refs[ref.Parent].Item];
|
||||
TimeRecordToProp(baseItem, NTimeRecord::k_Index_MTime, prop);
|
||||
if (prop.vt == VT_EMPTY && baseItem.Has_UnixMTime())
|
||||
{
|
||||
FILETIME ft;
|
||||
NWindows::NTime::UnixTimeToFileTime(baseItem.UnixMTime, ft);
|
||||
prop = ft;
|
||||
}
|
||||
PropVariant_SetFrom_UnixTime(prop, baseItem.UnixMTime);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -360,7 +360,7 @@ void CInArchive::ReadName(const Byte *p, unsigned nameSize, CItem &item)
|
||||
static int ReadTime(const Byte *p, unsigned size, Byte mask, CRarTime &rarTime)
|
||||
{
|
||||
rarTime.LowSecond = (Byte)(((mask & 4) != 0) ? 1 : 0);
|
||||
unsigned numDigits = (mask & 3);
|
||||
const unsigned numDigits = (mask & 3);
|
||||
rarTime.SubTime[0] =
|
||||
rarTime.SubTime[1] =
|
||||
rarTime.SubTime[2] = 0;
|
||||
@@ -405,8 +405,8 @@ bool CInArchive::ReadHeaderReal(const Byte *p, unsigned size, CItem &item)
|
||||
|
||||
item.MTime.LowSecond = 0;
|
||||
item.MTime.SubTime[0] =
|
||||
item.MTime.SubTime[1] =
|
||||
item.MTime.SubTime[2] = 0;
|
||||
item.MTime.SubTime[1] =
|
||||
item.MTime.SubTime[2] = 0;
|
||||
|
||||
p += kFileHeaderSize;
|
||||
size -= kFileHeaderSize;
|
||||
@@ -941,31 +941,32 @@ STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static bool RarTimeToFileTime(const CRarTime &rarTime, FILETIME &result)
|
||||
static bool RarTimeToFileTime(const CRarTime &rarTime, FILETIME &ft)
|
||||
{
|
||||
if (!NTime::DosTimeToFileTime(rarTime.DosTime, result))
|
||||
if (!NTime::DosTime_To_FileTime(rarTime.DosTime, ft))
|
||||
return false;
|
||||
UInt64 value = (((UInt64)result.dwHighDateTime) << 32) + result.dwLowDateTime;
|
||||
value += (UInt64)rarTime.LowSecond * 10000000;
|
||||
value += ((UInt64)rarTime.SubTime[2] << 16) +
|
||||
((UInt64)rarTime.SubTime[1] << 8) +
|
||||
((UInt64)rarTime.SubTime[0]);
|
||||
result.dwLowDateTime = (DWORD)value;
|
||||
result.dwHighDateTime = DWORD(value >> 32);
|
||||
UInt64 v = (((UInt64)ft.dwHighDateTime) << 32) + ft.dwLowDateTime;
|
||||
v += (UInt32)rarTime.LowSecond * 10000000;
|
||||
v +=
|
||||
((UInt32)rarTime.SubTime[2] << 16) +
|
||||
((UInt32)rarTime.SubTime[1] << 8) +
|
||||
((UInt32)rarTime.SubTime[0]);
|
||||
ft.dwLowDateTime = (DWORD)v;
|
||||
ft.dwHighDateTime = (DWORD)(v >> 32);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void RarTimeToProp(const CRarTime &rarTime, NCOM::CPropVariant &prop)
|
||||
{
|
||||
FILETIME localFileTime, utcFileTime;
|
||||
if (RarTimeToFileTime(rarTime, localFileTime))
|
||||
{
|
||||
if (!LocalFileTimeToFileTime(&localFileTime, &utcFileTime))
|
||||
utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;
|
||||
}
|
||||
FILETIME localFileTime, utc;
|
||||
if (RarTimeToFileTime(rarTime, localFileTime)
|
||||
&& LocalFileTimeToFileTime(&localFileTime, &utc))
|
||||
prop.SetAsTimeFrom_FT_Prec(utc, k_PropVar_TimePrec_100ns);
|
||||
/*
|
||||
else
|
||||
utcFileTime.dwHighDateTime = utcFileTime.dwLowDateTime = 0;
|
||||
prop = utcFileTime;
|
||||
utc.dwHighDateTime = utc.dwLowDateTime = 0;
|
||||
// prop.SetAsTimeFrom_FT_Prec(utc, k_PropVar_TimePrec_100ns);
|
||||
*/
|
||||
}
|
||||
|
||||
STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
|
||||
|
||||
@@ -52,7 +52,7 @@ public:
|
||||
ext.IsEqualTo_Ascii_NoCase("r01"))
|
||||
{
|
||||
_changed = ext;
|
||||
_before = name.Left(dotPos + 1);
|
||||
_before.SetFrom(name.Ptr(), dotPos + 1);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -60,16 +60,23 @@ public:
|
||||
|
||||
if (newStyle)
|
||||
{
|
||||
unsigned i = base.Len();
|
||||
unsigned k = base.Len();
|
||||
|
||||
for (; k != 0; k--)
|
||||
if (IsDigit(base[k - 1]))
|
||||
break;
|
||||
|
||||
unsigned i = k;
|
||||
|
||||
for (; i != 0; i--)
|
||||
if (!IsDigit(base[i - 1]))
|
||||
break;
|
||||
|
||||
if (i != base.Len())
|
||||
if (i != k)
|
||||
{
|
||||
_before = base.Left(i);
|
||||
_changed = base.Ptr(i);
|
||||
_before.SetFrom(base.Ptr(), i);
|
||||
_changed.SetFrom(base.Ptr(i), k - i);
|
||||
_after.Insert(0, base.Ptr(k));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user