diff options
author | 2019-09-19 11:54:50 +0200 | |
---|---|---|
committer | 2019-10-01 10:41:20 +0200 | |
commit | b829ccf57c83d0cad0b285fdd9a25e823ce2bbcd (patch) | |
tree | 1eac2edcb961df5bcf3920c1838a877c89b69cc2 /alsa-binding/Alsa-RegEvt.c | |
parent | b2a41422fa86e1c899328b0b768ad779c29e1ede (diff) |
Rework verb request json parsing
Rework verb request json parsing to allow having request
without 'devid' key in json.
BUG-AGL: SPEC-2832
Change-Id: Id937d98c29d30b9298be3a1972f1a2cf5d0b722c
Signed-off-by: Jonathan Aillet <jonathan.aillet@iot.bzh>
Diffstat (limited to 'alsa-binding/Alsa-RegEvt.c')
-rw-r--r-- | alsa-binding/Alsa-RegEvt.c | 76 |
1 files changed, 42 insertions, 34 deletions
diff --git a/alsa-binding/Alsa-RegEvt.c b/alsa-binding/Alsa-RegEvt.c index 28b66b1..7962963 100644 --- a/alsa-binding/Alsa-RegEvt.c +++ b/alsa-binding/Alsa-RegEvt.c @@ -22,6 +22,8 @@ #include <afb-timer.h> +#include <wrap-json.h> + #include "Alsa-ApiHat.h" // Defines for inotify events @@ -93,29 +95,24 @@ STATIC int getHalIdxFromCardid (int cardid) { return -1; } -PUBLIC json_object *alsaCheckQuery(afb_req_t request, queryValuesT *queryValues) { - - json_object *tmpJ; - int done; +PUBLIC char *alsaGetDevIdFromQuery(json_object *queryJ) +{ + char *devId = NULL; - // get query from request - json_object *queryInJ = afb_req_json(request); + if(wrap_json_unpack(queryJ, "{s:s}", "devid", &devId)) + return NULL; - done = json_object_object_get_ex(queryInJ, "devid", &tmpJ); - if (!done) { - afb_req_fail_f(request, "devid-missing", "Invalid query='%s'", json_object_get_string(queryInJ)); - goto OnErrorExit; - } - queryValues->devid = json_object_get_string(tmpJ); + return devId; +} - done = json_object_object_get_ex(queryInJ, "mode", &tmpJ); - if (!done) queryValues->mode = QUERY_QUIET; // default quiet - else queryValues->mode = json_object_get_int(tmpJ); +PUBLIC queryModeE alsaGetModeFromQuery(json_object *queryJ) +{ + queryModeE mode = QUERY_QUIET; - return queryInJ; + if(wrap_json_unpack(queryJ, "{s:i}", "mode", &mode)) + return QUERY_QUIET; -OnErrorExit: - return NULL; + return mode; } STATIC void updateSelectedAlsaCardsAvailabilityAndFireEvents(sndCardsT *sndCards, int first, int last) { @@ -438,23 +435,23 @@ OnErrorExit: } // Subscribe to every Alsa CtlEvent send by a given board -STATIC afb_event_t alsaEvtSubscribeAlsaControlEvent(afb_req_t request, sndCardsT *sndCards, queryValuesT *queryValues) { +STATIC afb_event_t alsaEvtSubscribeAlsaControlEvent(afb_req_t request, sndCardsT *sndCards, char* devId, queryModeE mode) { sndHandleT *currentSndHandle = NULL; snd_ctl_t *ctlDev = NULL; int err, cardId; snd_ctl_card_info_t *cardinfo; // open control interface for devid - err = snd_ctl_open(&ctlDev, queryValues->devid, SND_CTL_READONLY); + err = snd_ctl_open(&ctlDev, devId, SND_CTL_READONLY); if (err < 0) { - afb_req_fail_f(request, "devid-unknown", "SndCard devid=%s Not Found err=%s", queryValues->devid, snd_strerror(err)); + afb_req_fail_f(request, "devid-unknown", "SndCard devid=%s Not Found err=%s", devId, snd_strerror(err)); goto OnErrorExit; } snd_ctl_card_info_alloca(&cardinfo); err = snd_ctl_card_info(ctlDev, cardinfo); if (err < 0) { - afb_req_fail_f(request, "devid-invalid", "SndCard devid=%s Not Found err=%s", queryValues->devid, snd_strerror(err)); + afb_req_fail_f(request, "devid-invalid", "SndCard devid=%s Not Found err=%s", devId, snd_strerror(err)); goto OnErrorExit; } @@ -471,12 +468,12 @@ STATIC afb_event_t alsaEvtSubscribeAlsaControlEvent(afb_req_t request, sndCardsT if (! currentSndHandle->evtHandle) { currentSndHandle->evtHandle = malloc(sizeof (ctrlEvtHandleT)); currentSndHandle->evtHandle->ctlDev = ctlDev; - currentSndHandle->evtHandle->mode = queryValues->mode; + currentSndHandle->evtHandle->mode = mode; // subscribe for sndctl events attached to devid err = snd_ctl_subscribe_events(currentSndHandle->evtHandle->ctlDev, 1); if (err < 0) { - afb_req_fail_f(request, "subscribe-fail", "Cannot subscribe events from devid=%s err=%d", queryValues->devid, err); + afb_req_fail_f(request, "subscribe-fail", "Cannot subscribe events from devid=%s err=%d", devId, err); goto OnErrorExit; } @@ -491,14 +488,14 @@ STATIC afb_event_t alsaEvtSubscribeAlsaControlEvent(afb_req_t request, sndCardsT sndCtlEventCB, currentSndHandle); if (err < 0) { - afb_req_fail_f(request, "register-mainloop", "Cannot hook events to mainloop devid=%s err=%d", queryValues->devid, err); + afb_req_fail_f(request, "register-mainloop", "Cannot hook events to mainloop devid=%s err=%d", devId, err); goto OnErrorExit; } // create binder event attached to devid name - currentSndHandle->evtHandle->afbevt = afb_daemon_make_event(queryValues->devid); + currentSndHandle->evtHandle->afbevt = afb_daemon_make_event(devId); if (!afb_event_is_valid(currentSndHandle->evtHandle->afbevt)) { - afb_req_fail_f(request, "register-event", "Cannot register new binder event name=%s", queryValues->devid); + afb_req_fail_f(request, "register-event", "Cannot register new binder event name=%s", devId); goto OnErrorExit; } } @@ -517,10 +514,15 @@ OnErrorExit: // Subscribe to alsacore event PUBLIC void alsaEvtSubcribe(afb_req_t request) { + int err; + + queryModeE mode; + + char *devId = NULL; + static sndCardsT *sndCards = NULL; + afb_event_t eventToSubscribe; - int err; - queryValuesT queryValues; json_object *queryJ; @@ -529,15 +531,21 @@ PUBLIC void alsaEvtSubcribe(afb_req_t request) { sndCards->apiHandle = afb_req_get_api(request); } - queryJ = alsaCheckQuery(request, &queryValues); - if (!queryJ) return; + queryJ = afb_req_json(request); + + devId = alsaGetDevIdFromQuery(queryJ); + if (!devId) { + afb_req_fail_f(request, "devid-missing", "Invalid query='%s'", json_object_get_string(queryJ)); + return; + } - if(! strcasecmp(queryValues.devid, "added")) + mode = alsaGetModeFromQuery(queryJ); + if(! strcasecmp(devId, "added")) eventToSubscribe = alsaEvtSubscribeSoundCardEvent(request, sndCards, SUBSCRIPTION_CARD_ADDED_EVENTS); - else if(! strcasecmp(queryValues.devid, "removed")) + else if(! strcasecmp(devId, "removed")) eventToSubscribe = alsaEvtSubscribeSoundCardEvent(request, sndCards, SUBSCRIPTION_CARD_REMOVED_EVENTS); else - eventToSubscribe = alsaEvtSubscribeAlsaControlEvent(request, sndCards, &queryValues); + eventToSubscribe = alsaEvtSubscribeAlsaControlEvent(request, sndCards, devId, mode); if(! eventToSubscribe) return; |