webrtc_signaling_client: Parse message and forward it to user callback 72/251572/14
authorSangchul Lee <sc11.lee@samsung.com>
Fri, 15 Jan 2021 04:52:39 +0000 (13:52 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 1 Feb 2021 10:29:43 +0000 (19:29 +0900)
A condition to allow only SDP or ICE candidate message is also added
in webrtc_signaling_send_message().

[Version] 0.1.95
[Issue Type] Implementation

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

index 6019e5d475dcaa0c1d8faa37b462bb83b52e765f..73edd2e7b4023176e45142480cde6ffe2abae2cf 100644 (file)
@@ -167,6 +167,14 @@ do { \
 
 #define WEBRTC_DISPLAY_TYPE_ECORE_WL    2
 
+#define SIGNALING_MESSAGE_PREFIX_CONNECTED           "CONNECTED"
+#define SIGNALING_MESSAGE_PREFIX_REQUEST_SESSION     "REQUEST_SESSION"
+#define SIGNALING_MESSAGE_PREFIX_SESSION_ESTABLISHED "SESSION_ESTABLISHED"
+#define SIGNALING_MESSAGE_PREFIX_SESSION_CLOSED      "SESSION_CLOSED"
+#define SIGNALING_MESSAGE_PREFIX_SDP                 "SDP"
+#define SIGNALING_MESSAGE_PREFIX_ICE_CANDIDATE       "ICE_CANDIDATE"
+#define SIGNALING_MESSAGE_PREFIX_ERROR               "ERROR"
+
 typedef enum {
        MEDIA_TYPE_AUDIO = 0x01,
        MEDIA_TYPE_VIDEO = 0x02,
index 4f72d4d50a884d3bdaa677f8613fb7801247c04b..2c34611955040fbced41185832ece3c06622f987 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.1.94
+Version:    0.1.95
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index db66d0cc6d30429f2d24005f1d5b2095af53e4ff..7b8e1dd36eda23dc8a06717448a3f1a8dfdd1d2f 100644 (file)
 #include "webrtc_private.h"
 #include "webrtc_internal.h"
 
+static int __parse_message(gchar *message, webrtc_signaling_message_type_e *type, gchar **content)
+{
+       gchar **contents;
+
+       RET_VAL_IF(message == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "message is NULL");
+       RET_VAL_IF(type == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "type is NULL");
+       RET_VAL_IF(content == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "content is NULL");
+
+       if (g_str_has_prefix(message, SIGNALING_MESSAGE_PREFIX_CONNECTED))
+               *type = SIGNALING_MESSAGE_TYPE_CONNECTED;
+       else if (g_str_has_prefix(message, SIGNALING_MESSAGE_PREFIX_SESSION_ESTABLISHED))
+               *type = SIGNALING_MESSAGE_TYPE_SESSION_ESTABLISHED;
+       else if (g_str_has_prefix(message, SIGNALING_MESSAGE_PREFIX_SESSION_CLOSED))
+               *type = SIGNALING_MESSAGE_TYPE_SESSION_CLOSED;
+       else if (g_str_has_prefix(message, SIGNALING_MESSAGE_PREFIX_SDP))
+               *type = SIGNALING_MESSAGE_TYPE_SDP;
+       else if (g_str_has_prefix(message, SIGNALING_MESSAGE_PREFIX_ICE_CANDIDATE))
+               *type = SIGNALING_MESSAGE_TYPE_ICE_CANDIDATE;
+       else
+               *type = SIGNALING_MESSAGE_TYPE_ERROR;
+
+       contents = g_strsplit(message, " ", 2);
+       if (g_strv_length(contents) != 2) {
+               LOG_ERROR("invalid message[%s]", message);
+               g_strfreev(contents);
+               return WEBRTC_ERROR_INVALID_OPERATION;
+       }
+
+       *content = strdup(contents[1]);
+
+       LOG_INFO("[%s] type[%d] content[%s]", contents[0], *type, *content);
+
+       g_strfreev(contents);
+
+       return WEBRTC_ERROR_NONE;
+}
+
 static void __websocket_message_cb(SoupWebsocketConnection *ws_conn, SoupWebsocketDataType type, GBytes *message, gpointer user_data)
 {
        gchar *text;
        gsize size;
        const gchar *data;
        webrtc_signaling_client_s *client = (webrtc_signaling_client_s *)user_data;
+       webrtc_signaling_message_type_e _type;
+       gchar *_message;
 
        RET_IF(client == NULL, "client is NULL");
        RET_IF(client->ws_conn == NULL, "ws_conn is NULL");
@@ -35,8 +74,21 @@ static void __websocket_message_cb(SoupWebsocketConnection *ws_conn, SoupWebsock
 
        LOG_DEBUG("receive message:\n%s", text);
 
-       /* FIXME: assign id and invoke message callback */
+       if (__parse_message(text, &_type, &_message) != WEBRTC_ERROR_NONE) {
+               LOG_ERROR("failed to __parse_message()");
+               g_free(text);
+               return;
+       }
 
+       if (_type == SIGNALING_MESSAGE_TYPE_CONNECTED) {
+               client->id = atoi(_message);
+               LOG_INFO("id[%d] is assigned", client->id);
+       }
+
+       if (client->message_cb.callback)
+               ((webrtc_signaling_message_cb)(client->message_cb.callback))(_type, _message, client->message_cb.user_data);
+
+       g_free(_message);
        g_free(text);
 }
 
@@ -56,6 +108,12 @@ static void __close_websocket(webrtc_signaling_client_s *client)
 
        LOG_DEBUG("client[%p, ws_conn:%p, id:%d] is closed\n", client, client->ws_conn, client->id);
 
+       if (client->message_cb.callback) {
+               gchar *id = g_strdup_printf("%d", client->id);
+               ((webrtc_signaling_message_cb)(client->message_cb.callback))(SIGNALING_MESSAGE_TYPE_DISCONNECTED, id, client->message_cb.user_data);
+               g_free(id);
+       }
+
        client->ws_conn = NULL;
        client->id = 0;
 }
@@ -91,7 +149,7 @@ static void __websocket_connected_cb(SoupSession *session, GAsyncResult *res, vo
 
        client->ws_conn = ws_conn;
 
-       LOG_DEBUG("client[%p, ws_conn:%p, id:%d]", client, client->ws_conn, client->id);
+       LOG_INFO("client[%p, ws_conn:%p, id:%d]", client, client->ws_conn, client->id);
 }
 
 static SoupSession* __connect_websocket(const char *ip, int port, webrtc_signaling_client_s *client)
@@ -111,7 +169,7 @@ static SoupSession* __connect_websocket(const char *ip, int port, webrtc_signali
 
        message = soup_message_new(SOUP_METHOD_GET, url);
 
-       LOG_DEBUG("connecting to signaling server[%s]...\n", url);
+       LOG_INFO("connecting to signaling server[%s]...\n", url);
 
        g_free(url);
 
@@ -163,7 +221,7 @@ int webrtc_signaling_request_session(webrtc_signaling_client_h client, int peer_
 
        LOG_DEBUG("request session with %d", peer_id);
 
-       message = g_strdup_printf("REQUEST_SESSION %d", peer_id);
+       message = g_strdup_printf("%s %d", SIGNALING_MESSAGE_PREFIX_REQUEST_SESSION, peer_id);
 
        soup_websocket_connection_send_text(_client->ws_conn, message);
 
@@ -172,9 +230,25 @@ int webrtc_signaling_request_session(webrtc_signaling_client_h client, int peer_
        return WEBRTC_ERROR_NONE;
 }
 
+static const char* __get_message_prefix(const char *message)
+{
+       RET_VAL_IF(message == NULL, NULL, "message is NULL");
+
+       if (g_str_has_prefix(message, "{\"sdp\":"))
+               return SIGNALING_MESSAGE_PREFIX_SDP;
+       if (g_str_has_prefix(message, "{\"ice\":"))
+               return SIGNALING_MESSAGE_PREFIX_ICE_CANDIDATE;
+
+       LOG_ERROR("message is neither SDP nor ICE candidate");
+
+       return NULL;
+}
+
 int webrtc_signaling_send_message(webrtc_signaling_client_h client, const char *message)
 {
        webrtc_signaling_client_s *_client = (webrtc_signaling_client_s *)client;
+       const char *prefix;
+       gchar *message_with_prefix;
 
        RET_VAL_IF(_client == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "client is NULL");
        RET_VAL_IF(message == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "message is NULL");
@@ -185,7 +259,14 @@ int webrtc_signaling_send_message(webrtc_signaling_client_h client, const char *
 
        LOG_DEBUG("send message:\n%s", message);
 
-       soup_websocket_connection_send_text(_client->ws_conn, message);
+       prefix = __get_message_prefix(message);
+       RET_VAL_IF(prefix == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "prefix is NULL");
+
+       message_with_prefix = g_strdup_printf("%s %s", prefix, message);
+
+       soup_websocket_connection_send_text(_client->ws_conn, message_with_prefix);
+
+       g_free(message_with_prefix);
 
        return WEBRTC_ERROR_NONE;
 }
index a1f37b8f39c47d1290367c941f23e1e841765d0d..78fb83d48978b07aa09d258d2806726b04494e2b 100644 (file)
 #include "webrtc_private.h"
 #include "webrtc_internal.h"
 
-#define SIGNALING_MESSAGE_PREFIX_CONNECTED           "CONNECTED"
-#define SIGNALING_MESSAGE_PREFIX_DISCONNECTED        "DISCONNECTED"
-#define SIGNALING_MESSAGE_PREFIX_REQUEST_SESSION     "REQUEST_SESSION"
-#define SIGNALING_MESSAGE_PREFIX_SESSION_ESTABLISHED "SESSION_ESTABLISHED"
-#define SIGNALING_MESSAGE_PREFIX_SESSION_CLOSED      "SESSION_CLOSED"
-#define SIGNALING_MESSAGE_PREFIX_SDP                 "SDP"
-#define SIGNALING_MESSAGE_PREFIX_ICE_CANDIDATE       "ICE_CANDIDATE"
-#define SIGNALING_MESSAGE_PREFIX_ERROR               "ERROR"
-
 #define SIGNALING_MESSAGE_REPLY_UNKNOWN_ERROR        "ERROR unknown"
 #define SIGNALING_MESSAGE_REPLY_CONNECT_ERROR        "ERROR connection"
 #define SIGNALING_MESSAGE_REPLY_SESSION_ERROR        "ERROR session"