subbrute_scene_load_file.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "../subbrute_i.h"
  2. #include "subbrute_scene.h"
  3. #define TAG "SubBruteSceneLoadFile"
  4. void subbrute_scene_load_file_on_enter(void* context) {
  5. furi_assert(context);
  6. SubBruteState* instance = (SubBruteState*)context;
  7. // Input events and views are managed by file_browser
  8. FuriString* app_folder;
  9. FuriString* load_path;
  10. load_path = furi_string_alloc();
  11. app_folder = furi_string_alloc_set(SUBBRUTE_PATH);
  12. DialogsFileBrowserOptions browser_options;
  13. dialog_file_browser_set_basic_options(&browser_options, SUBBRUTE_FILE_EXT, &I_sub1_10px);
  14. SubBruteFileResult load_result = SubBruteFileResultUnknown;
  15. bool res =
  16. dialog_file_browser_show(instance->dialogs, load_path, app_folder, &browser_options);
  17. #ifdef FURI_DEBUG
  18. FURI_LOG_D(
  19. TAG,
  20. "load_path: %s, app_folder: %s",
  21. furi_string_get_cstr(load_path),
  22. furi_string_get_cstr(app_folder));
  23. #endif
  24. if(res) {
  25. load_result =
  26. subbrute_device_load_from_file(instance->device, furi_string_get_cstr(load_path));
  27. if(load_result == SubBruteFileResultOk) {
  28. uint8_t extra_repeats = subbrute_main_view_get_extra_repeats(instance->view_main);
  29. load_result = subbrute_device_attack_set(
  30. instance->device, SubBruteAttackLoadFile, extra_repeats);
  31. if(load_result == SubBruteFileResultOk) {
  32. if(!subbrute_worker_init_file_attack(
  33. instance->worker,
  34. instance->device->key_index,
  35. instance->device->load_index,
  36. instance->device->file_key,
  37. instance->device->file_protocol_info,
  38. extra_repeats)) {
  39. furi_crash("Invalid attack set!");
  40. }
  41. // Ready to run!
  42. FURI_LOG_I(TAG, "Ready to run");
  43. res = true;
  44. }
  45. }
  46. if(load_result == SubBruteFileResultOk) {
  47. scene_manager_next_scene(instance->scene_manager, SubBruteSceneLoadSelect);
  48. } else {
  49. FURI_LOG_E(TAG, "Returned error: %d", load_result);
  50. FuriString* dialog_msg;
  51. dialog_msg = furi_string_alloc();
  52. furi_string_cat_printf(
  53. dialog_msg, "Cannot parse\nfile: %s", subbrute_device_error_get_desc(load_result));
  54. dialog_message_show_storage_error(instance->dialogs, furi_string_get_cstr(dialog_msg));
  55. furi_string_free(dialog_msg);
  56. scene_manager_search_and_switch_to_previous_scene(
  57. instance->scene_manager, SubBruteSceneStart);
  58. }
  59. } else {
  60. scene_manager_search_and_switch_to_previous_scene(
  61. instance->scene_manager, SubBruteSceneStart);
  62. }
  63. furi_string_free(app_folder);
  64. furi_string_free(load_path);
  65. }
  66. void subbrute_scene_load_file_on_exit(void* context) {
  67. UNUSED(context);
  68. }
  69. bool subbrute_scene_load_file_on_event(void* context, SceneManagerEvent event) {
  70. UNUSED(context);
  71. UNUSED(event);
  72. return false;
  73. }