X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?p=staging%2Fsoundmanager.git;a=blobdiff_plain;f=sample%2Fmediaplayer%2Fbinding%2Fmediaplayer-api.c;fp=sample%2Fmediaplayer%2Fbinding%2Fmediaplayer-api.c;h=e81c98adcb22fe9e318e1d856c43fb4973c698a0;hp=0000000000000000000000000000000000000000;hb=2e602801b372b0b68111316b89f567213e3ea378;hpb=f743c3428f41b8d127e538ea8a6505a0c882cdb2 diff --git a/sample/mediaplayer/binding/mediaplayer-api.c b/sample/mediaplayer/binding/mediaplayer-api.c new file mode 100644 index 0000000..e81c98a --- /dev/null +++ b/sample/mediaplayer/binding/mediaplayer-api.c @@ -0,0 +1,173 @@ +/* + * Copyright 2017 Konsulko Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include + +#define AFB_BINDING_VERSION 2 +#include + +#include "mediaplayer-manager.h" + +static struct afb_event media_added_event; +static struct afb_event media_removed_event; + +/* + * @brief Subscribe for an event + * + * @param struct afb_req : an afb request structure + * + */ +static void subscribe(struct afb_req request) +{ + const char *value = afb_req_value(request, "value"); + if(value) { + if(!strcasecmp(value, "media_added")) { + afb_req_subscribe(request, media_added_event); + } else if(!strcasecmp(value, "media_removed")) { + afb_req_subscribe(request, media_removed_event); + } else { + afb_req_fail(request, "failed", "Invalid event"); + return; + } + } + afb_req_success(request, NULL, NULL); +} + +/* + * @brief Unsubscribe for an event + * + * @param struct afb_req : an afb request structure + * + */ +static void unsubscribe(struct afb_req request) +{ + const char *value = afb_req_value(request, "value"); + if(value) { + if(!strcasecmp(value, "media_added")) { + afb_req_unsubscribe(request, media_added_event); + } else if(!strcasecmp(value, "media_removed")) { + afb_req_unsubscribe(request, media_removed_event); + } else { + afb_req_fail(request, "failed", "Invalid event"); + return; + } + } + afb_req_success(request, NULL, NULL); +} + +static json_object *new_json_object_from_device(GList *list) +{ + json_object *jarray = json_object_new_array(); + json_object *jresp = json_object_new_object(); + json_object *jstring = NULL; + GList *l; + + for (l = list; l; l = l->next) + { + jstring = json_object_new_string(l->data); + json_object_array_add(jarray, jstring); + } + + if (jstring == NULL) + return NULL; + + json_object_object_add(jresp, "Media", jarray); + + return jresp; +} + +static void media_results_get (struct afb_req request) +{ + GList *list; + json_object *jresp = NULL; + + ListLock(); + list = media_lightmediascanner_scan(); + list = media_local_scan(list); + if (list == NULL) { + afb_req_fail(request, "failed", "media scan error"); + ListUnlock(); + return; + } + + jresp = new_json_object_from_device(list); + g_list_free(list); + ListUnlock(); + + if (jresp == NULL) { + afb_req_fail(request, "failed", "media parsing error"); + return; + } + + afb_req_success(request, jresp, "Media Results Displayed"); +} + +static void media_broadcast_device_added (GList *list) +{ + json_object *jresp = new_json_object_from_device(list); + + if (jresp != NULL) { + afb_event_push(media_added_event, jresp); + } +} + +static void media_broadcast_device_removed (const char *obj_path) +{ + json_object *jresp = json_object_new_object(); + json_object *jstring = json_object_new_string(obj_path); + + json_object_object_add(jresp, "Path", jstring); + + afb_event_push(media_removed_event, jresp); +} + +static const struct afb_verb_v2 binding_verbs[] = { + { "media_result", media_results_get, NULL, "Media scan result", AFB_SESSION_CHECK }, + { "subscribe", subscribe, NULL, "Subscribe for an event", AFB_SESSION_CHECK }, + { "unsubscribe", unsubscribe, NULL, "Unsubscribe for an event", AFB_SESSION_CHECK }, + { NULL } +}; + +static int preinit() +{ + Binding_RegisterCallback_t API_Callback; + API_Callback.binding_device_added = media_broadcast_device_added; + API_Callback.binding_device_removed = media_broadcast_device_removed; + BindingAPIRegister(&API_Callback); + + return MediaPlayerManagerInit(); +} + +static int init() +{ + media_added_event = afb_daemon_make_event("media_added"); + media_removed_event = afb_daemon_make_event("media_removed"); + + return 0; +} + +const struct afb_binding_v2 afbBindingV2 = { + .api = "media-manager", + .specification = "mediaplayer API", + .preinit = preinit, + .init = init, + .verbs = binding_verbs, +};