diff --git a/CPP/7zip/UI/Agent/ArchiveFolder.cpp b/CPP/7zip/UI/Agent/ArchiveFolder.cpp index cf933d23..a7ec1ed2 100755 --- a/CPP/7zip/UI/Agent/ArchiveFolder.cpp +++ b/CPP/7zip/UI/Agent/ArchiveFolder.cpp @@ -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, Int64 soleFolderIndex, + Int32 includeAltStreams, Int32 replaceAltStreamCharsMode, const wchar_t *path, IFolderOperationsExtractCallback *callback)) { if (moveMode) @@ -43,6 +43,9 @@ Z7_COM7F_IMF(CAgentFolder::CopyTo(Int32 moveMode, const UInt32 *indices, UInt32 NExtract::NPathMode::kNoPathsAlt : NExtract::NPathMode::kNoPaths; + Int64 soleFolderIndex; + extractCallback2->GetSoleFolderIndex(&soleFolderIndex); + return Extract(indices, numItems, includeAltStreams, replaceAltStreamCharsMode, soleFolderIndex, diff --git a/CPP/7zip/UI/Agent/IFolderArchive.h b/CPP/7zip/UI/Agent/IFolderArchive.h index 79ceff02..55f14234 100755 --- a/CPP/7zip/UI/Agent/IFolderArchive.h +++ b/CPP/7zip/UI/Agent/IFolderArchive.h @@ -27,7 +27,6 @@ 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, \ diff --git a/CPP/7zip/UI/FileManager/ExtractCallback.cpp b/CPP/7zip/UI/FileManager/ExtractCallback.cpp index f6740447..a853d9f9 100755 --- a/CPP/7zip/UI/FileManager/ExtractCallback.cpp +++ b/CPP/7zip/UI/FileManager/ExtractCallback.cpp @@ -692,6 +692,16 @@ Z7_COM7F_IMF(CExtractCallbackImp::CryptoGetTextPassword(BSTR *password)) #ifndef Z7_SFX +Z7_COM7F_IMF(CExtractCallbackImp::SetSoleFolderIndex(Int64 soleFolderIndex)) +{ + this->SoleFolderIndex = soleFolderIndex; +} + +Z7_COM7F_IMF(CExtractCallbackImp::GetSoleFolderIndex(Int64 *pSoleFolderIndex)) +{ + (*pSoleFolderIndex) = this->SoleFolderIndex; +} + Z7_COM7F_IMF(CExtractCallbackImp::AskWrite( const wchar_t *srcPath, Int32 srcIsFolder, const FILETIME *srcTime, const UInt64 *srcSize, diff --git a/CPP/7zip/UI/FileManager/ExtractCallback.h b/CPP/7zip/UI/FileManager/ExtractCallback.h index c2aa4700..09b96ca5 100755 --- a/CPP/7zip/UI/FileManager/ExtractCallback.h +++ b/CPP/7zip/UI/FileManager/ExtractCallback.h @@ -255,6 +255,8 @@ public: bool ThereAreMessageErrors; NExtract::NOverwriteMode::EEnum OverwriteMode; + Int64 SoleFolderIndex; + #ifndef Z7_NO_CRYPTO bool PasswordIsDefined; bool PasswordWasAsked; @@ -279,6 +281,7 @@ public: ProcessAltStreams(true), StreamMode(false), OverwriteMode(NExtract::NOverwriteMode::kAsk), + SoleFolderIndex(-1), #ifndef Z7_NO_CRYPTO PasswordIsDefined(false), PasswordWasAsked(false), diff --git a/CPP/7zip/UI/FileManager/IFolder.h b/CPP/7zip/UI/FileManager/IFolder.h index c08de367..ab65a2a0 100755 --- a/CPP/7zip/UI/FileManager/IFolder.h +++ b/CPP/7zip/UI/FileManager/IFolder.h @@ -67,6 +67,8 @@ Z7_IFACE_CONSTR_FOLDER(IFolderWasChanged, 0x04) BSTR *destPathResult, \ Int32 *writeAnswer)) \ x(ShowMessage(const wchar_t *message)) \ + x(SetSoleFolderIndex(Int64 soleFolderIndex)) \ + x(GetSoleFolderIndex(Int64 *pSoleFolderIndex)) \ x(SetCurrentFilePath(const wchar_t *filePath)) \ x(SetNumFiles(UInt64 numFiles)) \ diff --git a/CPP/7zip/UI/FileManager/PanelCopy.cpp b/CPP/7zip/UI/FileManager/PanelCopy.cpp index c2dfa07d..e157d1f9 100755 --- a/CPP/7zip/UI/FileManager/PanelCopy.cpp +++ b/CPP/7zip/UI/FileManager/PanelCopy.cpp @@ -109,12 +109,14 @@ HRESULT CPanelCopyThread::ProcessVirt() options->folder, BoolToInt(true), extractCallback2); } else + CMyComPtr extractCallback2; + RINOK(ExtractCallback.QueryInterface(IID_IFolderArchiveExtractCallback, &extractCallback2)) + extractCallback2->SetSoleFolderIndex(options->soleFolderIndex); result2 = FolderOperations->CopyTo( BoolToInt(options->moveMode), &Indices.Front(), Indices.Size(), BoolToInt(options->includeAltStreams), BoolToInt(options->replaceAltStreamChars), - options->soleFolderIndex, options->folder, ExtractCallback); if (result2 == S_OK && !ExtractCallbackSpec->ThereAreMessageErrors)