static void SetDriveMenuHotkeys() { long long InitDriveMenuHotkeys = 1; ConfigProvider().GeneralCfg()->GetValue(L"Interface"sv, L"InitDriveMenuHotkeys"sv, InitDriveMenuHotkeys, InitDriveMenuHotkeys); if (InitDriveMenuHotkeys) { static const struct { string_view PluginId; GUID MenuId; string_view Hotkey; } DriveMenuHotkeys[] = { { L"1E26A927-5135-48C6-88B2-845FB8945484"sv, { 0x61026851, 0x2643, 0x4C67, { 0xBF, 0x80, 0xD3, 0xC7, 0x7A, 0x3A, 0xE8, 0x30 } }, L"0"sv }, // ProcList { L"B77C964B-E31E-4D4C-8FE5-D6B0C6853E7C"sv, { 0xF98C70B3, 0xA1AE, 0x4896, { 0x93, 0x88, 0xC5, 0xC8, 0xE0, 0x50, 0x13, 0xB7 } }, L"1"sv }, // TmpPanel { L"42E4AEB1-A230-44F4-B33C-F195BB654931"sv, { 0xC9FB4F53, 0x54B5, 0x48FF, { 0x9B, 0xA2, 0xE8, 0xEB, 0x27, 0xF0, 0x12, 0xA2 } }, L"2"sv }, // NetBox { L"773B5051-7C5F-4920-A201-68051C4176A4"sv, { 0x24B6DD41, 0xDF12, 0x470A, { 0xA4, 0x7C, 0x86, 0x75, 0xED, 0x8D, 0x2E, 0xD4 } }, L"3"sv }, // Network }; std::for_each(CONST_RANGE(DriveMenuHotkeys, i) { ConfigProvider().PlHotkeyCfg()->SetHotkey(i.PluginId, i.MenuId, hotkey_type::drive_menu, i.Hotkey); });
PluginSettings::PluginSettings(const GUID& Guid, bool Local): PluginsCfg(nullptr) { const auto pPlugin = Global->CtrlObject->Plugins->FindPlugin(Guid); if (pPlugin) { string strGuid = GuidToStr(Guid); PluginsCfg = ConfigProvider().CreatePluginsConfig(strGuid, Local); m_Keys.emplace_back(PluginsCfg->CreateKey(HierarchicalConfig::root_key(), strGuid, &pPlugin->GetTitle())); if (!Global->Opt->ReadOnlyConfig) { DizList Diz; string strDbPath = Local ? Global->Opt->LocalProfilePath : Global->Opt->ProfilePath; AddEndSlash(strDbPath); strDbPath += L"PluginsData\\"; Diz.Read(strDbPath); string strDbName = strGuid + L".db"; string Description = string(pPlugin->GetTitle()) + L" (" + pPlugin->GetDescription() + L")"; if(Description != NullToEmpty(Diz.GetDizTextAddr(strDbName, L"", 0))) { Diz.AddDizText(strDbName, L"", Description); Diz.Flush(strDbPath); } } } }
static auto GetFavoritesEnumerator() { return select(ConfigProvider().GeneralCfg()->ValuesEnumerator<long long>(FavoriteCodePagesKey()), [](const auto& i) { return std::pair(std::stoul(i.first), i.second); }); }
size_t GetDescriptionWidth() { size_t Width = 0; DWORD Index=0; unsigned __int64 id; string strMask; string strDescription; filemasks FMask; while (ConfigProvider().AssocConfig()->EnumMasks(Index++,&id,strMask)) { if (!FMask.Set(strMask, FMF_SILENT)) continue; ConfigProvider().AssocConfig()->GetDescription(id,strDescription); Width = std::max(Width, HiStrlen(strDescription)); } return Width; }
static void UpdateErrorMode() { Global->ErrorMode |= SEM_NOGPFAULTERRORBOX; long long IgnoreDataAlignmentFaults = 0; ConfigProvider().GeneralCfg()->GetValue(L"System.Exception"sv, L"IgnoreDataAlignmentFaults"sv, IgnoreDataAlignmentFaults, IgnoreDataAlignmentFaults); if (IgnoreDataAlignmentFaults) { Global->ErrorMode |= SEM_NOALIGNMENTFAULTEXCEPT; } os::set_error_mode(Global->ErrorMode); }
bool Plugin::LoadFromCache(const os::FAR_FIND_DATA &FindData) { const auto& PlCache = *ConfigProvider().PlCacheCfg(); if (const auto id = PlCache.GetCacheID(m_strCacheName)) { if (PlCache.IsPreload(id)) //PF_PRELOAD plugin, skip cache { WorkFlags.Set(PIWF_PRELOADED); return false; } { string strCurPluginID = str_printf( L"%I64x%x%x", FindData.nFileSize, FindData.ftCreationTime.dwLowDateTime, FindData.ftLastWriteTime.dwLowDateTime ); string strPluginID = PlCache.GetSignature(id); if (strPluginID != strCurPluginID) //одинаковые ли бинарники? return false; } if (!PlCache.GetMinFarVersion(id, &MinFarVersion)) { MinFarVersion = FAR_VERSION; } if (!PlCache.GetVersion(id, &PluginVersion)) { ClearStruct(PluginVersion); } VersionString = VersionToString(PluginVersion); m_strGuid = PlCache.GetGuid(id); SetGuid(StrToGuid(m_strGuid,m_Guid)?m_Guid:FarGuid); strTitle = PlCache.GetTitle(id); strDescription = PlCache.GetDescription(id); strAuthor = PlCache.GetAuthor(id); m_model->LoadExportsFromCache(PlCache, id, Exports); WorkFlags.Set(PIWF_CACHED); //too much "cached" flags return true; } return false; }
void History::CompactHistory() { SCOPED_ACTION(auto)(ConfigProvider().HistoryCfg()->ScopedTransaction()); ConfigProvider().HistoryCfg()->DeleteOldUnlocked(HISTORYTYPE_CMD, L"", Global->Opt->HistoryLifetime, Global->Opt->HistoryCount); ConfigProvider().HistoryCfg()->DeleteOldUnlocked(HISTORYTYPE_FOLDER, L"", Global->Opt->FoldersHistoryLifetime, Global->Opt->FoldersHistoryCount); ConfigProvider().HistoryCfg()->DeleteOldUnlocked(HISTORYTYPE_VIEW, L"", Global->Opt->ViewHistoryLifetime, Global->Opt->ViewHistoryCount); DWORD index=0; string strName; while (ConfigProvider().HistoryCfg()->EnumLargeHistories(index++, Global->Opt->DialogsHistoryCount, HISTORYTYPE_DIALOG, strName)) { ConfigProvider().HistoryCfg()->DeleteOldUnlocked(HISTORYTYPE_DIALOG, strName, Global->Opt->DialogsHistoryLifetime, Global->Opt->DialogsHistoryCount); } }
static bool ProcessServiceModes(range<const wchar_t* const*> const Args, int& ServiceResult) { const auto& isArg = [](const wchar_t* Arg, string_view const Name) { return (*Arg == L'/' || *Arg == L'-') && equal_icase(Arg + 1, Name); }; if (Args.size() == 4 && IsElevationArgument(Args[0])) // /service:elevation {GUID} PID UsePrivileges { ServiceResult = ElevationMain(Args[1], std::wcstoul(Args[2], nullptr, 10), *Args[3] == L'1'); return true; } if (InRange(2u, Args.size(), 5u) && (isArg(Args[0], L"export"sv) || isArg(Args[0], L"import"sv))) { const auto Export = isArg(Args[0], L"export"sv); string strProfilePath(Args.size() > 2 ? Args[2] : L""), strLocalProfilePath(Args.size() > 3 ? Args[3] : L""), strTemplatePath(Args.size() > 4 ? Args[4] : L""); InitTemplateProfile(strTemplatePath); InitProfile(strProfilePath, strLocalProfilePath); Global->m_ConfigProvider = new config_provider(Export? config_provider::mode::m_export : config_provider::mode::m_import); ServiceResult = !ConfigProvider().ServiceMode(Args[1]); return true; } if (InRange(1u, Args.size(), 3u) && isArg(Args[0], L"clearcache"sv)) { string strProfilePath(Args.size() > 1 ? Args[1] : L""); string strLocalProfilePath(Args.size() > 2 ? Args[2] : L""); InitProfile(strProfilePath, strLocalProfilePath); config_provider::ClearPluginsCache(); ServiceResult = 0; return true; } return false; }
bool Plugin::SaveToCache() { PluginInfo Info = {sizeof(Info)}; GetPluginInfo(&Info); auto& PlCache = *ConfigProvider().PlCacheCfg(); SCOPED_ACTION(auto)(PlCache.ScopedTransaction()); PlCache.DeleteCache(m_strCacheName); unsigned __int64 id = PlCache.CreateCache(m_strCacheName); { bool bPreload = (Info.Flags & PF_PRELOAD); PlCache.SetPreload(id, bPreload); WorkFlags.Change(PIWF_PRELOADED, bPreload); if (bPreload) { PlCache.EndTransaction(); return true; } } { string strCurPluginID; os::FAR_FIND_DATA fdata; os::GetFindDataEx(m_strModuleName, fdata); strCurPluginID = str_printf( L"%I64x%x%x", fdata.nFileSize, fdata.ftCreationTime.dwLowDateTime, fdata.ftLastWriteTime.dwLowDateTime ); PlCache.SetSignature(id, strCurPluginID); } for (size_t i = 0; i < Info.DiskMenu.Count; i++) { PlCache.SetDiskMenuItem(id, i, Info.DiskMenu.Strings[i], GuidToStr(Info.DiskMenu.Guids[i])); } for (size_t i = 0; i < Info.PluginMenu.Count; i++) { PlCache.SetPluginsMenuItem(id, i, Info.PluginMenu.Strings[i], GuidToStr(Info.PluginMenu.Guids[i])); } for (size_t i = 0; i < Info.PluginConfig.Count; i++) { PlCache.SetPluginsConfigMenuItem(id, i, Info.PluginConfig.Strings[i], GuidToStr(Info.PluginConfig.Guids[i])); } PlCache.SetCommandPrefix(id, NullToEmpty(Info.CommandPrefix)); PlCache.SetFlags(id, Info.Flags); PlCache.SetMinFarVersion(id, &MinFarVersion); PlCache.SetGuid(id, m_strGuid); PlCache.SetVersion(id, &PluginVersion); PlCache.SetTitle(id, strTitle); PlCache.SetDescription(id, strDescription); PlCache.SetAuthor(id, strAuthor); m_model->SaveExportsToCache(PlCache, id, Exports); return true; }
static int MainProcess( const string& EditName, const string& ViewName, const string& DestName1, const string& DestName2, int StartLine, int StartChar ) { SCOPED_ACTION(ChangePriority)(THREAD_PRIORITY_NORMAL); FarColor InitAttributes={}; console.GetTextAttributes(InitAttributes); SetRealColor(colors::PaletteColorToFarColor(COL_COMMANDLINEUSERSCREEN)); string ename(EditName),vname(ViewName), apanel(DestName1),ppanel(DestName2); if (ConfigProvider().ShowProblems()) { ename.clear(); vname.clear(); StartLine = StartChar = -1; apanel = Global->Opt->ProfilePath; ppanel = Global->Opt->LocalProfilePath; } if (!ename.empty() || !vname.empty()) { Global->OnlyEditorViewerUsed = true; _tran(SysLog(L"create dummy panels")); Global->CtrlObject->CreateDummyFilePanels(); Global->WindowManager->PluginCommit(); Global->CtrlObject->Plugins->LoadPlugins(); Global->CtrlObject->Macro.LoadMacros(true, true); if (!ename.empty()) { const auto ShellEditor = FileEditor::create(ename, CP_DEFAULT, FFILEEDIT_CANNEWFILE | FFILEEDIT_ENABLEF6, StartLine, StartChar); _tran(SysLog(L"make shelleditor %p",ShellEditor)); if (!ShellEditor->GetExitCode()) // ???????????? { Global->WindowManager->ExitMainLoop(0); } } // TODO: Этот else убрать только после разборок с возможностью задавать несколько /e и /v в ком.строке else if (!vname.empty()) { const auto ShellViewer = FileViewer::create(vname, true); if (!ShellViewer->GetExitCode()) { Global->WindowManager->ExitMainLoop(0); } _tran(SysLog(L"make shellviewer, %p",ShellViewer)); } Global->WindowManager->EnterMainLoop(); } else { int DirCount=0; // воспользуемся тем, что ControlObject::Init() создает панели // юзая Global->Opt->* const auto& SetupPanel = [&](bool active) { ++DirCount; string strPath = active? apanel : ppanel; if (os::fs::is_file(strPath)) { CutToParent(strPath); } bool Root = false; const auto Type = ParsePath(strPath, nullptr, &Root); if(Root && (Type == root_type::drive_letter || Type == root_type::unc_drive_letter || Type == root_type::volume)) { AddEndSlash(strPath); } auto& CurrentPanelOptions = (Global->Opt->LeftFocus == active)? Global->Opt->LeftPanel : Global->Opt->RightPanel; CurrentPanelOptions.m_Type = static_cast<int>(panel_type::FILE_PANEL); // сменим моду панели CurrentPanelOptions.Visible = true; // и включим ее CurrentPanelOptions.Folder = strPath; }; if (!apanel.empty()) { SetupPanel(true); if (!ppanel.empty()) { SetupPanel(false); } } // теперь все готово - создаем панели! Global->CtrlObject->Init(DirCount); // а теперь "провалимся" в каталог или хост-файл (если получится ;-) if (!apanel.empty()) // активная панель { const auto ActivePanel = Global->CtrlObject->Cp()->ActivePanel(); const auto AnotherPanel = Global->CtrlObject->Cp()->PassivePanel(); if (!ppanel.empty()) // пассивная панель { FarChDir(AnotherPanel->GetCurDir()); if (IsPluginPrefixPath(ppanel)) { AnotherPanel->Parent()->SetActivePanel(AnotherPanel); execute_info Info; Info.Command = ppanel; Global->CtrlObject->CmdLine()->ExecString(Info); ActivePanel->Parent()->SetActivePanel(ActivePanel); } else { const auto strPath = PointToName(ppanel); if (!strPath.empty()) { if (AnotherPanel->GoToFile(strPath)) AnotherPanel->ProcessKey(Manager::Key(KEY_CTRLPGDN)); } } } FarChDir(ActivePanel->GetCurDir()); if (IsPluginPrefixPath(apanel)) { execute_info Info; Info.Command = apanel; Global->CtrlObject->CmdLine()->ExecString(Info); } else { const auto strPath = PointToName(apanel); if (!strPath.empty()) { if (ActivePanel->GoToFile(strPath)) ActivePanel->ProcessKey(Manager::Key(KEY_CTRLPGDN)); } } // !!! ВНИМАНИЕ !!! // Сначала редравим пассивную панель, а потом активную! AnotherPanel->Redraw(); ActivePanel->Redraw(); } Global->WindowManager->EnterMainLoop(); } TreeList::FlushCache(); // очистим за собой! SetScreen(0,0,ScrX,ScrY,L' ',colors::PaletteColorToFarColor(COL_COMMANDLINEUSERSCREEN)); console.SetTextAttributes(InitAttributes); Global->ScrBuf->ResetLockCount(); Global->ScrBuf->Flush(); return 0; }
const std::unique_ptr<HistoryConfig>& History::HistoryCfgRef() const { return m_EnableSave? ConfigProvider().HistoryCfg() : ConfigProvider().HistoryCfgMem(); }
/* $ 06.07.2001 + Используем filemasks вместо GetCommaWord, этим самым добиваемся того, что можно использовать маски исключения - Убрал непонятный мне запрет на использование маски файлов типа "*.*" (был когда-то, вроде, такой баг-репорт) */ bool ProcessLocalFileTypes(const string& Name, const string& ShortName, FILETYPE_MODE Mode, bool AlwaysWaitFinish) { string strCommand, strDescription, strMask; { const auto TypesMenu = VMenu2::create(MSG(MSelectAssocTitle), nullptr, 0, ScrY - 4); TypesMenu->SetHelp(L"FileAssoc"); TypesMenu->SetMenuFlags(VMENU_WRAPMODE); TypesMenu->SetId(SelectAssocMenuId); int ActualCmdCount=0; // отображаемых ассоциаций в меню filemasks FMask; // для работы с масками файлов int CommandCount=0; DWORD Index=0; unsigned __int64 id; string FileName = PointToName(Name); while (ConfigProvider().AssocConfig()->EnumMasksForType(Mode,Index++,&id,strMask)) { strCommand.clear(); if (FMask.Set(strMask,FMF_SILENT)) { if (FMask.Compare(FileName)) { ConfigProvider().AssocConfig()->GetCommand(id,Mode,strCommand); if (!strCommand.empty()) { ConfigProvider().AssocConfig()->GetDescription(id,strDescription); CommandCount++; } } if (strCommand.empty()) continue; } string strCommandText = strCommand; SubstFileName(nullptr,strCommandText,Name, ShortName,nullptr,nullptr,nullptr,nullptr,TRUE); // все "подставлено", теперь проверим условия "if exist" if (!ExtractIfExistCommand(strCommandText)) continue; ActualCmdCount++; if (!strDescription.empty()) SubstFileName(nullptr,strDescription, Name, ShortName, nullptr, nullptr, nullptr, nullptr, TRUE); else strDescription = strCommandText; MenuItemEx TypesMenuItem(strDescription); TypesMenuItem.SetSelect(Index==1); TypesMenuItem.UserData = strCommand; TypesMenu->AddItem(TypesMenuItem); } if (!CommandCount) return false; if (!ActualCmdCount) return true; int ExitCode=0; if (ActualCmdCount>1) { ExitCode=TypesMenu->Run(); if (ExitCode<0) return true; } strCommand = *TypesMenu->GetUserDataPtr<string>(ExitCode); } string strListName, strAnotherListName, strShortListName, strAnotherShortListName; const string* ListNames[] = { &strListName, &strAnotherListName, &strShortListName, &strAnotherShortListName }; int PreserveLFN=SubstFileName(nullptr,strCommand, Name, ShortName, &strListName, &strAnotherListName, &strShortListName, &strAnotherShortListName); const auto ListFileUsed = !std::all_of(ALL_CONST_RANGE(ListNames), std::mem_fn(&string::empty)); // Снова все "подставлено", теперь проверим условия "if exist" if (ExtractIfExistCommand(strCommand)) { SCOPED_ACTION(PreserveLongName)(ShortName, PreserveLFN); RemoveExternalSpaces(strCommand); if (!strCommand.empty()) { Global->CtrlObject->CmdLine()->ExecString(strCommand,AlwaysWaitFinish, false, false, ListFileUsed, false, Mode == FILETYPE_VIEW || Mode == FILETYPE_ALTVIEW || Mode == FILETYPE_EDIT || Mode == FILETYPE_ALTEDIT); if (!(Global->Opt->ExcludeCmdHistory&EXCLUDECMDHISTORY_NOTFARASS) && !AlwaysWaitFinish) //AN { const auto curDir = Global->CtrlObject->CmdLine()->GetCurDir(); Global->CtrlObject->CmdHistory->AddToHistory(strCommand, HR_DEFAULT, nullptr, nullptr, curDir.data()); } } } std::for_each(CONST_RANGE(ListNames, i) { if (!i->empty()) os::DeleteFile(*i); });