1 // Far.cpp
2 // Test Align for updating !!!!!!!!!!!!!!!!!!
3 
4 #include "StdAfx.h"
5 
6 #include "../../../Common/MyWindows.h"
7 
8 #include "../../../Common/MyInitGuid.h"
9 
10 #include "../../../Common/StringConvert.h"
11 
12 #include "../../../Windows/FileDir.h"
13 #include "../../../Windows/NtCheck.h"
14 
15 #include "../../Common/FileStreams.h"
16 
17 #include "Messages.h"
18 #include "Plugin.h"
19 #include "ProgressBox.h"
20 
21 using namespace NWindows;
22 using namespace NFile;
23 using namespace NDir;
24 using namespace NFar;
25 
26 static const DWORD kShowProgressTime_ms = 100;
27 
28 static const char * const kCommandPrefix = "7-zip";
29 static const char * const kRegisrtryMainKeyName = NULL; // ""
30 static LPCTSTR const kRegisrtryValueNameEnabled = TEXT("UsedByDefault3");
31 static const char * const kHelpTopicConfig =  "Config";
32 static bool kPluginEnabledDefault = true;
33 
34 HINSTANCE g_hInstance;
35 
36 namespace NFar {
37 
38 const char *g_PluginName_for_Error = "7-Zip";
39 
40 }
41 
42 #define NT_CHECK_FAIL_ACTION return FALSE;
43 
DllMain(HANDLE hInstance,DWORD dwReason,LPVOID)44 BOOL WINAPI DllMain(
45   #ifdef UNDER_CE
46   HANDLE
47   #else
48   HINSTANCE
49   #endif
50   hInstance, DWORD dwReason, LPVOID)
51 {
52   if (dwReason == DLL_PROCESS_ATTACH)
53   {
54     // OutputDebugStringA("7-Zip FAR DLL_PROCESS_ATTACH");
55     g_hInstance = (HINSTANCE)hInstance;
56     NT_CHECK
57   }
58   if (dwReason == DLL_PROCESS_DETACH)
59   {
60     // OutputDebugStringA("7-Zip FAR DLL_PROCESS_DETACH");
61   }
62   return TRUE;
63 }
64 
65 static struct COptions
66 {
67   bool Enabled;
68 } g_Options;
69 
70 static const char * const kPliginNameForRegistry = "7-ZIP";
71 
ExitFAR()72 EXTERN_C void WINAPI ExitFAR()
73 {
74   /* WIN32:
75        it's not allowed to call FreeLibrary() from FreeLibrary().
76        So we try to free all DLLs before destructors */
77   // OutputDebugStringA("-- ExitFAR --- START");
78 
79   FreeGlobalCodecs();
80 
81   // OutputDebugStringA("-- ExitFAR --- END");
82 }
83 
SetStartupInfo(const PluginStartupInfo * info)84 EXTERN_C void WINAPI SetStartupInfo(const PluginStartupInfo *info)
85 {
86   MY_TRY_BEGIN;
87   g_StartupInfo.Init(*info, kPliginNameForRegistry);
88   g_Options.Enabled = g_StartupInfo.QueryRegKeyValue(
89       HKEY_CURRENT_USER, kRegisrtryMainKeyName,
90       kRegisrtryValueNameEnabled, kPluginEnabledDefault);
91 
92   // OutputDebugStringA("SetStartupInfo");
93   // LoadGlobalCodecs();
94 
95   MY_TRY_END1("SetStartupInfo");
96 }
97 
98 class COpenArchiveCallback:
99   public IArchiveOpenCallback,
100   public IArchiveOpenVolumeCallback,
101   public IArchiveOpenSetSubArchiveName,
102   public IProgress,
103   public ICryptoGetTextPassword,
104   public CMyUnknownImp
105 {
106   DWORD m_StartTickValue;
107   bool m_MessageBoxIsShown;
108 
109   CProgressBox _progressBox;
110 
111   bool _numFilesTotalDefined;
112   bool _numBytesTotalDefined;
113 
114   NFind::CFileInfo _fileInfo;
115   bool _subArchiveMode;
116   UString _subArchiveName;
117 public:
118   bool PasswordIsDefined;
119   UString Password;
120 
121   FString _folderPrefix;
122 
123 public:
124   MY_UNKNOWN_IMP4(
125      IArchiveOpenVolumeCallback,
126      IArchiveOpenSetSubArchiveName,
127      IProgress,
128      ICryptoGetTextPassword
129     )
130 
131   // IProgress
132   STDMETHOD(SetTotal)(UInt64 total);
133   STDMETHOD(SetCompleted)(const UInt64 *aCompleteValue);
134 
135   // IArchiveOpenCallback
136   STDMETHOD(SetTotal)(const UInt64 *numFiles, const UInt64 *numBytes);
137   STDMETHOD(SetCompleted)(const UInt64 *numFiles, const UInt64 *numBytes);
138 
139   // IArchiveOpenVolumeCallback
140   STDMETHOD(GetProperty)(PROPID propID, PROPVARIANT *value);
141   STDMETHOD(GetStream)(const wchar_t *name, IInStream **inStream);
142 
STDMETHOD(SetSubArchiveName (const wchar_t * name))143   STDMETHOD(SetSubArchiveName(const wchar_t *name))
144   {
145     _subArchiveMode = true;
146     _subArchiveName = name;
147     return S_OK;
148   }
149 
150   // ICryptoGetTextPassword
151   STDMETHOD(CryptoGetTextPassword)(BSTR *password);
152 
COpenArchiveCallback()153   COpenArchiveCallback(): _subArchiveMode(false) {}
154 
Init()155   void Init()
156   {
157     PasswordIsDefined = false;
158 
159     _subArchiveMode = false;
160 
161     _numFilesTotalDefined = false;
162     _numBytesTotalDefined = false;
163 
164     m_MessageBoxIsShown = false;
165 
166     _progressBox.Init(
167         // g_StartupInfo.GetMsgString(NMessageID::kWaitTitle),
168         g_StartupInfo.GetMsgString(NMessageID::kReading));
169   }
170   void ShowMessage();
171 
LoadFileInfo(const FString & folderPrefix,const FString & fileName)172   void LoadFileInfo(const FString &folderPrefix, const FString &fileName)
173   {
174     _folderPrefix = folderPrefix;
175     if (!_fileInfo.Find(_folderPrefix + fileName))
176       throw 1;
177   }
178 };
179 
CheckBreak2()180 static HRESULT CheckBreak2()
181 {
182   return WasEscPressed() ? E_ABORT : S_OK;
183 }
184 
ShowMessage()185 void COpenArchiveCallback::ShowMessage()
186 {
187   if (!m_MessageBoxIsShown)
188   {
189     DWORD currentTime = GetTickCount();
190     if (currentTime - _progressBox.StartTick < kShowProgressTime_ms)
191       return;
192     m_MessageBoxIsShown = true;
193   }
194 
195   _progressBox.UseBytesForPercents = !_numFilesTotalDefined;
196   _progressBox.Print();
197 }
198 
SetTotal(const UInt64 * numFiles,const UInt64 * numBytes)199 STDMETHODIMP COpenArchiveCallback::SetTotal(const UInt64 *numFiles, const UInt64 *numBytes)
200 {
201   _numFilesTotalDefined = (numFiles != NULL);
202   if (_numFilesTotalDefined)
203     _progressBox.FilesTotal = *numFiles;
204 
205   _numBytesTotalDefined = (numBytes != NULL);
206   if (_numBytesTotalDefined)
207     _progressBox.Total = *numBytes;
208 
209   return CheckBreak2();
210 }
211 
SetCompleted(const UInt64 * numFiles,const UInt64 * numBytes)212 STDMETHODIMP COpenArchiveCallback::SetCompleted(const UInt64 *numFiles, const UInt64 *numBytes)
213 {
214   if (numFiles)
215     _progressBox.Files = *numFiles;
216 
217   if (numBytes)
218     _progressBox.Completed = *numBytes;
219 
220   ShowMessage();
221   return CheckBreak2();
222 }
223 
224 
SetTotal(const UInt64)225 STDMETHODIMP COpenArchiveCallback::SetTotal(const UInt64 /* total */)
226 {
227   return CheckBreak2();
228 }
229 
SetCompleted(const UInt64 *)230 STDMETHODIMP COpenArchiveCallback::SetCompleted(const UInt64 * /* completed */)
231 {
232   ShowMessage();
233   return CheckBreak2();
234 }
235 
GetStream(const wchar_t * name,IInStream ** inStream)236 STDMETHODIMP COpenArchiveCallback::GetStream(const wchar_t *name, IInStream **inStream)
237 {
238   if (WasEscPressed())
239     return E_ABORT;
240   if (_subArchiveMode)
241     return S_FALSE;
242   *inStream = NULL;
243   FString fullPath = _folderPrefix + us2fs(name);
244   if (!_fileInfo.Find(fullPath))
245     return S_FALSE;
246   if (_fileInfo.IsDir())
247     return S_FALSE;
248   CInFileStream *inFile = new CInFileStream;
249   CMyComPtr<IInStream> inStreamTemp = inFile;
250   if (!inFile->Open(fullPath))
251     return ::GetLastError();
252   *inStream = inStreamTemp.Detach();
253   return S_OK;
254 }
255 
256 
GetProperty(PROPID propID,PROPVARIANT * value)257 STDMETHODIMP COpenArchiveCallback::GetProperty(PROPID propID, PROPVARIANT *value)
258 {
259   NCOM::CPropVariant prop;
260   if (_subArchiveMode)
261   {
262     switch (propID)
263     {
264       case kpidName: prop = _subArchiveName; break;
265     }
266   }
267   else
268   switch (propID)
269   {
270     case kpidName:  prop = GetUnicodeString(_fileInfo.Name, CP_OEMCP); break;
271     case kpidIsDir:  prop = _fileInfo.IsDir(); break;
272     case kpidSize:  prop = _fileInfo.Size; break;
273     case kpidAttrib:  prop = (UInt32)_fileInfo.Attrib; break;
274     case kpidCTime:  prop = _fileInfo.CTime; break;
275     case kpidATime:  prop = _fileInfo.ATime; break;
276     case kpidMTime:  prop = _fileInfo.MTime; break;
277   }
278   prop.Detach(value);
279   return S_OK;
280 }
281 
GetPassword(UString & password)282 HRESULT GetPassword(UString &password)
283 {
284   if (WasEscPressed())
285     return E_ABORT;
286   password.Empty();
287   CInitDialogItem initItems[]=
288   {
289     { DI_DOUBLEBOX, 3, 1, 72, 4, false, false, 0, false,  NMessageID::kGetPasswordTitle, NULL, NULL },
290     { DI_TEXT, 5, 2, 0, 0, false, false, DIF_SHOWAMPERSAND, false, NMessageID::kEnterPasswordForFile, NULL, NULL },
291     { DI_PSWEDIT, 5, 3, 70, 3, true, false, 0, true, -1, "", NULL }
292   };
293 
294   const int kNumItems = ARRAY_SIZE(initItems);
295   FarDialogItem dialogItems[kNumItems];
296   g_StartupInfo.InitDialogItems(initItems, dialogItems, kNumItems);
297 
298   // sprintf(DialogItems[1].Data,GetMsg(MGetPasswordForFile),FileName);
299   if (g_StartupInfo.ShowDialog(76, 6, NULL, dialogItems, kNumItems) < 0)
300     return E_ABORT;
301 
302   password = MultiByteToUnicodeString(dialogItems[2].Data, CP_OEMCP);
303   return S_OK;
304 }
305 
CryptoGetTextPassword(BSTR * password)306 STDMETHODIMP COpenArchiveCallback::CryptoGetTextPassword(BSTR *password)
307 {
308   if (!PasswordIsDefined)
309   {
310     RINOK(GetPassword(Password));
311     PasswordIsDefined = true;
312   }
313   return StringToBstr(Password, password);
314 }
315 
316 /*
317 HRESULT OpenArchive(const CSysString &fileName,
318     IInFolderArchive **archiveHandlerResult,
319     CArchiverInfo &archiverInfoResult,
320     UString &defaultName,
321     IArchiveOpenCallback *openArchiveCallback)
322 {
323   HRESULT OpenArchive(const CSysString &fileName,
324     IInArchive **archive,
325     CArchiverInfo &archiverInfoResult,
326     IArchiveOpenCallback *openArchiveCallback);
327 }
328 */
329 
MyOpenFilePluginW(const wchar_t * name)330 static HANDLE MyOpenFilePluginW(const wchar_t *name)
331 {
332   FString normalizedName = us2fs(name);
333   normalizedName.Trim();
334   FString fullName;
335   MyGetFullPathName(normalizedName, fullName);
336   NFind::CFileInfo fileInfo;
337   if (!fileInfo.Find(fullName))
338     return INVALID_HANDLE_VALUE;
339   if (fileInfo.IsDir())
340     return INVALID_HANDLE_VALUE;
341 
342 
343   CMyComPtr<IInFolderArchive> archiveHandler;
344 
345   // CArchiverInfo archiverInfoResult;
346   // ::OutputDebugStringA("before OpenArchive\n");
347 
348   CScreenRestorer screenRestorer;
349   {
350     screenRestorer.Save();
351   }
352 
353   COpenArchiveCallback *openArchiveCallbackSpec = new COpenArchiveCallback;
354   CMyComPtr<IArchiveOpenCallback> openArchiveCallback = openArchiveCallbackSpec;
355 
356   // if ((opMode & OPM_SILENT) == 0 && (opMode & OPM_FIND ) == 0)
357   openArchiveCallbackSpec->Init();
358   {
359     FString dirPrefix, fileName;
360     GetFullPathAndSplit(fullName, dirPrefix, fileName);
361     openArchiveCallbackSpec->LoadFileInfo(dirPrefix, fileName);
362   }
363 
364   // ::OutputDebugStringA("before OpenArchive\n");
365 
366   CAgent *agent = new CAgent;
367   archiveHandler = agent;
368   CMyComBSTR archiveType;
369   HRESULT result = archiveHandler->Open(NULL,
370       GetUnicodeString(fullName, CP_OEMCP), UString(), &archiveType, openArchiveCallback);
371   /*
372   HRESULT result = ::OpenArchive(fullName, &archiveHandler,
373       archiverInfoResult, defaultName, openArchiveCallback);
374   */
375   if (result == E_ABORT)
376     return (HANDLE)-2;
377 
378   UString errorMessage = agent->GetErrorMessage();
379   if (!errorMessage.IsEmpty())
380     g_StartupInfo.ShowErrorMessage(UnicodeStringToMultiByte(errorMessage, CP_OEMCP));
381 
382   if (result != S_OK)
383   {
384     if (result == S_FALSE)
385       return INVALID_HANDLE_VALUE;
386     ShowSysErrorMessage(result);
387     return INVALID_HANDLE_VALUE;
388   }
389 
390   // ::OutputDebugStringA("after OpenArchive\n");
391 
392   CPlugin *plugin = new CPlugin(
393       fullName,
394       // defaultName,
395       agent,
396       (const wchar_t *)archiveType
397       );
398 
399   plugin->PasswordIsDefined = openArchiveCallbackSpec->PasswordIsDefined;
400   plugin->Password = openArchiveCallbackSpec->Password;
401 
402   // OutputDebugStringA("--- OpenFilePlugin ---- END");
403   return (HANDLE)(plugin);
404 }
405 
MyOpenFilePlugin(const char * name)406 static HANDLE MyOpenFilePlugin(const char *name)
407 {
408   UINT codePage =
409   #ifdef UNDER_CE
410     CP_OEMCP;
411   #else
412     ::AreFileApisANSI() ? CP_ACP : CP_OEMCP;
413   #endif
414   return MyOpenFilePluginW(GetUnicodeString(name, codePage));
415 }
416 
OpenFilePlugin(char * name,const unsigned char *,int)417 EXTERN_C HANDLE WINAPI OpenFilePlugin(char *name, const unsigned char * /* data */, int /* dataSize */)
418 {
419   MY_TRY_BEGIN;
420   // OutputDebugStringA("--- OpenFilePlugin");
421   if (name == NULL || (!g_Options.Enabled))
422   {
423     // if (!Opt.ProcessShiftF1)
424       return(INVALID_HANDLE_VALUE);
425   }
426   return MyOpenFilePlugin(name);
427   MY_TRY_END2("OpenFilePlugin", INVALID_HANDLE_VALUE);
428 }
429 
430 /*
431 EXTERN_C HANDLE WINAPI OpenFilePluginW(const wchar_t *name,const unsigned char *Data,int DataSize,int OpMode)
432 {
433   MY_TRY_BEGIN;
434   if (name == NULL || (!g_Options.Enabled))
435   {
436     // if (!Opt.ProcessShiftF1)
437       return(INVALID_HANDLE_VALUE);
438   }
439   return MyOpenFilePluginW(name);
440   ::OutputDebugStringA("OpenFilePluginW\n");
441   MY_TRY_END2("OpenFilePluginW", INVALID_HANDLE_VALUE);
442 }
443 */
444 
OpenPlugin(int openFrom,INT_PTR item)445 EXTERN_C HANDLE WINAPI OpenPlugin(int openFrom, INT_PTR item)
446 {
447   MY_TRY_BEGIN;
448 
449   if (openFrom == OPEN_COMMANDLINE)
450   {
451     AString fileName ((const char *)item);
452     if (fileName.IsEmpty())
453       return INVALID_HANDLE_VALUE;
454     if (fileName.Len() >= 2
455         && fileName[0] == '\"'
456         && fileName.Back() == '\"')
457     {
458       fileName.DeleteBack();
459       fileName.DeleteFrontal(1);
460     }
461     return MyOpenFilePlugin(fileName);
462   }
463 
464   if (openFrom == OPEN_PLUGINSMENU)
465   {
466     switch (item)
467     {
468       case 0:
469       {
470         PluginPanelItem pluginPanelItem;
471         if (!g_StartupInfo.ControlGetActivePanelCurrentItemInfo(pluginPanelItem))
472           throw 142134;
473         return MyOpenFilePlugin(pluginPanelItem.FindData.cFileName);
474       }
475 
476       case 1:
477       {
478         CObjectVector<PluginPanelItem> pluginPanelItem;
479         if (!g_StartupInfo.ControlGetActivePanelSelectedOrCurrentItems(pluginPanelItem))
480           throw 142134;
481         HRESULT res = CompressFiles(pluginPanelItem);
482         if (res != S_OK && res != E_ABORT)
483         {
484           ShowSysErrorMessage(res);
485         }
486         // if (res == S_OK)
487         {
488           /* int t = */ g_StartupInfo.ControlClearPanelSelection();
489           g_StartupInfo.ControlRequestActivePanel(FCTL_UPDATEPANEL, NULL);
490           g_StartupInfo.ControlRequestActivePanel(FCTL_REDRAWPANEL, NULL);
491           g_StartupInfo.ControlRequestActivePanel(FCTL_UPDATEANOTHERPANEL, NULL);
492           g_StartupInfo.ControlRequestActivePanel(FCTL_REDRAWANOTHERPANEL, NULL);
493         }
494         return INVALID_HANDLE_VALUE;
495       }
496 
497       default:
498         throw 4282215;
499     }
500   }
501 
502   return INVALID_HANDLE_VALUE;
503   MY_TRY_END2("OpenPlugin", INVALID_HANDLE_VALUE);
504 }
505 
ClosePlugin(HANDLE plugin)506 EXTERN_C void WINAPI ClosePlugin(HANDLE plugin)
507 {
508   // OutputDebugStringA("-- ClosePlugin --- START");
509   // MY_TRY_BEGIN;
510   delete (CPlugin *)plugin;
511   // OutputDebugStringA("-- ClosePlugin --- END");
512   // MY_TRY_END1("ClosePlugin");
513 }
514 
GetFindData(HANDLE plugin,struct PluginPanelItem ** panelItems,int * itemsNumber,int opMode)515 EXTERN_C int WINAPI GetFindData(HANDLE plugin, struct PluginPanelItem **panelItems, int *itemsNumber, int opMode)
516 {
517   MY_TRY_BEGIN;
518   return(((CPlugin *)plugin)->GetFindData(panelItems, itemsNumber, opMode));
519   MY_TRY_END2("GetFindData", FALSE);
520 }
521 
FreeFindData(HANDLE plugin,struct PluginPanelItem * panelItems,int itemsNumber)522 EXTERN_C void WINAPI FreeFindData(HANDLE plugin, struct PluginPanelItem *panelItems, int itemsNumber)
523 {
524   // MY_TRY_BEGIN;
525   ((CPlugin *)plugin)->FreeFindData(panelItems, itemsNumber);
526   // MY_TRY_END1("FreeFindData");
527 }
528 
GetFiles(HANDLE plugin,struct PluginPanelItem * panelItems,int itemsNumber,int move,char * destPath,int opMode)529 EXTERN_C int WINAPI GetFiles(HANDLE plugin, struct PluginPanelItem *panelItems,
530     int itemsNumber, int move, char *destPath, int opMode)
531 {
532   MY_TRY_BEGIN;
533   return(((CPlugin *)plugin)->GetFiles(panelItems, itemsNumber, move, destPath, opMode));
534   MY_TRY_END2("GetFiles", NFileOperationReturnCode::kError);
535 }
536 
SetDirectory(HANDLE plugin,const char * dir,int opMode)537 EXTERN_C int WINAPI SetDirectory(HANDLE plugin, const char *dir, int opMode)
538 {
539   MY_TRY_BEGIN;
540   return(((CPlugin *)plugin)->SetDirectory(dir, opMode));
541   MY_TRY_END2("SetDirectory", FALSE);
542 }
543 
GetPluginInfo(struct PluginInfo * info)544 EXTERN_C void WINAPI GetPluginInfo(struct PluginInfo *info)
545 {
546   MY_TRY_BEGIN;
547 
548   info->StructSize = sizeof(*info);
549   info->Flags = 0;
550   info->DiskMenuStrings = NULL;
551   info->DiskMenuNumbers = NULL;
552   info->DiskMenuStringsNumber = 0;
553   static const char *pluginMenuStrings[2];
554   pluginMenuStrings[0] = g_StartupInfo.GetMsgString(NMessageID::kOpenArchiveMenuString);
555   pluginMenuStrings[1] = g_StartupInfo.GetMsgString(NMessageID::kCreateArchiveMenuString);
556   info->PluginMenuStrings = (char **)pluginMenuStrings;
557   info->PluginMenuStringsNumber = 2;
558   static const char *pluginCfgStrings[1];
559   pluginCfgStrings[0] = g_StartupInfo.GetMsgString(NMessageID::kOpenArchiveMenuString);
560   info->PluginConfigStrings = (char **)pluginCfgStrings;
561   info->PluginConfigStringsNumber = ARRAY_SIZE(pluginCfgStrings);
562   info->CommandPrefix = (char *)kCommandPrefix;
563   MY_TRY_END1("GetPluginInfo");
564 }
565 
Configure(int)566 EXTERN_C int WINAPI Configure(int /* itemNumber */)
567 {
568   MY_TRY_BEGIN;
569 
570   const int kEnabledCheckBoxIndex = 1;
571 
572   const int kYSize = 7;
573 
574   struct CInitDialogItem initItems[]=
575   {
576     { DI_DOUBLEBOX, 3, 1, 72, kYSize - 2, false, false, 0, false, NMessageID::kConfigTitle, NULL, NULL },
577     { DI_CHECKBOX, 5, 2, 0, 0, true, g_Options.Enabled, 0, false, NMessageID::kConfigPluginEnabled, NULL, NULL },
578     { DI_TEXT, 5, 3, 0, 0, false, false, DIF_BOXCOLOR | DIF_SEPARATOR, false, -1, "", NULL },
579     { DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, true, NMessageID::kOk, NULL, NULL },
580     { DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, false, NMessageID::kCancel, NULL, NULL },
581   };
582 
583   const int kNumDialogItems = ARRAY_SIZE(initItems);
584   const int kOkButtonIndex = kNumDialogItems - 2;
585 
586   FarDialogItem dialogItems[kNumDialogItems];
587   g_StartupInfo.InitDialogItems(initItems, dialogItems, kNumDialogItems);
588 
589   int askCode = g_StartupInfo.ShowDialog(76, kYSize,
590       kHelpTopicConfig, dialogItems, kNumDialogItems);
591 
592   if (askCode != kOkButtonIndex)
593     return (FALSE);
594 
595   g_Options.Enabled = BOOLToBool(dialogItems[kEnabledCheckBoxIndex].Selected);
596 
597   g_StartupInfo.SetRegKeyValue(HKEY_CURRENT_USER, kRegisrtryMainKeyName,
598       kRegisrtryValueNameEnabled, g_Options.Enabled);
599   return(TRUE);
600   MY_TRY_END2("Configure", FALSE);
601 }
602 
GetOpenPluginInfo(HANDLE plugin,struct OpenPluginInfo * info)603 EXTERN_C void WINAPI GetOpenPluginInfo(HANDLE plugin,struct OpenPluginInfo *info)
604 {
605   MY_TRY_BEGIN;
606   ((CPlugin *)plugin)->GetOpenPluginInfo(info);
607   MY_TRY_END1("GetOpenPluginInfo");
608 }
609 
PutFiles(HANDLE plugin,struct PluginPanelItem * panelItems,int itemsNumber,int move,int opMode)610 EXTERN_C int WINAPI PutFiles(HANDLE plugin, struct PluginPanelItem *panelItems, int itemsNumber, int move, int opMode)
611 {
612   MY_TRY_BEGIN;
613   return (((CPlugin *)plugin)->PutFiles(panelItems, itemsNumber, move, opMode));
614   MY_TRY_END2("PutFiles", NFileOperationReturnCode::kError);
615 }
616 
DeleteFiles(HANDLE plugin,PluginPanelItem * panelItems,int itemsNumber,int opMode)617 EXTERN_C int WINAPI DeleteFiles(HANDLE plugin, PluginPanelItem *panelItems, int itemsNumber, int opMode)
618 {
619   MY_TRY_BEGIN;
620   return (((CPlugin *)plugin)->DeleteFiles(panelItems, itemsNumber, opMode));
621   MY_TRY_END2("DeleteFiles", FALSE);
622 }
623 
ProcessKey(HANDLE plugin,int key,unsigned int controlState)624 EXTERN_C int WINAPI ProcessKey(HANDLE plugin, int key, unsigned int controlState)
625 {
626   MY_TRY_BEGIN;
627   return (((CPlugin *)plugin)->ProcessKey(key, controlState));
628   MY_TRY_END2("ProcessKey", FALSE);
629 }
630