Browse Source

MT#55283 introduce parser_arg union

Generic "item" object to represent some entity within a signalling
message

Change-Id: Ie1a7f2acaf954b86597ac32af3f0546d68f9e687
pull/1848/head
Richard Fuchs 1 year ago
parent
commit
416f658088
6 changed files with 55 additions and 48 deletions
  1. +9
    -9
      daemon/call_interfaces.c
  2. +11
    -11
      daemon/control_ng.c
  3. +6
    -6
      daemon/statistics.c
  4. +21
    -21
      include/control_ng.h
  5. +1
    -1
      include/recording.h
  6. +7
    -0
      include/types.h

+ 9
- 9
daemon/call_interfaces.c View File

@ -2121,7 +2121,7 @@ static const char *call_offer_answer_ng(ng_parser_ctx_t *ctx, enum call_opmode o
struct call_monologue * monologues[2];
int ret;
g_auto(sdp_ng_flags) flags;
bencode_item_t *output = ctx->resp;
parser_arg output = ctx->resp;
call_ng_process_flags(&flags, ctx, opmode);
@ -2289,8 +2289,8 @@ const char *call_delete_ng(ng_parser_ctx_t *ctx) {
bool fatal = false;
bool discard = false;
int delete_delay;
bencode_item_t *input = ctx->req;
bencode_item_t *output = ctx->resp;
parser_arg input = ctx->req;
parser_arg output = ctx->resp;
if (!ctx->parser->dict_get_str(input, "call-id", &callid))
return "No call-id in message";
@ -2761,7 +2761,7 @@ static void ng_list_calls(bencode_item_t *output, long long int limit) {
const char *call_query_ng(ng_parser_ctx_t *ctx) {
str callid, fromtag, totag;
call_t *call;
bencode_item_t *input = ctx->req;
parser_arg input = ctx->req;
if (!ctx->parser->dict_get_str(input, "call-id", &callid))
return "No call-id in message";
@ -2782,8 +2782,8 @@ const char *call_query_ng(ng_parser_ctx_t *ctx) {
const char *call_list_ng(ng_parser_ctx_t *ctx) {
bencode_item_t *calls = NULL;
long long int limit;
bencode_item_t *input = ctx->req;
bencode_item_t *output = ctx->resp;
parser_arg input = ctx->req;
parser_arg output = ctx->resp;
limit = ctx->parser->dict_get_int_str(input, "limit", 32);
@ -2804,7 +2804,7 @@ static const char *call_recording_common_ng(ng_parser_ctx_t *ctx,
{
g_auto(sdp_ng_flags) flags;
g_autoptr(call_t) call = NULL;
bencode_item_t *input = ctx->req;
parser_arg input = ctx->req;
call_ng_process_flags(&flags, ctx, opmode);
@ -2854,7 +2854,7 @@ const char *call_pause_recording_ng(ng_parser_ctx_t *ctx) {
static void stop_recording_fn(ng_parser_ctx_t *ctx, call_t *call) {
// support alternative usage for "pause" call: either `pause=yes` ...
bencode_item_t *input = ctx->req;
parser_arg input = ctx->req;
str pause;
if (ctx->parser->dict_get_str(input, "pause", &pause)) {
if (!str_cmp(&pause, "yes") || !str_cmp(&pause, "on") || !str_cmp(&pause, "true")) {
@ -3697,7 +3697,7 @@ const char *call_subscribe_request_ng(ng_parser_ctx_t *ctx) {
g_autoptr(call_t) call = NULL;
g_auto(subscription_q) srms = TYPED_GQUEUE_INIT;
g_auto(str) sdp_out = STR_NULL;
bencode_item_t *output = ctx->resp;
parser_arg output = ctx->resp;
/* get source monologue */
err = media_block_match_mult(&call, &srms, &flags, ctx, OP_REQUEST);


+ 11
- 11
daemon/control_ng.c View File

@ -130,11 +130,11 @@ static void bencode_list_iter(ng_parser_ctx_t *ctx, bencode_item_t *list,
static long long bencode_get_int(bencode_item_t *arg) {
return arg->value;
}
static bencode_item_t *__bencode_dict(ng_parser_ctx_t *ctx) {
return bencode_dictionary(&ctx->ngbuf->buffer);
static parser_arg __bencode_dict(ng_parser_ctx_t *ctx) {
return (parser_arg) bencode_dictionary(&ctx->ngbuf->buffer);
}
static bencode_item_t *__bencode_list(ng_parser_ctx_t *ctx) {
return bencode_list(&ctx->ngbuf->buffer);
static parser_arg __bencode_list(ng_parser_ctx_t *ctx) {
return (parser_arg) bencode_list(&ctx->ngbuf->buffer);
}
static void bencode_pretty_print(bencode_item_t *el, GString *s);
@ -359,9 +359,9 @@ static void control_ng_process_payload(ng_ctx *hctx, str *reply, str *data, cons
/* Bencode dictionary */
if (data->s[0] == 'd') {
parser_ctx.req = bencode_decode_expect_str(&parser_ctx.ngbuf->buffer, data, BENCODE_DICTIONARY);
parser_ctx.req.benc = bencode_decode_expect_str(&parser_ctx.ngbuf->buffer, data, BENCODE_DICTIONARY);
errstr = "Could not decode bencode dictionary";
if (!parser_ctx.req)
if (!parser_ctx.req.benc)
goto err_send;
}
@ -372,9 +372,9 @@ static void control_ng_process_payload(ng_ctx *hctx, str *reply, str *data, cons
errstr = "Failed to parse JSON document";
if (!json_parser_load_from_data(parser_ctx.ngbuf->json, data->s, data->len, NULL))
goto err_send;
parser_ctx.req = bencode_convert_json(&parser_ctx.ngbuf->buffer, parser_ctx.ngbuf->json);
parser_ctx.req.benc = bencode_convert_json(&parser_ctx.ngbuf->buffer, parser_ctx.ngbuf->json);
errstr = "Could not decode bencode dictionary";
if (!parser_ctx.req || parser_ctx.req->type != BENCODE_DICTIONARY)
if (!parser_ctx.req.benc || parser_ctx.req.benc->type != BENCODE_DICTIONARY)
goto err_send;
}
@ -384,7 +384,7 @@ static void control_ng_process_payload(ng_ctx *hctx, str *reply, str *data, cons
}
parser_ctx.resp = parser_ctx.parser->dict(&parser_ctx);
assert(parser_ctx.resp != NULL);
assert(parser_ctx.resp.gen != NULL);
parser_ctx.parser->dict_get_str(parser_ctx.req, "command", &cmd);
errstr = "Dictionary contains no key \"command\"";
@ -565,9 +565,9 @@ send_resp:
ilogs(control, LOG_INFO, "Replying to '"STR_FORMAT"' from %s (elapsed time %llu.%06llu sec)", STR_FMT(&cmd), addr, (unsigned long long)cmd_process_time.tv_sec, (unsigned long long)cmd_process_time.tv_usec);
if (get_log_level(control) >= LOG_DEBUG) {
parser_ctx.req = bencode_decode_expect_str(&parser_ctx.ngbuf->buffer,
parser_ctx.req.benc = bencode_decode_expect_str(&parser_ctx.ngbuf->buffer,
reply, BENCODE_DICTIONARY);
if (parser_ctx.req) {
if (parser_ctx.req.benc) {
log_str = g_string_sized_new(256);
g_string_append_printf(log_str, "Response dump for '"STR_FORMAT"' to %s: %s",
STR_FMT(&cmd), addr,


+ 6
- 6
daemon/statistics.c View File

@ -956,7 +956,7 @@ const char *statistics_ng(ng_parser_ctx_t *ctx) {
g_autoptr(stats_metric_q) metrics = statistics_gather_metrics(NULL);
g_auto(GQueue) bstack = G_QUEUE_INIT;
bencode_item_t *dict = ctx->resp;
parser_arg dict = ctx->resp;
const char *sub_label = "statistics"; // top level
bencode_buffer_t *buf = &ctx->ngbuf->buffer;
@ -981,8 +981,8 @@ const char *statistics_ng(ng_parser_ctx_t *ctx) {
// list or dict end?
if (m->is_close_bracket) {
dict = g_queue_pop_tail(&bstack);
assert(dict != NULL);
dict.gen = g_queue_pop_tail(&bstack);
assert(dict.gen != NULL);
continue;
}
@ -994,13 +994,13 @@ const char *statistics_ng(ng_parser_ctx_t *ctx) {
}
// open bracket of some sort - new sub-entry follows
bencode_item_t *sub = NULL;
parser_arg sub = {0};
if (m->is_brace)
sub = ctx->parser->dict(ctx);
else
sub = ctx->parser->list(ctx);
assert(sub != NULL);
assert(sub.gen != NULL);
// is this a dictionary?
if (ctx->parser->is_dict(dict)) {
@ -1013,7 +1013,7 @@ const char *statistics_ng(ng_parser_ctx_t *ctx) {
abort();
sub_label = NULL;
g_queue_push_tail(&bstack, dict);
g_queue_push_tail(&bstack, dict.gen);
dict = sub;
}


+ 21
- 21
include/control_ng.h View File

@ -112,11 +112,11 @@ typedef union {
} helper_arg __attribute__ ((__transparent_union__));
struct ng_parser {
str *(*collapse)(bencode_item_t *root, str *out);
bool (*dict_iter)(ng_parser_ctx_t *, bencode_item_t *,
void (*callback)(ng_parser_ctx_t *, str *, bencode_item_t *, helper_arg),
str *(*collapse)(parser_arg, str *out);
bool (*dict_iter)(ng_parser_ctx_t *, parser_arg,
void (*callback)(ng_parser_ctx_t *, str *, parser_arg, helper_arg),
helper_arg);
bool (*is_list)(bencode_item_t *);
bool (*is_list)(parser_arg);
void (*list_iter)(ng_parser_ctx_t *, bencode_item_t *input,
void (*str_callback)(ng_parser_ctx_t *, str *key, helper_arg),
void (*item_callback)(ng_parser_ctx_t *, bencode_item_t *, helper_arg),
@ -126,29 +126,29 @@ struct ng_parser {
long long (*get_int_str)(bencode_item_t *, long long def);
bool (*is_int)(bencode_item_t *);
long long (*get_int)(bencode_item_t *);
bool (*is_dict)(bencode_item_t *);
bencode_item_t *(*dict)(ng_parser_ctx_t *);
char *(*dict_get_str)(bencode_item_t *, const char *, str *);
long long (*dict_get_int_str)(bencode_item_t *, const char *, long long def);
bencode_item_t *(*dict_get_expect)(bencode_item_t *, const char *, bencode_type_t);
bencode_item_t *(*dict_add)(bencode_item_t *, const char *, bencode_item_t *);
void (*dict_add_string)(bencode_item_t *, const char *, const char *);
void (*dict_add_str)(bencode_item_t *, const char *, const str *);
void (*dict_add_str_dup)(bencode_item_t *, const char *, const str *);
void (*dict_add_int)(bencode_item_t *, const char *, long long);
bencode_item_t *(*dict_add_dict)(bencode_item_t *, const char *);
bencode_item_t *(*dict_add_list)(bencode_item_t *, const char *);
bencode_item_t *(*list)(ng_parser_ctx_t *);
bencode_item_t *(*list_add)(bencode_item_t *, bencode_item_t *);
bool (*is_dict)(parser_arg);
parser_arg (*dict)(ng_parser_ctx_t *);
char *(*dict_get_str)(parser_arg, const char *, str *);
long long (*dict_get_int_str)(parser_arg, const char *, long long def);
bencode_item_t *(*dict_get_expect)(parser_arg, const char *, bencode_type_t);
bencode_item_t *(*dict_add)(parser_arg, const char *, parser_arg);
void (*dict_add_string)(parser_arg, const char *, const char *);
void (*dict_add_str)(parser_arg, const char *, const str *);
void (*dict_add_str_dup)(parser_arg, const char *, const str *);
void (*dict_add_int)(parser_arg, const char *, long long);
bencode_item_t *(*dict_add_dict)(parser_arg, const char *);
bencode_item_t *(*dict_add_list)(parser_arg, const char *);
parser_arg (*list)(ng_parser_ctx_t *);
bencode_item_t *(*list_add)(parser_arg, parser_arg);
bencode_item_t *(*list_add_dict)(bencode_item_t *);
void (*list_add_string)(bencode_item_t *, const char *);
void (*pretty_print)(bencode_item_t *, GString *);
void (*pretty_print)(parser_arg, GString *);
};
struct ng_parser_ctx {
const ng_parser_t *parser;
struct ng_buffer *ngbuf;
bencode_item_t *req;
bencode_item_t *resp;
parser_arg req;
parser_arg resp;
sdp_ng_flags *flags;
enum call_opmode opmode;
};


+ 1
- 1
include/recording.h View File

@ -70,7 +70,7 @@ struct recording_method {
void (*dump_packet)(struct media_packet *, const str *s);
void (*finish)(call_t *, bool discard);
void (*response)(struct recording *, const ng_parser_t *, bencode_item_t *);
void (*response)(struct recording *, const ng_parser_t *, parser_arg);
void (*init_stream_struct)(struct packet_stream *);
void (*setup_stream)(struct packet_stream *);


+ 7
- 0
include/types.h View File

@ -39,6 +39,13 @@ typedef void sdp_attr_print_f(GString *, union sdp_attr_print_arg, const sdp_ng_
typedef struct ng_parser ng_parser_t;
typedef struct ng_parser_ctx ng_parser_ctx_t;
typedef struct bencode_item bencode_item_t;
typedef union {
bencode_item_t *benc;
void *gen;
} parser_arg __attribute__ ((__transparent_union__));
#include "containers.h"
struct sdp_session;


Loading…
Cancel
Save