binding: media: fix memory leak with json objects
[apps/mediaplayer.git] / binding / mediaplayer-api.c
index 44944df..813ab97 100644 (file)
 #include <stdlib.h>
 #include <unistd.h>
 #include <json-c/json.h>
+
+#define AFB_BINDING_VERSION 2
 #include <afb/afb-binding.h>
 
 #include "mediaplayer-manager.h"
 
-const struct afb_binding_interface *afbitf;
-
 static struct afb_event media_added_event;
 static struct afb_event media_removed_event;
 
@@ -86,15 +86,14 @@ static json_object *new_json_object_from_device(GList *list)
         json_object_array_add(jarray, jstring);
     }
 
-    if (jstring == NULL)
+    if (jstring == NULL) {
+        json_object_put(jarray);
+        json_object_put(jresp);
         return NULL;
+    }
 
     json_object_object_add(jresp, "Media", jarray);
 
-    // TODO: Add media path
-    jstring = json_object_new_string("");
-    json_object_object_add(jresp, "Path", jstring);
-
     return jresp;
 }
 
@@ -105,6 +104,7 @@ static void media_results_get (struct afb_req request)
 
     ListLock();
     list = media_lightmediascanner_scan();
+    list = media_local_scan(list);
     if (list == NULL) {
         afb_req_fail(request, "failed", "media scan error");
         ListUnlock();
@@ -142,41 +142,35 @@ static void media_broadcast_device_removed (const char *obj_path)
     afb_event_push(media_removed_event, jresp);
 }
 
-static const struct afb_verb_desc_v1 binding_verbs[] = {
-    { "media_result",  AFB_SESSION_CHECK, media_results_get,   "Media scan result" },
-    { "subscribe",     AFB_SESSION_CHECK, subscribe,           "Subscribe for an event" },
-    { "unsubscribe",   AFB_SESSION_CHECK, unsubscribe,         "Unsubscribe for an event" },
+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 const struct afb_binding binding_description = {
-    .type = AFB_BINDING_VERSION_1,
-    .v1 = {
-        .prefix = "media-manager",
-        .info = "mediaplayer API",
-        .verbs = binding_verbs,
-    }
-};
-
-const struct afb_binding
-*afbBindingV1Register(const struct afb_binding_interface *itf)
+static int preinit()
 {
-    afbitf = itf;
-
     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);
 
-    MediaPlayerManagerInit();
-
-    return &binding_description;
+    return MediaPlayerManagerInit();
 }
 
-int afbBindingV1ServiceInit(struct afb_service service)
+static int init()
 {
-    media_added_event = afb_daemon_make_event(afbitf->daemon, "media_added");
-    media_removed_event = afb_daemon_make_event(afbitf->daemon, "media_removed");
+    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,
+};