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

@@ -1,8 +1,11 @@
// StdAfx.h
#ifndef __STDAFX_H
#define __STDAFX_H
#ifndef ZIP7_INC_STDAFX_H
#define ZIP7_INC_STDAFX_H
#if defined(_MSC_VER) && _MSC_VER >= 1800
#pragma warning(disable : 4464) // relative include path contains '..'
#endif
#include "../../../Common/Common.h"
#endif

View File

@@ -95,7 +95,7 @@ static void AddErrorMessage(AString &s, const char *message)
}
STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
Z7_COM7F_IMF(CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value))
{
COM_TRY_BEGIN
NCOM::CPropVariant prop;
@@ -124,7 +124,7 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
const CImageInfo &image2 = xml.Images[i];
if (image2.CTimeDefined)
if (index < 0 || ::CompareFileTime(&image2.CTime, &xml.Images[index].CTime) < 0)
index = i;
index = (int)i;
}
if (index >= 0)
prop = xml.Images[index].CTime;
@@ -141,7 +141,7 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
const CImageInfo &image2 = xml.Images[i];
if (image2.MTimeDefined)
if (index < 0 || ::CompareFileTime(&image2.MTime, &xml.Images[index].MTime) > 0)
index = i;
index = (int)i;
}
if (index >= 0)
prop = xml.Images[index].MTime;
@@ -170,11 +170,11 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
AString res;
res.Add_UInt32(ver1);
res += '.';
res.Add_Dot();
res.Add_UInt32(ver2);
if (ver3 != 0)
{
res += '.';
res.Add_Dot();
res.Add_UInt32(ver3);
}
prop = res;
@@ -245,7 +245,7 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
if (h.PartNumber != 1)
{
s.Add_UInt32(h.PartNumber);
s += '.';
s.Add_Dot();
}
s += "swm";
prop = s;
@@ -267,7 +267,7 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
{
const CHeader &header = _volumes[_xmls[i].VolIndex].Header;
unsigned method = header.GetMethod();
if (method < ARRAY_SIZE(k_Methods))
if (method < Z7_ARRAY_SIZE(k_Methods))
methodMask |= ((UInt32)1 << method);
else
methodUnknown = method;
@@ -280,7 +280,7 @@ STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)
unsigned numMethods = 0;
for (unsigned i = 0; i < ARRAY_SIZE(k_Methods); i++)
for (unsigned i = 0; i < Z7_ARRAY_SIZE(k_Methods); i++)
{
if (methodMask & ((UInt32)1 << i))
{
@@ -365,8 +365,8 @@ static void MethodToProp(int method, int chunksSizeBits, NCOM::CPropVariant &pro
{
char temp[32];
if ((unsigned)method < ARRAY_SIZE(k_Methods))
strcpy(temp, k_Methods[(unsigned)method]);
if ((unsigned)method < Z7_ARRAY_SIZE(k_Methods))
MyStringCopy(temp, k_Methods[(unsigned)method]);
else
ConvertUInt32ToString((UInt32)(unsigned)method, temp);
@@ -382,7 +382,7 @@ static void MethodToProp(int method, int chunksSizeBits, NCOM::CPropVariant &pro
}
STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
Z7_COM7F_IMF(CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value))
{
COM_TRY_BEGIN
NCOM::CPropVariant prop;
@@ -423,7 +423,7 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val
else
*/
AString s (FILES_DIR_NAME STRING_PATH_SEPARATOR);
s.Add_UInt32(item.StreamIndex);
s.Add_UInt32((UInt32)(Int32)item.StreamIndex);
prop = s;
}
break;
@@ -434,7 +434,7 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val
else
{
char sz[16];
ConvertUInt32ToString(item.StreamIndex, sz);
ConvertUInt32ToString((UInt32)(Int32)item.StreamIndex, sz);
/*
AString s = sz;
while (s.Len() < _nameLenForStreams)
@@ -558,7 +558,7 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val
if (r.SolidIndex >= 0)
{
CSolid &ss = _db.Solids[r.SolidIndex];
MethodToProp(ss.Method, ss.ChunkSizeBits, prop);
MethodToProp(ss.Method, (int)ss.ChunkSizeBits, prop);
}
}
else
@@ -567,8 +567,8 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val
int chunkSizeBits = -1;
if (r.IsCompressed())
{
method = vol->Header.GetMethod();
chunkSizeBits = vol->Header.ChunkSizeBits;
method = (int)vol->Header.GetMethod();
chunkSizeBits = (int)vol->Header.ChunkSizeBits;
}
MethodToProp(method, chunkSizeBits, prop);
}
@@ -620,7 +620,7 @@ STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val
COM_TRY_END
}
STDMETHODIMP CHandler::GetRootProp(PROPID propID, PROPVARIANT *value)
Z7_COM7F_IMF(CHandler::GetRootProp(PROPID propID, PROPVARIANT *value))
{
// COM_TRY_BEGIN
NCOM::CPropVariant prop;
@@ -670,9 +670,9 @@ HRESULT CHandler::GetSecurity(UInt32 realIndex, const void **data, UInt32 *dataS
return S_OK;
}
STDMETHODIMP CHandler::GetRootRawProp(PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType)
Z7_COM7F_IMF(CHandler::GetRootRawProp(PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType))
{
*data = 0;
*data = NULL;
*dataSize = 0;
*propType = 0;
if (propID == kpidNtSecure && _db.Images.Size() != 0 && _db.NumExcludededItems != 0)
@@ -694,20 +694,20 @@ static const Byte kRawProps[] =
};
STDMETHODIMP CHandler::GetNumRawProps(UInt32 *numProps)
Z7_COM7F_IMF(CHandler::GetNumRawProps(UInt32 *numProps))
{
*numProps = ARRAY_SIZE(kRawProps);
*numProps = Z7_ARRAY_SIZE(kRawProps);
return S_OK;
}
STDMETHODIMP CHandler::GetRawPropInfo(UInt32 index, BSTR *name, PROPID *propID)
Z7_COM7F_IMF(CHandler::GetRawPropInfo(UInt32 index, BSTR *name, PROPID *propID))
{
*propID = kRawProps[index];
*name = 0;
*name = NULL;
return S_OK;
}
STDMETHODIMP CHandler::GetParent(UInt32 index, UInt32 *parent, UInt32 *parentType)
Z7_COM7F_IMF(CHandler::GetParent(UInt32 index, UInt32 *parent, UInt32 *parentType))
{
*parentType = NParentType::kDir;
*parent = (UInt32)(Int32)-1;
@@ -722,13 +722,13 @@ STDMETHODIMP CHandler::GetParent(UInt32 index, UInt32 *parent, UInt32 *parentTyp
if (item.Parent >= 0)
{
if (_db.ExludedItem != item.Parent)
*parent = _db.Items[item.Parent].IndexInSorted;
*parent = (unsigned)_db.Items[item.Parent].IndexInSorted;
}
else
{
CImage &image = _db.Images[item.ImageIndex];
if (image.VirtualRootIndex >= 0)
*parent = _db.SortedItems.Size() + _numXmlItems + image.VirtualRootIndex;
*parent = _db.SortedItems.Size() + _numXmlItems + (unsigned)image.VirtualRootIndex;
}
}
else
@@ -736,7 +736,7 @@ STDMETHODIMP CHandler::GetParent(UInt32 index, UInt32 *parent, UInt32 *parentTyp
return S_OK;
}
STDMETHODIMP CHandler::GetRawProp(UInt32 index, PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType)
Z7_COM7F_IMF(CHandler::GetRawProp(UInt32 index, PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType))
{
*data = NULL;
*dataSize = 0;
@@ -842,8 +842,8 @@ public:
{
int dotPos = name.ReverseFind_Dot();
if (dotPos < 0)
dotPos = name.Len();
_before.SetFrom(name.Ptr(), dotPos);
dotPos = (int)name.Len();
_before.SetFrom(name.Ptr(), (unsigned)dotPos);
_after = name.Ptr(dotPos);
}
@@ -856,7 +856,7 @@ public:
}
};
STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCallback *callback)
Z7_COM7F_IMF(CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCallback *callback))
{
COM_TRY_BEGIN
@@ -963,7 +963,7 @@ STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCal
numVolumes = header.NumParts;
{
NCOM::CPropVariant prop;
RINOK(openVolumeCallback->GetProperty(kpidName, &prop));
RINOK(openVolumeCallback->GetProperty(kpidName, &prop))
if (prop.vt != VT_BSTR)
break;
seqName.InitName(prop.bstrVal);
@@ -971,7 +971,7 @@ STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCal
}
}
RINOK(_db.FillAndCheck(_volumes));
RINOK(_db.FillAndCheck(_volumes))
int defaultImageIndex = (int)_defaultImageNumber - 1;
bool showImageNumber = (_db.Images.Size() != 1 && defaultImageIndex < 0);
@@ -983,8 +983,8 @@ STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCal
_showImageNumber = showImageNumber;
RINOK(_db.GenerateSortedItems(defaultImageIndex, showImageNumber));
RINOK(_db.ExtractReparseStreams(_volumes, callback));
RINOK(_db.GenerateSortedItems(defaultImageIndex, showImageNumber))
RINOK(_db.ExtractReparseStreams(_volumes, callback))
/*
wchar_t sz[16];
@@ -1001,7 +1001,7 @@ STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCal
}
STDMETHODIMP CHandler::Close()
Z7_COM7F_IMF(CHandler::Close())
{
_firstVolumeIndex = -1;
_phySize = 0;
@@ -1019,11 +1019,11 @@ STDMETHODIMP CHandler::Close()
}
STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
Int32 testMode, IArchiveExtractCallback *extractCallback)
Z7_COM7F_IMF(CHandler::Extract(const UInt32 *indices, UInt32 numItems,
Int32 testMode, IArchiveExtractCallback *extractCallback))
{
COM_TRY_BEGIN
bool allFilesMode = (numItems == (UInt32)(Int32)-1);
const bool allFilesMode = (numItems == (UInt32)(Int32)-1);
if (allFilesMode)
numItems = _db.SortedItems.Size() + _numXmlItems + _db.VirtualRoots.Size() + _numIgnoreItems;
@@ -1048,12 +1048,12 @@ STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
else
{
index -= _db.SortedItems.Size();
if (index < (UInt32)_numXmlItems)
if (index < _numXmlItems)
totalSize += _xmls[index].Data.Size();
}
}
RINOK(extractCallback->SetTotal(totalSize));
RINOK(extractCallback->SetTotal(totalSize))
UInt64 currentTotalUnPacked = 0;
UInt64 currentItemUnPacked;
@@ -1074,36 +1074,36 @@ STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
lps->InSize = unpacker.TotalPacked;
lps->OutSize = currentTotalUnPacked;
RINOK(lps->SetCur());
RINOK(lps->SetCur())
if (i >= numItems)
break;
UInt32 index = allFilesMode ? i : indices[i];
Int32 askMode = testMode ?
const Int32 askMode = testMode ?
NExtract::NAskMode::kTest :
NExtract::NAskMode::kExtract;
CMyComPtr<ISequentialOutStream> realOutStream;
RINOK(extractCallback->GetStream(index, &realOutStream, askMode));
RINOK(extractCallback->GetStream(index, &realOutStream, askMode))
if (index >= _db.SortedItems.Size())
{
if (!testMode && !realOutStream)
continue;
RINOK(extractCallback->PrepareOperation(askMode));
RINOK(extractCallback->PrepareOperation(askMode))
index -= _db.SortedItems.Size();
if (index < (UInt32)_numXmlItems)
if (index < _numXmlItems)
{
const CByteBuffer &data = _xmls[index].Data;
currentItemUnPacked = data.Size();
if (realOutStream)
{
RINOK(WriteStream(realOutStream, (const Byte *)data, data.Size()));
RINOK(WriteStream(realOutStream, (const Byte *)data, data.Size()))
realOutStream.Release();
}
}
RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK));
RINOK(extractCallback->SetOperationResult(NExtract::NOperationResult::kOK))
continue;
}
@@ -1114,11 +1114,11 @@ STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
if (!item.IsDir)
if (!testMode && !realOutStream)
continue;
RINOK(extractCallback->PrepareOperation(askMode));
RINOK(extractCallback->PrepareOperation(askMode))
realOutStream.Release();
RINOK(extractCallback->SetOperationResult(!item.IsDir && _db.ItemHasStream(item) ?
NExtract::NOperationResult::kDataError :
NExtract::NOperationResult::kOK));
NExtract::NOperationResult::kOK))
continue;
}
@@ -1128,7 +1128,7 @@ STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
if (!testMode && !realOutStream)
continue;
RINOK(extractCallback->PrepareOperation(askMode));
RINOK(extractCallback->PrepareOperation(askMode))
Int32 opRes = NExtract::NOperationResult::kOK;
if (streamIndex != prevSuccessStreamIndex || realOutStream)
@@ -1156,7 +1156,7 @@ STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
}
realOutStream.Release();
RINOK(extractCallback->SetOperationResult(opRes));
RINOK(extractCallback->SetOperationResult(opRes))
}
return S_OK;
@@ -1164,7 +1164,7 @@ STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems,
}
STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems)
Z7_COM7F_IMF(CHandler::GetNumberOfItems(UInt32 *numItems))
{
*numItems = _db.SortedItems.Size() +
_numXmlItems +
@@ -1180,7 +1180,7 @@ CHandler::CHandler()
_xmlError = false;
}
STDMETHODIMP CHandler::SetProperties(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps)
Z7_COM7F_IMF(CHandler::SetProperties(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps))
{
InitDefaults();
@@ -1197,18 +1197,18 @@ STDMETHODIMP CHandler::SetProperties(const wchar_t * const *names, const PROPVAR
{
// some clients write 'x' property. So we support it
UInt32 level = 0;
RINOK(ParsePropToUInt32(name.Ptr(1), prop, level));
RINOK(ParsePropToUInt32(name.Ptr(1), prop, level))
}
else if (name.IsEqualTo("is"))
{
RINOK(PROPVARIANT_to_bool(prop, _set_showImageNumber));
RINOK(PROPVARIANT_to_bool(prop, _set_showImageNumber))
_set_use_ShowImageNumber = true;
}
else if (name.IsEqualTo("im"))
{
UInt32 image = 9;
RINOK(ParsePropToUInt32(L"", prop, image));
_defaultImageNumber = image;
RINOK(ParsePropToUInt32(L"", prop, image))
_defaultImageNumber = (int)image;
}
else if (name.IsPrefixedBy_Ascii_NoCase("mt"))
{
@@ -1217,12 +1217,17 @@ STDMETHODIMP CHandler::SetProperties(const wchar_t * const *names, const PROPVAR
{
}
else
return E_INVALIDARG;
{
bool processed = false;
RINOK(_timeOptions.Parse(name, prop, processed))
if (!processed)
return E_INVALIDARG;
}
}
return S_OK;
}
STDMETHODIMP CHandler::KeepModeForNextOpen()
Z7_COM7F_IMF(CHandler::KeepModeForNextOpen())
{
_keepMode_ShowImageNumber = _showImageNumber;
return S_OK;

View File

@@ -1,10 +1,12 @@
// WimHandler.h
#ifndef __ARCHIVE_WIM_HANDLER_H
#define __ARCHIVE_WIM_HANDLER_H
#ifndef ZIP7_INC_ARCHIVE_WIM_HANDLER_H
#define ZIP7_INC_ARCHIVE_WIM_HANDLER_H
#include "../../../Common/MyCom.h"
#include "../Common/HandlerOut.h"
#include "WimIn.h"
namespace NArchive {
@@ -12,15 +14,13 @@ namespace NWim {
static const Int32 kNumImagesMaxUpdate = (1 << 10);
class CHandler:
public IInArchive,
public IArchiveGetRawProps,
public IArchiveGetRootProps,
public IArchiveKeepModeForNextOpen,
public ISetProperties,
public IOutArchive,
public CMyUnknownImp
{
Z7_CLASS_IMP_CHandler_IInArchive_5(
IArchiveGetRawProps
, IArchiveGetRootProps
, IArchiveKeepModeForNextOpen
, ISetProperties
, IOutArchive
)
CDatabase _db;
UInt32 _version;
bool _isOldVersion;
@@ -49,11 +49,14 @@ class CHandler:
UInt64 _phySize;
int _firstVolumeIndex;
CHandlerTimeOptions _timeOptions;
void InitDefaults()
{
_set_use_ShowImageNumber = false;
_set_showImageNumber = false;
_defaultImageNumber = -1;
_timeOptions.Init();
}
bool IsUpdateSupported() const
@@ -83,19 +86,6 @@ class CHandler:
HRESULT GetTime(IArchiveUpdateCallback *callback, UInt32 callbackIndex, Int32 arcIndex, PROPID propID, FILETIME &ft);
public:
CHandler();
MY_UNKNOWN_IMP6(
IInArchive,
IArchiveGetRawProps,
IArchiveGetRootProps,
IArchiveKeepModeForNextOpen,
ISetProperties,
IOutArchive)
INTERFACE_IInArchive(;)
INTERFACE_IArchiveGetRawProps(;)
INTERFACE_IArchiveGetRootProps(;)
STDMETHOD(SetProperties)(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps);
STDMETHOD(KeepModeForNextOpen)();
INTERFACE_IOutArchive(;)
};
}}

View File

File diff suppressed because it is too large Load Diff

View File

@@ -99,7 +99,7 @@ HRESULT CUnpacker::UnpackChunk(
if (!packBuf.Data)
return E_OUTOFMEMORY;
RINOK(ReadStream_FALSE(inStream, packBuf.Data, inSize));
RINOK(ReadStream_FALSE(inStream, packBuf.Data, inSize))
TotalPacked += inSize;
@@ -124,7 +124,7 @@ HRESULT CUnpacker::UnpackChunk(
else
{
res = lzmsDecoder->Code(packBuf.Data, inSize, unpackBuf.Data, outSize);
unpackedSize = lzmsDecoder->GetUnpackSize();;
unpackedSize = lzmsDecoder->GetUnpackSize();
}
}
@@ -141,7 +141,7 @@ HRESULT CUnpacker::UnpackChunk(
if (outStream)
{
RINOK(WriteStream(outStream, unpackBuf.Data, outSize));
RINOK(WriteStream(outStream, unpackBuf.Data, outSize))
}
return res;
@@ -168,7 +168,7 @@ HRESULT CUnpacker::Unpack2(
CMyComPtr<ISequentialInStream> limitedStream = limitedStreamSpec;
limitedStreamSpec->SetStream(inStream);
RINOK(inStream->Seek(resource.Offset, STREAM_SEEK_SET, NULL));
RINOK(InStream_SeekSet(inStream, resource.Offset))
if (resource.PackSize != resource.UnpackSize)
return S_FALSE;
@@ -221,7 +221,7 @@ HRESULT CUnpacker::Unpack2(
size_t cur = chunkSize - offsetInChunk;
if (cur > rem)
cur = (size_t)rem;
RINOK(WriteStream(outStream, unpackBuf.Data + offsetInChunk, cur));
RINOK(WriteStream(outStream, unpackBuf.Data + offsetInChunk, cur))
outProcessed += cur;
rem -= cur;
offsetInChunk = 0;
@@ -233,20 +233,20 @@ HRESULT CUnpacker::Unpack2(
if (rem == 0)
return S_OK;
UInt64 offset = ss.Chunks[chunkIndex];
UInt64 packSize = ss.GetChunkPackSize(chunkIndex);
const UInt64 offset = ss.Chunks[chunkIndex];
const UInt64 packSize = ss.GetChunkPackSize(chunkIndex);
const CResource &rs = db->DataStreams[ss.StreamIndex].Resource;
RINOK(inStream->Seek(rs.Offset + ss.HeadersSize + offset, STREAM_SEEK_SET, NULL));
RINOK(InStream_SeekSet(inStream, rs.Offset + ss.HeadersSize + offset))
size_t cur = chunkSize;
UInt64 unpackRem = ss.UnpackSize - ((UInt64)chunkIndex << chunkSizeBits);
const UInt64 unpackRem = ss.UnpackSize - ((UInt64)chunkIndex << chunkSizeBits);
if (cur > unpackRem)
cur = (size_t)unpackRem;
_solidIndex = -1;
_unpackedChunkIndex = 0;
HRESULT res = UnpackChunk(inStream, ss.Method, chunkSizeBits, (size_t)packSize, cur, NULL);
const HRESULT res = UnpackChunk(inStream, (unsigned)ss.Method, chunkSizeBits, (size_t)packSize, cur, NULL);
if (res != S_OK)
{
@@ -266,11 +266,11 @@ HRESULT CUnpacker::Unpack2(
if (cur > rem)
cur = (size_t)rem;
RINOK(WriteStream(outStream, unpackBuf.Data + offsetInChunk, cur));
RINOK(WriteStream(outStream, unpackBuf.Data + offsetInChunk, cur))
if (progress)
{
RINOK(progress->SetRatioInfo(&packProcessed, &outProcessed));
RINOK(progress->SetRatioInfo(&packProcessed, &outProcessed))
packProcessed += packSize;
outProcessed += cur;
}
@@ -311,8 +311,8 @@ HRESULT CUnpacker::Unpack2(
if (sizesBufSize != sizesBufSize64)
return E_OUTOFMEMORY;
sizesBuf.AllocAtLeast(sizesBufSize);
RINOK(inStream->Seek(baseOffset, STREAM_SEEK_SET, NULL));
RINOK(ReadStream_FALSE(inStream, sizesBuf, sizesBufSize));
RINOK(InStream_SeekSet(inStream, baseOffset))
RINOK(ReadStream_FALSE(inStream, sizesBuf, sizesBufSize))
baseOffset += sizesBufSize64;
numChunks = (size_t)numChunks64;
}
@@ -341,11 +341,11 @@ HRESULT CUnpacker::Unpack2(
if (inSize != inSize64)
return S_FALSE;
RINOK(inStream->Seek(baseOffset + offset, STREAM_SEEK_SET, NULL));
RINOK(InStream_SeekSet(inStream, baseOffset + offset))
if (progress)
{
RINOK(progress->SetRatioInfo(&offset, &outProcessed));
RINOK(progress->SetRatioInfo(&offset, &outProcessed))
}
size_t outSize = (size_t)1 << chunkSizeBits;
@@ -353,7 +353,7 @@ HRESULT CUnpacker::Unpack2(
if (outSize > rem)
outSize = (size_t)rem;
RINOK(UnpackChunk(inStream, header.GetMethod(), chunkSizeBits, inSize, outSize, outStream));
RINOK(UnpackChunk(inStream, header.GetMethod(), chunkSizeBits, inSize, outSize, outStream))
outProcessed += outSize;
offset = nextOffset;
@@ -494,8 +494,8 @@ void CDatabase::GetItemName(unsigned index, NWindows::NCOM::CPropVariant &name)
void CDatabase::GetItemPath(unsigned index1, bool showImageNumber, NWindows::NCOM::CPropVariant &path) const
{
unsigned size = 0;
int index = index1;
int imageIndex = Items[index].ImageIndex;
int index = (int)index1;
const int imageIndex = Items[index].ImageIndex;
const CImage &image = Images[imageIndex];
unsigned newLevel = 0;
@@ -545,7 +545,7 @@ void CDatabase::GetItemPath(unsigned index1, bool showImageNumber, NWindows::NCO
else if (needColon)
s[0] = L':';
index = index1;
index = (int)index1;
wchar_t separator = 0;
for (;;)
@@ -597,7 +597,7 @@ HRESULT CDatabase::ParseDirItem(size_t pos, int parent)
if (OpenCallback && (Items.Size() & 0xFFFF) == 0)
{
UInt64 numFiles = Items.Size();
RINOK(OpenCallback->SetCompleted(&numFiles, NULL));
RINOK(OpenCallback->SetCompleted(&numFiles, NULL))
}
const size_t rem = DirSize - pos;
@@ -664,7 +664,7 @@ HRESULT CDatabase::ParseDirItem(size_t pos, int parent)
item.Offset = pos;
item.Parent = parent;
item.ImageIndex = Images.Size() - 1;
item.ImageIndex = (int)Images.Size() - 1;
const unsigned prevIndex = Items.Add(item);
@@ -677,7 +677,8 @@ HRESULT CDatabase::ParseDirItem(size_t pos, int parent)
return S_FALSE;
const Byte *p2 = DirData + pos;
const UInt64 len2 = Get64(p2);
if ((len2 & align) != 0 || rem2 < len2 || len2 < (IsOldVersion ? 0x18 : 0x28))
if ((len2 & align) != 0 || rem2 < len2
|| len2 < (unsigned)(IsOldVersion ? 0x18 : 0x28))
return S_FALSE;
DirProcessed += (size_t)len2;
@@ -742,8 +743,8 @@ HRESULT CDatabase::ParseDirItem(size_t pos, int parent)
CItem item2;
item2.Offset = pos;
item2.IsAltStream = true;
item2.Parent = prevIndex;
item2.ImageIndex = Images.Size() - 1;
item2.Parent = (int)prevIndex;
item2.ImageIndex = (int)Images.Size() - 1;
Items.Add(item2);
}
@@ -775,7 +776,7 @@ HRESULT CDatabase::ParseDirItem(size_t pos, int parent)
if (item.IsDir && subdirOffset != 0)
{
RINOK(ParseDirItem((size_t)subdirOffset, prevIndex));
RINOK(ParseDirItem((size_t)subdirOffset, (int)prevIndex))
}
}
}
@@ -864,7 +865,7 @@ HRESULT CDatabase::ParseImageDirs(CByteBuffer &buf, int parent)
DirStartOffset = DirProcessed = pos;
image.StartItem = Items.Size();
RINOK(ParseDirItem(pos, parent));
RINOK(ParseDirItem(pos, parent))
image.NumItems = Items.Size() - image.StartItem;
if (DirProcessed == DirSize)
@@ -899,27 +900,27 @@ HRESULT CHeader::Parse(const Byte *p, UInt64 &phySize)
ChunkSizeBits = kChunkSizeBits;
if (ChunkSize != 0)
{
int log = GetLog(ChunkSize);
const int log = GetLog(ChunkSize);
if (log < 12)
return S_FALSE;
ChunkSizeBits = log;
ChunkSizeBits = (unsigned)log;
}
}
_IsOldVersion = false;
_IsNewVersion = false;
_isOldVersion = false;
_isNewVersion = false;
if (IsSolidVersion())
_IsNewVersion = true;
_isNewVersion = true;
else
{
if (Version < 0x010900)
return S_FALSE;
_IsOldVersion = (Version <= 0x010A00);
_isOldVersion = (Version <= 0x010A00);
// We don't know details about 1.11 version. So we use headerSize to guess exact features.
if (Version == 0x010B00 && headerSize == 0x60)
_IsOldVersion = true;
_IsNewVersion = (Version >= 0x010D00);
_isOldVersion = true;
_isNewVersion = (Version >= 0x010D00);
}
unsigned offset;
@@ -973,7 +974,7 @@ const Byte kSignature[kSignatureSize] = { 'M', 'S', 'W', 'I', 'M', 0, 0, 0 };
HRESULT ReadHeader(IInStream *inStream, CHeader &h, UInt64 &phySize)
{
Byte p[kHeaderSizeMax];
RINOK(ReadStream_FALSE(inStream, p, kHeaderSizeMax));
RINOK(ReadStream_FALSE(inStream, p, kHeaderSizeMax))
if (memcmp(p, kSignature, kSignatureSize) != 0)
return S_FALSE;
return h.Parse(p, phySize);
@@ -985,7 +986,7 @@ static HRESULT ReadStreams(IInStream *inStream, const CHeader &h, CDatabase &db)
CByteBuffer offsetBuf;
CUnpacker unpacker;
RINOK(unpacker.UnpackData(inStream, h.OffsetResource, h, NULL, offsetBuf, NULL));
RINOK(unpacker.UnpackData(inStream, h.OffsetResource, h, NULL, offsetBuf, NULL))
const size_t streamInfoSize = h.IsOldVersion() ? kStreamInfoSize + 2 : kStreamInfoSize;
{
@@ -1087,7 +1088,7 @@ HRESULT CDatabase::Open(IInStream *inStream, const CHeader &h, unsigned numItems
IsOldVersion = h.IsOldVersion();
IsOldVersion9 = (h.Version == 0x10900);
RINOK(ReadStreams(inStream, h, *this));
RINOK(ReadStreams(inStream, h, *this))
bool needBootMetadata = !h.MetadataResource.IsEmpty();
unsigned numNonDeletedImages = 0;
@@ -1101,14 +1102,14 @@ HRESULT CDatabase::Open(IInStream *inStream, const CHeader &h, unsigned numItems
if (h.PartNumber != 1 || si.PartNumber != h.PartNumber)
continue;
const int userImage = Images.Size() + GetStartImageIndex();
const unsigned userImage = Images.Size() + GetStartImageIndex();
CImage &image = Images.AddNew();
SetRootNames(image, userImage);
CByteBuffer &metadata = image.Meta;
Byte hash[kHashSize];
RINOK(unpacker.UnpackData(inStream, si.Resource, h, this, metadata, hash));
RINOK(unpacker.UnpackData(inStream, si.Resource, h, this, metadata, hash))
if (memcmp(hash, si.Hash, kHashSize) != 0 &&
!(h.IsOldVersion() && IsEmptySha(si.Hash)))
@@ -1119,7 +1120,7 @@ HRESULT CDatabase::Open(IInStream *inStream, const CHeader &h, unsigned numItems
if (Items.IsEmpty())
Items.ClearAndReserve(numItemsReserve);
RINOK(ParseImageDirs(metadata, -1));
RINOK(ParseImageDirs(metadata, -1))
if (needBootMetadata)
{
@@ -1166,12 +1167,12 @@ bool CDatabase::ItemHasStream(const CItem &item) const
}
#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
#define RINOZ(x) { int _tt_ = (x); if (_tt_ != 0) return _tt_; }
static int CompareStreamsByPos(const CStreamInfo *p1, const CStreamInfo *p2, void * /* param */)
{
RINOZ(MyCompare(p1->PartNumber, p2->PartNumber));
RINOZ(MyCompare(p1->Resource.Offset, p2->Resource.Offset));
RINOZ(MyCompare(p1->PartNumber, p2->PartNumber))
RINOZ(MyCompare(p1->Resource.Offset, p2->Resource.Offset))
return MyCompare(p1->Resource.PackSize, p2->Resource.PackSize);
}
@@ -1192,11 +1193,11 @@ static int FindId(const CStreamInfo *streams, const CUIntVector &sorted, UInt32
unsigned left = 0, right = sorted.Size();
while (left != right)
{
unsigned mid = (left + right) / 2;
unsigned streamIndex = sorted[mid];
UInt32 id2 = streams[streamIndex].Id;
const unsigned mid = (left + right) / 2;
const unsigned streamIndex = sorted[mid];
const UInt32 id2 = streams[streamIndex].Id;
if (id == id2)
return streamIndex;
return (int)streamIndex;
if (id < id2)
right = mid;
else
@@ -1210,15 +1211,15 @@ static int FindHash(const CStreamInfo *streams, const CUIntVector &sorted, const
unsigned left = 0, right = sorted.Size();
while (left != right)
{
unsigned mid = (left + right) / 2;
unsigned streamIndex = sorted[mid];
const unsigned mid = (left + right) / 2;
const unsigned streamIndex = sorted[mid];
const Byte *hash2 = streams[streamIndex].Hash;
unsigned i;
for (i = 0; i < kHashSize; i++)
if (hash[i] != hash2[i])
break;
if (i == kHashSize)
return streamIndex;
return (int)streamIndex;
if (hash[i] < hash2[i])
right = mid;
else
@@ -1237,8 +1238,8 @@ static int CompareItems(const unsigned *a1, const unsigned *a2, void *param)
return i1.IsDir ? -1 : 1;
if (i1.IsAltStream != i2.IsAltStream)
return i1.IsAltStream ? 1 : -1;
RINOZ(MyCompare(i1.StreamIndex, i2.StreamIndex));
RINOZ(MyCompare(i1.ImageIndex, i2.ImageIndex));
RINOZ(MyCompare(i1.StreamIndex, i2.StreamIndex))
RINOZ(MyCompare(i1.ImageIndex, i2.ImageIndex))
return MyCompare(i1.Offset, i2.Offset);
}
@@ -1286,7 +1287,7 @@ HRESULT CDatabase::FillAndCheck(const CObjectVector<CVolume> &volumes)
if (si.RefCount != 1)
return S_FALSE;
r.SolidIndex = Solids.Size();
r.SolidIndex = (int)Solids.Size();
CSolid &ss = Solids.AddNew();
ss.StreamIndex = k;
@@ -1300,8 +1301,8 @@ HRESULT CDatabase::FillAndCheck(const CObjectVector<CVolume> &volumes)
const CVolume &vol = volumes[si.PartNumber];
IInStream *inStream = vol.Stream;
RINOK(inStream->Seek(r.Offset, STREAM_SEEK_SET, NULL));
RINOK(ReadStream_FALSE(inStream, (Byte *)header, kSolidHeaderSize));
RINOK(InStream_SeekSet(inStream, r.Offset))
RINOK(ReadStream_FALSE(inStream, (Byte *)header, kSolidHeaderSize))
ss.UnpackSize = GetUi64(header);
@@ -1313,11 +1314,11 @@ HRESULT CDatabase::FillAndCheck(const CObjectVector<CVolume> &volumes)
return S_FALSE;
const UInt32 solidChunkSize = GetUi32(header + 8);
int log = GetLog(solidChunkSize);
const int log = GetLog(solidChunkSize);
if (log < 8 || log > 31)
return S_FALSE;
ss.ChunkSizeBits = log;
ss.Method = GetUi32(header + 12);
ss.ChunkSizeBits = (unsigned)log;
ss.Method = (Int32)GetUi32(header + 12);
UInt64 numChunks64 = (ss.UnpackSize + (((UInt32)1 << ss.ChunkSizeBits) - 1)) >> ss.ChunkSizeBits;
UInt64 sizesBufSize64 = 4 * numChunks64;
@@ -1327,7 +1328,7 @@ HRESULT CDatabase::FillAndCheck(const CObjectVector<CVolume> &volumes)
return E_OUTOFMEMORY;
sizesBuf.AllocAtLeast(sizesBufSize);
RINOK(ReadStream_FALSE(inStream, sizesBuf, sizesBufSize));
RINOK(ReadStream_FALSE(inStream, sizesBuf, sizesBufSize))
size_t numChunks = (size_t)numChunks64;
ss.Chunks.Alloc(numChunks + 1);
@@ -1381,14 +1382,14 @@ HRESULT CDatabase::FillAndCheck(const CObjectVector<CVolume> &volumes)
CSolid &ss = Solids[solidIndex];
if (r.Offset < ss.SolidOffset)
return S_FALSE;
UInt64 relat = r.Offset - ss.SolidOffset;
const UInt64 relat = r.Offset - ss.SolidOffset;
if (relat > ss.UnpackSize)
return S_FALSE;
if (r.PackSize > ss.UnpackSize - relat)
return S_FALSE;
r.SolidIndex = solidIndex;
r.SolidIndex = (int)solidIndex;
if (ss.FirstSmallStream < 0)
ss.FirstSmallStream = k;
ss.FirstSmallStream = (int)k;
sortedByHash.AddInReserved(k);
// ss.NumRefs++;
@@ -1542,7 +1543,7 @@ HRESULT CDatabase::FillAndCheck(const CObjectVector<CVolume> &volumes)
{
CItem item;
item.Offset = 0;
item.StreamIndex = i;
item.StreamIndex = (int)i;
item.ImageIndex = -1;
Items.Add(item);
ThereAreDeletedStreams = true;
@@ -1591,7 +1592,7 @@ HRESULT CDatabase::GenerateSortedItems(int imageIndex, bool showImageNumber)
if (NumExcludededItems != 0)
{
ExludedItem = startItem;
ExludedItem = (int)startItem;
startItem += NumExcludededItems;
}
@@ -1603,7 +1604,7 @@ HRESULT CDatabase::GenerateSortedItems(int imageIndex, bool showImageNumber)
SortedItems.Sort(CompareItems, this);
for (i = 0; i < SortedItems.Size(); i++)
Items[SortedItems[i]].IndexInSorted = i;
Items[SortedItems[i]].IndexInSorted = (int)i;
if (showImageNumber)
for (i = 0; i < Images.Size(); i++)
@@ -1611,7 +1612,7 @@ HRESULT CDatabase::GenerateSortedItems(int imageIndex, bool showImageNumber)
CImage &image = Images[i];
if (image.NumEmptyRootItems != 0)
continue;
image.VirtualRootIndex = VirtualRoots.Size();
image.VirtualRootIndex = (int)VirtualRoots.Size();
VirtualRoots.Add(i);
}
@@ -1681,7 +1682,7 @@ HRESULT CDatabase::ExtractReparseStreams(const CObjectVector<CVolume> &volumes,
if ((unpacker.TotalPacked - totalPackedPrev) >= ((UInt32)1 << 16))
{
UInt64 numFiles = Items.Size();
RINOK(openCallback->SetCompleted(&numFiles, &unpacker.TotalPacked));
RINOK(openCallback->SetCompleted(&numFiles, &unpacker.TotalPacked))
totalPackedPrev = unpacker.TotalPacked;
}
}
@@ -1715,7 +1716,7 @@ HRESULT CDatabase::ExtractReparseStreams(const CObjectVector<CVolume> &volumes,
if (res == S_FALSE)
continue;
RINOK(res);
RINOK(res)
if (memcmp(digest, si.Hash, kHashSize) != 0
// && !(h.IsOldVersion() && IsEmptySha(si.Hash))
@@ -1729,11 +1730,11 @@ HRESULT CDatabase::ExtractReparseStreams(const CObjectVector<CVolume> &volumes,
CByteBuffer &reparse = ReparseItems.AddNew();
reparse.Alloc(8 + buf.Size());
Byte *dest = (Byte *)reparse;
SetUi32(dest, tag);
SetUi32(dest + 4, (UInt32)buf.Size());
SetUi32(dest, tag)
SetUi32(dest + 4, (UInt32)buf.Size())
if (buf.Size() != 0)
memcpy(dest + 8, buf, buf.Size());
ItemToReparse[itemIndex] = ReparseItems.Size() - 1;
ItemToReparse[itemIndex] = (int)ReparseItems.Size() - 1;
}
return S_OK;
@@ -1856,7 +1857,7 @@ bool CWimXml::Parse()
return false;
}
imageInfo.ItemIndexInXml = i;
imageInfo.ItemIndexInXml = (int)i;
Images.Add(imageInfo);
}

View File

@@ -1,7 +1,7 @@
// Archive/WimIn.h
#ifndef __ARCHIVE_WIM_IN_H
#define __ARCHIVE_WIM_IN_H
#ifndef ZIP7_INC_ARCHIVE_WIM_IN_H
#define ZIP7_INC_ARCHIVE_WIM_IN_H
#include "../../../../C/Alloc.h"
@@ -192,7 +192,7 @@ struct CSolid
UInt64 UnpackSize;
int Method;
int ChunkSizeBits;
unsigned ChunkSizeBits;
UInt64 HeadersSize;
// size_t NumChunks;
@@ -258,8 +258,8 @@ struct CHeader
UInt32 NumImages;
UInt32 BootIndex;
bool _IsOldVersion; // 1.10-
bool _IsNewVersion; // 1.13+ or 0.14
bool _isOldVersion; // 1.10-
bool _isNewVersion; // 1.13+ or 0.14
CResource OffsetResource;
CResource XmlResource;
@@ -295,8 +295,8 @@ struct CHeader
return mask;
}
bool IsOldVersion() const { return _IsOldVersion; }
bool IsNewVersion() const { return _IsNewVersion; }
bool IsOldVersion() const { return _isOldVersion; }
bool IsNewVersion() const { return _isNewVersion; }
bool IsSolidVersion() const { return (Version == k_Version_Solid); }
bool AreFromOnArchive(const CHeader &h)
@@ -457,7 +457,7 @@ public:
bool RefCountError;
bool HeadersError;
bool GetStartImageIndex() const { return IsOldVersion9 ? 0 : 1; }
unsigned GetStartImageIndex() const { return IsOldVersion9 ? 0 : 1; }
unsigned GetDirAlignMask() const { return IsOldVersion9 ? 3 : 7; }
// User Items can contain all images or just one image from all.