mirror of
https://github.com/aaru-dps/Aaru.Compression.Native.git
synced 2025-12-16 19:24:31 +00:00
Update to lzma 23.01.
This commit is contained in:
400
3rdparty/lzma/CPP/7zip/UI/Common/UpdateCallback.cpp
vendored
400
3rdparty/lzma/CPP/7zip/UI/Common/UpdateCallback.cpp
vendored
@@ -4,7 +4,26 @@
|
||||
|
||||
// #include <stdio.h>
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef _WIN32
|
||||
// #include <grp.h>
|
||||
// #include <pwd.h>
|
||||
/*
|
||||
inclusion of <sys/sysmacros.h> by <sys/types.h> is deprecated since glibc 2.25.
|
||||
Since glibc 2.3.3, macros have been aliases for three GNU-specific
|
||||
functions: gnu_dev_makedev(), gnu_dev_major(), and gnu_dev_minor()
|
||||
*/
|
||||
// for major()/minor():
|
||||
#include <sys/types.h>
|
||||
#if defined(__FreeBSD__) || defined(BSD) || defined(__APPLE__)
|
||||
#else
|
||||
#ifndef major
|
||||
#include <sys/sysmacros.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif // _WIN32
|
||||
|
||||
#ifndef Z7_ST
|
||||
#include "../../../Windows/Synchronization.h"
|
||||
#endif
|
||||
|
||||
@@ -23,14 +42,14 @@
|
||||
#include "UpdateCallback.h"
|
||||
|
||||
#if defined(_WIN32) && !defined(UNDER_CE)
|
||||
#define _USE_SECURITY_CODE
|
||||
#define Z7_USE_SECURITY_CODE
|
||||
#include "../../../Windows/SecurityUtils.h"
|
||||
#endif
|
||||
|
||||
using namespace NWindows;
|
||||
using namespace NFile;
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
static NSynchronization::CCriticalSection g_CriticalSection;
|
||||
#define MT_LOCK NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
|
||||
#else
|
||||
@@ -38,12 +57,32 @@ static NSynchronization::CCriticalSection g_CriticalSection;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef _USE_SECURITY_CODE
|
||||
#ifdef Z7_USE_SECURITY_CODE
|
||||
bool InitLocalPrivileges();
|
||||
#endif
|
||||
|
||||
CArchiveUpdateCallback::CArchiveUpdateCallback():
|
||||
_hardIndex_From((UInt32)(Int32)-1),
|
||||
PreserveATime(false),
|
||||
ShareForWrite(false),
|
||||
StopAfterOpenError(false),
|
||||
StdInMode(false),
|
||||
|
||||
KeepOriginalItemNames(false),
|
||||
StoreNtSecurity(false),
|
||||
StoreHardLinks(false),
|
||||
StoreSymLinks(false),
|
||||
|
||||
#ifndef _WIN32
|
||||
StoreOwnerId(false),
|
||||
StoreOwnerName(false),
|
||||
#endif
|
||||
|
||||
/*
|
||||
, Need_ArcMTime_Report(false),
|
||||
, ArcMTime_WasReported(false),
|
||||
*/
|
||||
Need_LatestMTime(false),
|
||||
LatestMTime_Defined(false),
|
||||
|
||||
Callback(NULL),
|
||||
|
||||
@@ -54,42 +93,33 @@ CArchiveUpdateCallback::CArchiveUpdateCallback():
|
||||
ArcItems(NULL),
|
||||
UpdatePairs(NULL),
|
||||
NewNames(NULL),
|
||||
CommentIndex(-1),
|
||||
Comment(NULL),
|
||||
CommentIndex(-1),
|
||||
|
||||
PreserveATime(false),
|
||||
ShareForWrite(false),
|
||||
StopAfterOpenError(false),
|
||||
StdInMode(false),
|
||||
|
||||
KeepOriginalItemNames(false),
|
||||
StoreNtSecurity(false),
|
||||
StoreHardLinks(false),
|
||||
StoreSymLinks(false),
|
||||
|
||||
ProcessedItemsStatuses(NULL)
|
||||
ProcessedItemsStatuses(NULL),
|
||||
_hardIndex_From((UInt32)(Int32)-1)
|
||||
{
|
||||
#ifdef _USE_SECURITY_CODE
|
||||
#ifdef Z7_USE_SECURITY_CODE
|
||||
_saclEnabled = InitLocalPrivileges();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::SetTotal(UInt64 size)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::SetTotal(UInt64 size))
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
return Callback->SetTotal(size);
|
||||
COM_TRY_END
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::SetCompleted(const UInt64 *completeValue)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::SetCompleted(const UInt64 *completeValue))
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
return Callback->SetCompleted(completeValue);
|
||||
COM_TRY_END
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize))
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
return Callback->SetRatioInfo(inSize, outSize);
|
||||
@@ -110,17 +140,17 @@ static const CStatProp kProps[] =
|
||||
{ NULL, kpidIsAnti, VT_BOOL}
|
||||
};
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::EnumProperties(IEnumSTATPROPSTG **)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::EnumProperties(IEnumSTATPROPSTG **)
|
||||
{
|
||||
return CStatPropEnumerator::CreateEnumerator(kProps, ARRAY_SIZE(kProps), enumerator);
|
||||
return CStatPropEnumerator::CreateEnumerator(kProps, Z7_ARRAY_SIZE(kProps), enumerator);
|
||||
}
|
||||
*/
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::GetUpdateItemInfo(UInt32 index,
|
||||
Int32 *newData, Int32 *newProps, UInt32 *indexInArchive)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::GetUpdateItemInfo(UInt32 index,
|
||||
Int32 *newData, Int32 *newProps, UInt32 *indexInArchive))
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
RINOK(Callback->CheckBreak());
|
||||
RINOK(Callback->CheckBreak())
|
||||
const CUpdatePair2 &up = (*UpdatePairs)[index];
|
||||
if (newData) *newData = BoolToInt(up.NewData);
|
||||
if (newProps) *newProps = BoolToInt(up.NewProps);
|
||||
@@ -134,29 +164,31 @@ STDMETHODIMP CArchiveUpdateCallback::GetUpdateItemInfo(UInt32 index,
|
||||
COM_TRY_END
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::GetRootProp(PROPID propID, PROPVARIANT *value)
|
||||
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::GetRootProp(PROPID propID, PROPVARIANT *value))
|
||||
{
|
||||
NCOM::CPropVariant prop;
|
||||
switch (propID)
|
||||
{
|
||||
case kpidIsDir: prop = true; break;
|
||||
case kpidAttrib: if (ParentDirItem) prop = ParentDirItem->Attrib; break;
|
||||
case kpidCTime: if (ParentDirItem) prop = ParentDirItem->CTime; break;
|
||||
case kpidATime: if (ParentDirItem) prop = ParentDirItem->ATime; break;
|
||||
case kpidMTime: if (ParentDirItem) prop = ParentDirItem->MTime; break;
|
||||
case kpidAttrib: if (ParentDirItem) prop = ParentDirItem->GetWinAttrib(); break;
|
||||
case kpidCTime: if (ParentDirItem) PropVariant_SetFrom_FiTime(prop, ParentDirItem->CTime); break;
|
||||
case kpidATime: if (ParentDirItem) PropVariant_SetFrom_FiTime(prop, ParentDirItem->ATime); break;
|
||||
case kpidMTime: if (ParentDirItem) PropVariant_SetFrom_FiTime(prop, ParentDirItem->MTime); break;
|
||||
case kpidArcFileName: if (!ArcFileName.IsEmpty()) prop = ArcFileName; break;
|
||||
}
|
||||
prop.Detach(value);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::GetParent(UInt32 /* index */, UInt32 *parent, UInt32 *parentType)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::GetParent(UInt32 /* index */, UInt32 *parent, UInt32 *parentType))
|
||||
{
|
||||
*parentType = NParentType::kDir;
|
||||
*parent = (UInt32)(Int32)-1;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::GetNumRawProps(UInt32 *numProps)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::GetNumRawProps(UInt32 *numProps))
|
||||
{
|
||||
*numProps = 0;
|
||||
if (StoreNtSecurity)
|
||||
@@ -164,25 +196,27 @@ STDMETHODIMP CArchiveUpdateCallback::GetNumRawProps(UInt32 *numProps)
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::GetRawPropInfo(UInt32 /* index */, BSTR *name, PROPID *propID)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::GetRawPropInfo(UInt32 /* index */, BSTR *name, PROPID *propID))
|
||||
{
|
||||
*name = NULL;
|
||||
*propID = kpidNtSecure;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::GetRootRawProp(PROPID
|
||||
#ifdef _USE_SECURITY_CODE
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::GetRootRawProp(PROPID
|
||||
propID
|
||||
#endif
|
||||
, const void **data, UInt32 *dataSize, UInt32 *propType)
|
||||
, const void **data, UInt32 *dataSize, UInt32 *propType))
|
||||
{
|
||||
*data = 0;
|
||||
#ifndef Z7_USE_SECURITY_CODE
|
||||
UNUSED_VAR(propID)
|
||||
#endif
|
||||
|
||||
*data = NULL;
|
||||
*dataSize = 0;
|
||||
*propType = 0;
|
||||
if (!StoreNtSecurity)
|
||||
return S_OK;
|
||||
#ifdef _USE_SECURITY_CODE
|
||||
#ifdef Z7_USE_SECURITY_CODE
|
||||
if (propID == kpidNtSecure)
|
||||
{
|
||||
if (StdInMode)
|
||||
@@ -206,12 +240,10 @@ STDMETHODIMP CArchiveUpdateCallback::GetRootRawProp(PROPID
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
// #ifdef _USE_SECURITY_CODE
|
||||
// #endif
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::GetRawProp(UInt32 index, PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::GetRawProp(UInt32 index, PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType))
|
||||
{
|
||||
*data = 0;
|
||||
*data = NULL;
|
||||
*dataSize = 0;
|
||||
*propType = 0;
|
||||
|
||||
@@ -238,7 +270,7 @@ STDMETHODIMP CArchiveUpdateCallback::GetRawProp(UInt32 index, PROPID propID, con
|
||||
const CDirItem &di = DirItems->Items[(unsigned)up.DirIndex];
|
||||
#endif
|
||||
|
||||
#ifdef _USE_SECURITY_CODE
|
||||
#ifdef Z7_USE_SECURITY_CODE
|
||||
if (propID == kpidNtSecure)
|
||||
{
|
||||
if (!StoreNtSecurity)
|
||||
@@ -322,7 +354,7 @@ static UString GetRelativePath(const UString &to, const UString &from)
|
||||
|
||||
#endif
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value))
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
const CUpdatePair2 &up = (*UpdatePairs)[index];
|
||||
@@ -358,7 +390,7 @@ STDMETHODIMP CArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PR
|
||||
CReparseAttr attr;
|
||||
if (attr.Parse(di.ReparseData, di.ReparseData.Size()))
|
||||
{
|
||||
UString simpleName = attr.GetPath();
|
||||
const UString simpleName = attr.GetPath();
|
||||
if (!attr.IsSymLink_WSL() && attr.IsRelative_Win())
|
||||
prop = simpleName;
|
||||
else
|
||||
@@ -445,25 +477,55 @@ STDMETHODIMP CArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PR
|
||||
{
|
||||
case kpidPath: prop = DirItems->GetLogPath((unsigned)up.DirIndex); break;
|
||||
case kpidIsDir: prop = di.IsDir(); break;
|
||||
case kpidSize: prop = di.IsDir() ? (UInt64)0 : di.Size; break;
|
||||
case kpidAttrib: prop = di.Attrib; break;
|
||||
case kpidCTime: prop = di.CTime; break;
|
||||
case kpidATime: prop = di.ATime; break;
|
||||
case kpidMTime: prop = di.MTime; break;
|
||||
case kpidSize: prop = (UInt64)(di.IsDir() ? (UInt64)0 : di.Size); break;
|
||||
case kpidCTime: PropVariant_SetFrom_FiTime(prop, di.CTime); break;
|
||||
case kpidATime: PropVariant_SetFrom_FiTime(prop, di.ATime); break;
|
||||
case kpidMTime: PropVariant_SetFrom_FiTime(prop, di.MTime); break;
|
||||
case kpidAttrib: prop = (UInt32)di.GetWinAttrib(); break;
|
||||
case kpidPosixAttrib: prop = (UInt32)di.GetPosixAttrib(); break;
|
||||
|
||||
#if defined(_WIN32)
|
||||
case kpidIsAltStream: prop = di.IsAltStream; break;
|
||||
#if defined(_WIN32) && !defined(UNDER_CE)
|
||||
// case kpidShortName: prop = di.ShortName; break;
|
||||
#endif
|
||||
case kpidPosixAttrib:
|
||||
{
|
||||
#ifdef _WIN32
|
||||
prop = di.GetPosixAttrib();
|
||||
#else
|
||||
if (di.Attrib & FILE_ATTRIBUTE_UNIX_EXTENSION)
|
||||
prop = (UInt32)(di.Attrib >> 16);
|
||||
#else
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wsign-conversion"
|
||||
#endif
|
||||
|
||||
case kpidDeviceMajor:
|
||||
/*
|
||||
printf("\ndi.mode = %o\n", di.mode);
|
||||
printf("\nst.st_rdev major = %d\n", (unsigned)major(di.rdev));
|
||||
printf("\nst.st_rdev minor = %d\n", (unsigned)minor(di.rdev));
|
||||
*/
|
||||
if (S_ISCHR(di.mode) || S_ISBLK(di.mode))
|
||||
prop = (UInt32)major(di.rdev);
|
||||
break;
|
||||
}
|
||||
|
||||
case kpidDeviceMinor:
|
||||
if (S_ISCHR(di.mode) || S_ISBLK(di.mode))
|
||||
prop = (UInt32)minor(di.rdev);
|
||||
break;
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
// case kpidDevice: if (S_ISCHR(di.mode) || S_ISBLK(di.mode)) prop = (UInt64)(di.rdev); break;
|
||||
|
||||
case kpidUserId: if (StoreOwnerId) prop = (UInt32)di.uid; break;
|
||||
case kpidGroupId: if (StoreOwnerId) prop = (UInt32)di.gid; break;
|
||||
case kpidUser:
|
||||
if (di.OwnerNameIndex >= 0)
|
||||
prop = DirItems->OwnerNameMap.Strings[(unsigned)di.OwnerNameIndex];
|
||||
break;
|
||||
case kpidGroup:
|
||||
if (di.OwnerGroupIndex >= 0)
|
||||
prop = DirItems->OwnerGroupMap.Strings[(unsigned)di.OwnerGroupIndex];
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
prop.Detach(value);
|
||||
@@ -471,11 +533,22 @@ STDMETHODIMP CArchiveUpdateCallback::GetProperty(UInt32 index, PROPID propID, PR
|
||||
COM_TRY_END
|
||||
}
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
static NSynchronization::CCriticalSection CS;
|
||||
#ifndef Z7_ST
|
||||
static NSynchronization::CCriticalSection g_CS;
|
||||
#endif
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::GetStream2(UInt32 index, ISequentialInStream **inStream, UInt32 mode)
|
||||
void CArchiveUpdateCallback::UpdateProcessedItemStatus(unsigned dirIndex)
|
||||
{
|
||||
if (ProcessedItemsStatuses)
|
||||
{
|
||||
#ifndef Z7_ST
|
||||
NSynchronization::CCriticalSectionLock lock(g_CS);
|
||||
#endif
|
||||
ProcessedItemsStatuses[dirIndex] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::GetStream2(UInt32 index, ISequentialInStream **inStream, UInt32 mode))
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
*inStream = NULL;
|
||||
@@ -483,7 +556,7 @@ STDMETHODIMP CArchiveUpdateCallback::GetStream2(UInt32 index, ISequentialInStrea
|
||||
if (!up.NewData)
|
||||
return E_FAIL;
|
||||
|
||||
RINOK(Callback->CheckBreak());
|
||||
RINOK(Callback->CheckBreak())
|
||||
// RINOK(Callback->Finalize());
|
||||
|
||||
bool isDir = IsDir(up);
|
||||
@@ -495,7 +568,7 @@ STDMETHODIMP CArchiveUpdateCallback::GetStream2(UInt32 index, ISequentialInStrea
|
||||
name = (*ArcItems)[(unsigned)up.ArcIndex].Name;
|
||||
else if (up.DirIndex >= 0)
|
||||
name = DirItems->GetLogPath((unsigned)up.DirIndex);
|
||||
RINOK(Callback->GetStream(name, isDir, true, mode));
|
||||
RINOK(Callback->GetStream(name, isDir, true, mode))
|
||||
|
||||
/* 9.33: fixed. Handlers expect real stream object for files, even for anti-file.
|
||||
so we return empty stream */
|
||||
@@ -510,7 +583,7 @@ STDMETHODIMP CArchiveUpdateCallback::GetStream2(UInt32 index, ISequentialInStrea
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
RINOK(Callback->GetStream(DirItems->GetLogPath((unsigned)up.DirIndex), isDir, false, mode));
|
||||
RINOK(Callback->GetStream(DirItems->GetLogPath((unsigned)up.DirIndex), isDir, false, mode))
|
||||
|
||||
if (isDir)
|
||||
return S_OK;
|
||||
@@ -544,6 +617,8 @@ STDMETHODIMP CArchiveUpdateCallback::GetStream2(UInt32 index, ISequentialInStrea
|
||||
CMyComPtr<ISequentialInStream> inStreamLoc = inStreamSpec;
|
||||
inStreamSpec->Init(di.ReparseData, di.ReparseData.Size());
|
||||
*inStream = inStreamLoc.Detach();
|
||||
|
||||
UpdateProcessedItemStatus((unsigned)up.DirIndex);
|
||||
return S_OK;
|
||||
}
|
||||
#endif // !defined(UNDER_CE)
|
||||
@@ -551,12 +626,42 @@ STDMETHODIMP CArchiveUpdateCallback::GetStream2(UInt32 index, ISequentialInStrea
|
||||
CInFileStream *inStreamSpec = new CInFileStream;
|
||||
CMyComPtr<ISequentialInStream> inStreamLoc(inStreamSpec);
|
||||
|
||||
/*
|
||||
// for debug:
|
||||
#ifdef _WIN32
|
||||
inStreamSpec->StoreOwnerName = true;
|
||||
inStreamSpec->OwnerName = "user_name";
|
||||
inStreamSpec->OwnerName += di.Name;
|
||||
inStreamSpec->OwnerName += "11111111112222222222222333333333333";
|
||||
inStreamSpec->OwnerGroup = "gname_";
|
||||
inStreamSpec->OwnerGroup += inStreamSpec->OwnerName;
|
||||
#endif
|
||||
*/
|
||||
|
||||
#ifndef _WIN32
|
||||
inStreamSpec->StoreOwnerId = StoreOwnerId;
|
||||
inStreamSpec->StoreOwnerName = StoreOwnerName;
|
||||
|
||||
// if (StoreOwner)
|
||||
{
|
||||
inStreamSpec->_uid = di.uid;
|
||||
inStreamSpec->_gid = di.gid;
|
||||
if (di.OwnerNameIndex >= 0)
|
||||
inStreamSpec->OwnerName = DirItems->OwnerNameMap.Strings[(unsigned)di.OwnerNameIndex];
|
||||
if (di.OwnerGroupIndex >= 0)
|
||||
inStreamSpec->OwnerGroup = DirItems->OwnerGroupMap.Strings[(unsigned)di.OwnerGroupIndex];
|
||||
}
|
||||
#endif
|
||||
|
||||
inStreamSpec->SupportHardLinks = StoreHardLinks;
|
||||
inStreamSpec->File.PreserveATime = PreserveATime;
|
||||
const bool preserveATime = (PreserveATime
|
||||
|| mode == NUpdateNotifyOp::kAnalyze); // 22.00 : we don't change access time in Analyze pass.
|
||||
inStreamSpec->Set_PreserveATime(preserveATime);
|
||||
|
||||
const FString path = DirItems->GetPhyPath((unsigned)up.DirIndex);
|
||||
_openFiles_Indexes.Add(index);
|
||||
_openFiles_Paths.Add(path);
|
||||
// _openFiles_Streams.Add(inStreamSpec);
|
||||
|
||||
/* 21.02 : we set Callback/CallbackRef after _openFiles_Indexes adding
|
||||
for correct working if exception was raised in GetPhyPath */
|
||||
@@ -565,15 +670,51 @@ STDMETHODIMP CArchiveUpdateCallback::GetStream2(UInt32 index, ISequentialInStrea
|
||||
|
||||
if (!inStreamSpec->OpenShared(path, ShareForWrite))
|
||||
{
|
||||
DWORD error = ::GetLastError();
|
||||
HRESULT hres = Callback->OpenFileError(path, error);
|
||||
if (StopAfterOpenError)
|
||||
bool isOpen = false;
|
||||
if (preserveATime)
|
||||
{
|
||||
inStreamSpec->Set_PreserveATime(false);
|
||||
isOpen = inStreamSpec->OpenShared(path, ShareForWrite);
|
||||
}
|
||||
if (!isOpen)
|
||||
{
|
||||
const DWORD error = ::GetLastError();
|
||||
const HRESULT hres = Callback->OpenFileError(path, error);
|
||||
if (hres == S_OK || hres == S_FALSE)
|
||||
if (StopAfterOpenError ||
|
||||
// v23: we check also for some critical errors:
|
||||
#ifdef _WIN32
|
||||
error == ERROR_NO_SYSTEM_RESOURCES
|
||||
#else
|
||||
error == EMFILE
|
||||
#endif
|
||||
)
|
||||
{
|
||||
if (error == 0)
|
||||
return E_FAIL;
|
||||
return HRESULT_FROM_WIN32(error);
|
||||
return hres;
|
||||
}
|
||||
return hres;
|
||||
}
|
||||
}
|
||||
|
||||
// #if defined(USE_WIN_FILE) || !defined(_WIN32)
|
||||
/*
|
||||
{
|
||||
// for debug:
|
||||
Byte b = 0;
|
||||
UInt32 processedSize = 0;
|
||||
if (inStreamSpec->Read(&b, 1, &processedSize) != S_OK ||
|
||||
processedSize != 1)
|
||||
return E_FAIL;
|
||||
}
|
||||
*/
|
||||
|
||||
if (Need_LatestMTime)
|
||||
{
|
||||
inStreamSpec->ReloadProps();
|
||||
}
|
||||
|
||||
// #if defined(Z7_FILE_STREAMS_USE_WIN_FILE) || !defined(_WIN32)
|
||||
if (StoreHardLinks)
|
||||
{
|
||||
CStreamFileProps props;
|
||||
@@ -585,8 +726,8 @@ STDMETHODIMP CArchiveUpdateCallback::GetStream2(UInt32 index, ISequentialInStrea
|
||||
pair.Key1 = props.VolID;
|
||||
pair.Key2 = props.FileID_Low;
|
||||
pair.Value = index;
|
||||
unsigned numItems = _map.Size();
|
||||
unsigned pairIndex = _map.AddToUniqueSorted2(pair);
|
||||
const unsigned numItems = _map.Size();
|
||||
const unsigned pairIndex = _map.AddToUniqueSorted2(pair);
|
||||
if (numItems == _map.Size())
|
||||
{
|
||||
// const CKeyKeyValPair &pair2 = _map.Pairs[pairIndex];
|
||||
@@ -600,13 +741,7 @@ STDMETHODIMP CArchiveUpdateCallback::GetStream2(UInt32 index, ISequentialInStrea
|
||||
}
|
||||
// #endif
|
||||
|
||||
if (ProcessedItemsStatuses)
|
||||
{
|
||||
#ifndef _7ZIP_ST
|
||||
NSynchronization::CCriticalSectionLock lock(CS);
|
||||
#endif
|
||||
ProcessedItemsStatuses[(unsigned)up.DirIndex] = 1;
|
||||
}
|
||||
UpdateProcessedItemStatus((unsigned)up.DirIndex);
|
||||
*inStream = inStreamLoc.Detach();
|
||||
}
|
||||
|
||||
@@ -614,14 +749,14 @@ STDMETHODIMP CArchiveUpdateCallback::GetStream2(UInt32 index, ISequentialInStrea
|
||||
COM_TRY_END
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::SetOperationResult(Int32 opRes)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::SetOperationResult(Int32 opRes))
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
return Callback->SetOperationResult(opRes);
|
||||
COM_TRY_END
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream **inStream)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream **inStream))
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
return GetStream2(index, inStream,
|
||||
@@ -631,10 +766,12 @@ STDMETHODIMP CArchiveUpdateCallback::GetStream(UInt32 index, ISequentialInStream
|
||||
COM_TRY_END
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::ReportOperation(UInt32 indexType, UInt32 index, UInt32 op)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::ReportOperation(UInt32 indexType, UInt32 index, UInt32 op))
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
|
||||
// if (op == NUpdateNotifyOp::kOpFinished) return Callback->ReportFinished(indexType, index);
|
||||
|
||||
bool isDir = false;
|
||||
|
||||
if (indexType == NArchive::NEventIndexType::kOutArcIndex)
|
||||
@@ -649,7 +786,7 @@ STDMETHODIMP CArchiveUpdateCallback::ReportOperation(UInt32 indexType, UInt32 in
|
||||
isDir = DirItems->Items[(unsigned)up.DirIndex].IsDir();
|
||||
}
|
||||
}
|
||||
return Callback->ReportUpdateOpeartion(op, name.IsEmpty() ? NULL : name.Ptr(), isDir);
|
||||
return Callback->ReportUpdateOperation(op, name.IsEmpty() ? NULL : name.Ptr(), isDir);
|
||||
}
|
||||
|
||||
wchar_t temp[16];
|
||||
@@ -668,9 +805,9 @@ STDMETHODIMP CArchiveUpdateCallback::ReportOperation(UInt32 indexType, UInt32 in
|
||||
}
|
||||
else if (Arc)
|
||||
{
|
||||
RINOK(Arc->GetItemPath(index, s2));
|
||||
RINOK(Arc->GetItem_Path(index, s2))
|
||||
s = s2;
|
||||
RINOK(Archive_IsItem_Dir(Arc->Archive, index, isDir));
|
||||
RINOK(Archive_IsItem_Dir(Arc->Archive, index, isDir))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -684,12 +821,12 @@ STDMETHODIMP CArchiveUpdateCallback::ReportOperation(UInt32 indexType, UInt32 in
|
||||
if (!s)
|
||||
s = L"";
|
||||
|
||||
return Callback->ReportUpdateOpeartion(op, s, isDir);
|
||||
return Callback->ReportUpdateOperation(op, s, isDir);
|
||||
|
||||
COM_TRY_END
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::ReportExtractResult(UInt32 indexType, UInt32 index, Int32 opRes)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::ReportExtractResult(UInt32 indexType, UInt32 index, Int32 opRes))
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
|
||||
@@ -723,12 +860,12 @@ STDMETHODIMP CArchiveUpdateCallback::ReportExtractResult(UInt32 indexType, UInt3
|
||||
s = (*ArcItems)[index].Name;
|
||||
else if (Arc)
|
||||
{
|
||||
RINOK(Arc->GetItemPath(index, s2));
|
||||
RINOK(Arc->GetItem_Path(index, s2))
|
||||
s = s2;
|
||||
}
|
||||
if (Archive)
|
||||
{
|
||||
RINOK(Archive_GetItemBoolProp(Archive, index, kpidEncrypted, isEncrypted));
|
||||
RINOK(Archive_GetItemBoolProp(Archive, index, kpidEncrypted, isEncrypted))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -744,7 +881,52 @@ STDMETHODIMP CArchiveUpdateCallback::ReportExtractResult(UInt32 indexType, UInt3
|
||||
COM_TRY_END
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::GetVolumeSize(UInt32 index, UInt64 *size)
|
||||
|
||||
/*
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::DoNeedArcProp(PROPID propID, Int32 *answer))
|
||||
{
|
||||
*answer = 0;
|
||||
if (Need_ArcMTime_Report && propID == kpidComboMTime)
|
||||
*answer = 1;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::ReportProp(UInt32 indexType, UInt32 index, PROPID propID, const PROPVARIANT *value))
|
||||
{
|
||||
if (indexType == NArchive::NEventIndexType::kArcProp)
|
||||
{
|
||||
if (propID == kpidComboMTime)
|
||||
{
|
||||
ArcMTime_WasReported = true;
|
||||
if (value->vt == VT_FILETIME)
|
||||
{
|
||||
Reported_ArcMTime.Set_From_Prop(*value);
|
||||
Reported_ArcMTime.Def = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Reported_ArcMTime.Clear();
|
||||
if (value->vt != VT_EMPTY)
|
||||
return E_FAIL; // for debug
|
||||
}
|
||||
}
|
||||
}
|
||||
return Callback->ReportProp(indexType, index, propID, value);
|
||||
}
|
||||
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::ReportRawProp(UInt32 indexType, UInt32 index,
|
||||
PROPID propID, const void *data, UInt32 dataSize, UInt32 propType))
|
||||
{
|
||||
return Callback->ReportRawProp(indexType, index, propID, data, dataSize, propType);
|
||||
}
|
||||
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::ReportFinished(UInt32 indexType, UInt32 index, Int32 opRes))
|
||||
{
|
||||
return Callback->ReportFinished(indexType, index, opRes);
|
||||
}
|
||||
*/
|
||||
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::GetVolumeSize(UInt32 index, UInt64 *size))
|
||||
{
|
||||
if (VolumesSizes.Size() == 0)
|
||||
return S_FALSE;
|
||||
@@ -754,7 +936,7 @@ STDMETHODIMP CArchiveUpdateCallback::GetVolumeSize(UInt32 index, UInt64 *size)
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::GetVolumeStream(UInt32 index, ISequentialOutStream **volumeStream)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::GetVolumeStream(UInt32 index, ISequentialOutStream **volumeStream))
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
char temp[16];
|
||||
@@ -763,7 +945,7 @@ STDMETHODIMP CArchiveUpdateCallback::GetVolumeStream(UInt32 index, ISequentialOu
|
||||
while (res.Len() < 2)
|
||||
res.InsertAtFront(FTEXT('0'));
|
||||
FString fileName = VolName;
|
||||
fileName += '.';
|
||||
fileName.Add_Dot();
|
||||
fileName += res;
|
||||
fileName += VolExt;
|
||||
COutFileStream *streamSpec = new COutFileStream;
|
||||
@@ -775,14 +957,14 @@ STDMETHODIMP CArchiveUpdateCallback::GetVolumeStream(UInt32 index, ISequentialOu
|
||||
COM_TRY_END
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password))
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
return Callback->CryptoGetTextPassword2(passwordIsDefined, password);
|
||||
COM_TRY_END
|
||||
}
|
||||
|
||||
STDMETHODIMP CArchiveUpdateCallback::CryptoGetTextPassword(BSTR *password)
|
||||
Z7_COM7F_IMF(CArchiveUpdateCallback::CryptoGetTextPassword(BSTR *password))
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
return Callback->CryptoGetTextPassword(password);
|
||||
@@ -797,12 +979,12 @@ HRESULT CArchiveUpdateCallback::InFileStream_On_Error(UINT_PTR val, DWORD error)
|
||||
#endif
|
||||
{
|
||||
MT_LOCK
|
||||
UInt32 index = (UInt32)val;
|
||||
const UInt32 index = (UInt32)val;
|
||||
FOR_VECTOR(i, _openFiles_Indexes)
|
||||
{
|
||||
if (_openFiles_Indexes[i] == index)
|
||||
{
|
||||
RINOK(Callback->ReadingFileError(_openFiles_Paths[i], error));
|
||||
RINOK(Callback->ReadingFileError(_openFiles_Paths[i], error))
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -810,21 +992,31 @@ HRESULT CArchiveUpdateCallback::InFileStream_On_Error(UINT_PTR val, DWORD error)
|
||||
return HRESULT_FROM_WIN32(error);
|
||||
}
|
||||
|
||||
void CArchiveUpdateCallback::InFileStream_On_Destroy(UINT_PTR val)
|
||||
void CArchiveUpdateCallback::InFileStream_On_Destroy(CInFileStream *stream, UINT_PTR val)
|
||||
{
|
||||
{
|
||||
MT_LOCK
|
||||
UInt32 index = (UInt32)val;
|
||||
if (Need_LatestMTime)
|
||||
{
|
||||
if (stream->_info_WasLoaded)
|
||||
{
|
||||
const CFiTime &ft = ST_MTIME(stream->_info);
|
||||
if (!LatestMTime_Defined
|
||||
|| Compare_FiTime(&LatestMTime, &ft) < 0)
|
||||
LatestMTime = ft;
|
||||
LatestMTime_Defined = true;
|
||||
}
|
||||
}
|
||||
const UInt32 index = (UInt32)val;
|
||||
FOR_VECTOR(i, _openFiles_Indexes)
|
||||
{
|
||||
if (_openFiles_Indexes[i] == index)
|
||||
{
|
||||
_openFiles_Indexes.Delete(i);
|
||||
_openFiles_Paths.Delete(i);
|
||||
// _openFiles_Streams.Delete(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* 21.02 : this function can be called in destructor.
|
||||
And destructor can be called after some exception.
|
||||
If we don't want to throw exception in desctructors or after another exceptions,
|
||||
|
||||
Reference in New Issue
Block a user