This commit is contained in:
Igor Pavlov
2023-12-22 17:17:05 +00:00
committed by Kornel
parent ec44a8a070
commit a36c48cece
954 changed files with 42199 additions and 25482 deletions

View File

@@ -2,56 +2,63 @@
#include "StdAfx.h"
#include "7zProperties.h"
#include "7zHeader.h"
#include "7zHandler.h"
// #define _MULTI_PACK
#include "7zProperties.h"
namespace NArchive {
namespace N7z {
struct CPropMap
{
UInt32 FilePropID;
CStatProp StatProp;
Byte FilePropID;
// CStatProp StatProp;
VARTYPE vt;
UInt32 StatPropID;
};
// #define STAT_PROP(name, id, vt) { name, id, vt }
#define STAT_PROP(name, id, vt) vt, id
#define STAT_PROP2(id, vt) STAT_PROP(NULL, id, vt)
#define k_7z_id_Encrypted 97
#define k_7z_id_Method 98
#define k_7z_id_Block 99
static const CPropMap kPropMap[] =
{
{ NID::kName, { NULL, kpidPath, VT_BSTR } },
{ NID::kSize, { NULL, kpidSize, VT_UI8 } },
{ NID::kPackInfo, { NULL, kpidPackSize, VT_UI8 } },
{ NID::kName, STAT_PROP2(kpidPath, VT_BSTR) },
{ NID::kSize, STAT_PROP2(kpidSize, VT_UI8) },
{ NID::kPackInfo, STAT_PROP2(kpidPackSize, VT_UI8) },
#ifdef _MULTI_PACK
{ 100, { "Pack0", kpidPackedSize0, VT_UI8 } },
{ 101, { "Pack1", kpidPackedSize1, VT_UI8 } },
{ 102, { "Pack2", kpidPackedSize2, VT_UI8 } },
{ 103, { "Pack3", kpidPackedSize3, VT_UI8 } },
{ 104, { "Pack4", kpidPackedSize4, VT_UI8 } },
#ifdef Z7_7Z_SHOW_PACK_STREAMS_SIZES
#define k_7z_id_PackedSize0 100
{ k_7z_id_PackedSize0 + 0, STAT_PROP("Pack0", kpidPackedSize0, VT_UI8) },
{ k_7z_id_PackedSize0 + 1, STAT_PROP("Pack1", kpidPackedSize1, VT_UI8) },
{ k_7z_id_PackedSize0 + 2, STAT_PROP("Pack2", kpidPackedSize2, VT_UI8) },
{ k_7z_id_PackedSize0 + 3, STAT_PROP("Pack3", kpidPackedSize3, VT_UI8) },
{ k_7z_id_PackedSize0 + 4, STAT_PROP("Pack4", kpidPackedSize4, VT_UI8) },
#endif
{ NID::kCTime, { NULL, kpidCTime, VT_FILETIME } },
{ NID::kMTime, { NULL, kpidMTime, VT_FILETIME } },
{ NID::kATime, { NULL, kpidATime, VT_FILETIME } },
{ NID::kWinAttrib, { NULL, kpidAttrib, VT_UI4 } },
{ NID::kStartPos, { NULL, kpidPosition, VT_UI8 } },
{ NID::kCTime, STAT_PROP2(kpidCTime, VT_FILETIME) },
{ NID::kMTime, STAT_PROP2(kpidMTime, VT_FILETIME) },
{ NID::kATime, STAT_PROP2(kpidATime, VT_FILETIME) },
{ NID::kWinAttrib, STAT_PROP2(kpidAttrib, VT_UI4) },
{ NID::kStartPos, STAT_PROP2(kpidPosition, VT_UI8) },
{ NID::kCRC, { NULL, kpidCRC, VT_UI4 } },
// { NID::kIsAux, { NULL, kpidIsAux, VT_BOOL } },
{ NID::kAnti, { NULL, kpidIsAnti, VT_BOOL } }
{ NID::kCRC, STAT_PROP2(kpidCRC, VT_UI4) },
// { NID::kIsAux, STAT_PROP2(kpidIsAux, VT_BOOL) },
{ NID::kAnti, STAT_PROP2(kpidIsAnti, VT_BOOL) }
#ifndef _SFX
,
{ 97, { NULL, kpidEncrypted, VT_BOOL } },
{ 98, { NULL, kpidMethod, VT_BSTR } },
{ 99, { NULL, kpidBlock, VT_UI4 } }
#ifndef Z7_SFX
, { k_7z_id_Encrypted, STAT_PROP2(kpidEncrypted, VT_BOOL) }
, { k_7z_id_Method, STAT_PROP2(kpidMethod, VT_BSTR) }
, { k_7z_id_Block, STAT_PROP2(kpidBlock, VT_UI4) }
#endif
};
static void CopyOneItem(CRecordVector<UInt64> &src,
CRecordVector<UInt64> &dest, UInt32 item)
CRecordVector<UInt64> &dest, const UInt32 item)
{
FOR_VECTOR (i, src)
if (src[i] == item)
@@ -62,7 +69,7 @@ static void CopyOneItem(CRecordVector<UInt64> &src,
}
}
static void RemoveOneItem(CRecordVector<UInt64> &src, UInt32 item)
static void RemoveOneItem(CRecordVector<UInt64> &src, const UInt32 item)
{
FOR_VECTOR (i, src)
if (src[i] == item)
@@ -72,7 +79,7 @@ static void RemoveOneItem(CRecordVector<UInt64> &src, UInt32 item)
}
}
static void InsertToHead(CRecordVector<UInt64> &dest, UInt32 item)
static void InsertToHead(CRecordVector<UInt64> &dest, const UInt32 item)
{
FOR_VECTOR (i, dest)
if (dest[i] == item)
@@ -89,7 +96,7 @@ void CHandler::FillPopIDs()
{
_fileInfoPopIDs.Clear();
#ifdef _7Z_VOL
#ifdef Z7_7Z_VOL
if (_volumes.Size() < 1)
return;
const CVolume &volume = _volumes.Front();
@@ -105,34 +112,31 @@ void CHandler::FillPopIDs()
RemoveOneItem(fileInfoPopIDs, NID::kNtSecure);
*/
COPY_ONE_ITEM(kName);
COPY_ONE_ITEM(kAnti);
COPY_ONE_ITEM(kSize);
COPY_ONE_ITEM(kPackInfo);
COPY_ONE_ITEM(kCTime);
COPY_ONE_ITEM(kMTime);
COPY_ONE_ITEM(kATime);
COPY_ONE_ITEM(kWinAttrib);
COPY_ONE_ITEM(kCRC);
COPY_ONE_ITEM(kComment);
COPY_ONE_ITEM(kName)
COPY_ONE_ITEM(kAnti)
COPY_ONE_ITEM(kSize)
COPY_ONE_ITEM(kPackInfo)
COPY_ONE_ITEM(kCTime)
COPY_ONE_ITEM(kMTime)
COPY_ONE_ITEM(kATime)
COPY_ONE_ITEM(kWinAttrib)
COPY_ONE_ITEM(kCRC)
COPY_ONE_ITEM(kComment)
_fileInfoPopIDs += fileInfoPopIDs;
#ifndef _SFX
_fileInfoPopIDs.Add(97);
_fileInfoPopIDs.Add(98);
_fileInfoPopIDs.Add(99);
#ifndef Z7_SFX
_fileInfoPopIDs.Add(k_7z_id_Encrypted);
_fileInfoPopIDs.Add(k_7z_id_Method);
_fileInfoPopIDs.Add(k_7z_id_Block);
#endif
#ifdef _MULTI_PACK
_fileInfoPopIDs.Add(100);
_fileInfoPopIDs.Add(101);
_fileInfoPopIDs.Add(102);
_fileInfoPopIDs.Add(103);
_fileInfoPopIDs.Add(104);
#ifdef Z7_7Z_SHOW_PACK_STREAMS_SIZES
for (unsigned i = 0; i < 5; i++)
_fileInfoPopIDs.Add(k_7z_id_PackedSize0 + i);
#endif
#ifndef _SFX
#ifndef Z7_SFX
InsertToHead(_fileInfoPopIDs, NID::kMTime);
InsertToHead(_fileInfoPopIDs, NID::kPackInfo);
InsertToHead(_fileInfoPopIDs, NID::kSize);
@@ -140,25 +144,29 @@ void CHandler::FillPopIDs()
#endif
}
STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProps)
Z7_COM7F_IMF(CHandler::GetNumberOfProperties(UInt32 *numProps))
{
*numProps = _fileInfoPopIDs.Size();
return S_OK;
}
STDMETHODIMP CHandler::GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)
Z7_COM7F_IMF(CHandler::GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType))
{
if (index >= _fileInfoPopIDs.Size())
return E_INVALIDARG;
UInt64 id = _fileInfoPopIDs[index];
for (unsigned i = 0; i < ARRAY_SIZE(kPropMap); i++)
const UInt64 id = _fileInfoPopIDs[index];
for (unsigned i = 0; i < Z7_ARRAY_SIZE(kPropMap); i++)
{
const CPropMap &pr = kPropMap[i];
if (pr.FilePropID == id)
{
*propID = pr.StatPropID;
*varType = pr.vt;
/*
const CStatProp &st = pr.StatProp;
*propID = st.PropID;
*varType = st.vt;
*/
/*
if (st.lpwstrName)
*name = ::SysAllocString(st.lpwstrName);