web_crawler_alloc.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. #include <alloc/web_crawler_alloc.h>
  2. /**
  3. * @brief Function to allocate resources for the WebCrawlerApp.
  4. * @return Pointer to the initialized WebCrawlerApp, or NULL on failure.
  5. */
  6. WebCrawlerApp* web_crawler_app_alloc() {
  7. // Initialize the entire structure to zero to prevent undefined behavior
  8. WebCrawlerApp* app = (WebCrawlerApp*)malloc(sizeof(WebCrawlerApp));
  9. // Open GUI
  10. Gui* gui = furi_record_open(RECORD_GUI);
  11. // Initialize UART with the correct callback
  12. if(!flipper_http_init(flipper_http_rx_callback, app)) {
  13. FURI_LOG_E(TAG, "Failed to initialize UART");
  14. return NULL;
  15. }
  16. // Allocate ViewDispatcher
  17. if(!easy_flipper_set_view_dispatcher(&app->view_dispatcher, gui, app)) {
  18. return NULL;
  19. }
  20. // Allocate and initialize temp_buffer and path
  21. app->temp_buffer_size_path = 128;
  22. app->temp_buffer_size_ssid = 64;
  23. app->temp_buffer_size_password = 64;
  24. app->temp_buffer_size_file_type = 16;
  25. app->temp_buffer_size_file_rename = 128;
  26. app->temp_buffer_size_http_method = 16;
  27. app->temp_buffer_size_headers = 256;
  28. app->temp_buffer_size_payload = 256;
  29. if(!easy_flipper_set_buffer(&app->temp_buffer_path, app->temp_buffer_size_path)) {
  30. return NULL;
  31. }
  32. if(!easy_flipper_set_buffer(&app->path, app->temp_buffer_size_path)) {
  33. return NULL;
  34. }
  35. if(!easy_flipper_set_buffer(&app->temp_buffer_ssid, app->temp_buffer_size_ssid)) {
  36. return NULL;
  37. }
  38. if(!easy_flipper_set_buffer(&app->ssid, app->temp_buffer_size_ssid)) {
  39. return NULL;
  40. }
  41. if(!easy_flipper_set_buffer(&app->temp_buffer_password, app->temp_buffer_size_password)) {
  42. return NULL;
  43. }
  44. if(!easy_flipper_set_buffer(&app->password, app->temp_buffer_size_password)) {
  45. return NULL;
  46. }
  47. if(!easy_flipper_set_buffer(&app->temp_buffer_file_type, app->temp_buffer_size_file_type)) {
  48. return NULL;
  49. }
  50. if(!easy_flipper_set_buffer(&app->file_type, app->temp_buffer_size_file_type)) {
  51. return NULL;
  52. }
  53. if(!easy_flipper_set_buffer(&app->temp_buffer_file_rename, app->temp_buffer_size_file_rename)) {
  54. return NULL;
  55. }
  56. if(!easy_flipper_set_buffer(&app->file_rename, app->temp_buffer_size_file_rename)) {
  57. return NULL;
  58. }
  59. if(!easy_flipper_set_buffer(&app->temp_buffer_http_method, app->temp_buffer_size_http_method)) {
  60. return NULL;
  61. }
  62. if(!easy_flipper_set_buffer(&app->http_method, app->temp_buffer_size_http_method)) {
  63. return NULL;
  64. }
  65. if(!easy_flipper_set_buffer(&app->temp_buffer_headers, app->temp_buffer_size_headers)) {
  66. return NULL;
  67. }
  68. if(!easy_flipper_set_buffer(&app->headers, app->temp_buffer_size_headers)) {
  69. return NULL;
  70. }
  71. if(!easy_flipper_set_buffer(&app->temp_buffer_payload, app->temp_buffer_size_payload)) {
  72. return NULL;
  73. }
  74. if(!easy_flipper_set_buffer(&app->payload, app->temp_buffer_size_payload)) {
  75. return NULL;
  76. }
  77. // Allocate TextInput views
  78. if(!easy_flipper_set_uart_text_input(
  79. &app->text_input_path,
  80. WebCrawlerViewTextInput,
  81. "Enter URL",
  82. app->temp_buffer_path,
  83. app->temp_buffer_size_path,
  84. NULL,
  85. web_crawler_back_to_request_callback,
  86. &app->view_dispatcher,
  87. app)) {
  88. return NULL;
  89. }
  90. if(!easy_flipper_set_uart_text_input(
  91. &app->text_input_ssid,
  92. WebCrawlerViewTextInputSSID,
  93. "Enter SSID",
  94. app->temp_buffer_ssid,
  95. app->temp_buffer_size_ssid,
  96. NULL,
  97. web_crawler_back_to_wifi_callback,
  98. &app->view_dispatcher,
  99. app)) {
  100. return NULL;
  101. }
  102. if(!easy_flipper_set_uart_text_input(
  103. &app->text_input_password,
  104. WebCrawlerViewTextInputPassword,
  105. "Enter Password",
  106. app->temp_buffer_password,
  107. app->temp_buffer_size_password,
  108. NULL,
  109. web_crawler_back_to_wifi_callback,
  110. &app->view_dispatcher,
  111. app)) {
  112. return NULL;
  113. }
  114. if(!easy_flipper_set_uart_text_input(
  115. &app->text_input_file_type,
  116. WebCrawlerViewTextInputFileType,
  117. "Enter File Type",
  118. app->temp_buffer_file_type,
  119. app->temp_buffer_size_file_type,
  120. NULL,
  121. web_crawler_back_to_file_callback,
  122. &app->view_dispatcher,
  123. app)) {
  124. return NULL;
  125. }
  126. if(!easy_flipper_set_uart_text_input(
  127. &app->text_input_file_rename,
  128. WebCrawlerViewTextInputFileRename,
  129. "Enter File Rename",
  130. app->temp_buffer_file_rename,
  131. app->temp_buffer_size_file_rename,
  132. NULL,
  133. web_crawler_back_to_file_callback,
  134. &app->view_dispatcher,
  135. app)) {
  136. return NULL;
  137. }
  138. if(!easy_flipper_set_uart_text_input(
  139. &app->text_input_headers,
  140. WebCrawlerViewTextInputHeaders,
  141. "Enter Headers",
  142. app->temp_buffer_headers,
  143. app->temp_buffer_size_headers,
  144. NULL,
  145. web_crawler_back_to_request_callback,
  146. &app->view_dispatcher,
  147. app)) {
  148. return NULL;
  149. }
  150. if(!easy_flipper_set_uart_text_input(
  151. &app->text_input_payload,
  152. WebCrawlerViewTextInputPayload,
  153. "Enter Payload",
  154. app->temp_buffer_payload,
  155. app->temp_buffer_size_payload,
  156. NULL,
  157. web_crawler_back_to_request_callback,
  158. &app->view_dispatcher,
  159. app)) {
  160. return NULL;
  161. }
  162. // Allocate VariableItemList views
  163. if(!easy_flipper_set_variable_item_list(
  164. &app->variable_item_list_wifi,
  165. WebCrawlerViewVariableItemListWifi,
  166. web_crawler_wifi_enter_callback,
  167. web_crawler_back_to_configure_callback,
  168. &app->view_dispatcher,
  169. app)) {
  170. return NULL;
  171. }
  172. if(!easy_flipper_set_variable_item_list(
  173. &app->variable_item_list_file,
  174. WebCrawlerViewVariableItemListFile,
  175. web_crawler_file_enter_callback,
  176. web_crawler_back_to_configure_callback,
  177. &app->view_dispatcher,
  178. app)) {
  179. return NULL;
  180. }
  181. if(!easy_flipper_set_variable_item_list(
  182. &app->variable_item_list_request,
  183. WebCrawlerViewVariableItemListRequest,
  184. web_crawler_request_enter_callback,
  185. web_crawler_back_to_configure_callback,
  186. &app->view_dispatcher,
  187. app)) {
  188. return NULL;
  189. }
  190. // set variable items
  191. app->path_item =
  192. variable_item_list_add(app->variable_item_list_request, "Path", 0, NULL, NULL);
  193. app->http_method_item = variable_item_list_add(
  194. app->variable_item_list_request, "HTTP Method", 5, web_crawler_http_method_change, app);
  195. app->headers_item =
  196. variable_item_list_add(app->variable_item_list_request, "Headers", 0, NULL, NULL);
  197. app->payload_item =
  198. variable_item_list_add(app->variable_item_list_request, "Payload", 0, NULL, NULL);
  199. //
  200. app->ssid_item =
  201. variable_item_list_add(app->variable_item_list_wifi, "SSID", 0, NULL, NULL); // index 0
  202. app->password_item =
  203. variable_item_list_add(app->variable_item_list_wifi, "Password", 0, NULL, NULL); // index 1
  204. //
  205. app->file_read_item = variable_item_list_add(
  206. app->variable_item_list_file, "Read File", 0, NULL, NULL); // index 0
  207. app->file_type_item = variable_item_list_add(
  208. app->variable_item_list_file, "Set File Type", 0, NULL, NULL); // index 1
  209. app->file_rename_item = variable_item_list_add(
  210. app->variable_item_list_file, "Rename File", 0, NULL, NULL); // index 2
  211. app->file_delete_item = variable_item_list_add(
  212. app->variable_item_list_file, "Delete File", 0, NULL, NULL); // index 3
  213. if(!app->ssid_item || !app->password_item || !app->file_type_item || !app->file_rename_item ||
  214. !app->path_item || !app->file_read_item || !app->file_delete_item ||
  215. !app->http_method_item || !app->headers_item || !app->payload_item) {
  216. free_all(app, "Failed to add items to VariableItemList");
  217. return NULL;
  218. }
  219. variable_item_set_current_value_text(app->path_item, ""); // Initialize
  220. variable_item_set_current_value_text(app->http_method_item, ""); // Initialize
  221. variable_item_set_current_value_text(app->headers_item, ""); // Initialize
  222. variable_item_set_current_value_text(app->payload_item, ""); // Initialize
  223. variable_item_set_current_value_text(app->ssid_item, ""); // Initialize
  224. variable_item_set_current_value_text(app->password_item, ""); // Initialize
  225. variable_item_set_current_value_text(app->file_type_item, ""); // Initialize
  226. variable_item_set_current_value_text(app->file_rename_item, ""); // Initialize
  227. variable_item_set_current_value_text(app->file_read_item, ""); // Initialize
  228. variable_item_set_current_value_text(app->file_delete_item, ""); // Initialize
  229. // Allocate Submenu views
  230. if(!easy_flipper_set_submenu(
  231. &app->submenu_main,
  232. WebCrawlerViewSubmenuMain,
  233. "Web Crawler v0.7",
  234. web_crawler_exit_app_callback,
  235. &app->view_dispatcher)) {
  236. return NULL;
  237. }
  238. if(!easy_flipper_set_submenu(
  239. &app->submenu_config,
  240. WebCrawlerViewSubmenuConfig,
  241. "Settings",
  242. web_crawler_back_to_main_callback,
  243. &app->view_dispatcher)) {
  244. return NULL;
  245. }
  246. // Add Submenu items
  247. submenu_add_item(
  248. app->submenu_main, "Run", WebCrawlerSubmenuIndexRun, web_crawler_submenu_callback, app);
  249. submenu_add_item(
  250. app->submenu_main, "About", WebCrawlerSubmenuIndexAbout, web_crawler_submenu_callback, app);
  251. submenu_add_item(
  252. app->submenu_main,
  253. "Settings",
  254. WebCrawlerSubmenuIndexConfig,
  255. web_crawler_submenu_callback,
  256. app);
  257. submenu_add_item(
  258. app->submenu_config, "WiFi", WebCrawlerSubmenuIndexWifi, web_crawler_submenu_callback, app);
  259. submenu_add_item(
  260. app->submenu_config, "File", WebCrawlerSubmenuIndexFile, web_crawler_submenu_callback, app);
  261. submenu_add_item(
  262. app->submenu_config,
  263. "Request",
  264. WebCrawlerSubmenuIndexRequest,
  265. web_crawler_submenu_callback,
  266. app);
  267. // Allocate views
  268. if(!easy_flipper_set_view(
  269. &app->view_main,
  270. WebCrawlerViewMain,
  271. NULL,
  272. NULL,
  273. web_crawler_exit_app_callback,
  274. &app->view_dispatcher,
  275. app)) {
  276. return NULL;
  277. }
  278. if(!easy_flipper_set_view(
  279. &app->view_run,
  280. WebCrawlerViewRun,
  281. web_crawler_view_draw_callback,
  282. NULL,
  283. web_crawler_back_to_main_callback,
  284. &app->view_dispatcher,
  285. app)) {
  286. return NULL;
  287. }
  288. //-- WIDGET ABOUT VIEW --
  289. if(!easy_flipper_set_widget(
  290. &app->widget_about,
  291. WebCrawlerViewAbout,
  292. "Web Crawler App\n---\nThis is a web crawler app for Flipper Zero.\n---\nVisit github.com/jblanked for more details.\n---\nPress BACK to return.",
  293. web_crawler_back_to_main_callback,
  294. &app->view_dispatcher)) {
  295. return NULL;
  296. }
  297. if(!easy_flipper_set_widget(
  298. &app->widget_file_read,
  299. WebCrawlerViewFileRead,
  300. "Data will be displayed here.",
  301. web_crawler_back_to_file_callback,
  302. &app->view_dispatcher)) {
  303. return NULL;
  304. }
  305. if(!easy_flipper_set_widget(
  306. &app->widget_file_delete,
  307. WebCrawlerViewFileDelete,
  308. "File deleted.",
  309. web_crawler_back_to_file_callback,
  310. &app->view_dispatcher)) {
  311. return NULL;
  312. }
  313. // Load Settings and Update Views
  314. if(!load_settings(
  315. app->path,
  316. app->temp_buffer_size_path,
  317. app->ssid,
  318. app->temp_buffer_size_ssid,
  319. app->password,
  320. app->temp_buffer_size_password,
  321. app->file_rename,
  322. app->temp_buffer_size_file_rename,
  323. app->file_type,
  324. app->temp_buffer_size_file_type,
  325. app->http_method,
  326. app->temp_buffer_size_http_method,
  327. app->headers,
  328. app->temp_buffer_size_headers,
  329. app->payload,
  330. app->temp_buffer_size_payload,
  331. app)) {
  332. FURI_LOG_E(TAG, "Failed to load settings");
  333. } else {
  334. // Update the configuration items based on loaded settings
  335. if(app->path_item) {
  336. variable_item_set_current_value_text(app->path_item, app->path);
  337. } else {
  338. variable_item_set_current_value_text(
  339. app->path_item, "https://httpbin.org/get"); // Initialize
  340. }
  341. if(app->ssid_item) {
  342. variable_item_set_current_value_text(app->ssid_item, app->ssid);
  343. } else {
  344. variable_item_set_current_value_text(app->ssid_item, ""); // Initialize
  345. }
  346. if(app->file_type_item) {
  347. variable_item_set_current_value_text(app->file_type_item, app->file_type);
  348. } else {
  349. variable_item_set_current_value_text(app->file_type_item, ".txt"); // Initialize
  350. }
  351. if(app->file_rename_item) {
  352. variable_item_set_current_value_text(app->file_rename_item, app->file_rename);
  353. } else {
  354. variable_item_set_current_value_text(
  355. app->file_rename_item, "received_data"); // Initialize
  356. }
  357. if(app->http_method_item) {
  358. variable_item_set_current_value_text(app->http_method_item, app->http_method);
  359. } else {
  360. variable_item_set_current_value_text(app->http_method_item, "GET"); // Initialize
  361. }
  362. if(app->headers_item) {
  363. variable_item_set_current_value_text(app->headers_item, app->headers);
  364. } else {
  365. variable_item_set_current_value_text(
  366. app->headers_item, "{\n\t\"Content-Type\": \"application/json\"\n}"); // Initialize
  367. }
  368. if(app->payload_item) {
  369. variable_item_set_current_value_text(app->payload_item, app->payload);
  370. } else {
  371. variable_item_set_current_value_text(
  372. app->payload_item, "{\n\t\"key\": \"value\"\n}"); // Initialize
  373. }
  374. // set the file path for fhttp.file_path
  375. char file_path[128];
  376. snprintf(
  377. file_path,
  378. sizeof(file_path),
  379. "%s%s%s",
  380. RECEIVED_DATA_PATH,
  381. app->file_rename,
  382. app->file_type);
  383. snprintf(fhttp.file_path, sizeof(fhttp.file_path), "%s", file_path);
  384. // update temp buffers
  385. strncpy(app->temp_buffer_path, app->path, app->temp_buffer_size_path - 1);
  386. app->temp_buffer_path[app->temp_buffer_size_path - 1] = '\0';
  387. strncpy(app->temp_buffer_ssid, app->ssid, app->temp_buffer_size_ssid - 1);
  388. app->temp_buffer_ssid[app->temp_buffer_size_ssid - 1] = '\0';
  389. strncpy(app->temp_buffer_file_type, app->file_type, app->temp_buffer_size_file_type - 1);
  390. app->temp_buffer_file_type[app->temp_buffer_size_file_type - 1] = '\0';
  391. strncpy(
  392. app->temp_buffer_file_rename, app->file_rename, app->temp_buffer_size_file_rename - 1);
  393. app->temp_buffer_file_rename[app->temp_buffer_size_file_rename - 1] = '\0';
  394. strncpy(
  395. app->temp_buffer_http_method, app->http_method, app->temp_buffer_size_http_method - 1);
  396. app->temp_buffer_http_method[app->temp_buffer_size_http_method - 1] = '\0';
  397. strncpy(app->temp_buffer_headers, app->headers, app->temp_buffer_size_headers - 1);
  398. app->temp_buffer_headers[app->temp_buffer_size_headers - 1] = '\0';
  399. strncpy(app->temp_buffer_payload, app->payload, app->temp_buffer_size_payload - 1);
  400. app->temp_buffer_payload[app->temp_buffer_size_payload - 1] = '\0';
  401. // Password handling can be omitted for security or handled securely
  402. }
  403. // Start with the Submenu view
  404. view_dispatcher_switch_to_view(app->view_dispatcher, WebCrawlerViewSubmenuMain);
  405. return app;
  406. }