wifi_marauder_scene_user_input.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include "../wifi_marauder_app_i.h"
  2. bool wifi_marauder_scene_user_input_validator_number_callback(
  3. const char* text,
  4. FuriString* error,
  5. void* context) {
  6. UNUSED(context);
  7. for(int i = 0; text[i] != '\0'; i++) {
  8. if(text[i] < '0' || text[i] > '9') {
  9. furi_string_printf(error, "This is not\na valid\nnumber!");
  10. return false;
  11. }
  12. }
  13. return true;
  14. }
  15. bool wifi_marauder_scene_user_input_validator_file_callback(
  16. const char* text,
  17. FuriString* error,
  18. void* context) {
  19. UNUSED(context);
  20. if(strlen(text) == 0) {
  21. furi_string_printf(error, "File name\ncannot be\nblank!");
  22. return false;
  23. }
  24. return true;
  25. }
  26. void wifi_marauder_scene_user_input_ok_callback(void* context) {
  27. WifiMarauderApp* app = context;
  28. File* file = NULL;
  29. char* file_path = NULL;
  30. switch(app->user_input_type) {
  31. // Writes the string value of the reference
  32. case WifiMarauderUserInputTypeString:
  33. if(app->user_input_string_reference != NULL) {
  34. strncpy(
  35. *app->user_input_string_reference,
  36. app->text_input_store,
  37. strlen(app->text_input_store) + 1);
  38. app->user_input_string_reference = NULL;
  39. }
  40. break;
  41. // Writes the numerical value of the reference
  42. case WifiMarauderUserInputTypeNumber:
  43. if(app->user_input_number_reference != NULL) {
  44. *app->user_input_number_reference = atoi(app->text_input_store);
  45. app->user_input_number_reference = NULL;
  46. }
  47. break;
  48. // Creates a file with the name entered by the user, if it does not exist
  49. case WifiMarauderUserInputTypeFileName:
  50. file = storage_file_alloc(app->storage);
  51. // Use application directory if not specified
  52. if(app->user_input_file_dir == NULL) {
  53. app->user_input_file_dir = strdup(MARAUDER_APP_FOLDER);
  54. }
  55. if(app->user_input_file_extension != NULL) {
  56. size_t file_path_len = strlen(app->user_input_file_dir) +
  57. strlen(app->text_input_store) +
  58. strlen(app->user_input_file_extension) + 3;
  59. file_path = (char*)malloc(file_path_len);
  60. snprintf(
  61. file_path,
  62. file_path_len,
  63. "%s/%s.%s",
  64. app->user_input_file_dir,
  65. app->text_input_store,
  66. app->user_input_file_extension);
  67. } else {
  68. size_t file_path_len =
  69. strlen(app->user_input_file_dir) + strlen(app->text_input_store) + 2;
  70. file_path = (char*)malloc(file_path_len);
  71. snprintf(
  72. file_path, file_path_len, "%s/%s", app->user_input_file_dir, app->text_input_store);
  73. }
  74. if(storage_file_open(file, file_path, FSAM_WRITE, FSOM_CREATE_NEW)) {
  75. storage_file_close(file);
  76. }
  77. // Free memory
  78. free(app->user_input_file_dir);
  79. app->user_input_file_dir = NULL;
  80. free(app->user_input_file_extension);
  81. app->user_input_file_extension = NULL;
  82. free(file_path);
  83. storage_file_free(file);
  84. break;
  85. default:
  86. break;
  87. }
  88. view_dispatcher_send_custom_event(app->view_dispatcher, WifiMarauderEventPrevScene);
  89. }
  90. void wifi_marauder_scene_user_input_on_enter(void* context) {
  91. WifiMarauderApp* app = context;
  92. switch(app->user_input_type) {
  93. // Loads the string value of the reference
  94. case WifiMarauderUserInputTypeString:
  95. text_input_set_header_text(app->text_input, "Enter value:");
  96. text_input_set_validator(app->text_input, NULL, app);
  97. if(app->user_input_string_reference != NULL) {
  98. strncpy(
  99. app->text_input_store,
  100. *app->user_input_string_reference,
  101. strlen(*app->user_input_string_reference) + 1);
  102. }
  103. text_input_show_illegal_symbols(app->text_input, true);
  104. break;
  105. // Loads the numerical value of the reference
  106. case WifiMarauderUserInputTypeNumber:
  107. text_input_set_header_text(app->text_input, "Enter a valid number:");
  108. text_input_set_validator(
  109. app->text_input, wifi_marauder_scene_user_input_validator_number_callback, app);
  110. if(app->user_input_number_reference != NULL) {
  111. char number_str[32];
  112. snprintf(number_str, sizeof(number_str), "%d", *app->user_input_number_reference);
  113. strncpy(app->text_input_store, number_str, strlen(number_str) + 1);
  114. }
  115. break;
  116. // File name
  117. case WifiMarauderUserInputTypeFileName:
  118. text_input_set_header_text(app->text_input, "Enter file name:");
  119. text_input_set_validator(
  120. app->text_input, wifi_marauder_scene_user_input_validator_file_callback, app);
  121. break;
  122. default:
  123. scene_manager_previous_scene(app->scene_manager);
  124. return;
  125. }
  126. text_input_set_result_callback(
  127. app->text_input,
  128. wifi_marauder_scene_user_input_ok_callback,
  129. app,
  130. app->text_input_store,
  131. WIFI_MARAUDER_TEXT_INPUT_STORE_SIZE,
  132. false);
  133. view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewTextInput);
  134. }
  135. bool wifi_marauder_scene_user_input_on_event(void* context, SceneManagerEvent event) {
  136. WifiMarauderApp* app = context;
  137. bool consumed = false;
  138. if(event.type == SceneManagerEventTypeCustom) {
  139. if(event.event == WifiMarauderEventPrevScene) {
  140. scene_manager_previous_scene(app->scene_manager);
  141. consumed = true;
  142. }
  143. }
  144. return consumed;
  145. }
  146. void wifi_marauder_scene_user_input_on_exit(void* context) {
  147. WifiMarauderApp* app = context;
  148. memset(app->text_input_store, 0, sizeof(app->text_input_store));
  149. text_input_reset(app->text_input);
  150. }