Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/UI/Agent/ArchiveFolderOut.cpp')
-rwxr-xr-xCPP/7zip/UI/Agent/ArchiveFolderOut.cpp115
1 files changed, 62 insertions, 53 deletions
diff --git a/CPP/7zip/UI/Agent/ArchiveFolderOut.cpp b/CPP/7zip/UI/Agent/ArchiveFolderOut.cpp
index cf3e2d5a..656602cb 100755
--- a/CPP/7zip/UI/Agent/ArchiveFolderOut.cpp
+++ b/CPP/7zip/UI/Agent/ArchiveFolderOut.cpp
@@ -6,6 +6,7 @@
#include "Windows/FileDir.h"
+#include "../../Common/FileStreams.h"
#include "../Common/WorkDir.h"
#include "Agent.h"
@@ -14,32 +15,20 @@ using namespace NWindows;
using namespace NFile;
using namespace NDirectory;
-static LPCWSTR kTempArcivePrefix = L"7zA";
-
void CAgentFolder::GetPathParts(UStringVector &pathParts)
{
_proxyFolderItem->GetPathParts(pathParts);
}
HRESULT CAgentFolder::CommonUpdateOperation(
- bool deleteOperation,
- bool createFolderOperation,
- bool renameOperation,
+ AGENT_OP operation,
const wchar_t *newItemName,
const NUpdateArchive::CActionSet *actionSet,
const UINT32 *indices, UINT32 numItems,
IFolderArchiveUpdateCallback *updateCallback100)
{
- NWorkDir::CInfo workDirInfo;
- workDirInfo.Load();
- UString archiveFilePath = _agentSpec->_archiveFilePath;
- UString workDir = GetWorkDir(workDirInfo, archiveFilePath);
- CreateComplexDirectory(workDir);
-
- CTempFileW tempFile;
- UString tempFileName;
- if (tempFile.Create(workDir, kTempArcivePrefix, tempFileName) == 0)
- return E_FAIL;
+ CWorkDirTempFile tempFile;
+ RINOK(tempFile.CreateTempFile(us2fs(_agentSpec->_archiveFilePath)));
/*
if (SetOutProperties(anOutArchive, aCompressionInfo.Method) != S_OK)
@@ -53,44 +42,39 @@ HRESULT CAgentFolder::CommonUpdateOperation(
GetPathParts(pathParts);
HRESULT result;
- if (deleteOperation)
- result = _agentSpec->DeleteItems(tempFileName,
- indices, numItems, updateCallback100);
- else if (createFolderOperation)
+ switch (operation)
{
- result = _agentSpec->CreateFolder(tempFileName,
- newItemName, updateCallback100);
- }
- else if (renameOperation)
- {
- result = _agentSpec->RenameItem(
- tempFileName,
- indices, numItems,
- newItemName,
- updateCallback100);
- }
- else
- {
- Byte actionSetByte[NUpdateArchive::NPairState::kNumValues];
- for (int i = 0; i < NUpdateArchive::NPairState::kNumValues; i++)
- actionSetByte[i] = (Byte)actionSet->StateActions[i];
- result = _agentSpec->DoOperation2(tempFileName, actionSetByte, NULL, updateCallback100);
+ case AGENT_OP_Delete:
+ result = _agentSpec->DeleteItems(tempFile.OutStream, indices, numItems, updateCallback100);
+ break;
+ case AGENT_OP_CreateFolder:
+ result = _agentSpec->CreateFolder(tempFile.OutStream, newItemName, updateCallback100);
+ break;
+ case AGENT_OP_Rename:
+ result = _agentSpec->RenameItem(tempFile.OutStream, indices, numItems, newItemName, updateCallback100);
+ break;
+ case AGENT_OP_CopyFromFile:
+ result = _agentSpec->UpdateOneFile(tempFile.OutStream, indices, numItems, newItemName, updateCallback100);
+ break;
+ case AGENT_OP_Uni:
+ {
+ Byte actionSetByte[NUpdateArchive::NPairState::kNumValues];
+ for (int i = 0; i < NUpdateArchive::NPairState::kNumValues; i++)
+ actionSetByte[i] = (Byte)actionSet->StateActions[i];
+ result = _agentSpec->DoOperation2(tempFile.OutStream, actionSetByte, NULL, updateCallback100);
+ break;
+ }
+ default:
+ return E_FAIL;
}
- if (result != S_OK)
- return result;
+ RINOK(result);
_agentSpec->Close();
// m_FolderItem = NULL;
- if (NFind::DoesFileExist(archiveFilePath))
- if (!DeleteFileAlways(archiveFilePath))
- return GetLastError();
-
- tempFile.DisableDeleting();
- if (!MyMoveFile(tempFileName, archiveFilePath))
- return GetLastError();
+ RINOK(tempFile.MoveToOriginal(true));
{
CMyComPtr<IArchiveOpenCallback> openCallback;
@@ -134,7 +118,7 @@ STDMETHODIMP CAgentFolder::CopyFrom(
{
COM_TRY_BEGIN
CMyComPtr<IFolderArchiveUpdateCallback> updateCallback100;
- if (progress != 0)
+ if (progress)
{
RINOK(progress->QueryInterface(IID_IFolderArchiveUpdateCallback, (void **)&updateCallback100));
}
@@ -142,7 +126,7 @@ STDMETHODIMP CAgentFolder::CopyFrom(
{
RINOK(_agentSpec->SetFiles(fromFolderPath, itemsPaths, numItems));
RINOK(_agentSpec->SetFolder(this));
- return CommonUpdateOperation(false, false, false, NULL,
+ return CommonUpdateOperation(AGENT_OP_Uni, NULL,
&NUpdateArchive::kAddActionSet, 0, 0, updateCallback100);
}
catch(const UString &s)
@@ -153,18 +137,43 @@ STDMETHODIMP CAgentFolder::CopyFrom(
COM_TRY_END
}
+STDMETHODIMP CAgentFolder::CopyFromFile(UInt32 destIndex, const wchar_t *itemPath, IProgress * progress)
+{
+ COM_TRY_BEGIN
+ CUIntVector indices;
+ indices.Add(destIndex);
+ CMyComPtr<IFolderArchiveUpdateCallback> updateCallback100;
+ if (progress)
+ {
+ RINOK(progress->QueryInterface(IID_IFolderArchiveUpdateCallback, (void **)&updateCallback100));
+ }
+ try
+ {
+ RINOK(_agentSpec->SetFolder(this));
+ return CommonUpdateOperation(AGENT_OP_CopyFromFile, itemPath,
+ &NUpdateArchive::kAddActionSet,
+ &indices.Front(), indices.Size(), updateCallback100);
+ }
+ catch(const UString &s)
+ {
+ RINOK(updateCallback100->UpdateErrorMessage(UString(L"Error: ") + s));
+ return E_FAIL;
+ }
+ COM_TRY_END
+}
+
STDMETHODIMP CAgentFolder::Delete(const UINT32 *indices, UINT32 numItems, IProgress *progress)
{
COM_TRY_BEGIN
RINOK(_agentSpec->SetFolder(this));
CMyComPtr<IFolderArchiveUpdateCallback> updateCallback100;
- if (progress != 0)
+ if (progress)
{
CMyComPtr<IProgress> progressWrapper = progress;
RINOK(progressWrapper.QueryInterface(
IID_IFolderArchiveUpdateCallback, &updateCallback100));
}
- return CommonUpdateOperation(true, false, false, NULL,
+ return CommonUpdateOperation(AGENT_OP_Delete, NULL,
&NUpdateArchive::kDeleteActionSet, indices, numItems, updateCallback100);
COM_TRY_END
}
@@ -176,12 +185,12 @@ STDMETHODIMP CAgentFolder::CreateFolder(const wchar_t *name, IProgress *progress
return ERROR_ALREADY_EXISTS;
RINOK(_agentSpec->SetFolder(this));
CMyComPtr<IFolderArchiveUpdateCallback> updateCallback100;
- if (progress != 0)
+ if (progress)
{
CMyComPtr<IProgress> progressWrapper = progress;
RINOK(progressWrapper.QueryInterface(IID_IFolderArchiveUpdateCallback, &updateCallback100));
}
- return CommonUpdateOperation(false, true, false, name, NULL, NULL, 0, updateCallback100);
+ return CommonUpdateOperation(AGENT_OP_CreateFolder, name, NULL, NULL, 0, updateCallback100);
COM_TRY_END
}
@@ -192,12 +201,12 @@ STDMETHODIMP CAgentFolder::Rename(UINT32 index, const wchar_t *newName, IProgres
indices.Add(index);
RINOK(_agentSpec->SetFolder(this));
CMyComPtr<IFolderArchiveUpdateCallback> updateCallback100;
- if (progress != 0)
+ if (progress)
{
CMyComPtr<IProgress> progressWrapper = progress;
RINOK(progressWrapper.QueryInterface(IID_IFolderArchiveUpdateCallback, &updateCallback100));
}
- return CommonUpdateOperation(false, false, true, newName, NULL, &indices.Front(),
+ return CommonUpdateOperation(AGENT_OP_Rename, newName, NULL, &indices.Front(),
indices.Size(), updateCallback100);
COM_TRY_END
}