mirror of
https://github.com/godotengine/godot.git
synced 2024-11-10 22:23:07 +00:00
Export: Remove temp files from cache after export
So far we left most temporary files lying around, so this attempts to fix that. I added a helper method to DirAccess to factor out the boilerplate of creating a DirAccess, checking if the file exists, remove it or print an error on failure.
This commit is contained in:
parent
5441aaf768
commit
37a16fee05
@ -97,6 +97,18 @@ public:
|
||||
virtual Error rename(String p_from, String p_to) = 0;
|
||||
virtual Error remove(String p_name) = 0;
|
||||
|
||||
// Meant for editor code when we want to quickly remove a file without custom
|
||||
// handling (e.g. removing a cache file).
|
||||
static void remove_file_or_error(String p_path) {
|
||||
DirAccess *da = create(ACCESS_FILESYSTEM);
|
||||
if (da->file_exists(p_path)) {
|
||||
if (da->remove(p_path) != OK) {
|
||||
ERR_FAIL_MSG("Cannot remove file or directory: " + p_path);
|
||||
}
|
||||
}
|
||||
memdelete(da);
|
||||
}
|
||||
|
||||
virtual String get_filesystem_type() const = 0;
|
||||
static String get_full_path(const String &p_path, AccessType p_access);
|
||||
static DirAccess *create_for_path(const String &p_path);
|
||||
|
@ -35,6 +35,7 @@
|
||||
#include "core/io/resource_saver.h"
|
||||
#include "core/io/zip_io.h"
|
||||
#include "core/math/crypto_core.h"
|
||||
#include "core/os/dir_access.h"
|
||||
#include "core/os/file_access.h"
|
||||
#include "core/project_settings.h"
|
||||
#include "core/script_language.h"
|
||||
@ -884,6 +885,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
||||
String engine_cfb = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmp" + config_file);
|
||||
ProjectSettings::get_singleton()->save_custom(engine_cfb, custom_map, custom_list);
|
||||
Vector<uint8_t> data = FileAccess::get_file_as_array(engine_cfb);
|
||||
DirAccess::remove_file_or_error(engine_cfb);
|
||||
|
||||
p_func(p_udata, "res://" + config_file, data, idx, total);
|
||||
|
||||
@ -916,8 +918,10 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, c
|
||||
|
||||
memdelete(ftmp); //close tmp file
|
||||
|
||||
if (err)
|
||||
if (err != OK) {
|
||||
DirAccess::remove_file_or_error(tmppath);
|
||||
return err;
|
||||
}
|
||||
|
||||
pd.file_ofs.sort(); //do sort, so we can do binary search later
|
||||
|
||||
@ -926,11 +930,17 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, c
|
||||
if (!p_embed) {
|
||||
// Regular output to separate PCK file
|
||||
f = FileAccess::open(p_path, FileAccess::WRITE);
|
||||
ERR_FAIL_COND_V(!f, ERR_CANT_CREATE);
|
||||
if (!f) {
|
||||
DirAccess::remove_file_or_error(tmppath);
|
||||
ERR_FAIL_V(ERR_CANT_CREATE);
|
||||
}
|
||||
} else {
|
||||
// Append to executable
|
||||
f = FileAccess::open(p_path, FileAccess::READ_WRITE);
|
||||
ERR_FAIL_COND_V(!f, ERR_FILE_CANT_OPEN);
|
||||
if (!f) {
|
||||
DirAccess::remove_file_or_error(tmppath);
|
||||
ERR_FAIL_V(ERR_FILE_CANT_OPEN);
|
||||
}
|
||||
|
||||
f->seek_end();
|
||||
embed_pos = f->get_position();
|
||||
@ -995,13 +1005,13 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, c
|
||||
f->store_8(0);
|
||||
}
|
||||
|
||||
//save the rest of the data
|
||||
// Save the rest of the data.
|
||||
|
||||
ftmp = FileAccess::open(tmppath, FileAccess::READ);
|
||||
if (!ftmp) {
|
||||
memdelete(f);
|
||||
ERR_EXPLAIN("Can't open file to read from path: " + String(tmppath));
|
||||
ERR_FAIL_V(ERR_CANT_CREATE);
|
||||
DirAccess::remove_file_or_error(tmppath);
|
||||
ERR_FAIL_V_MSG(ERR_CANT_CREATE, "Can't open file to read from path: " + String(tmppath));
|
||||
}
|
||||
|
||||
const int bufsize = 16384;
|
||||
@ -1035,6 +1045,7 @@ Error EditorExportPlatform::save_pack(const Ref<EditorExportPreset> &p_preset, c
|
||||
}
|
||||
|
||||
memdelete(f);
|
||||
DirAccess::remove_file_or_error(tmppath);
|
||||
|
||||
return OK;
|
||||
}
|
||||
@ -1043,8 +1054,6 @@ Error EditorExportPlatform::save_zip(const Ref<EditorExportPreset> &p_preset, co
|
||||
|
||||
EditorProgress ep("savezip", TTR("Packing"), 102, true);
|
||||
|
||||
//FileAccess *tmp = FileAccess::open(tmppath,FileAccess::WRITE);
|
||||
|
||||
FileAccess *src_f;
|
||||
zlib_filefunc_def io = zipio_create_io_from_file(&src_f);
|
||||
zipFile zip = zipOpen2(p_path.utf8().get_data(), APPEND_STATUS_CREATE, NULL, &io);
|
||||
@ -1694,11 +1703,18 @@ void EditorExportTextSceneToBinaryPlugin::_export_file(const String &p_path, con
|
||||
bool convert = GLOBAL_GET("editor/convert_text_resources_to_binary_on_export");
|
||||
if (!convert)
|
||||
return;
|
||||
String tmp_path = EditorSettings::get_singleton()->get_cache_dir().plus_file("file.res");
|
||||
String tmp_path = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmpfile.res");
|
||||
Error err = ResourceFormatLoaderText::convert_file_to_binary(p_path, tmp_path);
|
||||
ERR_FAIL_COND(err != OK);
|
||||
if (err != OK) {
|
||||
DirAccess::remove_file_or_error(tmp_path);
|
||||
ERR_FAIL();
|
||||
}
|
||||
Vector<uint8_t> data = FileAccess::get_file_as_array(tmp_path);
|
||||
ERR_FAIL_COND(data.size() == 0);
|
||||
if (data.size() == 0) {
|
||||
DirAccess::remove_file_or_error(tmp_path);
|
||||
ERR_FAIL();
|
||||
}
|
||||
DirAccess::remove_file_or_error(tmp_path);
|
||||
add_file(p_path + ".converted.res", data, true);
|
||||
}
|
||||
|
||||
|
@ -422,14 +422,16 @@ void ExportTemplateManager::_http_download_templates_completed(int p_status, int
|
||||
String path = download_templates->get_download_file();
|
||||
template_list_state->set_text(TTR("Download Complete."));
|
||||
template_downloader->hide();
|
||||
int ret = _install_from_file(path, false);
|
||||
bool ret = _install_from_file(path, false);
|
||||
if (ret) {
|
||||
Error err = OS::get_singleton()->move_to_trash(path);
|
||||
// Clean up downloaded file.
|
||||
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
||||
Error err = da->remove(path);
|
||||
if (err != OK) {
|
||||
EditorNode::get_singleton()->add_io_error(TTR("Cannot remove:") + "\n" + path + "\n");
|
||||
EditorNode::get_singleton()->add_io_error(TTR("Cannot remove temporary file:") + "\n" + path + "\n");
|
||||
}
|
||||
} else {
|
||||
WARN_PRINTS(vformat(TTR("Templates installation failed. The problematic templates archives can be found at '%s'."), path));
|
||||
EditorNode::get_singleton()->add_io_error(vformat(TTR("Templates installation failed.\nThe problematic templates archives can be found at '%s'."), path));
|
||||
}
|
||||
}
|
||||
} break;
|
||||
@ -458,7 +460,7 @@ void ExportTemplateManager::_begin_template_download(const String &p_url) {
|
||||
|
||||
Error err = download_templates->request(p_url);
|
||||
if (err != OK) {
|
||||
EditorNode::get_singleton()->show_warning(TTR("Error requesting url: ") + p_url);
|
||||
EditorNode::get_singleton()->show_warning(TTR("Error requesting URL:") + " " + p_url);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -354,16 +354,16 @@ void EditorAssetLibraryItemDownload::_http_download_completed(int p_status, int
|
||||
} break;
|
||||
case HTTPRequest::RESULT_REQUEST_FAILED: {
|
||||
error_text = TTR("Request failed, return code:") + " " + itos(p_code);
|
||||
status->set_text(TTR("Request Failed."));
|
||||
status->set_text(TTR("Request failed."));
|
||||
} break;
|
||||
case HTTPRequest::RESULT_DOWNLOAD_FILE_CANT_OPEN:
|
||||
case HTTPRequest::RESULT_DOWNLOAD_FILE_WRITE_ERROR: {
|
||||
error_text = TTR("Cannot save response to") + " " + download->get_download_file();
|
||||
error_text = TTR("Cannot save response to:") + " " + download->get_download_file();
|
||||
status->set_text(TTR("Write error."));
|
||||
} break;
|
||||
case HTTPRequest::RESULT_REDIRECT_LIMIT_REACHED: {
|
||||
error_text = TTR("Request failed, too many redirects");
|
||||
status->set_text(TTR("Redirect Loop."));
|
||||
status->set_text(TTR("Redirect loop."));
|
||||
} break;
|
||||
case HTTPRequest::RESULT_TIMEOUT: {
|
||||
error_text = TTR("Request failed, timeout");
|
||||
@ -472,9 +472,8 @@ void EditorAssetLibraryItemDownload::_notification(int p_what) {
|
||||
}
|
||||
void EditorAssetLibraryItemDownload::_close() {
|
||||
|
||||
DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
||||
da->remove(download->get_download_file()); //clean up removed file
|
||||
memdelete(da);
|
||||
// Clean up downloaded file.
|
||||
DirAccess::remove_file_or_error(download->get_download_file());
|
||||
queue_delete();
|
||||
}
|
||||
|
||||
|
@ -32,6 +32,7 @@
|
||||
|
||||
#include "core/io/resource_loader.h"
|
||||
#include "core/io/resource_saver.h"
|
||||
#include "core/os/dir_access.h"
|
||||
#include "core/os/file_access.h"
|
||||
#include "core/os/os.h"
|
||||
#include "editor_settings.h"
|
||||
@ -52,57 +53,75 @@ static void _compress_image(Image::CompressMode p_mode, Image *p_image) {
|
||||
_base_image_compress_pvrtc2_func(p_image);
|
||||
else if (_base_image_compress_pvrtc4_func)
|
||||
_base_image_compress_pvrtc4_func(p_image);
|
||||
|
||||
break;
|
||||
case Image::COMPRESS_PVRTC4:
|
||||
if (_base_image_compress_pvrtc4_func)
|
||||
_base_image_compress_pvrtc4_func(p_image);
|
||||
|
||||
break;
|
||||
default: ERR_FAIL();
|
||||
default:
|
||||
ERR_FAIL_MSG("Unsupported Image compress mode used in PVRTC module.");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
String tmppath = EditorSettings::get_singleton()->get_cache_dir();
|
||||
|
||||
List<String> args;
|
||||
|
||||
String src_img = tmppath.plus_file("_tmp_src_img.png");
|
||||
String dst_img = tmppath.plus_file("_tmp_dst_img.pvr");
|
||||
|
||||
List<String> args;
|
||||
args.push_back("-i");
|
||||
args.push_back(src_img);
|
||||
args.push_back("-o");
|
||||
args.push_back(dst_img);
|
||||
args.push_back("-f");
|
||||
switch (p_mode) {
|
||||
|
||||
case Image::COMPRESS_PVRTC2: args.push_back("PVRTC2"); break;
|
||||
case Image::COMPRESS_PVRTC4: args.push_back("PVRTC4"); break;
|
||||
case Image::COMPRESS_ETC: args.push_back("ETC"); break;
|
||||
default: ERR_FAIL();
|
||||
switch (p_mode) {
|
||||
case Image::COMPRESS_PVRTC2:
|
||||
args.push_back("PVRTC2");
|
||||
break;
|
||||
case Image::COMPRESS_PVRTC4:
|
||||
args.push_back("PVRTC4");
|
||||
break;
|
||||
case Image::COMPRESS_ETC:
|
||||
args.push_back("ETC");
|
||||
break;
|
||||
default:
|
||||
ERR_FAIL_MSG("Unsupported Image compress mode used in PVRTC module.");
|
||||
}
|
||||
|
||||
if (EditorSettings::get_singleton()->get("filesystem/import/pvrtc_fast_conversion").operator bool()) {
|
||||
args.push_back("-pvrtcfast");
|
||||
}
|
||||
if (p_image->has_mipmaps())
|
||||
if (p_image->has_mipmaps()) {
|
||||
args.push_back("-m");
|
||||
}
|
||||
|
||||
// Save source PNG.
|
||||
Ref<ImageTexture> t = memnew(ImageTexture);
|
||||
t->create_from_image(Ref<Image>(p_image), 0);
|
||||
ResourceSaver::save(src_img, t);
|
||||
|
||||
Error err = OS::get_singleton()->execute(ttpath, args, true);
|
||||
ERR_EXPLAIN(TTR("Could not execute PVRTC tool:") + " " + ttpath);
|
||||
ERR_FAIL_COND(err != OK);
|
||||
if (err != OK) {
|
||||
// Clean up generated files.
|
||||
DirAccess::remove_file_or_error(src_img);
|
||||
DirAccess::remove_file_or_error(dst_img);
|
||||
ERR_FAIL_MSG("Could not execute PVRTC tool: " + ttpath);
|
||||
}
|
||||
|
||||
t = ResourceLoader::load(dst_img, "Texture");
|
||||
|
||||
ERR_EXPLAIN(TTR("Can't load back converted image using PVRTC tool:") + " " + dst_img);
|
||||
ERR_FAIL_COND(t.is_null());
|
||||
if (t.is_null()) {
|
||||
// Clean up generated files.
|
||||
DirAccess::remove_file_or_error(src_img);
|
||||
DirAccess::remove_file_or_error(dst_img);
|
||||
ERR_FAIL_MSG("Can't load back converted image using PVRTC tool.");
|
||||
}
|
||||
|
||||
p_image->copy_internals_from(t->get_data());
|
||||
|
||||
// Clean up generated files.
|
||||
DirAccess::remove_file_or_error(src_img);
|
||||
DirAccess::remove_file_or_error(dst_img);
|
||||
}
|
||||
|
||||
static void _compress_pvrtc2(Image *p_image) {
|
||||
|
@ -32,6 +32,7 @@
|
||||
|
||||
#include "core/io/file_access_encrypted.h"
|
||||
#include "core/io/resource_loader.h"
|
||||
#include "core/os/dir_access.h"
|
||||
#include "core/os/file_access.h"
|
||||
#include "editor/gdscript_highlighter.h"
|
||||
#include "gdscript.h"
|
||||
@ -117,6 +118,9 @@ public:
|
||||
file = FileAccess::get_file_as_array(tmp_path);
|
||||
add_file(p_path.get_basename() + ".gde", file, true);
|
||||
|
||||
// Clean up temporary file.
|
||||
DirAccess::remove_file_or_error(tmp_path);
|
||||
|
||||
} else {
|
||||
|
||||
add_file(p_path.get_basename() + ".gdc", file, true);
|
||||
|
@ -32,6 +32,7 @@
|
||||
|
||||
#include "core/io/marshalls.h"
|
||||
#include "core/io/zip_io.h"
|
||||
#include "core/os/dir_access.h"
|
||||
#include "core/os/file_access.h"
|
||||
#include "core/os/os.h"
|
||||
#include "core/project_settings.h"
|
||||
@ -1398,8 +1399,9 @@ public:
|
||||
return ERR_UNCONFIGURED;
|
||||
}
|
||||
|
||||
//export_temp
|
||||
// Export_temp APK.
|
||||
if (ep.step("Exporting APK", 0)) {
|
||||
device_lock->unlock();
|
||||
return ERR_SKIP;
|
||||
}
|
||||
|
||||
@ -1409,11 +1411,20 @@ public:
|
||||
if (use_reverse)
|
||||
p_debug_flags |= DEBUG_FLAG_REMOTE_DEBUG_LOCALHOST;
|
||||
|
||||
String export_to = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmpexport.apk");
|
||||
Error err = export_project(p_preset, true, export_to, p_debug_flags);
|
||||
if (err) {
|
||||
device_lock->unlock();
|
||||
return err;
|
||||
String tmp_export_path = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmpexport.apk");
|
||||
|
||||
#define CLEANUP_AND_RETURN(m_err) \
|
||||
{ \
|
||||
DirAccess::remove_file_or_error(tmp_export_path); \
|
||||
device_lock->unlock(); \
|
||||
return m_err; \
|
||||
}
|
||||
|
||||
// Export to temporary APK before sending to device.
|
||||
Error err = export_project(p_preset, true, tmp_export_path, p_debug_flags);
|
||||
|
||||
if (err != OK) {
|
||||
CLEANUP_AND_RETURN(err);
|
||||
}
|
||||
|
||||
List<String> args;
|
||||
@ -1425,7 +1436,7 @@ public:
|
||||
|
||||
if (remove_prev) {
|
||||
if (ep.step("Uninstalling...", 1)) {
|
||||
return ERR_SKIP;
|
||||
CLEANUP_AND_RETURN(ERR_SKIP);
|
||||
}
|
||||
|
||||
print_line("Uninstalling previous version: " + devices[p_device].name);
|
||||
@ -1440,7 +1451,7 @@ public:
|
||||
|
||||
print_line("Installing to device (please wait...): " + devices[p_device].name);
|
||||
if (ep.step("Installing to device (please wait...)", 2)) {
|
||||
return ERR_SKIP;
|
||||
CLEANUP_AND_RETURN(ERR_SKIP);
|
||||
}
|
||||
|
||||
args.clear();
|
||||
@ -1448,13 +1459,12 @@ public:
|
||||
args.push_back(devices[p_device].id);
|
||||
args.push_back("install");
|
||||
args.push_back("-r");
|
||||
args.push_back(export_to);
|
||||
args.push_back(tmp_export_path);
|
||||
|
||||
err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv);
|
||||
if (err || rv != 0) {
|
||||
EditorNode::add_io_error("Could not install to device.");
|
||||
device_lock->unlock();
|
||||
return ERR_CANT_CREATE;
|
||||
CLEANUP_AND_RETURN(ERR_CANT_CREATE);
|
||||
}
|
||||
|
||||
if (use_remote) {
|
||||
@ -1508,7 +1518,7 @@ public:
|
||||
}
|
||||
|
||||
if (ep.step("Running on Device...", 3)) {
|
||||
return ERR_SKIP;
|
||||
CLEANUP_AND_RETURN(ERR_SKIP);
|
||||
}
|
||||
args.clear();
|
||||
args.push_back("-s");
|
||||
@ -1528,11 +1538,11 @@ public:
|
||||
err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv);
|
||||
if (err || rv != 0) {
|
||||
EditorNode::add_io_error("Could not execute on device.");
|
||||
device_lock->unlock();
|
||||
return ERR_CANT_CREATE;
|
||||
CLEANUP_AND_RETURN(ERR_CANT_CREATE);
|
||||
}
|
||||
device_lock->unlock();
|
||||
return OK;
|
||||
|
||||
CLEANUP_AND_RETURN(OK);
|
||||
#undef CLEANUP_AND_RETURN
|
||||
}
|
||||
|
||||
virtual Ref<Texture> get_run_icon() const {
|
||||
@ -2023,8 +2033,16 @@ public:
|
||||
zlib_filefunc_def io2 = io;
|
||||
FileAccess *dst_f = NULL;
|
||||
io2.opaque = &dst_f;
|
||||
String unaligned_path = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmpexport-unaligned.apk");
|
||||
zipFile unaligned_apk = zipOpen2(unaligned_path.utf8().get_data(), APPEND_STATUS_CREATE, NULL, &io2);
|
||||
|
||||
String tmp_unaligned_path = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmpexport-unaligned.apk");
|
||||
|
||||
#define CLEANUP_AND_RETURN(m_err) \
|
||||
{ \
|
||||
DirAccess::remove_file_or_error(tmp_unaligned_path); \
|
||||
return m_err; \
|
||||
}
|
||||
|
||||
zipFile unaligned_apk = zipOpen2(tmp_unaligned_path.utf8().get_data(), APPEND_STATUS_CREATE, NULL, &io2);
|
||||
|
||||
bool use_32_fb = p_preset->get("graphics/32_bits_framebuffer");
|
||||
bool immersive = p_preset->get("screen/immersive_mode");
|
||||
@ -2152,7 +2170,7 @@ public:
|
||||
}
|
||||
|
||||
if (ep.step("Adding Files...", 1)) {
|
||||
return ERR_SKIP;
|
||||
CLEANUP_AND_RETURN(ERR_SKIP);
|
||||
}
|
||||
Error err = OK;
|
||||
Vector<String> cl = cmdline.strip_edges().split(" ");
|
||||
@ -2184,7 +2202,7 @@ public:
|
||||
unzClose(pkg);
|
||||
EditorNode::add_io_error("Could not write expansion package file: " + apkfname);
|
||||
|
||||
return OK;
|
||||
CLEANUP_AND_RETURN(ERR_SKIP);
|
||||
}
|
||||
|
||||
cl.push_back("--use_apk_expansion");
|
||||
@ -2271,8 +2289,8 @@ public:
|
||||
zipClose(unaligned_apk, NULL);
|
||||
unzClose(pkg);
|
||||
|
||||
if (err) {
|
||||
return err;
|
||||
if (err != OK) {
|
||||
CLEANUP_AND_RETURN(err);
|
||||
}
|
||||
|
||||
if (_signed) {
|
||||
@ -2280,7 +2298,7 @@ public:
|
||||
String jarsigner = EditorSettings::get_singleton()->get("export/android/jarsigner");
|
||||
if (!FileAccess::exists(jarsigner)) {
|
||||
EditorNode::add_io_error("'jarsigner' could not be found.\nPlease supply a path in the Editor Settings.\nThe resulting APK is unsigned.");
|
||||
return OK;
|
||||
CLEANUP_AND_RETURN(OK);
|
||||
}
|
||||
|
||||
String keystore;
|
||||
@ -2300,7 +2318,7 @@ public:
|
||||
}
|
||||
|
||||
if (ep.step("Signing debug APK...", 103)) {
|
||||
return ERR_SKIP;
|
||||
CLEANUP_AND_RETURN(ERR_SKIP);
|
||||
}
|
||||
|
||||
} else {
|
||||
@ -2309,13 +2327,13 @@ public:
|
||||
user = release_username;
|
||||
|
||||
if (ep.step("Signing release APK...", 103)) {
|
||||
return ERR_SKIP;
|
||||
CLEANUP_AND_RETURN(ERR_SKIP);
|
||||
}
|
||||
}
|
||||
|
||||
if (!FileAccess::exists(keystore)) {
|
||||
EditorNode::add_io_error("Could not find keystore, unable to export.");
|
||||
return ERR_FILE_CANT_OPEN;
|
||||
CLEANUP_AND_RETURN(ERR_FILE_CANT_OPEN);
|
||||
}
|
||||
|
||||
List<String> args;
|
||||
@ -2333,30 +2351,30 @@ public:
|
||||
args.push_back(keystore);
|
||||
args.push_back("-storepass");
|
||||
args.push_back(password);
|
||||
args.push_back(unaligned_path);
|
||||
args.push_back(tmp_unaligned_path);
|
||||
args.push_back(user);
|
||||
int retval;
|
||||
OS::get_singleton()->execute(jarsigner, args, true, NULL, NULL, &retval);
|
||||
if (retval) {
|
||||
EditorNode::add_io_error("'jarsigner' returned with error #" + itos(retval));
|
||||
return ERR_CANT_CREATE;
|
||||
CLEANUP_AND_RETURN(ERR_CANT_CREATE);
|
||||
}
|
||||
|
||||
if (ep.step("Verifying APK...", 104)) {
|
||||
return ERR_SKIP;
|
||||
CLEANUP_AND_RETURN(ERR_SKIP);
|
||||
}
|
||||
|
||||
args.clear();
|
||||
args.push_back("-verify");
|
||||
args.push_back("-keystore");
|
||||
args.push_back(keystore);
|
||||
args.push_back(unaligned_path);
|
||||
args.push_back(tmp_unaligned_path);
|
||||
args.push_back("-verbose");
|
||||
|
||||
OS::get_singleton()->execute(jarsigner, args, true, NULL, NULL, &retval);
|
||||
if (retval) {
|
||||
EditorNode::add_io_error("'jarsigner' verification of APK failed. Make sure to use a jarsigner from OpenJDK 8.");
|
||||
return ERR_CANT_CREATE;
|
||||
CLEANUP_AND_RETURN(ERR_CANT_CREATE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2365,14 +2383,14 @@ public:
|
||||
static const int ZIP_ALIGNMENT = 4;
|
||||
|
||||
if (ep.step("Aligning APK...", 105)) {
|
||||
return ERR_SKIP;
|
||||
CLEANUP_AND_RETURN(ERR_SKIP);
|
||||
}
|
||||
|
||||
unzFile tmp_unaligned = unzOpen2(unaligned_path.utf8().get_data(), &io);
|
||||
unzFile tmp_unaligned = unzOpen2(tmp_unaligned_path.utf8().get_data(), &io);
|
||||
if (!tmp_unaligned) {
|
||||
|
||||
EditorNode::add_io_error("Could not find temp unaligned APK.");
|
||||
return ERR_FILE_NOT_FOUND;
|
||||
EditorNode::add_io_error("Could not unzip temporary unaligned APK.");
|
||||
CLEANUP_AND_RETURN(ERR_FILE_NOT_FOUND);
|
||||
}
|
||||
|
||||
ret = unzGoToFirstFile(tmp_unaligned);
|
||||
@ -2442,7 +2460,7 @@ public:
|
||||
zipClose(final_apk, NULL);
|
||||
unzClose(tmp_unaligned);
|
||||
|
||||
return OK;
|
||||
CLEANUP_AND_RETURN(OK);
|
||||
}
|
||||
|
||||
virtual void get_platform_features(List<String> *r_features) {
|
||||
|
@ -362,12 +362,21 @@ int EditorExportPlatformJavaScript::get_device_count() const {
|
||||
|
||||
Error EditorExportPlatformJavaScript::run(const Ref<EditorExportPreset> &p_preset, int p_device, int p_debug_flags) {
|
||||
|
||||
String path = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmp_export.html");
|
||||
String basepath = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmp_js_export");
|
||||
String path = basepath + ".html";
|
||||
Error err = export_project(p_preset, true, path, p_debug_flags);
|
||||
if (err) {
|
||||
if (err != OK) {
|
||||
// Export generates several files, clean them up on failure.
|
||||
DirAccess::remove_file_or_error(basepath + ".html");
|
||||
DirAccess::remove_file_or_error(basepath + ".js");
|
||||
DirAccess::remove_file_or_error(basepath + ".pck");
|
||||
DirAccess::remove_file_or_error(basepath + ".png");
|
||||
DirAccess::remove_file_or_error(basepath + ".wasm");
|
||||
return err;
|
||||
}
|
||||
OS::get_singleton()->shell_open(String("file://") + path);
|
||||
// FIXME: Find out how to clean up export files after running the successfully
|
||||
// exported game. Might not be trivial.
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
@ -29,9 +29,11 @@
|
||||
/*************************************************************************/
|
||||
|
||||
#include "export.h"
|
||||
|
||||
#include "core/io/marshalls.h"
|
||||
#include "core/io/resource_saver.h"
|
||||
#include "core/io/zip_io.h"
|
||||
#include "core/os/dir_access.h"
|
||||
#include "core/os/file_access.h"
|
||||
#include "core/os/os.h"
|
||||
#include "core/project_settings.h"
|
||||
@ -244,13 +246,17 @@ void EditorExportPlatformOSX::_make_icon(const Ref<Image> &p_icon, Vector<uint8_
|
||||
copy->resize(icon_infos[i].size, icon_infos[i].size);
|
||||
|
||||
if (icon_infos[i].is_png) {
|
||||
//encode png icon
|
||||
// Encode PNG icon.
|
||||
it->create_from_image(copy);
|
||||
String path = EditorSettings::get_singleton()->get_cache_dir().plus_file("icon.png");
|
||||
ResourceSaver::save(path, it);
|
||||
|
||||
FileAccess *f = FileAccess::open(path, FileAccess::READ);
|
||||
ERR_FAIL_COND(!f);
|
||||
if (!f) {
|
||||
// Clean up generated file.
|
||||
DirAccess::remove_file_or_error(path);
|
||||
ERR_FAIL();
|
||||
}
|
||||
|
||||
int ofs = data.size();
|
||||
uint32_t len = f->get_len();
|
||||
@ -261,6 +267,10 @@ void EditorExportPlatformOSX::_make_icon(const Ref<Image> &p_icon, Vector<uint8_
|
||||
len = BSWAP32(len);
|
||||
copymem(&data.write[ofs], icon_infos[i].name, 4);
|
||||
encode_uint32(len, &data.write[ofs + 4]);
|
||||
|
||||
// Clean up generated file.
|
||||
DirAccess::remove_file_or_error(path);
|
||||
|
||||
} else {
|
||||
PoolVector<uint8_t> src_data = copy->get_data();
|
||||
|
||||
@ -561,7 +571,6 @@ Error EditorExportPlatformOSX::export_project(const Ref<EditorExportPreset> &p_p
|
||||
}
|
||||
}
|
||||
}
|
||||
//bleh?
|
||||
}
|
||||
|
||||
if (data.size() > 0) {
|
||||
@ -687,7 +696,8 @@ Error EditorExportPlatformOSX::export_project(const Ref<EditorExportPreset> &p_p
|
||||
|
||||
// Clean up temporary .app dir
|
||||
OS::get_singleton()->move_to_trash(tmp_app_path_name);
|
||||
} else {
|
||||
|
||||
} else { // pck
|
||||
|
||||
String pack_path = EditorSettings::get_singleton()->get_cache_dir().plus_file(pkg_name + ".pck");
|
||||
|
||||
@ -747,6 +757,9 @@ Error EditorExportPlatformOSX::export_project(const Ref<EditorExportPreset> &p_p
|
||||
zipCloseFileInZip(dst_pkg_zip);
|
||||
}
|
||||
}
|
||||
|
||||
// Clean up generated file.
|
||||
DirAccess::remove_file_or_error(pack_path);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "core/io/zip_io.h"
|
||||
#include "core/math/crypto_core.h"
|
||||
#include "core/object.h"
|
||||
#include "core/os/dir_access.h"
|
||||
#include "core/os/file_access.h"
|
||||
#include "core/project_settings.h"
|
||||
#include "core/version.h"
|
||||
@ -133,8 +134,6 @@ class AppxPackager {
|
||||
|
||||
String progress_task;
|
||||
FileAccess *package;
|
||||
String tmp_blockmap_file_path;
|
||||
String tmp_content_types_file_path;
|
||||
|
||||
Set<String> mime_types;
|
||||
|
||||
@ -146,8 +145,8 @@ class AppxPackager {
|
||||
|
||||
String hash_block(const uint8_t *p_block_data, size_t p_block_len);
|
||||
|
||||
void make_block_map();
|
||||
void make_content_types();
|
||||
void make_block_map(const String &p_path);
|
||||
void make_content_types(const String &p_path);
|
||||
|
||||
_FORCE_INLINE_ unsigned int buf_put_int16(uint16_t p_val, uint8_t *p_buf) {
|
||||
for (int i = 0; i < 2; i++) {
|
||||
@ -208,9 +207,9 @@ String AppxPackager::hash_block(const uint8_t *p_block_data, size_t p_block_len)
|
||||
return String(base64);
|
||||
}
|
||||
|
||||
void AppxPackager::make_block_map() {
|
||||
void AppxPackager::make_block_map(const String &p_path) {
|
||||
|
||||
FileAccess *tmp_file = FileAccess::open(tmp_blockmap_file_path, FileAccess::WRITE);
|
||||
FileAccess *tmp_file = FileAccess::open(p_path, FileAccess::WRITE);
|
||||
|
||||
tmp_file->store_string("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
|
||||
tmp_file->store_string("<BlockMap xmlns=\"http://schemas.microsoft.com/appx/2010/blockmap\" HashMethod=\"http://www.w3.org/2001/04/xmlenc#sha256\">");
|
||||
@ -253,9 +252,9 @@ String AppxPackager::content_type(String p_extension) {
|
||||
return "application/octet-stream";
|
||||
}
|
||||
|
||||
void AppxPackager::make_content_types() {
|
||||
void AppxPackager::make_content_types(const String &p_path) {
|
||||
|
||||
FileAccess *tmp_file = FileAccess::open(tmp_content_types_file_path, FileAccess::WRITE);
|
||||
FileAccess *tmp_file = FileAccess::open(p_path, FileAccess::WRITE);
|
||||
|
||||
tmp_file->store_string("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
|
||||
tmp_file->store_string("<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">");
|
||||
@ -458,8 +457,6 @@ void AppxPackager::init(FileAccess *p_fa) {
|
||||
package = p_fa;
|
||||
central_dir_offset = 0;
|
||||
end_of_central_dir_offset = 0;
|
||||
tmp_blockmap_file_path = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmpblockmap.xml");
|
||||
tmp_content_types_file_path = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmpcontenttypes.xml");
|
||||
}
|
||||
|
||||
Error AppxPackager::add_file(String p_file_name, const uint8_t *p_buffer, size_t p_len, int p_file_no, int p_total_files, bool p_compress) {
|
||||
@ -591,7 +588,9 @@ void AppxPackager::finish() {
|
||||
// Create and add block map file
|
||||
EditorNode::progress_task_step("export", "Creating block map...", 4);
|
||||
|
||||
make_block_map();
|
||||
const String &tmp_blockmap_file_path = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmpblockmap.xml");
|
||||
make_block_map(tmp_blockmap_file_path);
|
||||
|
||||
FileAccess *blockmap_file = FileAccess::open(tmp_blockmap_file_path, FileAccess::READ);
|
||||
Vector<uint8_t> blockmap_buffer;
|
||||
blockmap_buffer.resize(blockmap_file->get_len());
|
||||
@ -604,8 +603,11 @@ void AppxPackager::finish() {
|
||||
memdelete(blockmap_file);
|
||||
|
||||
// Add content types
|
||||
|
||||
EditorNode::progress_task_step("export", "Setting content types...", 5);
|
||||
make_content_types();
|
||||
|
||||
const String &tmp_content_types_file_path = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmpcontenttypes.xml");
|
||||
make_content_types(tmp_content_types_file_path);
|
||||
|
||||
FileAccess *types_file = FileAccess::open(tmp_content_types_file_path, FileAccess::READ);
|
||||
Vector<uint8_t> types_buffer;
|
||||
@ -618,6 +620,10 @@ void AppxPackager::finish() {
|
||||
types_file->close();
|
||||
memdelete(types_file);
|
||||
|
||||
// Cleanup generated files.
|
||||
DirAccess::remove_file_or_error(tmp_blockmap_file_path);
|
||||
DirAccess::remove_file_or_error(tmp_content_types_file_path);
|
||||
|
||||
// Pre-process central directory before signing
|
||||
for (int i = 0; i < file_metadata.size(); i++) {
|
||||
store_central_dir_header(file_metadata[i]);
|
||||
@ -909,7 +915,8 @@ class EditorExportPlatformUWP : public EditorExportPlatform {
|
||||
if (err != OK) {
|
||||
|
||||
String err_string = "Couldn't open temp logo file.";
|
||||
|
||||
// Cleanup generated file.
|
||||
DirAccess::remove_file_or_error(tmp_path);
|
||||
EditorNode::add_io_error(err_string);
|
||||
ERR_FAIL_V_MSG(data, err_string);
|
||||
}
|
||||
@ -919,29 +926,7 @@ class EditorExportPlatformUWP : public EditorExportPlatform {
|
||||
|
||||
f->close();
|
||||
memdelete(f);
|
||||
|
||||
// Delete temp file
|
||||
DirAccess *dir = DirAccess::open(tmp_path.get_base_dir(), &err);
|
||||
|
||||
if (err != OK) {
|
||||
|
||||
String err_string = "Couldn't open temp path to remove temp logo file.";
|
||||
|
||||
EditorNode::add_io_error(err_string);
|
||||
ERR_FAIL_V_MSG(data, err_string);
|
||||
}
|
||||
|
||||
err = dir->remove(tmp_path);
|
||||
|
||||
memdelete(dir);
|
||||
|
||||
if (err != OK) {
|
||||
|
||||
String err_string = "Couldn't remove temp logo file.";
|
||||
|
||||
EditorNode::add_io_error(err_string);
|
||||
ERR_FAIL_V_MSG(data, err_string);
|
||||
}
|
||||
DirAccess::remove_file_or_error(tmp_path);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user