Skip to content

Use faster APIs to calculate paths at startup for Store packaged Python on Windows #99345

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Nov 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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