|
|
|
@ -1323,56 +1323,21 @@ static const char *janus_attach(JsonReader *reader, JsonBuilder *builder, struct |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static const char *janus_detach(struct websocket_message *wm, JsonReader *reader, JsonBuilder *builder, |
|
|
|
struct janus_session *session, |
|
|
|
uint64_t handle_id, int *retcode) |
|
|
|
{ |
|
|
|
*retcode = 458; |
|
|
|
if (!session) |
|
|
|
return "Session ID not found"; |
|
|
|
*retcode = 457; |
|
|
|
if (!handle_id) |
|
|
|
return "Unhandled request method"; |
|
|
|
|
|
|
|
uint64_t room_id = 0; |
|
|
|
|
|
|
|
// remove handle from session first as the handle ID in the hash is owned by the |
|
|
|
// janus_handle object, which is owned by janus_handles |
|
|
|
{ |
|
|
|
LOCK(&session->lock); |
|
|
|
|
|
|
|
bool exists = g_hash_table_remove(session->handles, &handle_id); |
|
|
|
|
|
|
|
*retcode = 463; |
|
|
|
if (!exists) |
|
|
|
return "Could not detach handle from plugin"; |
|
|
|
} |
|
|
|
|
|
|
|
LOCK(&janus_lock); |
|
|
|
|
|
|
|
struct janus_handle *handle = NULL; |
|
|
|
g_hash_table_steal_extended(janus_handles, &handle_id, NULL, (void **) &handle); |
|
|
|
|
|
|
|
*retcode = 463; |
|
|
|
if (!handle) |
|
|
|
return "Could not detach handle from plugin"; |
|
|
|
if (handle->session != session) { |
|
|
|
g_hash_table_insert(janus_handles, &handle->id, handle); |
|
|
|
return "Invalid session/handle association"; |
|
|
|
} |
|
|
|
|
|
|
|
room_id = handle->room; |
|
|
|
static void janus_destroy_handle(struct janus_handle *handle) { |
|
|
|
uint64_t room_id = handle->room; |
|
|
|
uint64_t handle_id = handle->id; |
|
|
|
|
|
|
|
// destroy handle |
|
|
|
obj_put(session); |
|
|
|
if (handle->session) |
|
|
|
obj_put(handle->session); |
|
|
|
g_slice_free1(sizeof(*handle), handle); |
|
|
|
|
|
|
|
if (!room_id) |
|
|
|
return NULL; |
|
|
|
return; |
|
|
|
|
|
|
|
struct janus_room *room = g_hash_table_lookup(janus_rooms, &room_id); |
|
|
|
if (!room) |
|
|
|
return NULL; |
|
|
|
return; |
|
|
|
|
|
|
|
uint64_t *feed = g_hash_table_lookup(room->publishers, &handle_id); |
|
|
|
if (feed) { |
|
|
|
@ -1408,6 +1373,46 @@ static const char *janus_detach(struct websocket_message *wm, JsonReader *reader |
|
|
|
obj_put(call); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static const char *janus_detach(struct websocket_message *wm, JsonReader *reader, JsonBuilder *builder, |
|
|
|
struct janus_session *session, |
|
|
|
uint64_t handle_id, int *retcode) |
|
|
|
{ |
|
|
|
*retcode = 458; |
|
|
|
if (!session) |
|
|
|
return "Session ID not found"; |
|
|
|
*retcode = 457; |
|
|
|
if (!handle_id) |
|
|
|
return "Unhandled request method"; |
|
|
|
|
|
|
|
// remove handle from session first as the handle ID in the hash is owned by the |
|
|
|
// janus_handle object, which is owned by janus_handles |
|
|
|
{ |
|
|
|
LOCK(&session->lock); |
|
|
|
|
|
|
|
bool exists = g_hash_table_remove(session->handles, &handle_id); |
|
|
|
|
|
|
|
*retcode = 463; |
|
|
|
if (!exists) |
|
|
|
return "Could not detach handle from plugin"; |
|
|
|
} |
|
|
|
|
|
|
|
LOCK(&janus_lock); |
|
|
|
|
|
|
|
struct janus_handle *handle = NULL; |
|
|
|
g_hash_table_steal_extended(janus_handles, &handle_id, NULL, (void **) &handle); |
|
|
|
|
|
|
|
*retcode = 463; |
|
|
|
if (!handle) |
|
|
|
return "Could not detach handle from plugin"; |
|
|
|
if (handle->session != session) { |
|
|
|
g_hash_table_insert(janus_handles, &handle->id, handle); |
|
|
|
return "Invalid session/handle association"; |
|
|
|
} |
|
|
|
|
|
|
|
janus_destroy_handle(handle); |
|
|
|
|
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|