connection.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "wa-inc/connection.h"
  6. #include "connection_api.h"
  7. /* Raw connection structure */
  8. typedef struct _connection {
  9. /* Next connection */
  10. struct _connection *next;
  11. /* Handle of the connection */
  12. uint32 handle;
  13. /* Callback function called when event on this connection occurs */
  14. on_connection_event_f on_event;
  15. /* User data */
  16. void *user_data;
  17. } connection_t;
  18. /* Raw connections list */
  19. static connection_t *g_conns = NULL;
  20. connection_t *api_open_connection(const char *name,
  21. attr_container_t *args,
  22. on_connection_event_f on_event,
  23. void *user_data)
  24. {
  25. connection_t *conn;
  26. char *args_buffer = (char *)args;
  27. uint32 handle, args_len = attr_container_get_serialize_length(args);
  28. handle = wasm_open_connection(name, args_buffer, args_len);
  29. if (handle == -1)
  30. return NULL;
  31. conn = (connection_t *)malloc(sizeof(*conn));
  32. if (conn == NULL) {
  33. wasm_close_connection(handle);
  34. return NULL;
  35. }
  36. memset(conn, 0, sizeof(*conn));
  37. conn->handle = handle;
  38. conn->on_event = on_event;
  39. conn->user_data = user_data;
  40. if (g_conns != NULL) {
  41. conn->next = g_conns;
  42. g_conns = conn;
  43. } else {
  44. g_conns = conn;
  45. }
  46. return conn;
  47. }
  48. void api_close_connection(connection_t *c)
  49. {
  50. connection_t *conn = g_conns, *prev = NULL;
  51. while (conn) {
  52. if (conn == c) {
  53. wasm_close_connection(c->handle);
  54. if (prev != NULL)
  55. prev->next = conn->next;
  56. else
  57. g_conns = conn->next;
  58. free(conn);
  59. return;
  60. } else {
  61. prev = conn;
  62. conn = conn->next;
  63. }
  64. }
  65. }
  66. int api_send_on_connection(connection_t *conn, const char *data, uint32 len)
  67. {
  68. return wasm_send_on_connection(conn->handle, data, len);
  69. }
  70. bool api_config_connection(connection_t *conn, attr_container_t *cfg)
  71. {
  72. char *cfg_buffer = (char *)cfg;
  73. uint32 cfg_len = attr_container_get_serialize_length(cfg);
  74. return wasm_config_connection(conn->handle, cfg_buffer, cfg_len);
  75. }
  76. void on_connection_data(uint32 handle, char *buffer, uint32 len)
  77. {
  78. connection_t *conn = g_conns;
  79. while (conn != NULL) {
  80. if (conn->handle == handle) {
  81. if (len == 0) {
  82. conn->on_event(conn,
  83. CONN_EVENT_TYPE_DISCONNECT,
  84. NULL,
  85. 0,
  86. conn->user_data);
  87. } else {
  88. conn->on_event(conn,
  89. CONN_EVENT_TYPE_DATA,
  90. buffer,
  91. len,
  92. conn->user_data);
  93. }
  94. return;
  95. }
  96. conn = conn->next;
  97. }
  98. }