📄 main.cpp
字号:
{ DI_TEXT, 5, 2, 0, 0, false, false, DIF_SHOWAMPERSAND, false, NMessageID::kEnterPasswordForFile, NULL, NULL },
{ DI_PSWEDIT, 5, 3, 70, 3, true, false, 0, true, -1, "", NULL }
};
const int kNumItems = sizeof(initItems)/sizeof(initItems[0]);
FarDialogItem dialogItems[kNumItems];
g_StartupInfo.InitDialogItems(initItems, dialogItems, kNumItems);
// sprintf(DialogItems[1].Data,GetMsg(MGetPasswordForFile),FileName);
if (g_StartupInfo.ShowDialog(76, 6, NULL, dialogItems, kNumItems) < 0)
return (E_ABORT);
AString oemPassword = dialogItems[2].Data;
password = MultiByteToUnicodeString(oemPassword, CP_OEMCP);
return S_OK;
}
STDMETHODIMP COpenArchiveCallback::CryptoGetTextPassword(BSTR *password)
{
if (!PasswordIsDefined)
{
RINOK(GetPassword(Password));
PasswordIsDefined = true;
}
CMyComBSTR temp = Password;
*password = temp.Detach();
return S_OK;
}
/*
HRESULT OpenArchive(const CSysString &fileName,
IInFolderArchive **archiveHandlerResult,
CArchiverInfo &archiverInfoResult,
UString &defaultName,
IArchiveOpenCallback *openArchiveCallback)
{
HRESULT OpenArchive(const CSysString &fileName,
#ifndef EXCLUDE_COM
HMODULE *module,
#endif
IInArchive **archive,
CArchiverInfo &archiverInfoResult,
IArchiveOpenCallback *openArchiveCallback);
}
*/
static HANDLE MyOpenFilePlugin(const char *name)
{
UINT codePage = ::AreFileApisANSI() ? CP_ACP : CP_OEMCP;
UString normalizedName = GetUnicodeString(name, codePage);
normalizedName.Trim();
UString fullName;
int fileNamePartStartIndex;
NFile::NDirectory::MyGetFullPathName(normalizedName, fullName, fileNamePartStartIndex);
NFile::NFind::CFileInfoW fileInfo;
if (!NFile::NFind::FindFile(fullName, fileInfo))
return INVALID_HANDLE_VALUE;
if (fileInfo.IsDirectory())
return INVALID_HANDLE_VALUE;
CMyComPtr<IInFolderArchive> archiveHandler;
// CArchiverInfo archiverInfoResult;
// ::OutputDebugString("before OpenArchive\n");
COpenArchiveCallback *openArchiveCallbackSpec = new COpenArchiveCallback;
CMyComPtr<IArchiveOpenCallback> openArchiveCallback = openArchiveCallbackSpec;
// if ((opMode & OPM_SILENT) == 0 && (opMode & OPM_FIND ) == 0)
CScreenRestorer screenRestorer;
CMessageBox m_MessageBox;
{
screenRestorer.Save();
}
openArchiveCallbackSpec->Init(&m_MessageBox);
openArchiveCallbackSpec->LoadFileInfo(
fullName.Left(fileNamePartStartIndex),
fullName.Mid(fileNamePartStartIndex));
// ::OutputDebugString("before OpenArchive\n");
// UString defaultName;
archiveHandler = new CAgent;
CMyComBSTR archiveType;
HRESULT result = archiveHandler->Open(
GetUnicodeString(fullName, CP_OEMCP), &archiveType, openArchiveCallback);
/*
HRESULT result = ::OpenArchive(fullName, &archiveHandler,
archiverInfoResult, defaultName, openArchiveCallback);
*/
if (result != S_OK)
{
if (result == E_ABORT)
return (HANDLE)-2;
return INVALID_HANDLE_VALUE;
}
// ::OutputDebugString("after OpenArchive\n");
CPlugin *plugin = new CPlugin(
fullName,
// defaultName,
archiveHandler,
(const wchar_t *)archiveType
);
if (plugin == NULL)
return(INVALID_HANDLE_VALUE);
plugin->PasswordIsDefined = openArchiveCallbackSpec->PasswordIsDefined;
plugin->Password = openArchiveCallbackSpec->Password;
return (HANDLE)(plugin);
}
HANDLE WINAPI OpenFilePlugin(char *name,
const unsigned char *data, unsigned int dataSize)
{
MY_TRY_BEGIN;
if (name == NULL || (!g_Options.Enabled))
{
// if (!Opt.ProcessShiftF1)
return(INVALID_HANDLE_VALUE);
}
return MyOpenFilePlugin(name);
MY_TRY_END2("OpenFilePlugin", INVALID_HANDLE_VALUE);
}
HANDLE WINAPI OpenPlugin(int openFrom, int item)
{
MY_TRY_BEGIN;
if(openFrom == OPEN_COMMANDLINE)
{
CSysString fileName = (const char *)item;
if(fileName.IsEmpty())
return INVALID_HANDLE_VALUE;
if (fileName.Length() >= 2 &&
fileName[0] == '\"' && fileName[fileName.Length() - 1] == '\"')
fileName = fileName.Mid(1, fileName.Length() - 2);
return MyOpenFilePlugin(fileName);
}
if(openFrom == OPEN_PLUGINSMENU)
{
switch(item)
{
case 0:
{
PluginPanelItem pluginPanelItem;
if(!g_StartupInfo.ControlGetActivePanelCurrentItemInfo(pluginPanelItem))
throw 142134;
return MyOpenFilePlugin(pluginPanelItem.FindData.cFileName);
}
case 1:
{
CObjectVector<PluginPanelItem> pluginPanelItem;
if(!g_StartupInfo.ControlGetActivePanelSelectedOrCurrentItems(pluginPanelItem))
throw 142134;
if (CompressFiles(pluginPanelItem) == S_OK)
{
int t = g_StartupInfo.ControlClearPanelSelection();
g_StartupInfo.ControlRequestActivePanel(FCTL_UPDATEPANEL, NULL);
g_StartupInfo.ControlRequestActivePanel(FCTL_REDRAWPANEL, NULL);
g_StartupInfo.ControlRequestActivePanel(FCTL_UPDATEANOTHERPANEL, NULL);
g_StartupInfo.ControlRequestActivePanel(FCTL_REDRAWANOTHERPANEL, NULL);
}
return INVALID_HANDLE_VALUE;
}
default:
throw 4282215;
}
}
return INVALID_HANDLE_VALUE;
MY_TRY_END2("OpenPlugin", INVALID_HANDLE_VALUE);
}
void WINAPI ClosePlugin(HANDLE plugin)
{
MY_TRY_BEGIN;
delete (CPlugin *)plugin;
MY_TRY_END1("ClosePlugin");
}
int WINAPI GetFindData(HANDLE plugin, struct PluginPanelItem **panelItems,
int *itemsNumber,int opMode)
{
MY_TRY_BEGIN;
return(((CPlugin *)plugin)->GetFindData(panelItems, itemsNumber, opMode));
MY_TRY_END2("GetFindData", FALSE);
}
void WINAPI FreeFindData(HANDLE plugin, struct PluginPanelItem *panelItems,
int itemsNumber)
{
MY_TRY_BEGIN;
((CPlugin *)plugin)->FreeFindData(panelItems, itemsNumber);
MY_TRY_END1("FreeFindData");
}
int WINAPI GetFiles(HANDLE plugin, struct PluginPanelItem *panelItems,
int itemsNumber, int move, char *destPath, int opMode)
{
MY_TRY_BEGIN;
return(((CPlugin *)plugin)->GetFiles(panelItems, itemsNumber, move, destPath, opMode));
MY_TRY_END2("GetFiles", NFileOperationReturnCode::kError);
}
int WINAPI SetDirectory(HANDLE plugin, char *dir, int opMode)
{
MY_TRY_BEGIN;
return(((CPlugin *)plugin)->SetDirectory(dir, opMode));
MY_TRY_END2("SetDirectory", FALSE);
}
void WINAPI GetPluginInfo(struct PluginInfo *info)
{
MY_TRY_BEGIN;
info->StructSize = sizeof(*info);
info->Flags = 0;
info->DiskMenuStrings = NULL;
info->DiskMenuNumbers = NULL;
info->DiskMenuStringsNumber = 0;
static const char *pluginMenuStrings[2];
pluginMenuStrings[0] = g_StartupInfo.GetMsgString(NMessageID::kOpenArchiveMenuString);
pluginMenuStrings[1] = g_StartupInfo.GetMsgString(NMessageID::kCreateArchiveMenuString);
info->PluginMenuStrings = (char **)pluginMenuStrings;
info->PluginMenuStringsNumber = 2;
static const char *pluginCfgStrings[1];
pluginCfgStrings[0] = g_StartupInfo.GetMsgString(NMessageID::kOpenArchiveMenuString);
info->PluginConfigStrings = (char **)pluginCfgStrings;
info->PluginConfigStringsNumber = sizeof(pluginCfgStrings) / sizeof(pluginCfgStrings[0]);
info->CommandPrefix = (char *)kCommandPrefix;
MY_TRY_END1("GetPluginInfo");
}
int WINAPI Configure(int itemNumber)
{
MY_TRY_BEGIN;
const int kEnabledCheckBoxIndex = 1;
const int kYSize = 7;
struct CInitDialogItem initItems[]=
{
{ DI_DOUBLEBOX, 3, 1, 72, kYSize - 2, false, false, 0, false, NMessageID::kConfigTitle, NULL, NULL },
{ DI_CHECKBOX, 5, 2, 0, 0, true, g_Options.Enabled, 0, false, NMessageID::kConfigPluginEnabled, NULL, NULL },
{ DI_TEXT, 5, 3, 0, 0, false, false, DIF_BOXCOLOR | DIF_SEPARATOR, false, -1, "", NULL },
{ DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, true, NMessageID::kOk, NULL, NULL },
{ DI_BUTTON, 0, kYSize - 3, 0, 0, false, false, DIF_CENTERGROUP, false, NMessageID::kCancel, NULL, NULL },
};
const int kNumDialogItems = sizeof(initItems) / sizeof(initItems[0]);
const int kOkButtonIndex = kNumDialogItems - 2;
FarDialogItem dialogItems[kNumDialogItems];
g_StartupInfo.InitDialogItems(initItems, dialogItems, kNumDialogItems);
int askCode = g_StartupInfo.ShowDialog(76, kYSize,
kHelpTopicConfig, dialogItems, kNumDialogItems);
if (askCode != kOkButtonIndex)
return (FALSE);
g_Options.Enabled = BOOLToBool(dialogItems[kEnabledCheckBoxIndex].Selected);
g_StartupInfo.SetRegKeyValue(HKEY_CURRENT_USER, kRegisrtryMainKeyName,
kRegisrtryValueNameEnabled, g_Options.Enabled);
return(TRUE);
MY_TRY_END2("Configure", FALSE);
}
void WINAPI GetOpenPluginInfo(HANDLE plugin,struct OpenPluginInfo *info)
{
MY_TRY_BEGIN;
((CPlugin *)plugin)->GetOpenPluginInfo(info);
MY_TRY_END1("GetOpenPluginInfo");
}
int WINAPI PutFiles(HANDLE plugin, struct PluginPanelItem *panelItems,
int itemsNumber, int move, int opMode)
{
MY_TRY_BEGIN;
return(((CPlugin *)plugin)->PutFiles(panelItems, itemsNumber, move, opMode));
MY_TRY_END2("PutFiles", NFileOperationReturnCode::kError);
}
int WINAPI DeleteFiles(HANDLE plugin, PluginPanelItem *panelItems,
int itemsNumber, int opMode)
{
MY_TRY_BEGIN;
return(((CPlugin *)plugin)->DeleteFiles(panelItems, itemsNumber, opMode));
MY_TRY_END2("DeleteFiles", FALSE);
}
int WINAPI ProcessKey(HANDLE plugin, int key, unsigned int controlState)
{
MY_TRY_BEGIN;
return (((CPlugin *)plugin)->ProcessKey(key, controlState));
MY_TRY_END2("ProcessKey", FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -