wifi_marauder_scene_user_input.c 5.3 KB

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