wifi_marauder_scene_log_viewer.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include "../wifi_marauder_app_i.h"
  2. void wifi_marauder_scene_log_viewer_widget_callback(
  3. GuiButtonType result,
  4. InputType type,
  5. void* context) {
  6. WifiMarauderApp* app = context;
  7. if(type == InputTypeShort) {
  8. view_dispatcher_send_custom_event(app->view_dispatcher, result);
  9. }
  10. }
  11. static void _read_log_page_into_text_store(WifiMarauderApp* app) {
  12. char temp[64 + 1];
  13. storage_file_seek(
  14. app->log_file, WIFI_MARAUDER_TEXT_BOX_STORE_SIZE * (app->open_log_file_page - 1), true);
  15. furi_string_reset(app->text_box_store);
  16. for(uint16_t i = 0; i < (WIFI_MARAUDER_TEXT_BOX_STORE_SIZE / (sizeof(temp) - 1)); i++) {
  17. uint16_t num_bytes = storage_file_read(app->log_file, temp, sizeof(temp) - 1);
  18. if(num_bytes == 0) {
  19. break;
  20. }
  21. temp[num_bytes] = '\0';
  22. furi_string_cat_str(app->text_box_store, temp);
  23. }
  24. }
  25. void wifi_marauder_scene_log_viewer_setup_widget(WifiMarauderApp* app, bool called_from_browse) {
  26. Widget* widget = app->widget;
  27. bool is_open = storage_file_is_open(app->log_file);
  28. bool should_open_log = (app->has_saved_logs_this_session || called_from_browse);
  29. if(is_open) {
  30. _read_log_page_into_text_store(app);
  31. } else if(
  32. should_open_log &&
  33. storage_file_open(app->log_file, app->log_file_path, FSAM_READ, FSOM_OPEN_EXISTING)) {
  34. uint64_t filesize = storage_file_size(app->log_file);
  35. app->open_log_file_num_pages = filesize / WIFI_MARAUDER_TEXT_BOX_STORE_SIZE;
  36. int extra_page = (filesize % WIFI_MARAUDER_TEXT_BOX_STORE_SIZE != 0) ? 1 : 0;
  37. app->open_log_file_num_pages = (filesize / WIFI_MARAUDER_TEXT_BOX_STORE_SIZE) + extra_page;
  38. app->open_log_file_page = 1;
  39. _read_log_page_into_text_store(app);
  40. } else {
  41. app->open_log_file_page = 0;
  42. app->open_log_file_num_pages = 0;
  43. }
  44. widget_reset(widget);
  45. if(furi_string_empty(app->text_box_store)) {
  46. char help_msg[256];
  47. snprintf(
  48. help_msg,
  49. sizeof(help_msg),
  50. "The log is empty! :(\nTry sending a command?\n\nSaving pcaps to flipper sdcard: %s\nSaving logs to flipper sdcard: %s",
  51. app->ok_to_save_pcaps ? "ON" : "OFF",
  52. app->ok_to_save_logs ? "ON" : "OFF");
  53. furi_string_set_str(app->text_box_store, help_msg);
  54. }
  55. widget_add_text_scroll_element(
  56. widget, 0, 0, 128, 53, furi_string_get_cstr(app->text_box_store));
  57. if(1 < app->open_log_file_page && app->open_log_file_page < app->open_log_file_num_pages) {
  58. // hide "Browse" text for middle pages
  59. widget_add_button_element(
  60. widget, GuiButtonTypeCenter, "", wifi_marauder_scene_log_viewer_widget_callback, app);
  61. } else {
  62. // only show "Browse" text on first and last page
  63. widget_add_button_element(
  64. widget,
  65. GuiButtonTypeCenter,
  66. "Browse",
  67. wifi_marauder_scene_log_viewer_widget_callback,
  68. app);
  69. }
  70. char pagecounter[100];
  71. snprintf(
  72. pagecounter,
  73. sizeof(pagecounter),
  74. "%d/%d",
  75. app->open_log_file_page,
  76. app->open_log_file_num_pages);
  77. if(app->open_log_file_page > 1) {
  78. if(app->open_log_file_page == app->open_log_file_num_pages) {
  79. // only show left side page-count on last page
  80. widget_add_button_element(
  81. widget,
  82. GuiButtonTypeLeft,
  83. pagecounter,
  84. wifi_marauder_scene_log_viewer_widget_callback,
  85. app);
  86. } else {
  87. widget_add_button_element(
  88. widget, GuiButtonTypeLeft, "", wifi_marauder_scene_log_viewer_widget_callback, app);
  89. }
  90. }
  91. if(app->open_log_file_page < app->open_log_file_num_pages) {
  92. widget_add_button_element(
  93. widget,
  94. GuiButtonTypeRight,
  95. pagecounter,
  96. wifi_marauder_scene_log_viewer_widget_callback,
  97. app);
  98. }
  99. }
  100. void wifi_marauder_scene_log_viewer_on_enter(void* context) {
  101. WifiMarauderApp* app = context;
  102. app->open_log_file_page = 0;
  103. app->open_log_file_num_pages = 0;
  104. bool saved_logs_exist = false;
  105. if (!app->has_saved_logs_this_session && furi_string_empty(app->text_box_store)) {
  106. // no commands sent yet this session, find last saved log
  107. if (storage_dir_open(app->log_file, MARAUDER_APP_FOLDER_LOGS)) {
  108. char name[70];
  109. char lastname[70];
  110. while (storage_dir_read(app->log_file, NULL, name, sizeof(name))) {
  111. // keep reading directory until last file is reached
  112. strlcpy(lastname, name, sizeof(lastname));
  113. saved_logs_exist = true;
  114. }
  115. if (saved_logs_exist) {
  116. snprintf(app->log_file_path, sizeof(app->log_file_path), "%s/%s", MARAUDER_APP_FOLDER_LOGS, lastname);
  117. }
  118. }
  119. storage_dir_close(app->log_file);
  120. }
  121. wifi_marauder_scene_log_viewer_setup_widget(app, saved_logs_exist);
  122. view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewWidget);
  123. }
  124. bool wifi_marauder_scene_log_viewer_on_event(void* context, SceneManagerEvent event) {
  125. WifiMarauderApp* app = context;
  126. bool consumed = false;
  127. if(event.type == SceneManagerEventTypeCustom) {
  128. if(event.event == GuiButtonTypeCenter) {
  129. // Browse
  130. FuriString* predefined_filepath = furi_string_alloc_set_str(MARAUDER_APP_FOLDER_LOGS);
  131. FuriString* selected_filepath = furi_string_alloc();
  132. if(dialog_file_browser_show(
  133. app->dialogs, selected_filepath, predefined_filepath, NULL)) {
  134. strncpy(
  135. app->log_file_path,
  136. furi_string_get_cstr(selected_filepath),
  137. sizeof(app->log_file_path));
  138. if(storage_file_is_open(app->log_file)) {
  139. storage_file_close(app->log_file);
  140. }
  141. wifi_marauder_scene_log_viewer_setup_widget(app, true);
  142. }
  143. furi_string_free(selected_filepath);
  144. furi_string_free(predefined_filepath);
  145. consumed = true;
  146. } else if(event.event == GuiButtonTypeRight) {
  147. // Advance page
  148. ++app->open_log_file_page;
  149. wifi_marauder_scene_log_viewer_setup_widget(app, false);
  150. } else if(event.event == GuiButtonTypeLeft) {
  151. // Previous page
  152. --app->open_log_file_page;
  153. wifi_marauder_scene_log_viewer_setup_widget(app, false);
  154. }
  155. }
  156. return consumed;
  157. }
  158. void wifi_marauder_scene_log_viewer_on_exit(void* context) {
  159. WifiMarauderApp* app = context;
  160. widget_reset(app->widget);
  161. if(storage_file_is_open(app->log_file)) {
  162. storage_file_close(app->log_file);
  163. }
  164. }