summaryrefslogtreecommitdiffstats
path: root/PC/python_uwp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'PC/python_uwp.cpp')
-rw-r--r--PC/python_uwp.cpp263
1 files changed, 0 insertions, 263 deletions
diff --git a/PC/python_uwp.cpp b/PC/python_uwp.cpp
deleted file mode 100644
index 88369e8..0000000
--- a/PC/python_uwp.cpp
+++ /dev/null
@@ -1,263 +0,0 @@
-/* Main program when embedded in a UWP application on Windows */
-
-#include "Python.h"
-#include <string.h>
-
-#define WIN32_LEAN_AND_MEAN
-#include <Windows.h>
-#include <shellapi.h>
-#include <shlobj.h>
-
-#include <string>
-
-#include <winrt\Windows.ApplicationModel.h>
-#include <winrt\Windows.Storage.h>
-
-#ifdef PYTHONW
-#ifdef _DEBUG
-const wchar_t *PROGNAME = L"pythonw_d.exe";
-#else
-const wchar_t *PROGNAME = L"pythonw.exe";
-#endif
-#else
-#ifdef _DEBUG
-const wchar_t *PROGNAME = L"python_d.exe";
-#else
-const wchar_t *PROGNAME = L"python.exe";
-#endif
-#endif
-
-static std::wstring
-get_user_base()
-{
- 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";
- }
- }
- }
- } 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();
-}
-
-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());
- }
- }
- }
- catch (...) {
- }
-
- return std::wstring();
-}
-
-static PyStatus
-set_process_name(PyConfig *config)
-{
- PyStatus status = PyStatus_Ok();
- std::wstring executable;
-
- const auto home = get_package_home();
- const auto family = get_package_family();
-
- if (!family.empty()) {
- PWSTR localAppData;
- if (SUCCEEDED(SHGetKnownFolderPath(FOLDERID_LocalAppData, 0,
- NULL, &localAppData))) {
- executable = std::wstring(localAppData)
- + L"\\Microsoft\\WindowsApps\\"
- + family
- + L"\\"
- + PROGNAME;
-
- CoTaskMemFree(localAppData);
- }
- }
-
- /* Only use module filename if we don't have a home */
- if (home.empty() && executable.empty()) {
- executable.resize(MAX_PATH);
- while (true) {
- DWORD len = GetModuleFileNameW(
- NULL, executable.data(), (DWORD)executable.size());
- if (len == 0) {
- executable.clear();
- break;
- } else if (len == executable.size() &&
- GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
- executable.resize(len * 2);
- } else {
- executable.resize(len);
- break;
- }
- }
- size_t i = executable.find_last_of(L"/\\");
- if (i == std::wstring::npos) {
- executable = PROGNAME;
- } else {
- executable.replace(i + 1, std::wstring::npos, PROGNAME);
- }
- }
-
- if (!home.empty()) {
- status = PyConfig_SetString(config, &config->home, home.c_str());
- if (PyStatus_Exception(status)) {
- return status;
- }
- }
-
- const wchar_t *launcherPath = _wgetenv(L"__PYVENV_LAUNCHER__");
- if (launcherPath) {
- if (!executable.empty()) {
- status = PyConfig_SetString(config, &config->base_executable,
- executable.c_str());
- if (PyStatus_Exception(status)) {
- return status;
- }
- }
-
- status = PyConfig_SetString(
- config, &config->executable, launcherPath);
-
- /* bpo-35873: Clear the environment variable to avoid it being
- * inherited by child processes. */
- _wputenv_s(L"__PYVENV_LAUNCHER__", L"");
- } else if (!executable.empty()) {
- status = PyConfig_SetString(
- config, &config->executable, executable.c_str());
- }
-
- return status;
-}
-
-int
-wmain(int argc, wchar_t **argv)
-{
- PyStatus status;
- PyPreConfig preconfig;
- PyConfig config;
-
- const wchar_t *moduleName = NULL;
- const wchar_t *p = wcsrchr(argv[0], L'\\');
- if (!p) {
- p = argv[0];
- }
- if (p) {
- if (*p == L'\\') {
- p++;
- }
-
- if (wcsnicmp(p, L"pip", 3) == 0) {
- moduleName = L"pip";
- } else if (wcsnicmp(p, L"idle", 4) == 0) {
- moduleName = L"idlelib";
- }
- }
-
- PyPreConfig_InitPythonConfig(&preconfig);
- if (!moduleName) {
- status = Py_PreInitializeFromArgs(&preconfig, argc, argv);
- if (PyStatus_Exception(status)) {
- goto fail_without_config;
- }
- }
-
- PyConfig_InitPythonConfig(&config);
-
- status = PyConfig_SetArgv(&config, argc, argv);
- if (PyStatus_Exception(status)) {
- goto fail;
- }
- if (moduleName) {
- config.parse_argv = 0;
- }
-
- status = set_process_name(&config);
- if (PyStatus_Exception(status)) {
- goto fail;
- }
-
- p = _wgetenv(L"PYTHONUSERBASE");
- if (!p || !*p) {
- _wputenv_s(L"PYTHONUSERBASE", get_user_base().c_str());
- }
-
- if (moduleName) {
- status = PyConfig_SetString(&config, &config.run_module, moduleName);
- if (PyStatus_Exception(status)) {
- goto fail;
- }
- status = PyConfig_SetString(&config, &config.run_filename, NULL);
- if (PyStatus_Exception(status)) {
- goto fail;
- }
- status = PyConfig_SetString(&config, &config.run_command, NULL);
- if (PyStatus_Exception(status)) {
- goto fail;
- }
- }
-
- status = Py_InitializeFromConfig(&config);
- if (PyStatus_Exception(status)) {
- goto fail;
- }
- PyConfig_Clear(&config);
-
- return Py_RunMain();
-
-fail:
- PyConfig_Clear(&config);
-fail_without_config:
- if (PyStatus_IsExit(status)) {
- return status.exitcode;
- }
- assert(PyStatus_Exception(status));
- Py_ExitStatusException(status);
- /* Unreachable code */
- return 0;
-}
-
-#ifdef PYTHONW
-
-int WINAPI wWinMain(
- HINSTANCE hInstance, /* handle to current instance */
- HINSTANCE hPrevInstance, /* handle to previous instance */
- LPWSTR lpCmdLine, /* pointer to command line */
- int nCmdShow /* show state of window */
-)
-{
- return wmain(__argc, __wargv);
-}
-
-#endif