ModernSettings: Add support for more settings

Based on `HostId`:
* {7E0522FC-1AC4-41CA-AFD0-3610417A9C41}
  execute `shell:::{PageId}`
* {12B1697E-D3A0-4DBC-B568-CCF64A3F934D}
  execute command in `DeepLink`
This commit is contained in:
ge0rdi
2020-08-31 19:20:09 +02:00
parent 7ee668e474
commit 6581868336
4 changed files with 54 additions and 15 deletions

View File

@@ -359,13 +359,13 @@ ModernSettings::Setting::Setting(const Blob& blob)
});
}
std::vector<ModernSettings::Setting> ModernSettings::enumerate() const
std::vector<std::wstring_view> ModernSettings::enumerate() const
{
std::vector<ModernSettings::Setting> retval;
std::vector<std::wstring_view> retval;
retval.reserve(m_settings.size());
for (const auto& i : m_settings)
retval.emplace_back(i.second);
retval.emplace_back(i.first);
return retval;
}

View File

@@ -127,7 +127,7 @@ public:
}
};
std::vector<Setting> enumerate() const;
std::vector<std::wstring_view> enumerate() const;
Setting get(const std::wstring_view& name) const;
private:

View File

@@ -70,6 +70,11 @@ static bool ActivateModernSettingPage(const WCHAR* page)
extern ModernSettings::Setting GetModernSetting(LPCITEMIDLIST pidl);
static HRESULT Execute(const wchar_t* cmd)
{
return (intptr_t)::ShellExecute(nullptr, L"open", cmd, nullptr, nullptr, SW_SHOWNORMAL) > 32 ? S_OK : E_FAIL;
}
static HRESULT OpenItemByPidl(LPCITEMIDLIST pidl)
{
auto child = ILFindLastID(pidl);
@@ -80,10 +85,49 @@ static HRESULT OpenItemByPidl(LPCITEMIDLIST pidl)
if (setting.hostId == L"{6E6DDBCB-9C89-434B-A994-D5F22239523B}")
{
if (setting.deepLink.empty())
return E_INVALIDARG;
std::wstring cmd(L"windowsdefender://");
cmd += setting.deepLink;
return (intptr_t)::ShellExecute(nullptr, L"open", cmd.c_str(), nullptr, nullptr, SW_SHOWNORMAL) > 32 ? S_OK : E_FAIL;
return Execute(cmd.c_str());
}
if (setting.hostId == L"{7E0522FC-1AC4-41CA-AFD0-3610417A9C41}")
{
if (setting.pageId.empty())
return E_INVALIDARG;
std::wstring cmd(L"shell:::");
cmd += setting.pageId;
return Execute(cmd.c_str());
}
if (setting.hostId == L"{12B1697E-D3A0-4DBC-B568-CCF64A3F934D}")
{
if (setting.deepLink.empty())
return E_INVALIDARG;
std::wstring cmd(setting.deepLink);
if (cmd.compare(0, 8, L"shell:::") == 0)
return Execute(cmd.c_str());
cmd.resize(MAX_PATH);
DoEnvironmentSubst(cmd.data(), (UINT)cmd.size());
STARTUPINFO startupInfo = { sizeof(startupInfo) };
PROCESS_INFORMATION processInfo{};
if (!CreateProcess(nullptr, cmd.data(), nullptr, nullptr, FALSE, 0, nullptr, nullptr, &startupInfo, &processInfo))
return E_FAIL;
CloseHandle(processInfo.hThread);
CloseHandle(processInfo.hProcess);
return S_OK;
}
if (setting.pageId.empty())

View File

@@ -91,16 +91,11 @@ public:
ULONG i = 0;
while (SUCCEEDED(hr) && i < celt && m_item < m_items.size())
{
const auto& s = m_items[m_item];
if ((s.hostId.empty() && s.deepLink.empty()) ||
(s.hostId == L"{6E6DDBCB-9C89-434B-A994-D5F22239523B}" && !s.deepLink.empty()))
hr = m_parent->CreateChildID(m_items[m_item], &rgelt[i]);
if (SUCCEEDED(hr))
{
hr = m_parent->CreateChildID(s.fileName, &rgelt[i]);
if (SUCCEEDED(hr))
{
celtFetched++;
i++;
}
celtFetched++;
i++;
}
m_item++;
@@ -141,7 +136,7 @@ public:
private:
CComPtr<CModernSettingsShellFolder> m_parent;
std::shared_ptr<ModernSettings> m_settings;
std::vector<ModernSettings::Setting> m_items;
std::vector<std::wstring_view> m_items;
DWORD m_item = 0;
};