[tracker/writeback-refactor] libtracker-miner, miner/fs, tracker-writeback: Integrating the three components involved in Writebac



commit ecee42b7a60b360db53984a5dc4f9f3e167399c9
Author: Philip Van Hoof <philip codeminded be>
Date:   Wed Jul 13 15:40:44 2011 +0200

    libtracker-miner, miner/fs, tracker-writeback: Integrating the three components involved in Writeback

 data/dbus/Makefile.am                        |   39 +++++++------
 data/dbus/tracker-writeback.xml              |   23 +++++++-
 src/libtracker-miner/tracker-marshal.list    |    2 +-
 src/libtracker-miner/tracker-miner-fs.c      |   46 +++++++++++++---
 src/libtracker-miner/tracker-miner-fs.h      |    7 ++-
 src/miners/fs/tracker-main.c                 |    2 +-
 src/miners/fs/tracker-writeback-dispatcher.c |   73 ++++++++++++++++++++++++--
 src/miners/fs/tracker-writeback-listener.c   |    1 +
 src/tracker-writeback/tracker-main.c         |    8 ---
 src/tracker-writeback/tracker-writeback.c    |   53 ++++++++++++++-----
 src/tracker-writeback/tracker-writeback.h    |    2 -
 11 files changed, 196 insertions(+), 60 deletions(-)
---
diff --git a/data/dbus/Makefile.am b/data/dbus/Makefile.am
index 4549048..a809137 100644
--- a/data/dbus/Makefile.am
+++ b/data/dbus/Makefile.am
@@ -2,39 +2,42 @@ include $(top_srcdir)/Makefile.decl
 
 configdir = $(datadir)/tracker
 
-config_DATA =                                          \
-	tracker-backup.xml                             \
-	tracker-extract.xml                            \
-	tracker-miner.xml                              \
-	tracker-miner-web.xml                          \
-	tracker-resources.xml                          \
-	tracker-statistics.xml                         \
-	tracker-writeback.xml                          \
+config_DATA = \
+	tracker-backup.xml \
+	tracker-extract.xml \
+	tracker-miner.xml \
+	tracker-miner-web.xml \
+	tracker-resources.xml \
+	tracker-statistics.xml \
+	tracker-writeback.xml \
 	tracker-status.xml
 
-config_noinst =                                        \
+config_noinst = \
 	tracker-miner-files-index.xml
 
 # Services
-service_in_files =                                     \
-	org.freedesktop.Tracker1.service.in            \
+service_in_files = \
+	org.freedesktop.Tracker1.service.in \
 	org.freedesktop.Tracker1.Miner.Applications.service.in \
 	org.freedesktop.Tracker1.Miner.EMails.service.in \
 	org.freedesktop.Tracker1.Miner.Files.service.in \
 	org.freedesktop.Tracker1.Miner.Flickr.service.in \
 	org.freedesktop.Tracker1.Miner.RSS.service.in  \
-	org.freedesktop.Tracker1.Extract.service.in
+	org.freedesktop.Tracker1.Extract.service.in \
+	org.freedesktop.Tracker1.Writeback.service.in
 
 %.service: %.service.in
 	@sed -e "s|@libexecdir[ ]|${libexecdir}|" $< > $@
 
 # Services
 servicedir = $(DBUS_SERVICES_DIR)
-service_DATA =                                         \
-	org.freedesktop.Tracker1.service               \
+service_DATA = \
+	org.freedesktop.Tracker1.service \
 	org.freedesktop.Tracker1.Miner.Applications.service \
 	org.freedesktop.Tracker1.Miner.Files.service   \
-	org.freedesktop.Tracker1.Extract.service
+	org.freedesktop.Tracker1.Extract.service \
+	org.freedesktop.Tracker1.Writeback.service
+
 
 if HAVE_TRACKER_MINER_EVOLUTION
 service_DATA += org.freedesktop.Tracker1.Miner.EMails.service
@@ -49,9 +52,9 @@ service_DATA += org.freedesktop.Tracker1.Miner.Flickr.service
 endif
 
 
