From f0eee2a75e3b883b09b3e2f142c1a20d65143862 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 26 Jul 2024 10:41:31 -0400 Subject: [PATCH] MT#55283 add abstract dictionary iterator Change-Id: Ic41b41e533ffddda5c37ad5ea6155faa0100cada --- daemon/call_interfaces.c | 24 +++--------------------- daemon/control_ng.c | 22 ++++++++++++++++++++++ include/control_ng.h | 2 ++ 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 0655aa0ab..0225a8312 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -1300,25 +1300,6 @@ void call_ng_flags_init(sdp_ng_flags *out, enum call_opmode opmode) { out->frequencies = g_array_new(false, false, sizeof(int)); } -static void call_ng_dict_iter(ng_parser_ctx_t *ctx, bencode_item_t *input, - void (*callback)(ng_parser_ctx_t *, str *key, bencode_item_t *value)) -{ - if (input->type != BENCODE_DICTIONARY) - return; - - bencode_item_t *value = NULL; - for (bencode_item_t *key = input->child; key; key = value->sibling) { - value = key->sibling; - if (!value) - break; - - str k; - if (!bencode_get_str(key, &k)) - continue; - - callback(ctx, &k, value); - } -} void call_ng_direction_flag(sdp_ng_flags *out, bencode_item_t *value) { if (value->type != BENCODE_LIST) @@ -1436,6 +1417,7 @@ void call_ng_main_flags(ng_parser_ctx_t *ctx, str *key, bencode_item_t *value) { str s = STR_NULL; bencode_item_t *it; sdp_ng_flags *out = ctx->flags; + const ng_parser_t *parser = ctx->parser; bencode_get_str(value, &s); @@ -1520,7 +1502,7 @@ void call_ng_main_flags(ng_parser_ctx_t *ctx, str *key, bencode_item_t *value) { out->digit = s.s[0]; break; case CSH_LOOKUP("codec"): - call_ng_dict_iter(ctx, value, call_ng_codec_flags); + parser->dict_iter(ctx, value, call_ng_codec_flags); break; case CSH_LOOKUP("command"): break; @@ -2013,7 +1995,7 @@ static void call_ng_process_flags(sdp_ng_flags *out, ng_parser_ctx_t *ctx, enum call_ng_flags_init(out, opmode); ctx->opmode = opmode; ctx->flags = out; - call_ng_dict_iter(ctx, ctx->req, call_ng_main_flags); + ctx->parser->dict_iter(ctx, ctx->req, call_ng_main_flags); } static void ng_sdp_attr_manipulations_free(struct sdp_manipulations * array[__MT_MAX]) { diff --git a/daemon/control_ng.c b/daemon/control_ng.c index 513671e72..f3f0a6cf8 100644 --- a/daemon/control_ng.c +++ b/daemon/control_ng.c @@ -79,11 +79,33 @@ typedef struct ng_ctx { } while (0) +static void bencode_dict_iter(ng_parser_ctx_t *ctx, bencode_item_t *input, + void (*callback)(ng_parser_ctx_t *, str *key, bencode_item_t *value)) +{ + if (input->type != BENCODE_DICTIONARY) + return; + + bencode_item_t *value = NULL; + for (bencode_item_t *key = input->child; key; key = value->sibling) { + value = key->sibling; + if (!value) + break; + + str k; + if (!bencode_get_str(key, &k)) + continue; + + callback(ctx, &k, value); + } +} + const ng_parser_t ng_parser_native = { .collapse = bencode_collapse_str, + .dict_iter = bencode_dict_iter, }; const ng_parser_t ng_parser_json = { .collapse = bencode_collapse_str_json, + .dict_iter = bencode_dict_iter, }; diff --git a/include/control_ng.h b/include/control_ng.h index aa3a59a40..3aac87fd7 100644 --- a/include/control_ng.h +++ b/include/control_ng.h @@ -99,6 +99,8 @@ enum call_opmode { struct ng_parser { str *(*collapse)(bencode_item_t *root, str *out); + void (*dict_iter)(ng_parser_ctx_t *, bencode_item_t *, + void (*callback)(ng_parser_ctx_t *, str *, bencode_item_t *)); }; struct ng_parser_ctx { const ng_parser_t *parser;