From ba56e37bc065d1229c22d8d09df371ee40468e3b Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 31 Aug 2022 13:14:00 -0400 Subject: [PATCH] TT#189201 unify media blocking/silencing interface functions Change-Id: I40518fbc09b8c1a0dfe5d6ae3e533ce9a61bea7f --- daemon/call_interfaces.c | 112 ++++++++++----------------------------- 1 file changed, 27 insertions(+), 85 deletions(-) diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 69fd689d5..953aa661b 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -2645,32 +2645,9 @@ const char *call_unblock_dtmf_ng(bencode_item_t *input, bencode_item_t *output) return NULL; } -const char *call_block_media_ng(bencode_item_t *input, bencode_item_t *output) { - AUTO_CLEANUP_NULL(struct call *call, call_unlock_release); - struct call_monologue *monologue; - const char *errstr = NULL; - struct sdp_ng_flags flags; - - errstr = media_block_match(&call, &monologue, &flags, input, OP_OTHER); - if (errstr) - return errstr; - - if (monologue) { - ilog(LOG_INFO, "Blocking directional media (tag '" STR_FORMAT_M "')", - STR_FMT_M(&monologue->tag)); - monologue->block_media = true; - __monologue_unkernelize(monologue); - } - else { - ilog(LOG_INFO, "Blocking media (entire call)"); - call->block_media = true; - __call_unkernelize(call); - } - - return NULL; -} - -const char *call_unblock_media_ng(bencode_item_t *input, bencode_item_t *output) { +static const char *call_block_silence_media(bencode_item_t *input, bool on_off, const char *ucase_verb, + size_t call_offset, size_t ml_offset) +{ AUTO_CLEANUP_NULL(struct call *call, call_unlock_release); struct call_monologue *monologue; const char *errstr = NULL; @@ -2681,81 +2658,46 @@ const char *call_unblock_media_ng(bencode_item_t *input, bencode_item_t *output) return errstr; if (monologue) { - ilog(LOG_INFO, "Unblocking directional media (tag '" STR_FORMAT_M "')", + ilog(LOG_INFO, "%s directional media (tag '" STR_FORMAT_M "')", + ucase_verb, STR_FMT_M(&monologue->tag)); - monologue->block_media = false; + G_STRUCT_MEMBER(bool, monologue, ml_offset) = on_off; __monologue_unkernelize(monologue); } else { - ilog(LOG_INFO, "Unblocking media (entire call)"); - call->block_media = false; - if (flags.all) { - for (GList *l = call->monologues.head; l; l = l->next) { - monologue = l->data; - monologue->block_media = false; + G_STRUCT_MEMBER(bool, call, call_offset) = on_off; + if (!on_off) { + ilog(LOG_INFO, "%s media (entire call and participants)", ucase_verb); + if (flags.all) { + for (GList *l = call->monologues.head; l; l = l->next) { + monologue = l->data; + G_STRUCT_MEMBER(bool, monologue, ml_offset) = on_off; + } } } + else + ilog(LOG_INFO, "%s media (entire call)", ucase_verb); __call_unkernelize(call); } return NULL; } +#define CALL_BLOCK_SILENCE_MEDIA(input, on_off, ucase_verb, member_name) \ + call_block_silence_media(input, on_off, ucase_verb, G_STRUCT_OFFSET(struct call, member_name), \ + G_STRUCT_OFFSET(struct call_monologue, member_name)) +const char *call_block_media_ng(bencode_item_t *input, bencode_item_t *output) { + return CALL_BLOCK_SILENCE_MEDIA(input, true, "Blocking", block_media); +} +const char *call_unblock_media_ng(bencode_item_t *input, bencode_item_t *output) { + return CALL_BLOCK_SILENCE_MEDIA(input, false, "Unblocking", block_media); +} const char *call_silence_media_ng(bencode_item_t *input, bencode_item_t *output) { - AUTO_CLEANUP_NULL(struct call *call, call_unlock_release); - struct call_monologue *monologue; - const char *errstr = NULL; - struct sdp_ng_flags flags; - - errstr = media_block_match(&call, &monologue, &flags, input, OP_OTHER); - if (errstr) - return errstr; - - if (monologue) { - ilog(LOG_INFO, "Silencing directional media (tag '" STR_FORMAT_M "')", - STR_FMT_M(&monologue->tag)); - monologue->silence_media = true; - __monologue_unkernelize(monologue); - } - else { - ilog(LOG_INFO, "Blocking media (entire call)"); - call->silence_media = true; - __call_unkernelize(call); - } - - return NULL; + return CALL_BLOCK_SILENCE_MEDIA(input, true, "Silencing", silence_media); } - const char *call_unsilence_media_ng(bencode_item_t *input, bencode_item_t *output) { - AUTO_CLEANUP_NULL(struct call *call, call_unlock_release); - struct call_monologue *monologue; - const char *errstr = NULL; - struct sdp_ng_flags flags; - - errstr = media_block_match(&call, &monologue, &flags, input, OP_OTHER); - if (errstr) - return errstr; - - if (monologue) { - ilog(LOG_INFO, "Unsilencing directional media (tag '" STR_FORMAT_M "')", - STR_FMT_M(&monologue->tag)); - monologue->silence_media = false; - __monologue_unkernelize(monologue); - } - else { - ilog(LOG_INFO, "Unsilencing media (entire call)"); - call->silence_media = false; - if (flags.all) { - for (GList *l = call->monologues.head; l; l = l->next) { - monologue = l->data; - monologue->silence_media = false; - } - } - __call_unkernelize(call); - } - - return NULL; + return CALL_BLOCK_SILENCE_MEDIA(input, false, "Unsilencing", silence_media); }