MT#55283 support individual unsubscribe action

Change-Id: Id4ea984ce8109b6a962edb52d0e81532bbfbd701
pull/2090/head
Richard Fuchs 4 months ago
parent dfa161cbf1
commit ef817fccef

@ -4610,8 +4610,7 @@ int monologue_subscribe_answer(struct call_monologue *dst_ml, sdp_ng_flags *flag
}
/* called with call->master_lock held in W */
__attribute__((nonnull(1, 2)))
int monologue_unsubscribe(struct call_monologue *dst_ml, sdp_ng_flags *flags) {
int monologue_unsubscribe(struct call_monologue *dst_ml, struct call_monologue *src_ml, sdp_ng_flags *flags) {
for (unsigned int i = 0; i < dst_ml->medias->len; i++)
{
struct call_media *media = dst_ml->medias->pdata[i];
@ -4622,6 +4621,9 @@ int monologue_unsubscribe(struct call_monologue *dst_ml, sdp_ng_flags *flags) {
/* TODO: should we care about subscribers as well? */
IQUEUE_FOREACH_SAFE(&media->media_subscriptions, ms) {
if (src_ml && ms->monologue != src_ml)
continue;
struct call_media *src_media = ms->media;
__media_unconfirm(src_media, "media unsubscribe");
@ -4632,7 +4634,8 @@ int monologue_unsubscribe(struct call_monologue *dst_ml, sdp_ng_flags *flags) {
update_init_subscribers(media, NULL, NULL, flags->opmode);
}
monologue_destroy(dst_ml);
if (!src_ml)
monologue_destroy(dst_ml);
return 0;
}

@ -4381,11 +4381,19 @@ const char *call_unsubscribe_ng(ng_command_ctx_t *ctx) {
return "No to-tag in message";
// get destination monologue
struct call_monologue *dest_ml = call_get_or_create_monologue(call, &flags.to_tag);
struct call_monologue *dest_ml = call_get_monologue(call, &flags.to_tag);
if (!dest_ml)
return "To-tag not found";
int ret = monologue_unsubscribe(dest_ml, &flags);
// get optional source monologue
struct call_monologue *src_ml = NULL;
if (flags.directional && flags.from_tag.len) {
src_ml = call_get_monologue(call, &flags.from_tag);
if (!src_ml)
return "From-tag not found";
}
int ret = monologue_unsubscribe(dest_ml, src_ml, &flags);
if (ret)
return "Failed to unsubscribe";

@ -898,8 +898,8 @@ int monologue_subscribe_request(const subscription_q *srms, struct call_monologu
__attribute__((nonnull(1, 2, 3)))
int monologue_subscribe_answer(struct call_monologue *dst, sdp_ng_flags *flags,
sdp_streams_q *streams);
__attribute__((nonnull(1, 2)))
int monologue_unsubscribe(struct call_monologue *dst, sdp_ng_flags *);
__attribute__((nonnull(1, 3)))
int monologue_unsubscribe(struct call_monologue *dst, struct call_monologue *src, sdp_ng_flags *);
int monologue_inject_start(struct call_monologue *src, struct call_monologue *dst,
sdp_ng_flags *flags);
int monologue_inject_stop(struct call_monologue *src, struct call_monologue *dst,

Loading…
Cancel
Save