]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Use faster APIs to calculate paths at startup for Store packaged Python on Windows...
authorSteve Dower <steve.dower@python.org>
Wed, 23 Nov 2022 19:50:15 +0000 (19:50 +0000)
committerGitHub <noreply@github.com>
Wed, 23 Nov 2022 19:50:15 +0000 (19:50 +0000)
Misc/NEWS.d/next/Windows/2022-11-23-17-17-16.gh-issue-99345.jOa3-f.rst [new file with mode: 0644]
PC/python_uwp.cpp

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 (file)
index 0000000..99db0c5
--- /dev/null
@@ -0,0 +1,2 @@
+Use faster initialization functions to detect install location for Windows
+Store package
index 88369e8fbfeb38da48c975b7d1a60ebad41a8d4f..2beea60e5af1efaa46a73f96e2eddefd832182ed 100644 (file)
@@ -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 (...) {
     }