#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");
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);
}
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;
}
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)
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);
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);
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");
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;
}