You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-06 12:20:30 +00:00
Added support for repackaging the generated UWP APPX file with makeappx.
(cherry picked from commit 7d7e256e7f)
This commit is contained in:
committed by
Rémi Verschelde
parent
fc32e066af
commit
36a04314bd
@@ -1200,6 +1200,51 @@ public:
|
|||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WINDOWS_ENABLED
|
||||||
|
void extract_all_files_from_zip(String zip_file_path, String extract_path) {
|
||||||
|
FileAccess *src_f = nullptr;
|
||||||
|
zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
|
||||||
|
|
||||||
|
unzFile pkg = unzOpen2(zip_file_path.utf8().get_data(), &io);
|
||||||
|
|
||||||
|
int ret = unzGoToFirstFile(pkg);
|
||||||
|
|
||||||
|
while (ret == UNZ_OK) {
|
||||||
|
// get file name
|
||||||
|
unz_file_info info;
|
||||||
|
char fname[16384];
|
||||||
|
ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, nullptr, 0, nullptr, 0);
|
||||||
|
|
||||||
|
String path = String::utf8(fname);
|
||||||
|
|
||||||
|
//write the files
|
||||||
|
Vector<uint8_t> data;
|
||||||
|
|
||||||
|
//read
|
||||||
|
data.resize(info.uncompressed_size);
|
||||||
|
unzOpenCurrentFile(pkg);
|
||||||
|
unzReadCurrentFile(pkg, data.ptrw(), data.size());
|
||||||
|
unzCloseCurrentFile(pkg);
|
||||||
|
|
||||||
|
//check if the subfolder doesn't exist and create it
|
||||||
|
String file_path = extract_path + "/" + path.get_base_dir();
|
||||||
|
DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
||||||
|
if (!da->dir_exists(file_path)) {
|
||||||
|
da->make_dir_recursive(file_path);
|
||||||
|
}
|
||||||
|
memdelete(da);
|
||||||
|
|
||||||
|
FileAccess *unzipped_file = FileAccess::open(extract_path + "/" + path, FileAccess::WRITE);
|
||||||
|
unzipped_file->store_buffer(data.ptrw(), data.size());
|
||||||
|
unzipped_file->close();
|
||||||
|
|
||||||
|
ret = unzGoToNextFile(pkg);
|
||||||
|
}
|
||||||
|
|
||||||
|
unzClose(pkg);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0) {
|
virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0) {
|
||||||
ExportNotifier notifier(*this, p_preset, p_debug, p_path, p_flags);
|
ExportNotifier notifier(*this, p_preset, p_debug, p_path, p_flags);
|
||||||
|
|
||||||
@@ -1389,6 +1434,50 @@ public:
|
|||||||
packager.finish();
|
packager.finish();
|
||||||
|
|
||||||
#ifdef WINDOWS_ENABLED
|
#ifdef WINDOWS_ENABLED
|
||||||
|
// Repackage it with makeappx if available
|
||||||
|
String makeappx_path = EditorSettings::get_singleton()->get("export/uwp/makeappx");
|
||||||
|
if (makeappx_path != String()) {
|
||||||
|
if (FileAccess::exists(makeappx_path)) {
|
||||||
|
// Get uwp_temp_path
|
||||||
|
String uwp_temp_path = EditorSettings::get_singleton()->get_cache_dir() + "/uwptemp";
|
||||||
|
|
||||||
|
// Extract current appx file
|
||||||
|
extract_all_files_from_zip(p_path, uwp_temp_path);
|
||||||
|
|
||||||
|
// Call makeappx
|
||||||
|
List<String> args_makeappx;
|
||||||
|
args_makeappx.push_back("pack");
|
||||||
|
args_makeappx.push_back("/d");
|
||||||
|
args_makeappx.push_back(uwp_temp_path);
|
||||||
|
args_makeappx.push_back("/p");
|
||||||
|
args_makeappx.push_back(p_path);
|
||||||
|
args_makeappx.push_back("/o");
|
||||||
|
|
||||||
|
OS::get_singleton()->execute(makeappx_path, args_makeappx, true);
|
||||||
|
|
||||||
|
// Delete uwp_temp_path folder recursively
|
||||||
|
DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
||||||
|
Error err = da->change_dir(uwp_temp_path);
|
||||||
|
if (err == OK) {
|
||||||
|
err = da->erase_contents_recursive();
|
||||||
|
if (err != OK) {
|
||||||
|
ERR_PRINT("Could not delete UWP temporary folder: '" + uwp_temp_path + "'.");
|
||||||
|
return err;
|
||||||
|
} else {
|
||||||
|
da->remove(uwp_temp_path);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ERR_PRINT("Could not change dir to UWP temporary folder: '" + uwp_temp_path + "'.");
|
||||||
|
ERR_PRINT("Could not delete UWP temporary folder: '" + uwp_temp_path + "'.");
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
memdelete(da);
|
||||||
|
} else {
|
||||||
|
ERR_PRINT("Could not find makeappx executable at " + makeappx_path + ", aborting.");
|
||||||
|
return ERR_FILE_NOT_FOUND;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Sign with signtool
|
// Sign with signtool
|
||||||
String signtool_path = EditorSettings::get_singleton()->get("export/uwp/signtool");
|
String signtool_path = EditorSettings::get_singleton()->get("export/uwp/signtool");
|
||||||
if (signtool_path == String()) {
|
if (signtool_path == String()) {
|
||||||
@@ -1466,6 +1555,8 @@ void register_uwp_exporter() {
|
|||||||
#ifdef WINDOWS_ENABLED
|
#ifdef WINDOWS_ENABLED
|
||||||
EDITOR_DEF("export/uwp/signtool", "");
|
EDITOR_DEF("export/uwp/signtool", "");
|
||||||
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/uwp/signtool", PROPERTY_HINT_GLOBAL_FILE, "*.exe"));
|
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/uwp/signtool", PROPERTY_HINT_GLOBAL_FILE, "*.exe"));
|
||||||
|
EDITOR_DEF("export/uwp/makeappx", "");
|
||||||
|
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/uwp/makeappx", PROPERTY_HINT_GLOBAL_FILE, "*.exe"));
|
||||||
EDITOR_DEF("export/uwp/debug_certificate", "");
|
EDITOR_DEF("export/uwp/debug_certificate", "");
|
||||||
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/uwp/debug_certificate", PROPERTY_HINT_GLOBAL_FILE, "*.pfx"));
|
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/uwp/debug_certificate", PROPERTY_HINT_GLOBAL_FILE, "*.pfx"));
|
||||||
EDITOR_DEF("export/uwp/debug_password", "");
|
EDITOR_DEF("export/uwp/debug_password", "");
|
||||||
|
|||||||
Reference in New Issue
Block a user