JSON initial codec state command and response#973
JSON initial codec state command and response#973alfredh merged 8 commits intobaresip:masterfrom Roog:master
Conversation
- menu command added '/apistate' - cmd_api_uastate added in devug_cmd.c - ua_state_json_api added in ua.c - account_json_api added in account.c - reg_json_api added in reg.c
src/ua.c
Outdated
|
|
||
| for (le = ua->regl.head; le; le = le->next) { | ||
| /* TODO: how to get only current ua register state? */ | ||
| err |= reg_json_api(reg, le->data); |
There was a problem hiding this comment.
This one is going through all the user agents and their registration statuses. I would like to just have the one that is valid for this user-agent.
There was a problem hiding this comment.
I realised that this one was listing two registrations for one user-agent / account. Not sure how i managed to get that. But that is what caused some confusion. Adding a check for this, unless it's a feature.
|
this looks really nice, well done for writing this code! I have done a code review and added some comments inline. it is mainly 2 things:
if I run the patch locally, here is how it looks: |
|
there are also some formating warnings that should be fixed: |
- Moved declarations to top of function - Cleaned up code formatting - Null check on variables passed to odict_entry_add - Renamed 'af' under 'registration' to 'ip_version'
- ua_state_json_api did not need the print function
|
Thank you @alfredh ! Your comments, really helped :)
Suggested next step:
Thank you for taking your time to reply and comment! Best regards |
modules/debug_cmd/debug_cmd.c
Outdated
|
|
||
| err |= ua_state_json_api(od, ua); | ||
| /* todo: add to list */ | ||
| err |= json_encode_odict(pf, od); |
There was a problem hiding this comment.
this logic will not work. it will append the ua object to the dict and then print it.
if you have 3 uas the result will be:
1
1,2
1,2,3
instead you should build an array, and then encode it as the last step
|
hi @Roog I added some more review comments, do they make sense to you ? |
|
Hi @alfredh , they do make sense! I'm just spending a little bit time reading up on some C related things. I wanted to understand arrays and pointers in C better. Hopefully I'll have some code soon :) |
|
great, regarding the function that encodes the JSON, here is an example: static int cmd_api_uastate(struct re_printf *pf, void *unused)
{
struct odict *od = NULL;
struct le *le;
int err;
(void)unused;
err = odict_alloc(&od, 8);
if (err)
return err;
for (le = list_head(uag_list()); le && !err; le = le->next) {
const struct ua *ua = le->data;
struct odict *odua;
err = odict_alloc(&odua, 8);
err |= ua_state_json_api(odua, ua);
err |= odict_entry_add(od, ua_aor(ua), ODICT_OBJECT, odua);
mem_deref(odua);
}
err |= json_encode_odict(pf, od);
if (err)
warning("debug: failed to encode json (%m)\n", err);
mem_deref(od);
return re_hprintf(pf, "\n");
}it adds multiple objects to the root object, using the SIP aor as the key. the output is something like this: I have used an online JSON validator to check the JSON output. |
- For the JSON api if there is more than one registration the sip-uri or aor will be the key
- scode -> code (makes sense since it's under registration.code - ip_version -> ipv (less data to send around, wondering if IP-version is needed in the api)
|
Thank you for the suggestion!
If you don't see anything that you'd like to change. Best regards |
|
thanks, I have merged the code to master.
you are welcome to make more changes and submit a PR for review. Many thanks for your contributions :) |
(Presumably the changelog [Unreleased] section is for 1.0.0) = Baresip Changelog == [Unreleased] === Added - aac: add AAC_STREAMTYPE_AUDIO enum value - aac: add AAC_ prefix - Video mode param to call_answer(), ua_answer() and ua_hold_answer [#966] - video_stop_display() API function [#977] - module: add path to module_load() function - conf: add conf_configure_buf - test: add usage of g711.so module [#978] - JSON initial codec state command and response [#973] - account_set_video_codecs() API function [#981] - net: add fallback dns nameserver [#996] - gtk: show call_peername in notify title [#1006] - call: Added call_state() API function that returns enum state of the call [#1013] - account_set_stun_user() and account_set_stun_pass() API functions [#1015] - API functions account_stun_uri and account_set_stun_uri. [#1018] - ausine: Audio sine wave input module [#1021] - gtk/menu: replace spaces from uri [#1007] - jack: allowing jack client name to be specified in the config file [#1025] [#1020] - snapshot: Add snapshot_send and snapshot_recv commands [#1029] - webrtc_aec: 'extended_filter' config option [#1030] - avfilter: FFmpeg filter graphs integration [#1038] - reg: view proxy expiry value in reg_status [#1068] - account: add parameter rwait for re-register interval [#1069] - call, stream, menu: add cmd to set the direction of video stream [#1073] === Changed - **Using [baresip/re](https://github.com/baresip/re) fork now** - audio: move calculation to audio_jb_current_value - avformat: clean up docs - gzrtp: update docs - account: increased size of audio codec list to 16 - video: make video_sdp_attr_decode public - config: Derive default audio driver from default audio device [#1009] - jack: modifying info message on jack client creation [#1019] - call: when video stream is disabled, stop also video display [#1023] - dtls_srtp: use tls_set_selfsigned_rsa with keysize 2048 [#1062] [#1056] - rst: use a min ptime of 20ms - aac: change ptime to 4ms === Fixed - avcodec: fix H.264 interop with Firefox - winwave: waveInGetPosition is no longer supported for use as of Windows Vista [#960] - avcodec: call av_hwdevice_ctx_create before if-statement - account: use single quote instead of backtick - ice: fix segfault in connh [#980] - call: Update call->got_offer when re-INVITE or answer to re-INVITE is received [#986] - mk: Test also for /usr/lib64/libspeexdsp.so to cover Fedora/RHEL/CentOS [#992] - config: Allow distribution specific CA trust bundle locations (fixes [#993] - config: Allow distribution specific default audio device (fixes [#994] - mqtt: fix err is never read (found by clang static analyzer) - avcodec: fix err is never read (found by clang static analyzer) - gtk: notification buttons do not work on Systems [#1012] - gtk: fix dtmf_tone and add tones as feedback [#1010] - pulse: drain pulse buffers before freeing [#1016] - jack: jack_play connect all physical ports [#1028] - Makefile: do not try to install modules if build is static [#1031] - gzrtp: media_alloc function is missing [#1034] [#1022] - call: when updating video, check if video stream has been disabled [#1037] - amr: fix length check, fixes [#1011] - modules: fix search path for avdevice.h [#1043] - gtk: declare variables C89 style - config: init newly added member - menu: fix segfault in ua_event_handler [#1059] [#1061] - debug_cmd: fix OpenSSL no-deprecated [#1065] - aac: handle missing bitrate parameter in SDP format - av1: properly configure encoder === Removed - ice: remove support for ICE-lite - ice: remove ice_debug, use log level DEBUG instead - ice: make stun server optional - config: remove ice_debug option (unused) === Contributors (many thanks) - Alfred E. Heggestad - Alexander Gramner - Andrew Webster - Christian Spielberger - Christoph Huber - Davide Alberani - Ethan Funk - Juha Heinanen - mbattista - Michael Malone - Mikl Kurkov - ndilieto - Robert Scheck - Roger Sandholm - Sebastian Reimers [#966]: baresip/baresip#966 [#977]: baresip/baresip#977 [#978]: baresip/baresip#978 [#973]: baresip/baresip#973 [#981]: baresip/baresip#981 [#996]: baresip/baresip#996 [#1006]: baresip/baresip#1006 [#1013]: baresip/baresip#1013 [#1015]: baresip/baresip#1015 [#1018]: baresip/baresip#1018 [#1021]: baresip/baresip#1021 [#1007]: baresip/baresip#1007 [#1025]: baresip/baresip#1025 [#1020]: baresip/baresip#1020 [#1029]: baresip/baresip#1029 [#1030]: baresip/baresip#1030 [#1038]: baresip/baresip#1038 [#1009]: baresip/baresip#1009 [#1019]: baresip/baresip#1019 [#1023]: baresip/baresip#1023 [#1062]: baresip/baresip#1062 [#1056]: baresip/baresip#1056 [#960]: baresip/baresip#960 [#980]: baresip/baresip#980 [#986]: baresip/baresip#986 [#992]: baresip/baresip#992 [#993]: baresip/baresip#993 [#994]: baresip/baresip#994 [#1012]: baresip/baresip#1012 [#1010]: baresip/baresip#1010 [#1016]: baresip/baresip#1016 [#1028]: baresip/baresip#1028 [#1031]: baresip/baresip#1031 [#1034]: baresip/baresip#1034 [#1022]: baresip/baresip#1022 [#1037]: baresip/baresip#1037 [#1011]: baresip/baresip#1011 [#1043]: baresip/baresip#1043 [#1059]: baresip/baresip#1059 [#1061]: baresip/baresip#1061 [#1065]: baresip/baresip#1065 [#1068]: baresip/baresip#1068 [#1069]: baresip/baresip#1069 [#1073]: baresip/baresip#1073 [Unreleased]: baresip/baresip@v0.6.6...HEAD
Hi!
Thanks for answering the 'issue' #959 . "MQTT / TCP on connection client state request".
As mentioned before in the "issue" the idea here is to have a command with a JSON-formatted response. The command could be used when you are starting an api connection to Baresip, via TCP or MQTT. Similair like how '/uastat' and '/callstat' is used today, so an external application could get up and running without a lot of parsing of those commands. The new 'response' could also be the default response on registration and call events...
I should start with an apology, I don't have a deep knowledge of C-programming. So the pull-request is a very early one, maybe @alfredh you can put me in the right direction. Please let me know if I should look up something before you give a proper response, I don't want to bother you with too trivial things..
{ "cuser":"rogersan-0x7f81ded10c30", "selected_ua":true, "aor":"sip:rogersan@domain.com", "display_name":"Roger San", "settings":{ "sip_nat":"outbound", "sip_nat_outbound":[ "sip:primary.example.com", "sip:secondary.example.com" ], "stun_host":"", "stun_port":0, "stun_user":"rogersan", "stun_pass":"***", "answer_mode":"manual", "call_transfer":true, "packet_time":20 }, "registration":{ "interval":3697, "q_value":0.000000, "id":1, "scode":999, "af":"v4" } }Best regards
Roger