binding: media: free sqlite3 prepared query statement
[apps/mediaplayer.git] / binding / mediaplayer-manager.c
index d5624e4..ca46587 100644 (file)
@@ -83,21 +83,39 @@ void DebugTraceSendMsg(int level, gchar* message)
 
 }
 
+GList* media_local_scan(GList *list)
+{
+    gchar *path = g_strconcat(g_get_home_dir(), "/", "Music", NULL);
+    gchar *tmp = NULL;
+    GDir *dir;
+
+    dir = g_dir_open(path, 0, NULL);
+    if (dir == NULL)
+    {
+        LOGE("Cannot open media path %s\n", path);
+        return list;
+    }
+
+    while ((tmp = (gchar *) g_dir_read_name(dir)) != NULL)
+    {
+        list = g_list_append(list, g_strdup_printf("file://%s/%s", path, tmp));
+    }
+
+    g_free(path);
+    g_dir_close(dir);
+
+    return list;
+}
+
 GList* media_lightmediascanner_scan(void)
 {
     sqlite3 *conn;
     sqlite3_stmt *res;
-    GList *list;
+    GList *list = NULL;
     const char *tail;
     const gchar *db_path;
     int ret = 0;
 
-    list = MediaPlayerManage.list;
-
-    // Returned cached result
-    if (list)
-        return list;
-
     db_path = scanner1_get_data_base_path(MediaPlayerManage.lms_proxy);
 
     ret = sqlite3_open(db_path, &conn);
@@ -123,7 +141,7 @@ GList* media_lightmediascanner_scan(void)
         list = g_list_append(list, g_strdup_printf("file://%s", path));
     }
 
-    MediaPlayerManage.list = list;
+    sqlite3_finalize(res);
 
     return list;
 }
@@ -167,19 +185,7 @@ on_interface_proxy_properties_changed (GDBusProxy *proxy,
     if (list != NULL && g_RegisterCallback.binding_device_added)
         g_RegisterCallback.binding_device_added(list);
 
-    ListUnlock();
-}
-
-static void
-on_device_removed (GDBusProxy *proxy, gpointer user_data)
-{
-    ListLock();
-
-    g_list_free(MediaPlayerManage.list);
-    MediaPlayerManage.list = NULL;
-
-    if (g_RegisterCallback.binding_device_removed)
-        g_RegisterCallback.binding_device_removed((const char *) user_data);
+    g_list_free_full(list, g_free);
 
     ListUnlock();
 }
@@ -197,25 +203,11 @@ static int MediaPlayerDBusInit(void)
         return -1;
     }
 
-    MediaPlayerManage.udisks_proxy = org_freedesktop_udisks_proxy_new_for_bus_sync(
-        G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, UDISKS_SERVICE,
-        UDISKS_PATH, NULL, &error);
-
-    if (MediaPlayerManage.udisks_proxy == NULL) {
-        LOGE("Create UDisks Proxy failed\n");
-        return -1;
-    }
-
     g_signal_connect (MediaPlayerManage.lms_proxy,
                       "g-properties-changed",
                       G_CALLBACK (on_interface_proxy_properties_changed),
                       NULL);
 
-    g_signal_connect (MediaPlayerManage.udisks_proxy,
-                      "device-removed",
-                      G_CALLBACK (on_device_removed),
-                      NULL);
-
     return 0;
 }
 
@@ -235,6 +227,28 @@ static void *media_event_loop_thread(void *unused)
     return NULL;
 }
 
+void
+unmount_cb (GFileMonitor      *mon,
+            GFile             *file,
+            GFile             *other_file,
+            GFileMonitorEvent  event,
+            gpointer           udata)
+{
+    gchar *path = g_file_get_path(file);
+    gchar *uri = g_strconcat("file://", path, NULL);
+    g_free(path);
+
+    ListLock();
+
+    if (g_RegisterCallback.binding_device_removed &&
+        event == G_FILE_MONITOR_EVENT_DELETED) {
+            g_RegisterCallback.binding_device_removed(uri);
+    }
+
+    ListUnlock();
+    g_free(uri);
+}
+
 /*
  * Create MediaPlayer Manager Thread
  * Note: mediaplayer-api should do MediaPlayerManagerInit() before any other 
@@ -243,9 +257,18 @@ static void *media_event_loop_thread(void *unused)
  */
 int MediaPlayerManagerInit() {
     pthread_t thread_id;
+    GFile *file;
+    GFileMonitor *mon;
 
     g_mutex_init(&(MediaPlayerManage.m));
 
+    file = g_file_new_for_path("/media");
+    g_assert(file != NULL);
+
+    mon = g_file_monitor (file, G_FILE_MONITOR_NONE, NULL, NULL);
+    g_assert(mon != NULL);
+    g_signal_connect (mon, "changed", G_CALLBACK(unmount_cb), NULL);
+
     pthread_create(&thread_id, NULL, media_event_loop_thread, NULL);
 
     return 0;