Skip to content

Commit

Permalink
feat: do not set time for sole folder in extraction
Browse files Browse the repository at this point in the history
  • Loading branch information
shunf4 committed May 10, 2024
1 parent fabeab4 commit 76db359
Show file tree
Hide file tree
Showing 9 changed files with 40 additions and 6 deletions.
3 changes: 3 additions & 0 deletions CPP/7zip/UI/Agent/Agent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion CPP/7zip/UI/Agent/ArchiveFolder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions CPP/7zip/UI/Agent/IFolderArchive.h
Original file line number Diff line number Diff line change
Expand Up @@ -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, \
Expand Down
7 changes: 5 additions & 2 deletions CPP/7zip/UI/Common/ArchiveExtractCallback.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -378,6 +379,8 @@ void CArchiveExtractCallback::Init(
NDir::MyGetFullPathName(directoryPath, _dirPathPrefix_Full);
NName::NormalizeDirPathPrefix(_dirPathPrefix_Full);
}

SoleFolderIndex = -1LL;
}


Expand Down Expand Up @@ -1142,7 +1145,7 @@ void CArchiveExtractCallback::CreateFolders()
CDirPathTime pt;
GetFiTimesCAM(pt);

if (pt.IsSomeTimeDefined())
if (pt.IsSomeTimeDefined() && _index != SoleFolderIndex)
{
pt.Path = fullPathNew;
pt.SetDirTime();
Expand Down
1 change: 1 addition & 0 deletions CPP/7zip/UI/Common/ArchiveExtractCallback.h
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,7 @@ class CArchiveExtractCallback Z7_final:
#endif
_keepAndReplaceEmptyDirPrefixes = keepAndReplaceEmptyDirPrefixes;
NumFolders = NumFiles = NumAltStreams = UnpackSize = AltStreams_UnpackSize = 0;
SoleFolderIndex = -1LL;
}

#ifndef Z7_SFX
Expand Down
12 changes: 10 additions & 2 deletions CPP/7zip/UI/FileManager/App.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -511,6 +511,7 @@ UString CPanel::GetItemsInfoString(const CRecordVector<UInt32> &indices, int *so
{
if (i == 0) {
*soleDir = 1;
soleFolderIndex = (Int64)index;
} else {
*soleDir = 0;
}
Expand All @@ -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;
Expand Down Expand Up @@ -629,14 +634,16 @@ 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;

copyDialog.Strings = copyFolders;
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, &copyDialog.soleDir);
copyDialog.Info = srcPanel.GetItemsInfoString(indices, &copyDialog.soleDir, soleFolderIndex);
copyDialog.m_currentFolderPrefix = srcPanel._currentFolderPrefix;

if (copyDialog.Create(srcPanel.GetParent()) != IDOK)
Expand Down Expand Up @@ -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);
}
Expand Down
4 changes: 3 additions & 1 deletion CPP/7zip/UI/FileManager/Panel.h
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ struct CCopyToOptions
NExtract::NZoneIdMode::EEnum ZoneIdMode;

UString folder;
Int64 soleFolderIndex;

UStringVector hashMethods;

Expand All @@ -280,6 +281,7 @@ struct CCopyToOptions
showErrorMessages(false),
NeedRegistryZone(true),
ZoneIdMode(NExtract::NZoneIdMode::kNone),
soleFolderIndex(-1LL),
VirtFileSystemSpec(NULL),
VirtFileSystem(NULL)
{}
Expand Down Expand Up @@ -971,7 +973,7 @@ class CPanel Z7_final: public NWindows::NControl::CWindow2
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
Expand Down
1 change: 1 addition & 0 deletions CPP/7zip/UI/FileManager/PanelCopy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
14 changes: 14 additions & 0 deletions CPP/7zip/UI/FileManager/PanelDrag.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -554,6 +554,7 @@ class CDataObject Z7_final:
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.
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand All @@ -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.
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 76db359

Please sign in to comment.