-EXTRA_DIST =                                           \
-	$(service_in_files)                            \
-	$(config_DATA)                                 \
+EXTRA_DIST = \
+	$(service_in_files) \
+	$(config_DATA) \
 	$(config_noinst)
 
 CLEANFILES = $(service_DATA)
diff --git a/data/dbus/tracker-writeback.xml b/data/dbus/tracker-writeback.xml
index e67cf70..71e09f5 100644
--- a/data/dbus/tracker-writeback.xml
+++ b/data/dbus/tracker-writeback.xml
@@ -1,8 +1,27 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
+<!--
+<busconfig>
+    <policy context="default">
+      <deny send_interface="org.freedesktop.Tracker1.Indexer"/>
+      <allow send_destination="org.freedesktop.Tracker1"/>
+    </policy>
+</busconfig>
+-->
+
 <node name="/">
   <interface name="org.freedesktop.Tracker1.Writeback">
-    <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="tracker_writeback_dbus"/>
-
+    <method name="GetPid">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="i" name="value" direction="out" />
+    </method>
+    <method name='PerformWriteback'>"
+      <arg type='s' name='uri' direction='in' />"
+      <arg type='as' name='rdf_types' direction='in' />"
+      <arg type='aas' name='results' direction='in' />"
+    </method>"
+    <method name='CancelTasks'>"
+      <arg type='as' name='uri' direction='in' />"
+    </method>"
   </interface>
 </node>
diff --git a/src/libtracker-miner/tracker-marshal.list b/src/libtracker-miner/tracker-marshal.list
index d045146..2218262 100644
--- a/src/libtracker-miner/tracker-marshal.list
+++ b/src/libtracker-miner/tracker-marshal.list
@@ -11,4 +11,4 @@ BOOL:OBJECT,OBJECT,OBJECT
 BOOL:OBJECT,OBJECT
 BOOL:OBJECT,POINTER
 BOOL:OBJECT
