wifi_marauder_scene_script_edit_list.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include "../wifi_marauder_app_i.h"
  2. static void
  3. wifi_marauder_scene_script_stage_edit_list_add_callback(void* context, uint32_t index) {
  4. WifiMarauderApp* app = context;
  5. // Creates new item
  6. WifiMarauderScriptStageListItem* new_item =
  7. (WifiMarauderScriptStageListItem*)malloc(sizeof(WifiMarauderScriptStageListItem));
  8. new_item->value = malloc(64);
  9. new_item->next_item = NULL;
  10. if(app->script_stage_edit_first_item == NULL) {
  11. app->script_stage_edit_first_item = new_item;
  12. } else {
  13. WifiMarauderScriptStageListItem* last_item = app->script_stage_edit_first_item;
  14. while(last_item->next_item != NULL) {
  15. last_item = last_item->next_item;
  16. }
  17. last_item->next_item = new_item;
  18. }
  19. scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEditList, index);
  20. app->user_input_type = WifiMarauderUserInputTypeString;
  21. app->user_input_string_reference = &new_item->value;
  22. scene_manager_next_scene(app->scene_manager, WifiMarauderSceneUserInput);
  23. }
  24. static void wifi_marauder_scene_script_stage_edit_list_deallocate_items(WifiMarauderApp* app) {
  25. WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
  26. while(current_item != NULL) {
  27. WifiMarauderScriptStageListItem* next_item = current_item->next_item;
  28. free(current_item->value);
  29. free(current_item);
  30. current_item = next_item;
  31. }
  32. app->script_stage_edit_first_item = NULL;
  33. }
  34. static void wifi_marauder_scene_script_stage_edit_list_save_strings(WifiMarauderApp* app) {
  35. WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
  36. int array_size = 0;
  37. // Calculates the required array size
  38. while(current_item != NULL) {
  39. array_size++;
  40. current_item = current_item->next_item;
  41. }
  42. // Reallocate the array of strings if necessary
  43. if(*app->script_stage_edit_string_count_reference < array_size) {
  44. *app->script_stage_edit_strings_reference =
  45. realloc(*app->script_stage_edit_strings_reference, array_size * sizeof(char*));
  46. }
  47. // Fills the array of strings
  48. current_item = app->script_stage_edit_first_item;
  49. int i = 0;
  50. while(current_item != NULL) {
  51. char* current_str = malloc(strlen(current_item->value) + 1);
  52. strncpy(current_str, current_item->value, strlen(current_item->value) + 1);
  53. (*app->script_stage_edit_strings_reference)[i] = current_str;
  54. current_item = current_item->next_item;
  55. i++;
  56. }
  57. *app->script_stage_edit_string_count_reference = array_size;
  58. }
  59. static void wifi_marauder_scene_script_stage_edit_list_save_numbers(WifiMarauderApp* app) {
  60. WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
  61. int array_size = 0;
  62. // Calculates the required array size
  63. while(current_item != NULL) {
  64. array_size++;
  65. current_item = current_item->next_item;
  66. }
  67. // Reallocate the array of integers if necessary
  68. if(*app->script_stage_edit_number_count_reference < array_size) {
  69. *app->script_stage_edit_numbers_reference =
  70. realloc(*app->script_stage_edit_numbers_reference, array_size * sizeof(int));
  71. }
  72. // Fills the array of integers
  73. current_item = app->script_stage_edit_first_item;
  74. int i = 0;
  75. while(current_item != NULL) {
  76. (*app->script_stage_edit_numbers_reference)[i] = atoi(current_item->value);
  77. current_item = current_item->next_item;
  78. i++;
  79. }
  80. *app->script_stage_edit_number_count_reference = array_size;
  81. }
  82. static void
  83. wifi_marauder_scene_script_stage_edit_list_save_callback(void* context, uint32_t index) {
  84. UNUSED(index);
  85. WifiMarauderApp* app = context;
  86. if(app->script_stage_edit_strings_reference != NULL &&
  87. app->script_stage_edit_string_count_reference != NULL) {
  88. wifi_marauder_scene_script_stage_edit_list_save_strings(app);
  89. }
  90. if(app->script_stage_edit_numbers_reference != NULL &&
  91. app->script_stage_edit_number_count_reference != NULL) {
  92. wifi_marauder_scene_script_stage_edit_list_save_numbers(app);
  93. }
  94. wifi_marauder_scene_script_stage_edit_list_deallocate_items(app);
  95. scene_manager_previous_scene(app->scene_manager);
  96. }
  97. static void
  98. wifi_marauder_scene_script_stage_edit_list_clear_callback(void* context, uint32_t index) {
  99. UNUSED(index);
  100. WifiMarauderApp* app = context;
  101. wifi_marauder_scene_script_stage_edit_list_deallocate_items(app);
  102. submenu_reset(app->submenu);
  103. submenu_add_item(
  104. app->submenu,
  105. "[+] ADD ITEM",
  106. 99,
  107. wifi_marauder_scene_script_stage_edit_list_add_callback,
  108. app);
  109. submenu_add_item(
  110. app->submenu,
  111. "[*] SAVE ITEMS",
  112. 99,
  113. wifi_marauder_scene_script_stage_edit_list_save_callback,
  114. app);
  115. submenu_add_item(
  116. app->submenu,
  117. "[-] CLEAR LIST",
  118. 99,
  119. wifi_marauder_scene_script_stage_edit_list_clear_callback,
  120. app);
  121. }
  122. void wifi_marauder_scene_script_stage_edit_list_on_enter(void* context) {
  123. WifiMarauderApp* app = context;
  124. int item_index = 0;
  125. WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
  126. while(current_item != NULL) {
  127. submenu_add_item(app->submenu, current_item->value, item_index++, NULL, app);
  128. current_item = current_item->next_item;
  129. }
  130. submenu_add_item(
  131. app->submenu,
  132. "[+] ADD ITEM",
  133. 99,
  134. wifi_marauder_scene_script_stage_edit_list_add_callback,
  135. app);
  136. submenu_add_item(
  137. app->submenu,
  138. "[*] SAVE ITEMS",
  139. 99,
  140. wifi_marauder_scene_script_stage_edit_list_save_callback,
  141. app);
  142. submenu_add_item(
  143. app->submenu,
  144. "[-] CLEAR LIST",
  145. 99,
  146. wifi_marauder_scene_script_stage_edit_list_clear_callback,
  147. app);
  148. submenu_set_selected_item(
  149. app->submenu,
  150. scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEditList));
  151. view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewSubmenu);
  152. }
  153. bool wifi_marauder_scene_script_stage_edit_list_on_event(void* context, SceneManagerEvent event) {
  154. UNUSED(context);
  155. UNUSED(event);
  156. return false;
  157. }
  158. void wifi_marauder_scene_script_stage_edit_list_on_exit(void* context) {
  159. WifiMarauderApp* app = context;
  160. submenu_reset(app->submenu);
  161. }