[tracker/libtracker-miner] Implemented Pause and Resume in tracker-status for miners
- From: Martyn James Russell <mr src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker/libtracker-miner] Implemented Pause and Resume in tracker-status for miners
- Date: Fri, 21 Aug 2009 12:12:10 +0000 (UTC)
commit 9301ff71a736ec2923ad8b6fff966cd21da9e2c4
Author: Martyn Russell <martyn lanedo com>
Date: Fri Aug 21 13:10:06 2009 +0100
Implemented Pause and Resume in tracker-status for miners
src/libtracker-miner/tracker-miner.h | 1 +
src/tracker-utils/Makefile.am | 21 +++-
src/tracker-utils/tracker-status.c | 226 +++++++++++++++++++++++++++++++++-
3 files changed, 237 insertions(+), 11 deletions(-)
---
diff --git a/src/libtracker-miner/tracker-miner.h b/src/libtracker-miner/tracker-miner.h
index fcae9bb..4d779bc 100644
--- a/src/libtracker-miner/tracker-miner.h
+++ b/src/libtracker-miner/tracker-miner.h
@@ -33,6 +33,7 @@ G_BEGIN_DECLS
#define TRACKER_IS_MINER_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), TRACKER_TYPE_MINER))
#define TRACKER_MINER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TRACKER_TYPE_MINER, TrackerMinerClass))
+#define TRACKER_MINER_DBUS_INTERFACE "org.freedesktop.Tracker.Miner"
#define TRACKER_MINER_DBUS_NAME_PREFIX "org.freedesktop.Tracker.Miner."
#define TRACKER_MINER_DBUS_PATH_PREFIX "/org/freedesktop/Tracker/Miner/"
diff --git a/src/tracker-utils/Makefile.am b/src/tracker-utils/Makefile.am
index 5ea9416..8afe822 100644
--- a/src/tracker-utils/Makefile.am
+++ b/src/tracker-utils/Makefile.am
@@ -6,21 +6,22 @@ INCLUDES = \
-DTRACKER_COMPILATION \
-I$(top_srcdir)/src \
$(WARN_CFLAGS) \
- $(GTHREAD_CFLAGS) \
- $(GLIB2_CFLAGS) \
$(GCOV_CFLAGS) \
+ $(DBUS_CFLAGS) \
$(GIO_CFLAGS) \
- $(DBUS_CFLAGS)
+ $(GTHREAD_CFLAGS) \
+ $(GLIB2_CFLAGS)
libs = \
$(top_builddir)/src/libtracker-miner/libtracker-miner.la \
$(top_builddir)/src/libtracker-db/libtracker-db.la \
$(top_builddir)/src/libtracker-common/libtracker-common.la \
$(top_builddir)/src/libtracker/libtrackerclient- TRACKER_API_VERSION@.la \
+ $(DBUS_LIBS) \
$(GIO_LIBS) \
- $(GCOV_LIBS) \
$(GTHREAD_LIBS) \
- $(GLIB2_LIBS)
+ $(GLIB2_LIBS) \
+ $(GCOV_LIBS)
bin_PROGRAMS = \
tracker-import \
@@ -56,3 +57,13 @@ tracker_sparql_LDADD = $(libs)
tracker_import_SOURCES = tracker-import.c
tracker_import_LDADD = $(libs)
+dbus_sources = \
+ tracker-miner-client.h
+
+%-client.h: $(top_srcdir)/data/dbus/%.xml
+ $(DBUSBINDINGTOOL) --mode=glib-client --output=$@ --prefix=$(subst -,_,$*) $^
+
+BUILT_SOURCES = \
+ $(dbus_sources)
+
+CLEANFILES = $(BUILT_SOURCES)
diff --git a/src/tracker-utils/tracker-status.c b/src/tracker-utils/tracker-status.c
index 002852e..eb21ff1 100644
--- a/src/tracker-utils/tracker-status.c
+++ b/src/tracker-utils/tracker-status.c
@@ -20,19 +20,22 @@
#include "config.h"
-#include <string.h>
-#include <stdlib.h>
#include <signal.h>
-#include <time.h>
#include <locale.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
#include <glib.h>
#include <glib/gi18n.h>
#include <libtracker/tracker.h>
+#include <libtracker-miner/tracker-miner.h>
#include <libtracker-miner/tracker-miner-discover.h>
+#include "tracker-miner-client.h"
+
#define TRACKER_TYPE_G_STRV_ARRAY (dbus_g_type_get_collection ("GPtrArray", G_TYPE_STRV))
/* #define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) */
@@ -44,6 +47,9 @@ static GMainLoop *main_loop;
static gboolean list_miners_running;
static gboolean list_miners_available;
+static gchar *mname;
+static gchar *mpause;
+static gint mresume = -1;
static gboolean follow;
static gboolean detailed;
@@ -56,7 +62,7 @@ static GOptionEntry entries[] = {
N_("Include details with state updates (only applies to --follow)"),
NULL
},
- { "list-miners-running", 'r', 0, G_OPTION_ARG_NONE, &list_miners_running,
+ { "list-miners-running", 'l', 0, G_OPTION_ARG_NONE, &list_miners_running,
N_("List all miners installed"),
NULL
},
@@ -64,6 +70,18 @@ static GOptionEntry entries[] = {
N_("List all miners installed"),
NULL
},
+ { "miner", 'm', 0, G_OPTION_ARG_STRING, &mname,
+ N_("Miner to use with other commands (you can use suffixes, e.g. FS or Applications)"),
+ N_("MINER")
+ },
+ { "pause", 'p', 0, G_OPTION_ARG_STRING, &mpause,
+ N_("Pause a miner (you must use this with --miner)"),
+ N_("REASON")
+ },
+ { "resume", 'r', 0, G_OPTION_ARG_INT, &mresume,
+ N_("Resume a miner (you must use this with --miner)"),
+ N_("COOKIE")
+ },
{ NULL }
};
@@ -110,6 +128,165 @@ initialize_signal_handler (void)
sigaction (SIGHUP, &act, NULL);
}
+static gchar *
+get_dbus_name (const gchar *name_provided)
+{
+ gchar *name;
+
+ if (g_str_has_prefix (name_provided, TRACKER_MINER_DBUS_NAME_PREFIX)) {
+ name = g_strdup (name_provided);
+ } else {
+ name = g_strconcat (TRACKER_MINER_DBUS_NAME_PREFIX,
+ name_provided,
+ NULL);
+ }
+
+ return name;
+}
+
+static gchar *
+get_dbus_path (const gchar *name)
+{
+ GStrv strv;
+ gchar *path;
+ gchar *str;
+
+ /* Create path from name */
+ strv = g_strsplit (name, ".", -1);
+ str = g_strjoinv ("/", strv);
+ g_strfreev (strv);
+ path = g_strconcat ("/", str, NULL);
+ g_free (str);
+
+ return path;
+}
+
+static DBusGProxy *
+get_dbus_proxy (const gchar *name)
+{
+ GError *error = NULL;
+ DBusGConnection *connection;
+ DBusGProxy *proxy;
+ gchar *path;
+
+ connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+
+ if (!connection) {
+ g_printerr ("%s. %s\n",
+ _("Could not connect to the DBus session bus"),
+ error ? error->message : _("No error given"));
+ g_clear_error (&error);
+ return NULL;
+ }
+
+ path = get_dbus_path (name);
+ proxy = dbus_g_proxy_new_for_name (connection,
+ name,
+ path,
+ TRACKER_MINER_DBUS_INTERFACE);
+ g_free (path);
+
+ if (!proxy) {
+ gchar *str;
+
+ str = g_strdup_printf (_("Could not DBusGProxy for that miner: %s"),
+ name);
+ g_printerr ("%s\n", str);
+ g_free (str);
+
+ return NULL;
+ }
+
+ return proxy;
+}
+
+static int
+miner_pause (const gchar *miner,
+ const gchar *reason)
+{
+ GError *error = NULL;
+ DBusGProxy *proxy;
+ gchar *name;
+ gchar *str;
+ gint cookie;
+
+ name = get_dbus_name (miner);
+
+ proxy = get_dbus_proxy (name);
+ if (!proxy) {
+ g_free (name);
+ return EXIT_FAILURE;
+ }
+
+ str = g_strdup_printf (_("Attempting to pause miner '%s' with reason '%s'"),
+ name,
+ reason);
+ g_print ("%s\n", str);
+ g_free (str);
+
+ if (!org_freedesktop_Tracker_Miner_pause (proxy,
+ g_get_application_name (),
+ reason,
+ &cookie,
+ &error)) {
+ g_printerr (" %s. %s\n",
+ _("Could not pause miner"),
+ error ? error->message : _("No error given"));
+ g_clear_error (&error);
+ g_free (name);
+
+ return EXIT_FAILURE;
+ }
+
+ str = g_strdup_printf (_("Cookie is %d"), cookie);
+ g_print (" %s\n", str);
+ g_free (str);
+ g_free (name);
+
+ return EXIT_SUCCESS;
+}
+
+static int
+miner_resume (const gchar *miner,
+ gint cookie)
+{
+ GError *error = NULL;
+ DBusGProxy *proxy;
+ gchar *name;
+ gchar *str;
+
+ name = get_dbus_name (miner);
+
+ proxy = get_dbus_proxy (name);
+ if (!proxy) {
+ g_free (name);
+ return EXIT_FAILURE;
+ }
+
+ str = g_strdup_printf (_("Attempting to resume miner %s with cookie %d"),
+ name,
+ cookie);
+ g_print ("%s\n", str);
+ g_free (str);
+
+ if (!org_freedesktop_Tracker_Miner_resume (proxy,
+ cookie,
+ &error)) {
+ g_printerr (" %s. %s\n",
+ _("Could not resume miner"),
+ error ? error->message : _("No error given"));
+ g_clear_error (&error);
+ g_free (name);
+
+ return EXIT_FAILURE;
+ }
+
+ g_print (" %s\n", _("Done"));
+ g_free (name);
+
+ return EXIT_SUCCESS;
+}
+
gint
main (gint argc, gchar *argv[])
{
@@ -123,9 +300,38 @@ main (gint argc, gchar *argv[])
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
- context = g_option_context_new (_("- Report current status"));
+ context = g_option_context_new (_("- Monitor and control status"));
g_option_context_add_main_entries (context, entries, NULL);
g_option_context_parse (context, &argc, &argv, NULL);
+
+ if (mpause && mresume != -1) {
+ gchar *help;
+
+ g_printerr ("%s\n\n",
+ _("You can not use miner pause and resume switches together"));
+
+ help = g_option_context_get_help (context, TRUE, NULL);
+ g_option_context_free (context);
+ g_printerr ("%s", help);
+ g_free (help);
+
+ return EXIT_FAILURE;
+ }
+
+ if ((mpause || mresume != -1) && !mname) {
+ gchar *help;
+
+ g_printerr ("%s\n\n",
+ _("You must provide the miner for pause or resume commands"));
+
+ help = g_option_context_get_help (context, TRUE, NULL);
+ g_option_context_free (context);
+ g_printerr ("%s", help);
+ g_free (help);
+
+ return EXIT_FAILURE;
+ }
+
g_option_context_free (context);
g_type_init ();
@@ -133,7 +339,7 @@ main (gint argc, gchar *argv[])
if (!g_thread_supported ()) {
g_thread_init (NULL);
}
-
+
client = tracker_connect (FALSE, -1);
if (!client) {
@@ -179,6 +385,14 @@ main (gint argc, gchar *argv[])
g_slist_free (list);
}
+ if (mpause) {
+ return miner_pause (mname, mpause);
+ }
+
+ if (mresume != -1) {
+ return miner_resume (mname, mresume);
+ }
+
if (!follow) {
GError *error = NULL;
gchar *state;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]