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