From 6b68ed11cfef9a4755e4be2bee705a9e8de9002e Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 8 Nov 2022 20:43:41 +0000 Subject: [PATCH 1/3] Change to more performant functions for UWP launcher --- PC/python_uwp.cpp | 89 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 65 insertions(+), 24 deletions(-) diff --git a/PC/python_uwp.cpp b/PC/python_uwp.cpp index 88369e8fbfeb38..9ced3b04fd1c2a 100644 --- a/PC/python_uwp.cpp +++ b/PC/python_uwp.cpp @@ -10,6 +10,7 @@ #include +#include #include #include @@ -27,15 +28,61 @@ const wchar_t *PROGNAME = L"python.exe"; #endif #endif +static std::wstring +get_package_family() +{ + try { + UINT32 nameLength = MAX_PATH; + std::wstring name; + name.resize(nameLength); + DWORD rc = GetCurrentPackageFamilyName(&nameLength, name.data()); + if (rc == ERROR_SUCCESS) { + name.resize(nameLength - 1); + return name; + } + else if (rc != ERROR_INSUFFICIENT_BUFFER) { + throw rc; + } + name.resize(nameLength); + rc = GetCurrentPackageFamilyName(&nameLength, name.data()); + if (rc != ERROR_SUCCESS) { + throw rc; + } + name.resize(nameLength - 1); + return name; + } + catch (...) { + } + + return std::wstring(); +} + static std::wstring get_user_base() { + const auto family = get_package_family(); + std::wstring path; + + if (!family.empty()) { + PWSTR localAppData; + if (SUCCEEDED(SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, + NULL, &localAppData))) { + path = std::wstring(localAppData) + + L"\\Packages\\" + + family + + L"\\LocalCache\\local-packages"; + + CoTaskMemFree(localAppData); + return path; + } + } + try { const auto appData = winrt::Windows::Storage::ApplicationData::Current(); if (appData) { const auto localCache = appData.LocalCacheFolder(); if (localCache) { - auto path = localCache.Path(); + path = localCache.Path(); if (!path.empty()) { return std::wstring(path) + L"\\local-packages"; } @@ -43,23 +90,6 @@ get_user_base() } } catch (...) { } - return std::wstring(); -} - -static std::wstring -get_package_family() -{ - try { - const auto package = winrt::Windows::ApplicationModel::Package::Current(); - if (package) { - const auto id = package.Id(); - if (id) { - return std::wstring(id.FamilyName()); - } - } - } - catch (...) { - } return std::wstring(); } @@ -68,13 +98,24 @@ static std::wstring get_package_home() { try { - const auto package = winrt::Windows::ApplicationModel::Package::Current(); - if (package) { - const auto path = package.InstalledLocation(); - if (path) { - return std::wstring(path.Path()); - } + UINT32 pathLength = MAX_PATH; + std::wstring path; + path.resize(pathLength); + DWORD rc = GetCurrentPackagePath(&pathLength, path.data()); + if (rc == ERROR_SUCCESS) { + path.resize(pathLength - 1); + return path; + } + else if (rc != ERROR_INSUFFICIENT_BUFFER) { + throw rc; + } + path.resize(pathLength); + rc = GetCurrentPackagePath(&pathLength, path.data()); + if (rc != ERROR_SUCCESS) { + throw rc; } + path.resize(pathLength - 1); + return path; } catch (...) { } From edc732ee79dc404244e901f680b4f93262ab53a2 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 10 Nov 2022 20:53:32 +0000 Subject: [PATCH 2/3] Remove bad optimisation --- PC/python_uwp.cpp | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/PC/python_uwp.cpp b/PC/python_uwp.cpp index 9ced3b04fd1c2a..2beea60e5af1ef 100644 --- a/PC/python_uwp.cpp +++ b/PC/python_uwp.cpp @@ -60,31 +60,14 @@ get_package_family() static std::wstring get_user_base() { - const auto family = get_package_family(); - std::wstring path; - - if (!family.empty()) { - PWSTR localAppData; - if (SUCCEEDED(SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, - NULL, &localAppData))) { - path = std::wstring(localAppData) - + L"\\Packages\\" - + family - + L"\\LocalCache\\local-packages"; - - CoTaskMemFree(localAppData); - return path; - } - } - try { const auto appData = winrt::Windows::Storage::ApplicationData::Current(); if (appData) { const auto localCache = appData.LocalCacheFolder(); if (localCache) { - path = localCache.Path(); + std::wstring path { localCache.Path().c_str() }; if (!path.empty()) { - return std::wstring(path) + L"\\local-packages"; + return path + L"\\local-packages"; } } } From e129378fcb8724ca91350c07150c4dbdc558adce Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Wed, 23 Nov 2022 17:17:22 +0000 Subject: [PATCH 3/3] NEWS --- .../next/Windows/2022-11-23-17-17-16.gh-issue-99345.jOa3-f.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Windows/2022-11-23-17-17-16.gh-issue-99345.jOa3-f.rst diff --git a/Misc/NEWS.d/next/Windows/2022-11-23-17-17-16.gh-issue-99345.jOa3-f.rst b/Misc/NEWS.d/next/Windows/2022-11-23-17-17-16.gh-issue-99345.jOa3-f.rst new file mode 100644 index 00000000000000..99db0c55a67eed --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2022-11-23-17-17-16.gh-issue-99345.jOa3-f.rst @@ -0,0 +1,2 @@ +Use faster initialization functions to detect install location for Windows +Store package