[tracker/writeback-refactor] libtracker-miner, miner/fs, tracker-writeback: Integrating the three components involved in Writebac
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/writeback-refactor] libtracker-miner, miner/fs, tracker-writeback: Integrating the three components involved in Writebac
- Date: Wed, 13 Jul 2011 13:41:29 +0000 (UTC)
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]