summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@python.org>2022-11-23 19:50:15 (GMT)
committerGitHub <noreply@github.com>2022-11-23 19:50:15 (GMT)
commit71a4a2da983a651bfcbc1be59c6e27508cdd05c6 (patch)
tree65a536e6cd79a0e23d4cbe9860aaefa862b12f33
parent55bad199cf89f5488bcfd50b897d798afd57976e (diff)
downloadcpython-71a4a2da983a651bfcbc1be59c6e27508cdd05c6.zip
cpython-71a4a2da983a651bfcbc1be59c6e27508cdd05c6.tar.gz
cpython-71a4a2da983a651bfcbc1be59c6e27508cdd05c6.tar.bz2
Use faster APIs to calculate paths at startup for Store packaged Python on Windows (GH-99345)
-rw-r--r--Misc/NEWS.d/next/Windows/2022-11-23-17-17-16.gh-issue-99345.jOa3-f.rst2
-rw-r--r--PC/python_uwp.cpp74
2 files changed, 51 insertions, 25 deletions
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 0000000..99db0c5
--- /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
diff --git a/PC/python_uwp.cpp b/PC/python_uwp.cpp
index 88369e8..2beea60 100644
--- a/PC/python_uwp.cpp
+++ b/PC/python_uwp.cpp
@@ -10,6 +10,7 @@
#include <string>
+#include <appmodel.h>
#include <winrt\Windows.ApplicationModel.h>
#include <winrt\Windows.Storage.h>
@@ -28,37 +29,49 @@ const wchar_t *PROGNAME = L"python.exe";
#endif
static std::wstring
-get_user_base()
+get_package_family()
{
try {
- const auto appData = winrt::Windows::Storage::ApplicationData::Current();
- if (appData) {
- const auto localCache = appData.LocalCacheFolder();
- if (localCache) {
- auto path = localCache.Path();
- if (!path.empty()) {
- return std::wstring(path) + L"\\local-packages";
- }
- }
+ 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;
}
- } catch (...) {
+ 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_package_family()
+get_user_base()
{
try {
- const auto package = winrt::Windows::ApplicationModel::Package::Current();
- if (package) {
- const auto id = package.Id();
- if (id) {
- return std::wstring(id.FamilyName());
+ const auto appData = winrt::Windows::Storage::ApplicationData::Current();
+ if (appData) {
+ const auto localCache = appData.LocalCacheFolder();
+ if (localCache) {
+ std::wstring path { localCache.Path().c_str() };
+ if (!path.empty()) {
+ return path + L"\\local-packages";
+ }
}
}
- }
- catch (...) {
+ } catch (...) {
}
return std::wstring();
@@ -68,13 +81,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 (...) {
}