-BOOL:OBJECT,BOXED
+VOID:OBJECT,BOXED,BOXED
diff --git a/src/libtracker-miner/tracker-miner-fs.c b/src/libtracker-miner/tracker-miner-fs.c
index 19a840b..88eb030 100644
--- a/src/libtracker-miner/tracker-miner-fs.c
+++ b/src/libtracker-miner/tracker-miner-fs.c
@@ -127,6 +127,7 @@ typedef struct {
 typedef struct {
 	GFile     *file;
 	GPtrArray *results;
+	GStrv      rdf_types;
 } ItemWritebackData;
 
 typedef struct {
@@ -685,9 +686,11 @@ tracker_miner_fs_class_init (TrackerMinerFSClass *klass)
 		              G_STRUCT_OFFSET (TrackerMinerFSClass, writeback_file),
 		              NULL,
 		              NULL,
-		              tracker_marshal_BOOLEAN__OBJECT_BOXED,
-		              G_TYPE_BOOLEAN, 2,
+		              tracker_marshal_VOID__OBJECT_BOXED_BOXED,
+		              G_TYPE_NONE,
+		              3,
 		              G_TYPE_FILE,
+		              G_TYPE_STRV,
 		              G_TYPE_PTR_ARRAY);
 
 	g_type_class_add_private (object_class, sizeof (TrackerMinerFSPrivate));
@@ -1170,13 +1173,16 @@ item_moved_data_free (ItemMovedData *data)
 
 static ItemWritebackData *
 item_writeback_data_new (GFile     *file,
+                         GStrv      rdf_types,
                          GPtrArray *results)
 {
 	ItemWritebackData *data;
 
 	data = g_slice_new (ItemWritebackData);
+
 	data->file = g_object_ref (file);
 	data->results = g_ptr_array_ref (results);
+	data->rdf_types = g_strdupv (rdf_types);
 
 	return data;
 }
@@ -1186,6 +1192,7 @@ item_writeback_data_free (ItemWritebackData *data)
 {
 	g_object_unref (data->file);
 	g_ptr_array_unref (data->results);
+	g_strfreev (data->rdf_types);
 	g_slice_free (ItemWritebackData, data);
 }
 
@@ -2494,16 +2501,15 @@ item_queue_get_next_file (TrackerMinerFS  *fs,
 	/* Writeback items first */
 	wdata = g_queue_pop_head (fs->priv->items_writeback);
 	if (wdata) {
-		gboolean success = FALSE;
-
 		*file = g_object_ref (wdata->file);
 		*source_file = NULL;
 
 		trace_eq_pop_head ("WRITEBACK", wdata->file);
 
 		g_signal_emit (fs, signals[WRITEBACK_FILE], 0,
-		               wdata->file, wdata->results,
-		               &success);
+		               wdata->file,
+		               wdata->rdf_types,
+		               wdata->results);
 
 		item_writeback_data_free (wdata);
 
@@ -4603,7 +4609,8 @@ tracker_miner_fs_check_file (TrackerMinerFS *fs,
  * tracker_miner_fs_writeback_file:
  * @fs: a #TrackerMinerFS
  * @file: #GFile for the file to check
- @ @results: A array of results from the preparation query
+ * @rdf_types: A #GStrv with rdf types
+ * @results: A array of results from the preparation query
  *
  * Tells the filesystem miner to writeback a file.
  *
@@ -4612,6 +4619,7 @@ tracker_miner_fs_check_file (TrackerMinerFS *fs,
 void
 tracker_miner_fs_writeback_file (TrackerMinerFS *fs,
                                  GFile          *file,
+                                 GStrv           rdf_types,
                                  GPtrArray      *results)
 {
 	gchar *path;
@@ -4627,7 +4635,7 @@ tracker_miner_fs_writeback_file (TrackerMinerFS *fs,
 
 	trace_eq_push_tail ("WRITEBACK", file, "Requested by application");
 
-	data = item_writeback_data_new (file, results);
+	data = item_writeback_data_new (file, rdf_types, results);
 	g_queue_push_tail (fs->priv->items_writeback,
 	                   data);
 
@@ -4637,6 +4645,28 @@ tracker_miner_fs_writeback_file (TrackerMinerFS *fs,
 }
 
 /**
+ * tracker_miner_fs_writeback_notify:
+ * @fs: a #TrackerMinerFS
+ * @file: a #GFile
+ * @error: a #GError with the error that happened during processing, or %NULL.
+ *
+ * Notifies @fs that all writing back on @file has been finished, if any error
+ * happened during file data processing, it should be passed in @error, else
+ * that parameter will contain %NULL to reflect success.
+ *
+ * Since: 0.10.20
+ **/
+void
+tracker_miner_fs_writeback_notify (TrackerMinerFS *fs,
+                                   GFile          *file,
+                                   const GError   *error)
+{
+#warning todo here
+
+	/* TODO */
+}
+
+/**
  * tracker_miner_fs_check_directory:
  * @fs: a #TrackerMinerFS
  * @file: #GFile for the directory to check
diff --git a/src/libtracker-miner/tracker-miner-fs.h b/src/libtracker-miner/tracker-miner-fs.h
index 549ced6..996961d 100644
--- a/src/libtracker-miner/tracker-miner-fs.h
+++ b/src/libtracker-miner/tracker-miner-fs.h
@@ -105,8 +105,9 @@ typedef struct {
 	                                       GFile                *file,
 	                                       TrackerSparqlBuilder *builder,
 	                                       GCancellable         *cancellable);
-	gboolean (* writeback_file)           (TrackerMinerFS       *fs,
+	void     (* writeback_file)           (TrackerMinerFS       *fs,
 	                                       GFile                *file,
+	                                       GStrv                 rdf_types,
 	                                       GPtrArray            *results);
 } TrackerMinerFSClass;
 
@@ -123,7 +124,11 @@ void                  tracker_miner_fs_check_file           (TrackerMinerFS *fs,
                                                              gboolean        check_parents);
 void                  tracker_miner_fs_writeback_file       (TrackerMinerFS *fs,
                                                              GFile          *file,
+                                                             GStrv           rdf_types,
                                                              GPtrArray      *results);
+void                  tracker_miner_fs_writeback_notify     (TrackerMinerFS *fs,
+                                                             GFile          *file,
+                                                             const GError   *error);
 void                  tracker_miner_fs_check_directory      (TrackerMinerFS *fs,
                                                              GFile          *file,
                                                              gboolean        check_parents);
diff --git a/src/miners/fs/tracker-main.c b/src/miners/fs/tracker-main.c
index 085bf38..8a91205 100644
--- a/src/miners/fs/tracker-main.c
+++ b/src/miners/fs/tracker-main.c
@@ -752,7 +752,7 @@ main (gint argc, gchar *argv[])
 		return EXIT_FAILURE;
 	}
 
-	tracker_writeback_init (miner_files, &error);
+	tracker_writeback_init (TRACKER_MINER_FILES (miner_files), &error);
 
 	if (error) {
 		g_critical ("Couldn't create writeback handling: '%s'",
diff --git a/src/miners/fs/tracker-writeback-dispatcher.c b/src/miners/fs/tracker-writeback-dispatcher.c
index 304808e..b28b076 100644
--- a/src/miners/fs/tracker-writeback-dispatcher.c
+++ b/src/miners/fs/tracker-writeback-dispatcher.c
@@ -25,6 +25,14 @@
 
 #include "tracker-writeback-dispatcher.h"
 
+#define TRACKER_WRITEBACK_SERVICE   "org.freedesktop.Tracker1.Writeback"
+#define TRACKER_WRITEBACK_PATH      "/org/freedesktop/Tracker1/Writeback"
+#define TRACKER_WRITEBACK_INTERFACE "org.freedesktop.Tracker1.Writeback"
+
+typedef struct {
+	GFile *file;
+	TrackerMinerFS *fs;
+} WritebackFileData;
 
 typedef struct {
 	TrackerMinerFiles *files_miner;
@@ -52,8 +60,9 @@ static void     writeback_dispatcher_finalize        (GObject              *obje
 static gboolean writeback_dispatcher_initable_init   (GInitable            *initable,
                                                       GCancellable         *cancellable,
                                                       GError              **error);
-static gboolean writeback_dispatcher_writeback_file  (TrackerMinerFS       *fs,
+static void writeback_dispatcher_writeback_file      (TrackerMinerFS       *fs,
                                                       GFile                *file,
+                                                      GStrv                 rdf_types,
                                                       GPtrArray            *results,
                                                       gpointer              user_data);
 
@@ -213,39 +222,93 @@ tracker_writeback_dispatcher_new (TrackerMinerFiles  *miner_files,
 	return (TrackerWritebackDispatcher *) miner;
 }
 
-static gboolean
+static void
+writeback_file_finished  (GObject      *source_object,
+                          GAsyncResult *res,
+                          gpointer      user_data)
+{
+	WritebackFileData *data = user_data;
+	GError *error = NULL;
+
+	g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
+	                               res, &error);
+
+	tracker_miner_fs_writeback_notify (data->fs, data->file, error);
+
+	g_object_unref (data->fs);
+	g_object_unref (data->file);
+	g_free (data);
+}
+
+static void
 writeback_dispatcher_writeback_file (TrackerMinerFS *fs,
                                      GFile          *file,
+                                     GStrv           rdf_types,
                                      GPtrArray      *results,
                                      gpointer        user_data)
 {
 	TrackerWritebackDispatcher *self = user_data;
 	TrackerWritebackDispatcherPrivate *priv;
-	// GError *internal_error = NULL;
 	gchar *uri;
 	guint i;
+	GVariantBuilder builder;
+	WritebackFileData *data = g_new (WritebackFileData, 1);
 
 	priv = TRACKER_WRITEBACK_DISPATCHER_GET_PRIVATE (self);
 
 	uri = g_file_get_uri (file);
 	g_print ("Writeback: %s with:\n", uri);
 
+	g_variant_builder_init (&builder, G_VARIANT_TYPE ("(sasaas)"));
+
+	g_variant_builder_add (&builder, "s", uri);
+
+	g_variant_builder_open (&builder, G_VARIANT_TYPE ("as"));
+	for (i = 0; rdf_types[i] != NULL; i++) {
+		g_variant_builder_add (&builder, "s", rdf_types[i]);
+	}
+	g_variant_builder_close (&builder);
+
+	g_variant_builder_open (&builder, G_VARIANT_TYPE ("aas"));
+
 	for (i = 0; i< results->len; i++) {
 		GStrv row = g_ptr_array_index (results, i);
 		guint y;
 
+		g_variant_builder_open (&builder, G_VARIANT_TYPE ("as"));
+
 		g_print ("\t");
 		for (y = 0; row[y] != NULL; y++) {
+			g_variant_builder_add (&builder, "s", row[y]);
+
 			if (y != 0) {
 				g_print (",");
 			}
 			g_print ("%d=%s", y, row[y]);
 		}
 		g_print ("\n");
+
+		g_variant_builder_close (&builder);
 	}
 
-	g_free (uri);
+	g_variant_builder_close (&builder);
 
-	return TRUE;
+	data->fs = g_object_ref (fs);
+	data->file = g_object_ref (file);
+
+	g_dbus_connection_call (priv->d_connection,
+	                        TRACKER_WRITEBACK_SERVICE,
+	                        TRACKER_WRITEBACK_PATH,
+	                        TRACKER_WRITEBACK_INTERFACE,
+	                        "PerformWriteback",
+	                        g_variant_ref_sink (g_variant_builder_end (&builder)),
+	                        NULL,
+	                        G_DBUS_CALL_FLAGS_NONE,
+	                        -1,
+	                        NULL,
+	                        (GAsyncReadyCallback) writeback_file_finished,
+	                        data);
+
+	g_free (uri);
 }
 
diff --git a/src/miners/fs/tracker-writeback-listener.c b/src/miners/fs/tracker-writeback-listener.c
index b9cf364..a30c91c 100644
--- a/src/miners/fs/tracker-writeback-listener.c
+++ b/src/miners/fs/tracker-writeback-listener.c
@@ -303,6 +303,7 @@ sparql_query_cb (GObject      *object,
 		if (results != NULL && results->len > 0) {
 			tracker_miner_fs_writeback_file (TRACKER_MINER_FS (priv->files_miner),
 			                                 file,
+			                                 data->rdf_types,
 			                                 results);
 		} else {
 			g_message ("  No files qualify for updates");
diff --git a/src/tracker-writeback/tracker-main.c b/src/tracker-writeback/tracker-main.c
index 6c125cf..f42fa69 100644
--- a/src/tracker-writeback/tracker-main.c
+++ b/src/tracker-writeback/tracker-main.c
@@ -127,14 +127,6 @@ main (int   argc,
 		return EXIT_FAILURE;
 	}
 
-	tracker_controller_start (controller, &error);
-
-	if (error) {
-		g_critical ("Error starting controller: %s", error->message);
-		g_error_free (error);
-		return EXIT_FAILURE;
-	}
-
 	g_message ("Main thread is: %p", g_thread_self ());
 
 	loop = g_main_loop_new (NULL, FALSE);
diff --git a/src/tracker-writeback/tracker-writeback.c b/src/tracker-writeback/tracker-writeback.c
index 3cc39c3..67cb160 100644
--- a/src/tracker-writeback/tracker-writeback.c
+++ b/src/tracker-writeback/tracker-writeback.c
@@ -83,7 +83,8 @@ static const gchar *introspection_xml =
 	"    </method>"
 	"    <method name='PerformWriteback'>"
 	"      <arg type='s' name='uri' direction='in' />"
-	"      <arg type='a{sas}' name='results' direction='in' />"
+	"      <arg type='as' name='rdf_types' direction='in' />"
+	"      <arg type='aas' name='results' direction='in' />"
 	"    </method>"
 	"    <method name='CancelTasks'>"
 	"      <arg type='as' name='uri' direction='in' />"
@@ -96,11 +97,12 @@ enum {
 	PROP_SHUTDOWN_TIMEOUT,
 };
 
-static void	tracker_controller_initable_iface_init  (GInitableIface     *iface);
-static gboolean tracker_controller_dbus_start       (TrackerController  *controller,
-                                                     GError            **error);
-static void	tracker_controller_dbus_stop            (TrackerController  *controller);
-
+static void     tracker_controller_initable_iface_init  (GInitableIface     *iface);
+static gboolean tracker_controller_dbus_start           (TrackerController  *controller,
+                                                         GError            **error);
+static void     tracker_controller_dbus_stop            (TrackerController  *controller);
+static gboolean tracker_controller_start                (TrackerController  *controller,
+                                                         GError            **error);
 
 G_DEFINE_TYPE_WITH_CODE (TrackerController, tracker_controller, G_TYPE_OBJECT,
                          G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
@@ -137,7 +139,7 @@ tracker_controller_finalize (GObject *object)
 	tracker_controller_dbus_stop (controller);
 
 	g_object_unref (priv->storage);
-	g_object_unref (priv->modules);
+	g_hash_table_unref (priv->modules);
 
 	g_main_loop_unref (priv->main_loop);
 	g_main_context_unref (priv->context);
@@ -392,8 +394,7 @@ perform_writeback_cb (GObject      *object,
 
 //	if (info) {
 	if (TRUE) {
-		g_dbus_method_invocation_return_value (data->invocation,
-		                                       g_variant_new ("(b)", TRUE));
+		g_dbus_method_invocation_return_value (data->invocation, NULL);
 
 		tracker_dbus_request_end (data->request, NULL);
 	} else {
@@ -444,15 +445,38 @@ handle_method_call_perform_writeback (TrackerController     *controller,
 	GPtrArray *results = NULL;
 	GHashTableIter iter;
 	gpointer key, value;
-	const gchar * const *rdf_types;
+	GVariantIter *iter1, *iter2, *iter3;
+	GArray *rdf_types_array;
+	GStrv rdf_types;
+	gchar *rdf_type = NULL;
 
 	priv = controller->priv;
 
-	g_variant_get (parameters, "(&sa{&sa&s})", &subject, &results);
+	results = g_ptr_array_new_with_free_func ((GDestroyNotify) g_strfreev);
+	g_variant_get (parameters, "(&sasaas)", &subject, &iter1, &iter2);
 
-#warning todo here
+	rdf_types_array = g_array_new (TRUE, TRUE, sizeof (gchar *));
+	while (g_variant_iter_loop (iter1, "&s", &rdf_type)) {
+		g_array_append_val (rdf_types_array, rdf_type);
+	}
+
+	rdf_types = (GStrv) rdf_types_array->data;
+	g_array_free (rdf_types_array, FALSE);
+
+	while (g_variant_iter_loop (iter2, "as", &iter3)) {
+		GArray *row_array = g_array_new (TRUE, TRUE, sizeof (gchar *));
+		gchar *cell = NULL;
 
-	rdf_types = NULL; // todo, get from results
+		while (g_variant_iter_loop (iter3, "&s", &cell)) {
+			g_array_append_val (row_array, cell);
+		}
+
+		g_ptr_array_add (results, row_array->data);
+		g_array_free (row_array, FALSE);
+	}
+
+	g_variant_iter_free (iter1);
+	g_variant_iter_free (iter2);
 
 	reset_shutdown_timeout (controller);
 	request = tracker_dbus_request_begin (NULL, "%s (%s)", __FUNCTION__, subject);
@@ -489,6 +513,7 @@ handle_method_call_perform_writeback (TrackerController     *controller,
 	// todo: make this really async
 	perform_writeback_cb (NULL, NULL, data);
 
+	g_free (rdf_types);
 }
 
 static void
@@ -744,7 +769,7 @@ tracker_controller_thread_func (gpointer user_data)
 	return NULL;
 }
 
-gboolean
+static gboolean
 tracker_controller_start (TrackerController  *controller,
                           GError            **error)
 {
diff --git a/src/tracker-writeback/tracker-writeback.h b/src/tracker-writeback/tracker-writeback.h
index 9af63ca..371a947 100644
--- a/src/tracker-writeback/tracker-writeback.h
+++ b/src/tracker-writeback/tracker-writeback.h
@@ -50,8 +50,6 @@ GType               tracker_controller_get_type (void) G_GNUC_CONST;
 
 TrackerController * tracker_controller_new   (guint               shutdown_timeout,
                                               GError            **error);
-gboolean            tracker_controller_start (TrackerController  *controller,
-                                              GError            **error);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]