wifi_marauder_scene_log_viewer.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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(
  117. app->log_file_path,
  118. sizeof(app->log_file_path),
  119. "%s/%s",
  120. MARAUDER_APP_FOLDER_LOGS,
  121. lastname);
  122. }
  123. }
  124. storage_dir_close(app->log_file);
  125. }
  126. wifi_marauder_scene_log_viewer_setup_widget(app, saved_logs_exist);
  127. view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewWidget);
  128. }
  129. bool wifi_marauder_scene_log_viewer_on_event(void* context, SceneManagerEvent event) {
  130. WifiMarauderApp* app = context;
  131. bool consumed = false;
  132. if(event.type == SceneManagerEventTypeCustom) {
  133. if(event.event == GuiButtonTypeCenter) {
  134. // Browse
  135. FuriString* predefined_filepath = furi_string_alloc_set_str(MARAUDER_APP_FOLDER_LOGS);
  136. FuriString* selected_filepath = furi_string_alloc();
  137. DialogsFileBrowserOptions browser_options;
  138. dialog_file_browser_set_basic_options(&browser_options, ".log", &I_Text_10x10);
  139. if(dialog_file_browser_show(
  140. app->dialogs, selected_filepath, predefined_filepath, &browser_options)) {
  141. strncpy(
  142. app->log_file_path,
  143. furi_string_get_cstr(selected_filepath),
  144. sizeof(app->log_file_path));
  145. if(storage_file_is_open(app->log_file)) {
  146. storage_file_close(app->log_file);
  147. }
  148. wifi_marauder_scene_log_viewer_setup_widget(app, true);
  149. }
  150. furi_string_free(selected_filepath);
  151. furi_string_free(predefined_filepath);
  152. consumed = true;
  153. } else if(event.event == GuiButtonTypeRight) {
  154. // Advance page
  155. ++app->open_log_file_page;
  156. wifi_marauder_scene_log_viewer_setup_widget(app, false);
  157. } else if(event.event == GuiButtonTypeLeft) {
  158. // Previous page
  159. --app->open_log_file_page;
  160. wifi_marauder_scene_log_viewer_setup_widget(app, false);
  161. }
  162. }
  163. return consumed;
  164. }
  165. void wifi_marauder_scene_log_viewer_on_exit(void* context) {
  166. WifiMarauderApp* app = context;
  167. widget_reset(app->widget);
  168. if(storage_file_is_open(app->log_file)) {
  169. storage_file_close(app->log_file);
  170. }
  171. }