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);
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;
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;
_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) {
_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);