xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Far/PluginDelete.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1 // PluginDelete.cpp
2 
3 #include "StdAfx.h"
4 
5 #include <stdio.h>
6 
7 #include "../../../Common/StringConvert.h"
8 #include "FarUtils.h"
9 
10 #include "Messages.h"
11 #include "Plugin.h"
12 #include "UpdateCallbackFar.h"
13 
14 using namespace NFar;
15 
DeleteFiles(PluginPanelItem * panelItems,unsigned numItems,int opMode)16 int CPlugin::DeleteFiles(PluginPanelItem *panelItems, unsigned numItems, int opMode)
17 {
18   if (numItems == 0)
19     return FALSE;
20   if (_agent->IsThere_ReadOnlyArc())
21   {
22     g_StartupInfo.ShowMessage(NMessageID::kUpdateNotSupportedForThisArchive);
23     return FALSE;
24   }
25   if ((opMode & OPM_SILENT) == 0)
26   {
27     const char *msgItems[]=
28     {
29       g_StartupInfo.GetMsgString(NMessageID::kDeleteTitle),
30       g_StartupInfo.GetMsgString(NMessageID::kDeleteFiles),
31       g_StartupInfo.GetMsgString(NMessageID::kDeleteDelete),
32       g_StartupInfo.GetMsgString(NMessageID::kDeleteCancel)
33     };
34 
35     // char msg[1024];
36     AString str1;
37 
38     if (numItems == 1)
39     {
40       str1 = g_StartupInfo.GetMsgString(NMessageID::kDeleteFile);
41       AString name (panelItems[0].FindData.cFileName);
42       const unsigned kSizeLimit = 48;
43       if (name.Len() > kSizeLimit)
44       {
45         UString s = MultiByteToUnicodeString(name, CP_OEMCP);
46         ReduceString(s, kSizeLimit);
47         name = UnicodeStringToMultiByte(s, CP_OEMCP);
48       }
49       str1.Replace(AString ("%.40s"), name);
50       msgItems[1] = str1;
51       // sprintf(msg, g_StartupInfo.GetMsgString(NMessageID::kDeleteFile), panelItems[0].FindData.cFileName);
52       // msgItems[2] = msg;
53     }
54     else if (numItems > 1)
55     {
56       str1 = g_StartupInfo.GetMsgString(NMessageID::kDeleteNumberOfFiles);
57       {
58         AString n;
59         n.Add_UInt32(numItems);
60         str1.Replace(AString ("%d"), n);
61       }
62       msgItems[1] = str1;
63       // sprintf(msg, g_StartupInfo.GetMsgString(NMessageID::kDeleteNumberOfFiles), numItems);
64       // msgItems[1] = msg;
65     }
66     if (g_StartupInfo.ShowMessage(FMSG_WARNING, NULL, msgItems, Z7_ARRAY_SIZE(msgItems), 2) != 0)
67       return (FALSE);
68   }
69 
70   CScreenRestorer screenRestorer;
71   CProgressBox progressBox;
72   CProgressBox *progressBoxPointer = NULL;
73   if ((opMode & OPM_SILENT) == 0 && (opMode & OPM_FIND ) == 0)
74   {
75     screenRestorer.Save();
76 
77     progressBoxPointer = &progressBox;
78     progressBox.Init(
79         // g_StartupInfo.GetMsgString(NMessageID::kWaitTitle),
80         g_StartupInfo.GetMsgString(NMessageID::kDeleting));
81   }
82 
83   /*
84   CWorkDirTempFile tempFile;
85   if (tempFile.CreateTempFile(m_FileName) != S_OK)
86     return FALSE;
87   */
88 
89   CObjArray<UInt32> indices(numItems);
90   unsigned i;
91   for (i = 0; i < numItems; i++)
92     indices[i] = (UInt32)panelItems[i].UserData;
93 
94   /*
95   UStringVector pathVector;
96   GetPathParts(pathVector);
97 
98   CMyComPtr<IOutFolderArchive> outArchive;
99   HRESULT result = m_ArchiveHandler.QueryInterface(IID_IOutFolderArchive, &outArchive);
100   if (result != S_OK)
101   {
102     g_StartupInfo.ShowMessage(NMessageID::kUpdateNotSupportedForThisArchive);
103     return FALSE;
104   }
105   */
106 
107   CUpdateCallback100Imp *updateCallbackSpec = new CUpdateCallback100Imp;
108   CMyComPtr<IFolderArchiveUpdateCallback> updateCallback(updateCallbackSpec);
109 
110   updateCallbackSpec->Init(/* m_ArchiveHandler, */ progressBoxPointer);
111   updateCallbackSpec->PasswordIsDefined = PasswordIsDefined;
112   updateCallbackSpec->Password = Password;
113 
114   /*
115   outArchive->SetFolder(_folder);
116   result = outArchive->DeleteItems(tempFile.OutStream, indices, numItems, updateCallback);
117   updateCallback.Release();
118   outArchive.Release();
119 
120   if (result == S_OK)
121   {
122     result = AfterUpdate(tempFile, pathVector);
123   }
124   */
125 
126   HRESULT result;
127   {
128     CMyComPtr<IFolderOperations> folderOperations;
129     result = _folder.QueryInterface(IID_IFolderOperations, &folderOperations);
130     if (folderOperations)
131       result = folderOperations->Delete(indices, numItems, updateCallback);
132     else if (result != S_OK)
133       result = E_FAIL;
134   }
135 
136   if (result != S_OK)
137   {
138     ShowSysErrorMessage(result);
139     return FALSE;
140   }
141 
142   SetCurrentDirVar();
143   return TRUE;
144 }
145