Skip to content

Commit

Permalink
Use faster APIs to calculate paths at startup for Store packaged Pyth…
Browse files Browse the repository at this point in the history
…on on Windows (pythonGH-99345)

(cherry picked from commit 71a4a2d)

Co-authored-by: Steve Dower <steve.dower@python.org>
  • Loading branch information
miss-islington and zooba authored Nov 23, 2022
1 parent 24fad64 commit d74117a
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Use faster initialization functions to detect install location for Windows
Store package
74 changes: 49 additions & 25 deletions PC/python_uwp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#include <string>

#include <appmodel.h>
#include <winrt\Windows.ApplicationModel.h>
#include <winrt\Windows.Storage.h>

Expand All @@ -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();
Expand All @@ -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 (...) {
}
Expand Down

0 comments on commit d74117a

Please sign in to comment.