MT#55283 extended "connect" matching

Change-Id: If751f1373fecf50e868ca76813ddd3d9e6423f82
pull/2099/head
Richard Fuchs 4 weeks ago
parent 0efd1b169b
commit 19e2aa2ea4

@ -4845,11 +4845,13 @@ int monologue_inject_stop(struct call_monologue *src_ml, struct call_monologue *
__attribute__((nonnull(1, 2, 3)))
void dialogue_connect(struct call_monologue *src_ml, struct call_monologue *dst_ml, sdp_ng_flags *flags) {
void dialogue_connect(const medias_q *src_medias, struct call_monologue *dst_ml, sdp_ng_flags *flags) {
// for each source media, find a usable destination media
for (unsigned int i = 0; i < src_ml->medias->len; i++) {
__auto_type src_media = src_ml->medias->pdata[i];
if (!src_media)
for (auto_iter(l, src_medias->head); l; l = l->next) {
__auto_type src_media = l->data;
// avoid connect to self XXX allow in some cases?
if (src_media->monologue == dst_ml)
continue;
struct call_media *dst_media = NULL;
@ -4865,10 +4867,11 @@ void dialogue_connect(struct call_monologue *src_ml, struct call_monologue *dst_
// otherwise try by index
if (!dst_media) {
for (unsigned int j = 0; j < dst_ml->medias->len; j++) {
unsigned int dx = (j + i) % dst_ml->medias->len;
unsigned int dx = (j + src_media->index - 1) % dst_ml->medias->len;
dst_media = dst_ml->medias->pdata[dx];
if (!dst_media)
continue;
// XXX avoid duplicate dst_media from same src_ml?
// if type matches, we can connect
if (!str_cmp_str(&dst_media->type, &src_media->type))
break;

@ -4466,20 +4466,15 @@ const char *call_connect_ng(ng_command_ctx_t *ctx) {
g_auto(sdp_ng_flags) flags;
g_autoptr(call_t) call = NULL;
g_autoptr(call_t) call2 = NULL;
g_auto(medias_q) medias = TYPED_GQUEUE_INIT;
call_ng_process_flags(&flags, ctx);
const char *err = medias_match(&call, &medias, &flags, ctx);
if (err)
return err;
if (!flags.call_id.s)
return "No call-id in message";
if (!flags.from_tag.s)
return "No from-tag in message";
if (!flags.to_tag.s)
return "No to-tag in message";
call = call_get(&flags.call_id);
if (!call)
return "Unknown call-ID";
if (flags.to_call_id.len) {
call2 = call_get2(call, &flags.to_call_id);
if (!call2)
@ -4488,22 +4483,15 @@ const char *call_connect_ng(ng_command_ctx_t *ctx) {
else
call2 = obj_get(call);
struct call_monologue *src_ml = call_get_or_create_monologue(call, &flags.from_tag);
if (!src_ml)
return "From-tag not found";
struct call_monologue *dest_ml = call_get_or_create_monologue(call2, &flags.to_tag);
if (!dest_ml)
return "To-tag not found";
if (src_ml == dest_ml)
return "Trying to connect to self"; // XXX should this be allowed?
if (!call_merge(call, call2))
return "Failed to merge two calls into one";
return "Failed to merge two calls into one (tag collision)";
call2 = NULL; // reference released
dialogue_connect(src_ml, dest_ml, &flags);
dialogue_connect(&medias, dest_ml, &flags);
call_unlock_release_update(&call);

@ -903,7 +903,7 @@ int monologue_inject_start(struct call_monologue *src, struct call_monologue *ds
sdp_ng_flags *flags);
int monologue_inject_stop(struct call_monologue *src, struct call_monologue *dst,
sdp_ng_flags *flags);
void dialogue_connect(struct call_monologue *, struct call_monologue *, sdp_ng_flags *);
void dialogue_connect(const medias_q *, struct call_monologue *, sdp_ng_flags *);
__attribute__((nonnull(1, 2, 3)))
bool monologue_transform(struct call_monologue *, sdp_ng_flags *, medias_q *);
__attribute__((nonnull(1, 2)))

Loading…
Cancel
Save