wifi_marauder_script_worker.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "../wifi_marauder_app_i.h"
  2. #include "wifi_marauder_script_worker.h"
  3. WifiMarauderScriptWorker* wifi_marauder_script_worker_alloc() {
  4. WifiMarauderScriptWorker* worker = malloc(sizeof(WifiMarauderScriptWorker));
  5. if(worker == NULL) {
  6. return NULL;
  7. }
  8. worker->callback_start = NULL;
  9. worker->callback_stage = NULL;
  10. worker->worker_thread = NULL;
  11. worker->is_running = false;
  12. return worker;
  13. }
  14. int32_t _wifi_marauder_script_worker_task(void* worker) {
  15. WifiMarauderScriptWorker* script_worker = worker;
  16. WifiMarauderScript* script = script_worker->script;
  17. if(script == NULL) {
  18. return WifiMarauderScriptWorkerStatusInvalidScript;
  19. }
  20. // Setup
  21. script_worker->callback_start(script_worker->context);
  22. if(!script_worker->is_running) {
  23. return WifiMarauderScriptWorkerStatusForceExit;
  24. }
  25. // Stages
  26. for(int i = 0; i < script->repeat; i++) {
  27. WifiMarauderScriptStage* current_stage = script->first_stage;
  28. while(current_stage != NULL && script_worker->is_running) {
  29. script_worker->callback_stage(current_stage, script_worker->context);
  30. current_stage = current_stage->next_stage;
  31. }
  32. if(!script_worker->is_running) {
  33. return WifiMarauderScriptWorkerStatusForceExit;
  34. }
  35. }
  36. script_worker->is_running = false;
  37. return WifiMarauderScriptWorkerStatusSuccess;
  38. }
  39. bool wifi_marauder_script_worker_start(
  40. WifiMarauderScriptWorker* instance,
  41. WifiMarauderScript* script) {
  42. if(!instance || !script) {
  43. return false;
  44. }
  45. instance->callback_start = wifi_marauder_script_execute_start;
  46. instance->callback_stage = wifi_marauder_script_execute_stage;
  47. instance->script = script;
  48. instance->context = instance;
  49. instance->is_running = true;
  50. instance->worker_thread = furi_thread_alloc_ex(
  51. "WifiMarauderScriptWorker", 1024, _wifi_marauder_script_worker_task, instance);
  52. if(!instance->worker_thread) {
  53. return false;
  54. }
  55. furi_thread_start(instance->worker_thread);
  56. return true;
  57. }
  58. void wifi_marauder_script_worker_free(WifiMarauderScriptWorker* worker) {
  59. if(worker != NULL) {
  60. if(worker->worker_thread != NULL) {
  61. worker->is_running = false;
  62. furi_thread_join(worker->worker_thread);
  63. furi_thread_free(worker->worker_thread);
  64. }
  65. free(worker);
  66. }
  67. }