From: Sangchul Lee Date: Fri, 15 Jan 2021 04:52:39 +0000 (+0900) Subject: webrtc_signaling_client: Parse message and forward it to user callback X-Git-Tag: submit/tizen/20210729.023123~146 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=935a4fcf9ffca81016a6699a7c09b859203cb3a0;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_signaling_client: Parse message and forward it to user callback 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 --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 6019e5d4..73edd2e7 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -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, diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 4f72d4d5..2c346119 100644 --- a/packaging/capi-media-webrtc.spec +++ b/packaging/capi-media-webrtc.spec @@ -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 diff --git a/src/webrtc_signaling_client.c b/src/webrtc_signaling_client.c index db66d0cc..7b8e1dd3 100644 --- a/src/webrtc_signaling_client.c +++ b/src/webrtc_signaling_client.c @@ -18,12 +18,51 @@ #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; } diff --git a/src/webrtc_signaling_server.c b/src/webrtc_signaling_server.c index a1f37b8f..78fb83d4 100644 --- a/src/webrtc_signaling_server.c +++ b/src/webrtc_signaling_server.c @@ -18,15 +18,6 @@ #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"