mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2026-10-01 04:17:56 +00:00
Loader: shrink reboot relaunch code
This commit is contained in:
@@ -115,19 +115,11 @@ void desktop_scene_main_on_enter(void* context) {
|
||||
if(!desktop->pending_launch_done) {
|
||||
desktop->pending_launch_done = true;
|
||||
|
||||
FuriString* pending_name = furi_string_alloc();
|
||||
FuriString* pending_args = furi_string_alloc();
|
||||
|
||||
if(loader_pending_launch_take(pending_name, pending_args)) {
|
||||
FURI_LOG_I(TAG, "Starting pending app: %s", furi_string_get_cstr(pending_name));
|
||||
LoaderPendingLaunch pending;
|
||||
if(loader_pending_launch_take(&pending)) {
|
||||
loader_start_detached_with_gui_error(
|
||||
desktop->loader,
|
||||
furi_string_get_cstr(pending_name),
|
||||
furi_string_empty(pending_args) ? NULL : furi_string_get_cstr(pending_args));
|
||||
desktop->loader, pending.name_or_path, pending.args[0] ? pending.args : NULL);
|
||||
}
|
||||
|
||||
furi_string_free(pending_args);
|
||||
furi_string_free(pending_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -148,15 +148,9 @@ static void loader_show_gui_error(
|
||||
loader_dialog_prepare_and_show(dialogs, &err_outdated_firmware);
|
||||
break;*/
|
||||
case LoaderStatusErrorOutOfMemory:
|
||||
dialog_message_set_header(
|
||||
message, "Error: Out of Memory", 64, 0, AlignCenter, AlignTop);
|
||||
dialog_message_set_header(message, "Out of memory", 64, 0, AlignCenter, AlignTop);
|
||||
dialog_message_set_text(
|
||||
message,
|
||||
"Not enough free RAM.\nReboot and run the app?",
|
||||
64,
|
||||
13,
|
||||
AlignCenter,
|
||||
AlignTop);
|
||||
message, "Reboot and run the app?", 64, 24, AlignCenter, AlignTop);
|
||||
dialog_message_set_buttons(message, NULL, NULL, "Reboot");
|
||||
if(dialog_message_show(dialogs, message) == DialogMessageButtonRight) {
|
||||
loader_pending_launch_save(name, args);
|
||||
@@ -640,10 +634,7 @@ static LoaderMessageLoaderStatusResult loader_start_external_app(
|
||||
flipper_application_get_manifest(loader->app.fap);
|
||||
if(memmgr_heap_get_max_free_block() < ((size_t)run_manifest->stack_size + 1024)) {
|
||||
result.value = loader_make_status_error(
|
||||
LoaderStatusErrorInternal,
|
||||
error_message,
|
||||
"Load failed, %s: no memory for stack",
|
||||
path);
|
||||
LoaderStatusErrorInternal, error_message, "No memory for stack");
|
||||
result.error = LoaderStatusErrorOutOfMemory;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -5,17 +5,10 @@
|
||||
#include <saved_struct.h>
|
||||
#include <storage/storage.h>
|
||||
|
||||
#define TAG "LoaderPending"
|
||||
|
||||
#define LOADER_PENDING_PATH INT_PATH(".loader.pending")
|
||||
#define LOADER_PENDING_MAGIC (0x4C)
|
||||
#define LOADER_PENDING_VERSION (1)
|
||||
|
||||
typedef struct {
|
||||
char name_or_path[128];
|
||||
char args[128];
|
||||
} LoaderPendingLaunch;
|
||||
|
||||
bool loader_pending_launch_save(const char* name_or_path, const char* args) {
|
||||
furi_check(name_or_path);
|
||||
|
||||
@@ -23,12 +16,10 @@ bool loader_pending_launch_save(const char* name_or_path, const char* args) {
|
||||
|
||||
if(strlcpy(pending.name_or_path, name_or_path, sizeof(pending.name_or_path)) >=
|
||||
sizeof(pending.name_or_path)) {
|
||||
FURI_LOG_E(TAG, "Name does not fit: %s", name_or_path);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(args && strlcpy(pending.args, args, sizeof(pending.args)) >= sizeof(pending.args)) {
|
||||
FURI_LOG_E(TAG, "Args do not fit: %s", args);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -40,36 +31,29 @@ bool loader_pending_launch_save(const char* name_or_path, const char* args) {
|
||||
LOADER_PENDING_VERSION);
|
||||
}
|
||||
|
||||
bool loader_pending_launch_take(FuriString* name_or_path, FuriString* args) {
|
||||
furi_check(name_or_path);
|
||||
furi_check(args);
|
||||
bool loader_pending_launch_take(LoaderPendingLaunch* pending) {
|
||||
furi_check(pending);
|
||||
|
||||
Storage* storage = furi_record_open(RECORD_STORAGE);
|
||||
bool taken = false;
|
||||
|
||||
if(storage_file_exists(storage, LOADER_PENDING_PATH)) {
|
||||
LoaderPendingLaunch pending;
|
||||
bool loaded = saved_struct_load(
|
||||
taken = saved_struct_load(
|
||||
LOADER_PENDING_PATH,
|
||||
&pending,
|
||||
sizeof(pending),
|
||||
pending,
|
||||
sizeof(*pending),
|
||||
LOADER_PENDING_MAGIC,
|
||||
LOADER_PENDING_VERSION);
|
||||
|
||||
storage_simply_remove(storage, LOADER_PENDING_PATH);
|
||||
|
||||
if(loaded) {
|
||||
pending.name_or_path[sizeof(pending.name_or_path) - 1] = '\0';
|
||||
pending.args[sizeof(pending.args) - 1] = '\0';
|
||||
|
||||
if(pending.name_or_path[0] != '\0') {
|
||||
furi_string_set_str(name_or_path, pending.name_or_path);
|
||||
furi_string_set_str(args, pending.args);
|
||||
taken = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
return taken;
|
||||
|
||||
if(!taken) return false;
|
||||
|
||||
pending->name_or_path[sizeof(pending->name_or_path) - 1] = '\0';
|
||||
pending->args[sizeof(pending->args) - 1] = '\0';
|
||||
|
||||
return pending->name_or_path[0] != '\0';
|
||||
}
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
|
||||
#include <furi.h>
|
||||
|
||||
typedef struct {
|
||||
char name_or_path[96];
|
||||
char args[96];
|
||||
} LoaderPendingLaunch;
|
||||
|
||||
bool loader_pending_launch_save(const char* name_or_path, const char* args);
|
||||
|
||||
bool loader_pending_launch_take(FuriString* name_or_path, FuriString* args);
|
||||
bool loader_pending_launch_take(LoaderPendingLaunch* pending);
|
||||
|
||||
Reference in New Issue
Block a user