MT#55283 add abstract dictionary iterator

Change-Id: Ic41b41e533ffddda5c37ad5ea6155faa0100cada
pull/1848/head
Richard Fuchs 10 months ago
parent 3f8f182119
commit f0eee2a75e

@ -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]) {

@ -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,
};

@ -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;

Loading…
Cancel
Save