|
|
@ -376,21 +376,32 @@ static void janus_add_publisher_details(JsonBuilder *builder, struct call_monolo |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void janus_publishers_list(JsonBuilder *builder, struct janus_room *room, uint64_t feed_id) { |
|
|
|
|
|
|
|
|
static void janus_publishers_list(JsonBuilder *builder, struct call *call, struct janus_room *room, |
|
|
|
|
|
uint64_t feed_id) |
|
|
|
|
|
{ |
|
|
json_builder_begin_array(builder); // [ |
|
|
json_builder_begin_array(builder); // [ |
|
|
|
|
|
|
|
|
GHashTableIter iter; |
|
|
GHashTableIter iter; |
|
|
gpointer value; |
|
|
|
|
|
|
|
|
gpointer key, value; |
|
|
g_hash_table_iter_init(&iter, room->publishers); |
|
|
g_hash_table_iter_init(&iter, room->publishers); |
|
|
|
|
|
|
|
|
while (g_hash_table_iter_next(&iter, NULL, &value)) { |
|
|
|
|
|
uint64_t *u64 = value; |
|
|
|
|
|
if (*u64 == feed_id) // skip self |
|
|
|
|
|
|
|
|
while (g_hash_table_iter_next(&iter, &key, &value)) { |
|
|
|
|
|
uint64_t *feed_id_ptr = value; |
|
|
|
|
|
if (*feed_id_ptr == feed_id) // skip self |
|
|
continue; |
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
// get monologue |
|
|
|
|
|
uint64_t *handle_id_ptr = key; |
|
|
|
|
|
struct call_monologue *ml = janus_get_monologue(*handle_id_ptr, call, call_get_monologue); |
|
|
|
|
|
if (!ml) |
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
json_builder_begin_object(builder); // { |
|
|
json_builder_begin_object(builder); // { |
|
|
json_builder_set_member_name(builder, "id"); |
|
|
json_builder_set_member_name(builder, "id"); |
|
|
json_builder_add_int_value(builder, *u64); |
|
|
|
|
|
// XXX |
|
|
|
|
|
|
|
|
json_builder_add_int_value(builder, *feed_id_ptr); |
|
|
|
|
|
|
|
|
|
|
|
janus_add_publisher_details(builder, ml); |
|
|
|
|
|
|
|
|
json_builder_end_object(builder); // } |
|
|
json_builder_end_object(builder); // } |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -470,6 +481,12 @@ static const char *janus_videoroom_join(struct websocket_message *wm, struct jan |
|
|
if (!room) |
|
|
if (!room) |
|
|
return "No such room"; |
|
|
return "No such room"; |
|
|
|
|
|
|
|
|
|
|
|
AUTO_CLEANUP_NULL(struct call *call, call_unlock_release); |
|
|
|
|
|
*retcode = 426; |
|
|
|
|
|
call = call_get(&room->call_id); |
|
|
|
|
|
if (!call) |
|
|
|
|
|
return "No such room"; |
|
|
|
|
|
|
|
|
*retcode = 436; |
|
|
*retcode = 436; |
|
|
if (!is_pub && g_hash_table_lookup(room->subscribers, &handle->id)) |
|
|
if (!is_pub && g_hash_table_lookup(room->subscribers, &handle->id)) |
|
|
return "User already exists in the room as a subscriber"; |
|
|
return "User already exists in the room as a subscriber"; |
|
|
@ -500,11 +517,6 @@ static const char *janus_videoroom_join(struct websocket_message *wm, struct jan |
|
|
// subscriber |
|
|
// subscriber |
|
|
|
|
|
|
|
|
AUTO_CLEANUP(GQueue srcs, call_subscriptions_clear) = G_QUEUE_INIT; |
|
|
AUTO_CLEANUP(GQueue srcs, call_subscriptions_clear) = G_QUEUE_INIT; |
|
|
AUTO_CLEANUP_NULL(struct call *call, call_unlock_release); |
|
|
|
|
|
*retcode = 426; |
|
|
|
|
|
call = call_get(&room->call_id); |
|
|
|
|
|
if (!call) |
|
|
|
|
|
return "No such room"; |
|
|
|
|
|
|
|
|
|
|
|
// get single feed ID if there is one |
|
|
// get single feed ID if there is one |
|
|
if (json_reader_read_member(reader, "feed")) { |
|
|
if (json_reader_read_member(reader, "feed")) { |
|
|
@ -620,7 +632,7 @@ static const char *janus_videoroom_join(struct websocket_message *wm, struct jan |
|
|
json_builder_set_member_name(builder, "id"); |
|
|
json_builder_set_member_name(builder, "id"); |
|
|
json_builder_add_int_value(builder, feed_id); |
|
|
json_builder_add_int_value(builder, feed_id); |
|
|
json_builder_set_member_name(builder, "publishers"); |
|
|
json_builder_set_member_name(builder, "publishers"); |
|
|
janus_publishers_list(builder, room, feed_id); |
|
|
|
|
|
|
|
|
janus_publishers_list(builder, call, room, feed_id); |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
// subscriber |
|
|
// subscriber |
|
|
@ -660,7 +672,7 @@ static void janus_notify_publishers_joined(JsonBuilder *event, void *ptr, uint64 |
|
|
uint64_t publisher_feed) |
|
|
uint64_t publisher_feed) |
|
|
{ |
|
|
{ |
|
|
json_builder_set_member_name(event, "publishers"); |
|
|
json_builder_set_member_name(event, "publishers"); |
|
|
janus_publishers_list(event, room, publisher_feed); |
|
|
|
|
|
|
|
|
janus_publishers_list(event, ptr, room, publisher_feed); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|