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