mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2026-10-01 04:17:56 +00:00
Loader: simplify pending launch
This commit is contained in:
@@ -115,10 +115,11 @@ void desktop_scene_main_on_enter(void* context) {
|
||||
if(!desktop->pending_launch_done) {
|
||||
desktop->pending_launch_done = true;
|
||||
|
||||
LoaderPendingLaunch pending;
|
||||
if(loader_pending_launch_take(&pending)) {
|
||||
LoaderPendingLaunch* pending = loader_pending_launch_take();
|
||||
if(pending) {
|
||||
loader_start_detached_with_gui_error(
|
||||
desktop->loader, pending.name_or_path, pending.args[0] ? pending.args : NULL);
|
||||
desktop->loader, pending->name_or_path, pending->args[0] ? pending->args : NULL);
|
||||
free(pending);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,7 +153,11 @@ static void loader_show_gui_error(
|
||||
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);
|
||||
if(!loader_pending_launch_save(name, args)) {
|
||||
dialog_message_set_text(
|
||||
message, "App will not reopen", 64, 24, AlignCenter, AlignTop);
|
||||
dialog_message_show(dialogs, message);
|
||||
}
|
||||
furi_hal_power_reset();
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -12,48 +12,56 @@
|
||||
bool loader_pending_launch_save(const char* name_or_path, const char* args) {
|
||||
furi_check(name_or_path);
|
||||
|
||||
LoaderPendingLaunch pending = {0};
|
||||
LoaderPendingLaunch* pending = malloc(sizeof(LoaderPendingLaunch));
|
||||
bool success = false;
|
||||
|
||||
if(strlcpy(pending.name_or_path, name_or_path, sizeof(pending.name_or_path)) >=
|
||||
sizeof(pending.name_or_path)) {
|
||||
return false;
|
||||
}
|
||||
do {
|
||||
if(strlcpy(pending->name_or_path, name_or_path, sizeof(pending->name_or_path)) >=
|
||||
sizeof(pending->name_or_path)) {
|
||||
break;
|
||||
}
|
||||
|
||||
if(args && strlcpy(pending.args, args, sizeof(pending.args)) >= sizeof(pending.args)) {
|
||||
return false;
|
||||
}
|
||||
if(args && strlcpy(pending->args, args, sizeof(pending->args)) >= sizeof(pending->args)) {
|
||||
break;
|
||||
}
|
||||
|
||||
return saved_struct_save(
|
||||
LOADER_PENDING_PATH,
|
||||
&pending,
|
||||
sizeof(pending),
|
||||
LOADER_PENDING_MAGIC,
|
||||
LOADER_PENDING_VERSION);
|
||||
}
|
||||
|
||||
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)) {
|
||||
taken = saved_struct_load(
|
||||
success = saved_struct_save(
|
||||
LOADER_PENDING_PATH,
|
||||
pending,
|
||||
sizeof(*pending),
|
||||
sizeof(LoaderPendingLaunch),
|
||||
LOADER_PENDING_MAGIC,
|
||||
LOADER_PENDING_VERSION);
|
||||
} while(false);
|
||||
|
||||
free(pending);
|
||||
return success;
|
||||
}
|
||||
|
||||
LoaderPendingLaunch* loader_pending_launch_take(void) {
|
||||
Storage* storage = furi_record_open(RECORD_STORAGE);
|
||||
LoaderPendingLaunch* pending = NULL;
|
||||
|
||||
if(storage_common_stat(storage, LOADER_PENDING_PATH, NULL) == FSE_OK) {
|
||||
pending = malloc(sizeof(LoaderPendingLaunch));
|
||||
|
||||
bool loaded = saved_struct_load(
|
||||
LOADER_PENDING_PATH,
|
||||
pending,
|
||||
sizeof(LoaderPendingLaunch),
|
||||
LOADER_PENDING_MAGIC,
|
||||
LOADER_PENDING_VERSION);
|
||||
|
||||
storage_simply_remove(storage, LOADER_PENDING_PATH);
|
||||
|
||||
pending->name_or_path[sizeof(pending->name_or_path) - 1] = '\0';
|
||||
pending->args[sizeof(pending->args) - 1] = '\0';
|
||||
|
||||
if(!loaded || (pending->name_or_path[0] == '\0')) {
|
||||
free(pending);
|
||||
pending = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
|
||||
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';
|
||||
return pending;
|
||||
}
|
||||
|
||||
@@ -2,11 +2,13 @@
|
||||
|
||||
#include <furi.h>
|
||||
|
||||
#define LOADER_PENDING_MAX_PATH_LEN 255u
|
||||
|
||||
typedef struct {
|
||||
char name_or_path[96];
|
||||
char args[96];
|
||||
char name_or_path[LOADER_PENDING_MAX_PATH_LEN];
|
||||
char args[LOADER_PENDING_MAX_PATH_LEN];
|
||||
} LoaderPendingLaunch;
|
||||
|
||||
bool loader_pending_launch_save(const char* name_or_path, const char* args);
|
||||
|
||||
bool loader_pending_launch_take(LoaderPendingLaunch* pending);
|
||||
LoaderPendingLaunch* loader_pending_launch_take(void);
|
||||
|
||||
Reference in New Issue
Block a user