mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-06 15:14:59 -06:00
feat: do not set time for sole folder in extraction
This commit is contained in:
@@ -1457,6 +1457,7 @@ Z7_COM7F_IMF(CAgentFolder::Extract(const UInt32 *indices,
|
||||
UInt32 numItems,
|
||||
Int32 includeAltStreams,
|
||||
Int32 replaceAltStreamColon,
|
||||
Int64 soleFolderIndex,
|
||||
NExtract::NPathMode::EEnum pathMode,
|
||||
NExtract::NOverwriteMode::EEnum overwriteMode,
|
||||
const wchar_t *path,
|
||||
@@ -1535,6 +1536,8 @@ Z7_COM7F_IMF(CAgentFolder::Extract(const UInt32 *indices,
|
||||
// do we need another base folder for subfolders ?
|
||||
extractCallbackSpec->DirPathPrefix_for_HashFiles = _agentSpec->_hashBaseFolderPrefix;
|
||||
|
||||
extractCallbackSpec->SoleFolderIndex = soleFolderIndex;
|
||||
|
||||
CUIntVector realIndices;
|
||||
GetRealIndices(indices, numItems, IntToBool(includeAltStreams),
|
||||
false, // includeFolderSubItemsInFlatMode
|
||||
|
||||
@@ -24,7 +24,7 @@ Z7_COM7F_IMF(CAgentFolder::SetZoneIdMode(NExtract::NZoneIdMode::EEnum zoneMode))
|
||||
|
||||
|
||||
Z7_COM7F_IMF(CAgentFolder::CopyTo(Int32 moveMode, const UInt32 *indices, UInt32 numItems,
|
||||
Int32 includeAltStreams, Int32 replaceAltStreamCharsMode,
|
||||
Int32 includeAltStreams, Int32 replaceAltStreamCharsMode, Int64 soleFolderIndex,
|
||||
const wchar_t *path, IFolderOperationsExtractCallback *callback))
|
||||
{
|
||||
if (moveMode)
|
||||
@@ -45,6 +45,7 @@ Z7_COM7F_IMF(CAgentFolder::CopyTo(Int32 moveMode, const UInt32 *indices, UInt32
|
||||
|
||||
return Extract(indices, numItems,
|
||||
includeAltStreams, replaceAltStreamCharsMode,
|
||||
soleFolderIndex,
|
||||
pathMode, NExtract::NOverwriteMode::kAsk,
|
||||
path, BoolToInt(false), extractCallback2);
|
||||
COM_TRY_END
|
||||
|
||||
@@ -27,6 +27,7 @@ IArchiveFolder is used by:
|
||||
x(Extract(const UInt32 *indices, UInt32 numItems, \
|
||||
Int32 includeAltStreams, \
|
||||
Int32 replaceAltStreamCharsMode, \
|
||||
Int64 soleFolderIndex, \
|
||||
NExtract::NPathMode::EEnum pathMode, \
|
||||
NExtract::NOverwriteMode::EEnum overwriteMode, \
|
||||
const wchar_t *path, Int32 testMode, \
|
||||
|
||||
@@ -275,7 +275,8 @@ CArchiveExtractCallback::CArchiveExtractCallback():
|
||||
Write_CTime(true),
|
||||
Write_ATime(true),
|
||||
Write_MTime(true),
|
||||
_multiArchives(false)
|
||||
_multiArchives(false),
|
||||
SoleFolderIndex(-1LL)
|
||||
{
|
||||
LocalProgressSpec = new CLocalProgress();
|
||||
_localProgress = LocalProgressSpec;
|
||||
@@ -378,6 +379,8 @@ void CArchiveExtractCallback::Init(
|
||||
NDir::MyGetFullPathName(directoryPath, _dirPathPrefix_Full);
|
||||
NName::NormalizeDirPathPrefix(_dirPathPrefix_Full);
|
||||
}
|
||||
|
||||
SoleFolderIndex = -1LL;
|
||||
}
|
||||
|
||||
|
||||
@@ -1142,7 +1145,7 @@ void CArchiveExtractCallback::CreateFolders()
|
||||
CDirPathTime pt;
|
||||
GetFiTimesCAM(pt);
|
||||
|
||||
if (pt.IsSomeTimeDefined())
|
||||
if (pt.IsSomeTimeDefined() && _index != SoleFolderIndex)
|
||||
{
|
||||
pt.Path = fullPathNew;
|
||||
pt.SetDirTime();
|
||||
|
||||
@@ -455,6 +455,7 @@ public:
|
||||
#endif
|
||||
_keepAndReplaceEmptyDirPrefixes = keepAndReplaceEmptyDirPrefixes;
|
||||
NumFolders = NumFiles = NumAltStreams = UnpackSize = AltStreams_UnpackSize = 0;
|
||||
SoleFolderIndex = -1LL;
|
||||
}
|
||||
|
||||
#ifndef Z7_SFX
|
||||
|
||||
@@ -496,7 +496,7 @@ static void AddPropValueToSum(IFolderFolder *folder, UInt32 index, PROPID propID
|
||||
sum = (UInt64)(Int64)-1;
|
||||
}
|
||||
|
||||
UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices, int *soleDir)
|
||||
UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices, int *soleDir, Int64 &soleFolderIndex)
|
||||
{
|
||||
UString info;
|
||||
UInt64 numDirs, numFiles, filesSize, foldersSize;
|
||||
@@ -511,6 +511,7 @@ UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices, int *so
|
||||
{
|
||||
if (i == 0) {
|
||||
*soleDir = 1;
|
||||
soleFolderIndex = (Int64)index;
|
||||
} else {
|
||||
*soleDir = 0;
|
||||
}
|
||||
@@ -525,6 +526,10 @@ UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices, int *so
|
||||
}
|
||||
}
|
||||
|
||||
if ((*soleDir) != 1) {
|
||||
soleFolderIndex = -1LL;
|
||||
}
|
||||
|
||||
AddValuePair2(info, IDS_PROP_FOLDERS, numDirs, foldersSize);
|
||||
AddValuePair2(info, IDS_PROP_FILES, numFiles, filesSize);
|
||||
int numDefined = ((foldersSize != (UInt64)(Int64)-1) && foldersSize != 0) ? 1: 0;
|
||||
@@ -629,6 +634,8 @@ void CApp::OnCopy(bool move, bool copyToSame, unsigned srcPanelIndex)
|
||||
|
||||
const bool useFullItemPaths = srcPanel.Is_IO_FS_Folder(); // maybe we need flat also here ??
|
||||
|
||||
Int64 soleFolderIndex = -1LL; // initially unset value
|
||||
|
||||
{
|
||||
CCopyDialog copyDialog;
|
||||
|
||||
@@ -636,7 +643,7 @@ void CApp::OnCopy(bool move, bool copyToSame, unsigned srcPanelIndex)
|
||||
copyDialog.Value = destPath;
|
||||
LangString(move ? IDS_MOVE : IDS_COPY, copyDialog.Title);
|
||||
LangString(move ? IDS_MOVE_TO : IDS_COPY_TO, copyDialog.Static);
|
||||
copyDialog.Info = srcPanel.GetItemsInfoString(indices, ©Dialog.soleDir);
|
||||
copyDialog.Info = srcPanel.GetItemsInfoString(indices, ©Dialog.soleDir, soleFolderIndex);
|
||||
copyDialog.m_currentFolderPrefix = srcPanel._currentFolderPrefix;
|
||||
|
||||
if (copyDialog.Create(srcPanel.GetParent()) != IDOK)
|
||||
@@ -815,6 +822,7 @@ void CApp::OnCopy(bool move, bool copyToSame, unsigned srcPanelIndex)
|
||||
options.includeAltStreams = true;
|
||||
options.replaceAltStreamChars = false;
|
||||
options.showErrorMessages = true;
|
||||
options.soleFolderIndex = soleFolderIndex;
|
||||
|
||||
result = srcPanel.CopyTo(options, indices, NULL);
|
||||
}
|
||||
|
||||
@@ -265,6 +265,7 @@ struct CCopyToOptions
|
||||
NExtract::NZoneIdMode::EEnum ZoneIdMode;
|
||||
|
||||
UString folder;
|
||||
Int64 soleFolderIndex;
|
||||
|
||||
UStringVector hashMethods;
|
||||
|
||||
@@ -280,6 +281,7 @@ struct CCopyToOptions
|
||||
showErrorMessages(false),
|
||||
NeedRegistryZone(true),
|
||||
ZoneIdMode(NExtract::NZoneIdMode::kNone),
|
||||
soleFolderIndex(-1LL),
|
||||
VirtFileSystemSpec(NULL),
|
||||
VirtFileSystem(NULL)
|
||||
{}
|
||||
@@ -971,7 +973,7 @@ public:
|
||||
void RefreshTitle(bool always = false) { _panelCallback->RefreshTitle(always); }
|
||||
void RefreshTitleAlways() { RefreshTitle(true); }
|
||||
|
||||
UString GetItemsInfoString(const CRecordVector<UInt32> &indices, int *soleDir);
|
||||
UString GetItemsInfoString(const CRecordVector<UInt32> &indices, int *soleDir, Int64 &soleFolderIndex);
|
||||
};
|
||||
|
||||
class CMyBuffer
|
||||
|
||||
@@ -114,6 +114,7 @@ HRESULT CPanelCopyThread::ProcessVirt()
|
||||
&Indices.Front(), Indices.Size(),
|
||||
BoolToInt(options->includeAltStreams),
|
||||
BoolToInt(options->replaceAltStreamChars),
|
||||
options->soleFolderIndex,
|
||||
options->folder, ExtractCallback);
|
||||
|
||||
if (result2 == S_OK && !ExtractCallbackSpec->ThereAreMessageErrors)
|
||||
|
||||
@@ -554,6 +554,7 @@ public:
|
||||
CRecordVector<UInt32> Indices;
|
||||
|
||||
UString SrcDirPrefix_Temp; // FS directory with source files or Temp
|
||||
Int64 SoleFolderIndex;
|
||||
UString DestDirPrefix_FromTarget;
|
||||
/* destination Path that was sent by Target via SetData().
|
||||
it can be altstreams prefix.
|
||||
@@ -633,6 +634,7 @@ void CDataObject::CopyFromPanelTo_Folder()
|
||||
{
|
||||
CCopyToOptions options;
|
||||
options.folder = SrcDirPrefix_Temp;
|
||||
options.soleFolderIndex = SoleFolderIndex;
|
||||
/* 15.13: fixed problem with mouse cursor for password window.
|
||||
DoDragDrop() probably calls SetCapture() to some hidden window.
|
||||
But it's problem, if we show some modal window, like MessageBox.
|
||||
@@ -1579,6 +1581,7 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */, bool isRightButton)
|
||||
*/
|
||||
}
|
||||
|
||||
Int64 soleFolderIndex = -1LL; // initially unset value
|
||||
{
|
||||
UStringVector names;
|
||||
// names variable is USED for drag and drop from 7-zip to Explorer or to 7-zip archive folder.
|
||||
@@ -1592,6 +1595,15 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */, bool isRightButton)
|
||||
else
|
||||
{
|
||||
s = GetItemName(index);
|
||||
if (IsItem_Folder(index)) {
|
||||
if (i == 0) {
|
||||
soleFolderIndex = (Int64)index;
|
||||
} else {
|
||||
soleFolderIndex = -1LL;
|
||||
}
|
||||
} else {
|
||||
soleFolderIndex = -1LL;
|
||||
}
|
||||
/*
|
||||
// We use (keepAndReplaceEmptyPrefixes = true) in CAgentFolder::Extract
|
||||
// So the following code is not required.
|
||||
@@ -1620,6 +1632,7 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */, bool isRightButton)
|
||||
dataObjectSpec->Panel = this;
|
||||
dataObjectSpec->Indices = indices;
|
||||
dataObjectSpec->SrcDirPrefix_Temp = dirPrefix;
|
||||
dataObjectSpec->SoleFolderIndex = soleFolderIndex;
|
||||
|
||||
dropSourceSpec->DataObjectSpec = dataObjectSpec;
|
||||
dropSourceSpec->DataObject = dataObjectSpec;
|
||||
@@ -1757,6 +1770,7 @@ void CPanel::OnDrag(LPNMLISTVIEW /* nmListView */, bool isRightButton)
|
||||
*/
|
||||
// options.moveMode = (moveIsAllowed && effect == DROPEFFECT_MOVE) // before v23.00:
|
||||
options.moveMode = moveIsAllowed;
|
||||
options.soleFolderIndex = soleFolderIndex;
|
||||
if (moveIsAllowed)
|
||||
{
|
||||
if (dataObjectSpec->m_Transfer_WasSet)
|
||||
|
||||
Reference in New Issue
Block a user