Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / 7zip / UI / Far / PluginDelete.cpp
1 // PluginDelete.cpp\r
2 \r
3 #include "StdAfx.h"\r
4 \r
5 #include "Windows/FileDir.h"\r
6 \r
7 #include "../Common/WorkDir.h"\r
8 \r
9 #include "Messages.h"\r
10 #include "Plugin.h"\r
11 #include "UpdateCallback100.h"\r
12 \r
13 using namespace NFar;\r
14 using namespace NWindows;\r
15 using namespace NFile;\r
16 using namespace NDirectory;\r
17 \r
18 static LPCWSTR kTempArchivePrefix = L"7zA";\r
19 \r
20 int CPlugin::DeleteFiles(PluginPanelItem *panelItems, int numItems, int opMode)\r
21 {\r
22   if (numItems == 0)\r
23     return FALSE;\r
24   /*\r
25   if (!m_ArchiverInfo.UpdateEnabled)\r
26   {\r
27     g_StartupInfo.ShowMessage(NMessageID::kUpdateNotSupportedForThisArchive);\r
28     return FALSE;\r
29   }\r
30   */\r
31   if ((opMode & OPM_SILENT) == 0)\r
32   {\r
33     const char *msgItems[]=\r
34     {\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
39     };\r
40     char msg[1024];\r
41     if (numItems == 1)\r
42     {\r
43       sprintf(msg, g_StartupInfo.GetMsgString(NMessageID::kDeleteFile), panelItems[0].FindData.cFileName);\r
44       msgItems[1] = msg;\r
45     }\r
46     else if (numItems > 1)\r
47     {\r
48       sprintf(msg, g_StartupInfo.GetMsgString(NMessageID::kDeleteNumberOfFiles),\r
49           numItems);\r
50       msgItems[1] = msg;\r
51     }\r
52     if (g_StartupInfo.ShowMessage(FMSG_WARNING, NULL, msgItems,\r
53         sizeof(msgItems) / sizeof(msgItems[0]), 2) != 0)\r
54       return (FALSE);\r
55   }\r
56 \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
61   {\r
62     screenRestorer.Save();\r
63 \r
64     progressBoxPointer = &progressBox;\r
65     progressBox.Init(\r
66         // g_StartupInfo.GetMsgString(NMessageID::kWaitTitle),\r
67         g_StartupInfo.GetMsgString(NMessageID::kDeleting), 48);\r
68   }\r
69 \r
70   NWorkDir::CInfo workDirInfo;\r
71   workDirInfo.Load();\r
72 \r
73   UString workDir = GetWorkDir(workDirInfo, m_FileName);\r
74   CreateComplexDirectory(workDir);\r
75 \r
76   CTempFileW tempFile;\r
77   UString tempFileName;\r
78   if (tempFile.Create(workDir, kTempArchivePrefix, tempFileName) == 0)\r
79     return FALSE;\r
80 \r
81 \r
82   CRecordVector<UINT32> indices;\r
83   indices.Reserve(numItems);\r
84   int i;\r
85   for (i = 0; i < numItems; i++)\r
86     indices.Add((UINT32)panelItems[i].UserData);\r
87 \r
88   ////////////////////////////\r
89   // Save _folder;\r
90 \r
91   UStringVector pathVector;\r
92   GetPathParts(pathVector);\r
93   \r
94   CMyComPtr<IOutFolderArchive> outArchive;\r
95   HRESULT result = m_ArchiveHandler.QueryInterface(IID_IOutFolderArchive, &outArchive);\r
96   if (result != S_OK)\r
97   {\r
98     g_StartupInfo.ShowMessage(NMessageID::kUpdateNotSupportedForThisArchive);\r
99     return FALSE;\r
100   }\r
101   outArchive->SetFolder(_folder);\r
102 \r
103   CUpdateCallback100Imp *updateCallbackSpec = new CUpdateCallback100Imp;\r
104   CMyComPtr<IFolderArchiveUpdateCallback> updateCallback(updateCallbackSpec );\r
105   \r
106   updateCallbackSpec->Init(/* m_ArchiveHandler, */ progressBoxPointer);\r
107 \r
108 \r
109   result = outArchive->DeleteItems(\r
110       tempFileName,\r
111       &indices.Front(), indices.Size(),\r
112       updateCallback);\r
113   updateCallback.Release();\r
114   outArchive.Release();\r
115 \r
116   if (result != S_OK)\r
117   {\r
118     ShowErrorMessage(result);\r
119     return FALSE;\r
120   }\r
121 \r
122   _folder.Release();\r
123   m_ArchiveHandler->Close();\r
124   \r
125   if (!DeleteFileAlways(m_FileName))\r
126   {\r
127     ShowLastErrorMessage();\r
128     return FALSE;\r
129   }\r
130 \r
131   tempFile.DisableDeleting();\r
132   if (!MyMoveFile(tempFileName, m_FileName))\r
133   {\r
134     ShowLastErrorMessage();\r
135     return FALSE;\r
136   }\r
137   \r
138   result = m_ArchiveHandler->ReOpen(NULL);\r
139   if (result != S_OK)\r
140   {\r
141     ShowErrorMessage(result);\r
142     return FALSE;\r
143   }\r
144 \r
145  \r
146   ////////////////////////////\r
147   // Restore _folder;\r
148 \r
149   m_ArchiveHandler->BindToRootFolder(&_folder);\r
150   for (i = 0; i < pathVector.Size(); i++)\r
151   {\r
152     CMyComPtr<IFolderFolder> newFolder;\r
153     _folder->BindToFolder(pathVector[i], &newFolder);\r
154     if (!newFolder)\r
155       break;\r
156     _folder = newFolder;\r
157   }\r
158   GetCurrentDir();\r
159 \r
160   return TRUE;\r
161 }\r