5 #include "Windows/FileDir.h"
\r
7 #include "../Common/WorkDir.h"
\r
9 #include "Messages.h"
\r
11 #include "UpdateCallback100.h"
\r
13 using namespace NFar;
\r
14 using namespace NWindows;
\r
15 using namespace NFile;
\r
16 using namespace NDirectory;
\r
18 static LPCWSTR kTempArchivePrefix = L"7zA";
\r
20 int CPlugin::DeleteFiles(PluginPanelItem *panelItems, int numItems, int opMode)
\r
25 if (!m_ArchiverInfo.UpdateEnabled)
\r
27 g_StartupInfo.ShowMessage(NMessageID::kUpdateNotSupportedForThisArchive);
\r
31 if ((opMode & OPM_SILENT) == 0)
\r
33 const char *msgItems[]=
\r
35 g_StartupInfo.GetMsgString(NMessageID::kDeleteTitle),
\r
36 g_StartupInfo.GetMsgString(NMessageID::kDeleteFiles),
\r
37 g_StartupInfo.GetMsgString(NMessageID::kDeleteDelete),
\r
38 g_StartupInfo.GetMsgString(NMessageID::kDeleteCancel)
\r
43 sprintf(msg, g_StartupInfo.GetMsgString(NMessageID::kDeleteFile), panelItems[0].FindData.cFileName);
\r
46 else if (numItems > 1)
\r
48 sprintf(msg, g_StartupInfo.GetMsgString(NMessageID::kDeleteNumberOfFiles),
\r
52 if (g_StartupInfo.ShowMessage(FMSG_WARNING, NULL, msgItems,
\r
53 sizeof(msgItems) / sizeof(msgItems[0]), 2) != 0)
\r
57 CScreenRestorer screenRestorer;
\r
58 CProgressBox progressBox;
\r
59 CProgressBox *progressBoxPointer = NULL;
\r
60 if ((opMode & OPM_SILENT) == 0 && (opMode & OPM_FIND ) == 0)
\r
62 screenRestorer.Save();
\r
64 progressBoxPointer = &progressBox;
\r
66 // g_StartupInfo.GetMsgString(NMessageID::kWaitTitle),
\r
67 g_StartupInfo.GetMsgString(NMessageID::kDeleting), 48);
\r
70 NWorkDir::CInfo workDirInfo;
\r
73 UString workDir = GetWorkDir(workDirInfo, m_FileName);
\r
74 CreateComplexDirectory(workDir);
\r
76 CTempFileW tempFile;
\r
77 UString tempFileName;
\r
78 if (tempFile.Create(workDir, kTempArchivePrefix, tempFileName) == 0)
\r
82 CRecordVector<UINT32> indices;
\r
83 indices.Reserve(numItems);
\r
85 for (i = 0; i < numItems; i++)
\r
86 indices.Add((UINT32)panelItems[i].UserData);
\r
88 ////////////////////////////
\r
91 UStringVector pathVector;
\r
92 GetPathParts(pathVector);
\r
94 CMyComPtr<IOutFolderArchive> outArchive;
\r
95 HRESULT result = m_ArchiveHandler.QueryInterface(IID_IOutFolderArchive, &outArchive);
\r
98 g_StartupInfo.ShowMessage(NMessageID::kUpdateNotSupportedForThisArchive);
\r
101 outArchive->SetFolder(_folder);
\r
103 CUpdateCallback100Imp *updateCallbackSpec = new CUpdateCallback100Imp;
\r
104 CMyComPtr<IFolderArchiveUpdateCallback> updateCallback(updateCallbackSpec );
\r
106 updateCallbackSpec->Init(/* m_ArchiveHandler, */ progressBoxPointer);
\r
109 result = outArchive->DeleteItems(
\r
111 &indices.Front(), indices.Size(),
\r
113 updateCallback.Release();
\r
114 outArchive.Release();
\r
116 if (result != S_OK)
\r
118 ShowErrorMessage(result);
\r
123 m_ArchiveHandler->Close();
\r
125 if (!DeleteFileAlways(m_FileName))
\r
127 ShowLastErrorMessage();
\r
131 tempFile.DisableDeleting();
\r
132 if (!MyMoveFile(tempFileName, m_FileName))
\r
134 ShowLastErrorMessage();
\r
138 result = m_ArchiveHandler->ReOpen(NULL);
\r
139 if (result != S_OK)
\r
141 ShowErrorMessage(result);
\r
146 ////////////////////////////
\r
147 // Restore _folder;
\r
149 m_ArchiveHandler->BindToRootFolder(&_folder);
\r
150 for (i = 0; i < pathVector.Size(); i++)
\r
152 CMyComPtr<IFolderFolder> newFolder;
\r
153 _folder->BindToFolder(pathVector[i], &newFolder);
\r
156 _folder = newFolder;
\r