wifi_marauder_scene_script_select.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "../wifi_marauder_app_i.h"
  2. static void wifi_marauder_scene_script_select_callback(void* context, uint32_t index) {
  3. WifiMarauderApp* app = context;
  4. char script_path[256];
  5. snprintf(
  6. script_path,
  7. sizeof(script_path),
  8. "%s/%s.json",
  9. MARAUDER_APP_FOLDER_SCRIPTS,
  10. furi_string_get_cstr(app->script_list[index]));
  11. app->script = wifi_marauder_script_parse_json(app->storage, script_path);
  12. if(app->script) {
  13. scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptSelect, index);
  14. scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptOptions);
  15. }
  16. }
  17. static void wifi_marauder_scene_script_select_add_callback(void* context, uint32_t index) {
  18. WifiMarauderApp* app = context;
  19. scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptSelect, index);
  20. app->user_input_type = WifiMarauderUserInputTypeFileName;
  21. app->user_input_file_dir = strdup(MARAUDER_APP_FOLDER_SCRIPTS);
  22. app->user_input_file_extension = strdup("json");
  23. scene_manager_next_scene(app->scene_manager, WifiMarauderSceneUserInput);
  24. }
  25. void wifi_marauder_scene_script_select_on_enter(void* context) {
  26. WifiMarauderApp* app = context;
  27. Submenu* submenu = app->submenu;
  28. File* dir_scripts = storage_file_alloc(app->storage);
  29. if(storage_dir_open(dir_scripts, MARAUDER_APP_FOLDER_SCRIPTS)) {
  30. FileInfo file_info;
  31. char file_path[255];
  32. app->script_list_count = 0;
  33. // Goes through the files in the folder counting the ones that end with the json extension
  34. while(storage_dir_read(dir_scripts, &file_info, file_path, 255)) {
  35. app->script_list_count++;
  36. }
  37. if(app->script_list_count > 0) {
  38. submenu_set_header(submenu, "Select a script:");
  39. app->script_list = malloc(app->script_list_count * sizeof(FuriString*));
  40. storage_dir_close(dir_scripts);
  41. storage_dir_open(dir_scripts, MARAUDER_APP_FOLDER_SCRIPTS);
  42. // Read the files again from the beginning, adding the scripts in the list
  43. int script_index = 0;
  44. while(storage_dir_read(dir_scripts, &file_info, file_path, 255)) {
  45. app->script_list[script_index] = furi_string_alloc();
  46. path_extract_filename_no_ext(file_path, app->script_list[script_index]);
  47. submenu_add_item(
  48. submenu,
  49. furi_string_get_cstr(app->script_list[script_index]),
  50. script_index,
  51. wifi_marauder_scene_script_select_callback,
  52. app);
  53. script_index++;
  54. }
  55. } else {
  56. submenu_set_header(submenu, "No script found");
  57. }
  58. submenu_add_item(
  59. submenu, "[+] ADD SCRIPT", 99, wifi_marauder_scene_script_select_add_callback, app);
  60. storage_dir_close(dir_scripts);
  61. }
  62. storage_file_free(dir_scripts);
  63. submenu_set_selected_item(
  64. submenu, scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptSelect));
  65. view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewSubmenu);
  66. }
  67. bool wifi_marauder_scene_script_select_on_event(void* context, SceneManagerEvent event) {
  68. UNUSED(context);
  69. UNUSED(event);
  70. return false;
  71. }
  72. void wifi_marauder_scene_script_select_on_exit(void* context) {
  73. WifiMarauderApp* app = context;
  74. submenu_reset(app->submenu);
  75. for(int i = 0; i < app->script_list_count; i++) {
  76. furi_string_free(app->script_list[i]);
  77. }
  78. free(app->script_list);
  79. }