request_response.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "app_manager_export.h"
  6. #include "coap_ext.h"
  7. #include "wasm_export.h"
  8. extern void module_request_handler(request_t *request, void *user_data);
  9. bool
  10. wasm_response_send(wasm_module_inst_t module_inst,
  11. int32 buffer_offset, int size)
  12. {
  13. char *buffer = NULL;
  14. if (!validate_app_addr(buffer_offset, size))
  15. return false;
  16. buffer = addr_app_to_native(buffer_offset);
  17. if (buffer != NULL) {
  18. response_t response[1];
  19. if (NULL == unpack_response(buffer, size, response))
  20. return false;
  21. am_send_response(response);
  22. return true;
  23. }
  24. return false;
  25. }
  26. void
  27. wasm_register_resource(wasm_module_inst_t module_inst, int32 url_offset)
  28. {
  29. char *url = NULL;
  30. if (!validate_app_str_addr(url_offset))
  31. return;
  32. url = addr_app_to_native(url_offset);
  33. if (url != NULL) {
  34. unsigned int mod_id = app_manager_get_module_id(Module_WASM_App,
  35. module_inst);
  36. am_register_resource(url, module_request_handler, mod_id);
  37. }
  38. }
  39. void
  40. wasm_post_request(wasm_module_inst_t module_inst,
  41. int32 buffer_offset, int size)
  42. {
  43. char *buffer = NULL;
  44. if (!validate_app_addr(buffer_offset, size))
  45. return;
  46. buffer = addr_app_to_native(buffer_offset);
  47. if (buffer != NULL) {
  48. request_t req[1];
  49. if (!unpack_request(buffer, size, req))
  50. return;
  51. // TODO: add permission check, ensure app can't do harm
  52. // set sender to help dispatch the response to the sender ap
  53. unsigned int mod_id = app_manager_get_module_id(Module_WASM_App,
  54. module_inst);
  55. req->sender = mod_id;
  56. if (req->action == COAP_EVENT) {
  57. am_publish_event(req);
  58. return;
  59. }
  60. am_dispatch_request(req);
  61. }
  62. }
  63. void
  64. wasm_sub_event(wasm_module_inst_t module_inst, int32 url_offset)
  65. {
  66. char *url = NULL;
  67. if (!validate_app_str_addr(url_offset))
  68. return;
  69. url = addr_app_to_native(url_offset);
  70. if (url != NULL) {
  71. unsigned int mod_id = app_manager_get_module_id(Module_WASM_App,
  72. module_inst);
  73. am_register_event(url, mod_id);
  74. }
  75. }