webrtc_signaling_server: Assign new id to incoming client 21/251421/13
authorSangchul Lee <sc11.lee@samsung.com>
Wed, 13 Jan 2021 10:41:19 +0000 (19:41 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 1 Feb 2021 02:44:21 +0000 (11:44 +0900)
[Version] 0.1.91
[Issue Type] Implementation

Change-Id: Ia16f762883f232fab937ee3fb2c055f2f1102a7b
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
include/webrtc_private.h
packaging/capi-media-webrtc.spec
src/webrtc_signaling_server.c

index 1dd9159fb82f475c9ca604d7c78a84d96e783ae0..0eae83ed1dd95126726e99f4863bc6c33cb33fb6 100644 (file)
@@ -363,6 +363,8 @@ typedef struct _webrtc_signaling_server_s {
        webrtc_websocket_s *ws;
        GThread *thread;
        bool exit_thread;
+
+       GHashTable *clients;
 } webrtc_signaling_server_s;
 
 int _load_ini(webrtc_s *webrtc);
index 05068d6f1c130c2f1bb9db8e86a18ec9c63b11fd..83720812e9a81c973895fa94cb2a6c6fad223fcd 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.1.90
+Version:    0.1.91
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 88208a5e1de14e09634e5c69658dca0596b31c1e..8791cfbdf64d4f9dd6889b160f1f8a2b8c2d665b 100644 (file)
@@ -44,16 +44,45 @@ static void __send_message(struct lws *wsi, const char *message)
        return;
 }
 
+static gchar *__make_new_peer_message(webrtc_signaling_server_s *server)
+{
+       gchar *peer = NULL;
+       gint32 id;
+
+       RET_VAL_IF(server == NULL, NULL, "server is NULL");
+
+       do {
+               g_free(peer);
+               id = g_random_int_range(10, 10000);
+               peer = g_strdup_printf("PEER %i", id);
+       } while (g_hash_table_contains(server->clients, peer));
+
+       return peer;
+}
+
 static int __ws_cb(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
 {
        LOG_DEBUG("wsi[%p] reason[%d] user[%p] in[%p] size[%zu]", wsi, reason, user, in, len);
 
        switch (reason) {
-       case LWS_CALLBACK_ESTABLISHED:
+       case LWS_CALLBACK_ESTABLISHED: {
+               webrtc_signaling_server_s *server = (webrtc_signaling_server_s *)lws_context_user(lws_get_context(wsi));
+               gchar *new_peer;
+
                LOG_INFO("ESTABLISHED");
-               /* FIXME: send message with unique id */
-               __send_message(wsi, "ESTABLISHED");
+
+               if (!(new_peer = __make_new_peer_message(server)))
+                       break;
+               if (!g_hash_table_insert(server->clients, new_peer, (gpointer)wsi)) {
+                       LOG_ERROR("should not be reached here, new_peer[%s] already exist, wsi[%p] will be removed", new_peer, wsi);
+                       g_hash_table_remove(server->clients, new_peer);
+                       break;
+               }
+               LOG_DEBUG("[%s] is connected", new_peer);
+
+               __send_message(wsi, new_peer);
                break;
+       }
        case LWS_CALLBACK_RECEIVE: {
                gchar *message = g_strndup((const gchar*)in, (gsize)len);
                LOG_INFO("RECEIVE:\n%s", message);
@@ -61,9 +90,23 @@ static int __ws_cb(struct lws *wsi, enum lws_callback_reasons reason, void *user
                g_free(message);
                break;
        }
-       case LWS_CALLBACK_CLOSED:
+       case LWS_CALLBACK_CLOSED: {
+               webrtc_signaling_server_s *server = (webrtc_signaling_server_s *)lws_context_user(lws_get_context(wsi));
+               GHashTableIter iter;
+               gpointer key, value;
+
                LOG_INFO("CLOSED");
+
+               g_hash_table_iter_init(&iter, server->clients);
+               while (g_hash_table_iter_next(&iter, &key, &value)) {
+                       if (value == wsi) {
+                               LOG_DEBUG("[%s] is disconnected", (const gchar *)key);
+                               g_hash_table_iter_remove(&iter);
+                               break;
+                       }
+               }
                break;
+       }
        case LWS_CALLBACK_PROTOCOL_INIT:
                LOG_DEBUG("PROTOCOL INIT");
                break;
@@ -105,6 +148,15 @@ static gpointer __thread_func(gpointer data)
        return NULL;
 }
 
+void _client_destroy_cb(gpointer data)
+{
+       struct lws *wsi = (struct lws *)data;
+
+       RET_IF(wsi == NULL, "wsi is NULL");
+
+       LOG_DEBUG("wsi[%p] is removed", wsi);
+}
+
 int webrtc_signaling_server_create(int port, webrtc_signaling_server_h *server)
 {
        webrtc_signaling_server_s *_server;
@@ -113,6 +165,8 @@ int webrtc_signaling_server_create(int port, webrtc_signaling_server_h *server)
 
        _server = g_new0(webrtc_signaling_server_s, 1);
 
+       _server->clients = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, _client_destroy_cb);
+
        /* FIXME: check the parameters from ini */
        _server->ws = _alloc_websocket(port, NULL, NULL, NULL, __ws_cb, _server);
        if (!_server->ws) {
@@ -207,6 +261,11 @@ int webrtc_signaling_server_destroy(webrtc_signaling_server_h server)
 
        _release_websocket(_server->ws);
 
+       if (_server->clients) {
+               g_hash_table_destroy(_server->clients);
+               _server->clients = NULL;
+       }
+
        LOG_INFO("server[%p]", _server);
 
        g_mutex_unlock(&_server->mutex);