diff --git a/applications/services/desktop/scenes/desktop_scene_main.c b/applications/services/desktop/scenes/desktop_scene_main.c index a6cf65c0c..2d10fa849 100644 --- a/applications/services/desktop/scenes/desktop_scene_main.c +++ b/applications/services/desktop/scenes/desktop_scene_main.c @@ -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); } } } diff --git a/applications/services/loader/loader.c b/applications/services/loader/loader.c index a06d39218..88273216c 100644 --- a/applications/services/loader/loader.c +++ b/applications/services/loader/loader.c @@ -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; diff --git a/applications/services/loader/loader_pending.c b/applications/services/loader/loader_pending.c index 618fed988..df5d95355 100644 --- a/applications/services/loader/loader_pending.c +++ b/applications/services/loader/loader_pending.c @@ -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; } diff --git a/applications/services/loader/loader_pending.h b/applications/services/loader/loader_pending.h index 3a79bf7df..562816a9c 100644 --- a/applications/services/loader/loader_pending.h +++ b/applications/services/loader/loader_pending.h @@ -2,11 +2,13 @@ #include +#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);