mirror of
https://github.com/Xevion/easy7zip.git
synced 2026-01-31 12:24:08 -06:00
Update to 7-Zip 17.00 Beta
This commit is contained in:
@@ -44,7 +44,8 @@ static const Byte kProps[] =
|
||||
|
||||
static const Byte kArcProps[] =
|
||||
{
|
||||
kpidNumStreams
|
||||
kpidNumStreams,
|
||||
kpidMethod
|
||||
};
|
||||
|
||||
struct CHeader
|
||||
@@ -53,6 +54,7 @@ struct CHeader
|
||||
Byte FilterID;
|
||||
Byte LzmaProps[5];
|
||||
|
||||
Byte GetProp() const { return LzmaProps[0]; }
|
||||
UInt32 GetDicSize() const { return GetUi32(LzmaProps + 1); }
|
||||
bool HasSize() const { return (Size != (UInt64)(Int64)-1); }
|
||||
bool Parse(const Byte *buf, bool isThereFilter);
|
||||
@@ -197,6 +199,8 @@ class CHandler:
|
||||
UInt64 _unpackSize;
|
||||
UInt64 _numStreams;
|
||||
|
||||
void GetMethod(NCOM::CPropVariant &prop);
|
||||
|
||||
public:
|
||||
MY_UNKNOWN_IMP2(IInArchive, IArchiveOpenSeq)
|
||||
|
||||
@@ -220,6 +224,7 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
|
||||
case kpidPhySize: if (_packSize_Defined) prop = _packSize; break;
|
||||
case kpidNumStreams: if (_numStreams_Defined) prop = _numStreams; break;
|
||||
case kpidUnpackSize: if (_unpackSize_Defined) prop = _unpackSize; break;
|
||||
case kpidMethod: GetMethod(prop); break;
|
||||
case kpidErrorFlags:
|
||||
{
|
||||
UInt32 v = 0;
|
||||
@@ -229,6 +234,7 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
|
||||
if (_unsupported) v |= kpv_ErrorFlags_UnsupportedMethod;
|
||||
if (_dataError) v |= kpv_ErrorFlags_DataError;
|
||||
prop = v;
|
||||
break;
|
||||
}
|
||||
}
|
||||
prop.Detach(value);
|
||||
@@ -241,23 +247,60 @@ STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static void DictSizeToString(UInt32 value, char *s)
|
||||
|
||||
static void DictSizeToString(UInt32 val, char *s)
|
||||
{
|
||||
for (int i = 0; i <= 31; i++)
|
||||
if (((UInt32)1 << i) == value)
|
||||
for (unsigned i = 0; i <= 31; i++)
|
||||
if (((UInt32)1 << i) == val)
|
||||
{
|
||||
::ConvertUInt32ToString(i, s);
|
||||
return;
|
||||
}
|
||||
char c = 'b';
|
||||
if ((value & ((1 << 20) - 1)) == 0) { value >>= 20; c = 'm'; }
|
||||
else if ((value & ((1 << 10) - 1)) == 0) { value >>= 10; c = 'k'; }
|
||||
::ConvertUInt32ToString(value, s);
|
||||
if ((val & ((1 << 20) - 1)) == 0) { val >>= 20; c = 'm'; }
|
||||
else if ((val & ((1 << 10) - 1)) == 0) { val >>= 10; c = 'k'; }
|
||||
::ConvertUInt32ToString(val, s);
|
||||
s += MyStringLen(s);
|
||||
*s++ = c;
|
||||
*s = 0;
|
||||
}
|
||||
|
||||
static char *AddProp32(char *s, const char *name, UInt32 v)
|
||||
{
|
||||
*s++ = ':';
|
||||
s = MyStpCpy(s, name);
|
||||
::ConvertUInt32ToString(v, s);
|
||||
return s + MyStringLen(s);
|
||||
}
|
||||
|
||||
void CHandler::GetMethod(NCOM::CPropVariant &prop)
|
||||
{
|
||||
if (!_stream)
|
||||
return;
|
||||
|
||||
char sz[64];
|
||||
char *s = sz;
|
||||
if (_header.FilterID != 0)
|
||||
s = MyStpCpy(s, "BCJ ");
|
||||
s = MyStpCpy(s, "LZMA:");
|
||||
DictSizeToString(_header.GetDicSize(), s);
|
||||
s += strlen(s);
|
||||
|
||||
UInt32 d = _header.GetProp();
|
||||
// if (d != 0x5D)
|
||||
{
|
||||
UInt32 lc = d % 9;
|
||||
d /= 9;
|
||||
UInt32 pb = d / 5;
|
||||
UInt32 lp = d % 5;
|
||||
if (lc != 3) s = AddProp32(s, "lc", lc);
|
||||
if (lp != 0) s = AddProp32(s, "lp", lp);
|
||||
if (pb != 2) s = AddProp32(s, "pb", pb);
|
||||
}
|
||||
prop = sz;
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value)
|
||||
{
|
||||
NCOM::CPropVariant prop;
|
||||
@@ -265,18 +308,7 @@ STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIAN
|
||||
{
|
||||
case kpidSize: if (_stream && _header.HasSize()) prop = _header.Size; break;
|
||||
case kpidPackSize: if (_packSize_Defined) prop = _packSize; break;
|
||||
case kpidMethod:
|
||||
if (_stream)
|
||||
{
|
||||
char sz[64];
|
||||
char *s = sz;
|
||||
if (_header.FilterID != 0)
|
||||
s = MyStpCpy(s, "BCJ ");
|
||||
s = MyStpCpy(s, "LZMA:");
|
||||
DictSizeToString(_header.GetDicSize(), s);
|
||||
prop = sz;
|
||||
}
|
||||
break;
|
||||
case kpidMethod: GetMethod(prop); break;
|
||||
}
|
||||
prop.Detach(value);
|
||||
return S_OK;
|
||||
@@ -396,9 +428,9 @@ STDMETHODIMP CCompressProgressInfoImp::SetRatioInfo(const UInt64 *inSize, const
|
||||
{
|
||||
if (Callback)
|
||||
{
|
||||
UInt64 files = 0;
|
||||
UInt64 value = Offset + *inSize;
|
||||
return Callback->SetCompleted(&files, &value);
|
||||
const UInt64 files = 0;
|
||||
const UInt64 val = Offset + *inSize;
|
||||
return Callback->SetCompleted(&files, &val);
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
@@ -510,7 +542,7 @@ STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
|
||||
{
|
||||
if (dataAfterEnd)
|
||||
_dataAfterEnd = true;
|
||||
else if (decoder._lzmaDecoderSpec->NeedMoreInput)
|
||||
else if (decoder._lzmaDecoderSpec->NeedsMoreInput())
|
||||
_needMoreInput = true;
|
||||
|
||||
_packSize = packSize;
|
||||
|
||||
Reference in New Issue
Block a user