web_crawler_i.h 16 KB

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