mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-08 22:07:07 -06:00
Update to 7-Zip Version 18.05
This commit is contained in:
@@ -182,6 +182,7 @@ HRESULT CArchiveExtractCallback::PrepareHardLinks(const CRecordVector<UInt32> *r
|
||||
#endif
|
||||
|
||||
CArchiveExtractCallback::CArchiveExtractCallback():
|
||||
_arc(NULL),
|
||||
WriteCTime(true),
|
||||
WriteATime(true),
|
||||
WriteMTime(true),
|
||||
@@ -205,8 +206,8 @@ void CArchiveExtractCallback::Init(
|
||||
const UStringVector &removePathParts, bool removePartsForAltStreams,
|
||||
UInt64 packSize)
|
||||
{
|
||||
_extractedFolderPaths.Clear();
|
||||
_extractedFolderIndices.Clear();
|
||||
ClearExtractedDirsInfo();
|
||||
_outFileStream.Release();
|
||||
|
||||
#ifdef SUPPORT_LINKS
|
||||
_hardLinks.Clear();
|
||||
@@ -368,9 +369,11 @@ void CArchiveExtractCallback::CreateComplexDirectory(const UStringVector &dirPat
|
||||
}
|
||||
}
|
||||
|
||||
HRESULT CArchiveExtractCallback::GetTime(int index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined)
|
||||
HRESULT CArchiveExtractCallback::GetTime(UInt32 index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined)
|
||||
{
|
||||
filetimeIsDefined = false;
|
||||
filetime.dwLowDateTime = 0;
|
||||
filetime.dwHighDateTime = 0;
|
||||
NCOM::CPropVariant prop;
|
||||
RINOK(_arc->Archive->GetProperty(index, propID, &prop));
|
||||
if (prop.vt == VT_FILETIME)
|
||||
@@ -734,7 +737,8 @@ STDMETHODIMP CArchiveExtractCallback::GetStream(UInt32 index, ISequentialOutStre
|
||||
return E_FAIL;
|
||||
UString s;
|
||||
CReparseAttr reparse;
|
||||
isOkReparse = reparse.Parse((const Byte *)data, dataSize);
|
||||
DWORD errorCode = 0;
|
||||
isOkReparse = reparse.Parse((const Byte *)data, dataSize, errorCode);
|
||||
if (isOkReparse)
|
||||
{
|
||||
isHardLink = false;
|
||||
@@ -1030,14 +1034,36 @@ if (askExtractMode == NArchive::NExtract::NAskMode::kExtract && !_testMode)
|
||||
{
|
||||
FString fullPathNew;
|
||||
CreateComplexDirectory(pathParts, fullPathNew);
|
||||
|
||||
if (_item.IsDir)
|
||||
{
|
||||
_extractedFolderPaths.Add(fullPathNew);
|
||||
_extractedFolderIndices.Add(index);
|
||||
SetDirTime(fullPathNew,
|
||||
(WriteCTime && _fi.CTimeDefined) ? &_fi.CTime : NULL,
|
||||
(WriteATime && _fi.ATimeDefined) ? &_fi.ATime : NULL,
|
||||
(WriteMTime && _fi.MTimeDefined) ? &_fi.MTime : (_arc->MTimeDefined ? &_arc->MTime : NULL));
|
||||
CDirPathTime &pt = _extractedFolders.AddNew();
|
||||
|
||||
pt.CTime = _fi.CTime;
|
||||
pt.CTimeDefined = (WriteCTime && _fi.CTimeDefined);
|
||||
|
||||
pt.ATime = _fi.ATime;
|
||||
pt.ATimeDefined = (WriteATime && _fi.ATimeDefined);
|
||||
|
||||
pt.MTimeDefined = false;
|
||||
|
||||
if (WriteMTime)
|
||||
{
|
||||
if (_fi.MTimeDefined)
|
||||
{
|
||||
pt.MTime = _fi.MTime;
|
||||
pt.MTimeDefined = true;
|
||||
}
|
||||
else if (_arc->MTimeDefined)
|
||||
{
|
||||
pt.MTime = _arc->MTime;
|
||||
pt.MTimeDefined = true;
|
||||
}
|
||||
}
|
||||
|
||||
pt.Path = fullPathNew;
|
||||
|
||||
pt.SetDirTime();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1270,7 +1296,8 @@ if (askExtractMode == NArchive::NExtract::NAskMode::kExtract && !_testMode)
|
||||
if (FillLinkData(data, fs2us(existPath), !isJunction))
|
||||
{
|
||||
CReparseAttr attr;
|
||||
if (!attr.Parse(data, data.Size()))
|
||||
DWORD errorCode = 0;
|
||||
if (!attr.Parse(data, data.Size(), errorCode))
|
||||
{
|
||||
RINOK(SendMessageError("Internal error for symbolic link file", us2fs(_item.Path)));
|
||||
// return E_FAIL;
|
||||
@@ -1447,6 +1474,33 @@ STDMETHODIMP CArchiveExtractCallback::PrepareOperation(Int32 askExtractMode)
|
||||
}
|
||||
|
||||
|
||||
HRESULT CArchiveExtractCallback::CloseFile()
|
||||
{
|
||||
if (!_outFileStream)
|
||||
return S_OK;
|
||||
|
||||
HRESULT hres = S_OK;
|
||||
_outFileStreamSpec->SetTime(
|
||||
(WriteCTime && _fi.CTimeDefined) ? &_fi.CTime : NULL,
|
||||
(WriteATime && _fi.ATimeDefined) ? &_fi.ATime : NULL,
|
||||
(WriteMTime && _fi.MTimeDefined) ? &_fi.MTime : (_arc->MTimeDefined ? &_arc->MTime : NULL));
|
||||
|
||||
const UInt64 processedSize = _outFileStreamSpec->ProcessedSize;
|
||||
if (_fileLengthWasSet && _curSize > processedSize)
|
||||
{
|
||||
bool res = _outFileStreamSpec->File.SetLength(processedSize);
|
||||
_fileLengthWasSet = res;
|
||||
if (!res)
|
||||
hres = SendMessageError_with_LastError(kCantSetFileLen, us2fs(_item.Path));
|
||||
}
|
||||
_curSize = processedSize;
|
||||
_curSizeDefined = true;
|
||||
RINOK(_outFileStreamSpec->Close());
|
||||
_outFileStream.Release();
|
||||
return hres;
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP CArchiveExtractCallback::SetOperationResult(Int32 opRes)
|
||||
{
|
||||
COM_TRY_BEGIN
|
||||
@@ -1475,27 +1529,7 @@ STDMETHODIMP CArchiveExtractCallback::SetOperationResult(Int32 opRes)
|
||||
|
||||
#endif
|
||||
|
||||
if (_outFileStream)
|
||||
{
|
||||
HRESULT hres = S_OK;
|
||||
_outFileStreamSpec->SetTime(
|
||||
(WriteCTime && _fi.CTimeDefined) ? &_fi.CTime : NULL,
|
||||
(WriteATime && _fi.ATimeDefined) ? &_fi.ATime : NULL,
|
||||
(WriteMTime && _fi.MTimeDefined) ? &_fi.MTime : (_arc->MTimeDefined ? &_arc->MTime : NULL));
|
||||
const UInt64 processedSize = _outFileStreamSpec->ProcessedSize;
|
||||
if (_fileLengthWasSet && _curSize > processedSize)
|
||||
{
|
||||
bool res = _outFileStreamSpec->File.SetLength(processedSize);
|
||||
_fileLengthWasSet = res;
|
||||
if (!res)
|
||||
hres = SendMessageError_with_LastError(kCantSetFileLen, us2fs(_item.Path));
|
||||
}
|
||||
_curSize = processedSize;
|
||||
_curSizeDefined = true;
|
||||
RINOK(_outFileStreamSpec->Close());
|
||||
_outFileStream.Release();
|
||||
RINOK(hres);
|
||||
}
|
||||
RINOK(CloseFile());
|
||||
|
||||
#ifdef _USE_SECURITY_CODE
|
||||
if (!_stdOutMode && _extractMode && _ntOptions.NtSecurity.Val && _arc->GetRawProps)
|
||||
@@ -1592,71 +1626,66 @@ STDMETHODIMP CArchiveExtractCallback::CryptoGetTextPassword(BSTR *password)
|
||||
}
|
||||
|
||||
|
||||
struct CExtrRefSortPair
|
||||
{
|
||||
unsigned Len;
|
||||
unsigned Index;
|
||||
|
||||
int Compare(const CExtrRefSortPair &a) const;
|
||||
};
|
||||
|
||||
#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; }
|
||||
|
||||
int CExtrRefSortPair::Compare(const CExtrRefSortPair &a) const
|
||||
{
|
||||
RINOZ(-MyCompare(Len, a.Len));
|
||||
return MyCompare(Index, a.Index);
|
||||
}
|
||||
|
||||
static unsigned GetNumSlashes(const FChar *s)
|
||||
void CDirPathSortPair::SetNumSlashes(const FChar *s)
|
||||
{
|
||||
for (unsigned numSlashes = 0;;)
|
||||
{
|
||||
FChar c = *s++;
|
||||
if (c == 0)
|
||||
return numSlashes;
|
||||
{
|
||||
Len = numSlashes;
|
||||
return;
|
||||
}
|
||||
if (IS_PATH_SEPAR(c))
|
||||
numSlashes++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool CDirPathTime::SetDirTime()
|
||||
{
|
||||
return NDir::SetDirTime(Path,
|
||||
CTimeDefined ? &CTime : NULL,
|
||||
ATimeDefined ? &ATime : NULL,
|
||||
MTimeDefined ? &MTime : NULL);
|
||||
}
|
||||
|
||||
|
||||
HRESULT CArchiveExtractCallback::SetDirsTimes()
|
||||
{
|
||||
CRecordVector<CExtrRefSortPair> pairs;
|
||||
pairs.ClearAndSetSize(_extractedFolderPaths.Size());
|
||||
if (!_arc)
|
||||
return S_OK;
|
||||
|
||||
CRecordVector<CDirPathSortPair> pairs;
|
||||
pairs.ClearAndSetSize(_extractedFolders.Size());
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < _extractedFolderPaths.Size(); i++)
|
||||
for (i = 0; i < _extractedFolders.Size(); i++)
|
||||
{
|
||||
CExtrRefSortPair &pair = pairs[i];
|
||||
CDirPathSortPair &pair = pairs[i];
|
||||
pair.Index = i;
|
||||
pair.Len = GetNumSlashes(_extractedFolderPaths[i]);
|
||||
pair.SetNumSlashes(_extractedFolders[i].Path);
|
||||
}
|
||||
|
||||
pairs.Sort2();
|
||||
|
||||
for (i = 0; i < pairs.Size(); i++)
|
||||
{
|
||||
int pairIndex = pairs[i].Index;
|
||||
int index = _extractedFolderIndices[pairIndex];
|
||||
|
||||
FILETIME CTime;
|
||||
FILETIME ATime;
|
||||
FILETIME MTime;
|
||||
|
||||
bool CTimeDefined;
|
||||
bool ATimeDefined;
|
||||
bool MTimeDefined;
|
||||
|
||||
RINOK(GetTime(index, kpidCTime, CTime, CTimeDefined));
|
||||
RINOK(GetTime(index, kpidATime, ATime, ATimeDefined));
|
||||
RINOK(GetTime(index, kpidMTime, MTime, MTimeDefined));
|
||||
|
||||
// printf("\n%S", _extractedFolderPaths[pairIndex]);
|
||||
SetDirTime(_extractedFolderPaths[pairIndex],
|
||||
(WriteCTime && CTimeDefined) ? &CTime : NULL,
|
||||
(WriteATime && ATimeDefined) ? &ATime : NULL,
|
||||
(WriteMTime && MTimeDefined) ? &MTime : (_arc->MTimeDefined ? &_arc->MTime : NULL));
|
||||
_extractedFolders[pairs[i].Index].SetDirTime();
|
||||
// if (!) return GetLastError();
|
||||
}
|
||||
|
||||
ClearExtractedDirsInfo();
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
HRESULT CArchiveExtractCallback::CloseArc()
|
||||
{
|
||||
HRESULT res = CloseFile();
|
||||
HRESULT res2 = SetDirsTimes();
|
||||
if (res == S_OK)
|
||||
res = res2;
|
||||
_arc = NULL;
|
||||
return res;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user