lightmediascannerctl: start daemon if not running.
[platform/upstream/lightmediascanner.git] / src / bin / lightmediascannerctl.c
index f1b3b7c..5764bc0 100644 (file)
@@ -4,6 +4,47 @@
 #include <string.h>
 #include <time.h>
 
+static gboolean
+start_service_by_name(void)
+{
+    GError *error = NULL;
+    GVariant *var;
+    GDBusConnection *conn;
+
+    conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error);
+    if (error) {
+        fprintf(stderr, "Could not get session bus connection: %s\n",
+                error->message);
+        g_error_free(error);
+        return FALSE;
+    }
+
+    var = g_dbus_connection_call_sync(conn,
+                                      "org.freedesktop.DBus",
+                                      "/org/freedesktop/DBus",
+                                      "org.freedesktop.DBus",
+                                      "StartServiceByName",
+                                      g_variant_new("(su)",
+                                                    "org.lightmediascanner", 0),
+                                      G_VARIANT_TYPE("(u)"),
+                                      G_DBUS_CALL_FLAGS_NONE,
+                                      10000,
+                                      NULL,
+                                      &error);
+    g_object_unref(conn);
+    if (var)
+        g_variant_unref(var);
+
+    if (error) {
+        fprintf(stderr, "Could not start org.lightmediascanner: %s\n",
+                error->message);
+        g_error_free(error);
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
 struct app {
     int ret;
     int argc;
@@ -237,8 +278,10 @@ on_properties_changed_check_scan(GDBusProxy *proxy, GVariant *changed, const cha
                     app->ret = EXIT_SUCCESS;
                     g_main_loop_quit(app->loop);
                 }
+                g_variant_unref(value);
                 break;
-            }
+            } else
+                g_variant_unref(value);
         }
         g_variant_iter_free(itr);
     }
@@ -257,6 +300,30 @@ on_properties_changed_check_scan(GDBusProxy *proxy, GVariant *changed, const cha
 }
 
 static void
+on_signal(GDBusProxy *proxy, gchar *sender, gchar *signal, GVariant *params, gpointer user_data)
+{
+    if (g_str_equal(signal, "ScanProgress")) {
+        const gchar *category = NULL, *path = NULL;
+        guint64 uptodate = 0, processed = 0, deleted = 0,
+            skipped = 0, errors = 0;
+
+        g_variant_get(params, "(&s&sttttt)",
+                      &category,
+                      &path,
+                      &uptodate,
+                      &processed,
+                      &deleted,
+                      &skipped,
+                      &errors);
+
+        printf("Scan Progress %s:%s uptodate=%"G_GUINT64_FORMAT", "
+               "processed=%"G_GUINT64_FORMAT", deleted=%"G_GUINT64_FORMAT", "
+               "skipped=%"G_GUINT64_FORMAT", errors=%"G_GUINT64_FORMAT"\n",
+               category, path, uptodate, processed, deleted, skipped, errors);
+    }
+}
+
+static void
 populate_scan_params(gpointer key, gpointer value, gpointer user_data)
 {
     const char *category = key;
@@ -303,6 +370,9 @@ do_scan(struct app *app)
     g_signal_connect(app->proxy, "g-properties-changed",
                      G_CALLBACK(on_properties_changed_check_scan),
                      app);
+    g_signal_connect(app->proxy, "g-signal",
+                     G_CALLBACK(on_signal),
+                     app);
 
     categories = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, do_free_array);
     for (i = 0; i < app->argc; i++) {
@@ -451,6 +521,9 @@ main(int argc, char *argv[])
         return EXIT_FAILURE;
     }
 
+    if (!start_service_by_name())
+        return EXIT_FAILURE;
+
     app.timer = NULL;
     app.loop = g_main_loop_new(NULL, FALSE);
     app.proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION,