connection.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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 *
  21. api_open_connection(const char *name, attr_container_t *args,
  22. on_connection_event_f on_event, void *user_data)
  23. {
  24. connection_t *conn;
  25. char *args_buffer = (char *)args;
  26. uint32 handle, args_len = attr_container_get_serialize_length(args);
  27. handle = wasm_open_connection(name, args_buffer, args_len);
  28. if (handle == -1)
  29. return NULL;
  30. conn = (connection_t *)malloc(sizeof(*conn));
  31. if (conn == NULL) {
  32. wasm_close_connection(handle);
  33. return NULL;
  34. }
  35. memset(conn, 0, sizeof(*conn));
  36. conn->handle = handle;
  37. conn->on_event = on_event;
  38. conn->user_data = user_data;
  39. if (g_conns != NULL) {
  40. conn->next = g_conns;
  41. g_conns = conn;
  42. }
  43. else {
  44. g_conns = conn;
  45. }
  46. return conn;
  47. }
  48. void
  49. api_close_connection(connection_t *c)
  50. {
  51. connection_t *conn = g_conns, *prev = NULL;
  52. while (conn) {
  53. if (conn == c) {
  54. wasm_close_connection(c->handle);
  55. if (prev != NULL)
  56. prev->next = conn->next;
  57. else
  58. g_conns = conn->next;
  59. free(conn);
  60. return;
  61. }
  62. else {
  63. prev = conn;
  64. conn = conn->next;
  65. }
  66. }
  67. }
  68. int
  69. api_send_on_connection(connection_t *conn, const char *data, uint32 len)
  70. {
  71. return wasm_send_on_connection(conn->handle, data, len);
  72. }
  73. bool
  74. api_config_connection(connection_t *conn, attr_container_t *cfg)
  75. {
  76. char *cfg_buffer = (char *)cfg;
  77. uint32 cfg_len = attr_container_get_serialize_length(cfg);
  78. return wasm_config_connection(conn->handle, cfg_buffer, cfg_len);
  79. }
  80. void
  81. on_connection_data(uint32 handle, char *buffer, uint32 len)
  82. {
  83. connection_t *conn = g_conns;
  84. while (conn != NULL) {
  85. if (conn->handle == handle) {
  86. if (len == 0) {
  87. conn->on_event(conn, CONN_EVENT_TYPE_DISCONNECT, NULL, 0,
  88. conn->user_data);
  89. }
  90. else {
  91. conn->on_event(conn, CONN_EVENT_TYPE_DATA, buffer, len,
  92. conn->user_data);
  93. }
  94. return;
  95. }
  96. conn = conn->next;
  97. }
  98. }