tracker r2925 - in trunk: . data/db src/plugins src/plugins/evolution src/plugins/kmail src/plugins/rss src/tracker-indexer src/trackerd



Author: pvanhoof
Date: Thu Feb 12 15:47:13 2009
New Revision: 2925
URL: http://svn.gnome.org/viewvc/tracker?rev=2925&view=rev

Log:
2009-02-12  Philip Van Hoof  <philip codeminded be>

	* src/plugins/evolution/tracker-evolution-indexer.h
	* src/plugins/evolution/tracker-evolution-registrar.h
	* src/plugins/evolution/tracker-evolution-plugin.xml
	* src/plugins/evolution/Makefile.am
	* src/plugins/evolution/tracker-evolution-indexer.c
	* src/plugins/evolution/tracker-evolution-registrar.xml
	* src/plugins/evolution/tracker-evolution-registrar.c
	* src/plugins/Makefile.am
	* src/tracker-indexer/tracker-main.c
	* src/tracker-indexer/Makefile.am
	* src/trackerd/tracker-main.c
	* src/trackerd/Makefile.am
	* configure.ac
	* data/db/sqlite-tracker.sql
	* src/plugins/rss
	* src/plugins/rss/tracker-rss-registrar.xml
	* src/plugins/rss/tracker-rss-registrar.c
	* src/plugins/rss/tracker-rss-indexer.h
	* src/plugins/rss/tracker-rss-registrar.h
	* src/plugins/rss/Makefile.am
	* src/plugins/rss/tracker-rss-common.h
	* src/plugins/rss/tracker-rss-indexer.c
	* src/plugins/kmail
	* src/plugins/kmail/tracker-kmail-common.h
	* src/plugins/kmail/tracker-kmail-indexer.c
	* src/plugins/kmail/tracker-kmail-registrar.xml
	* src/plugins/kmail/tracker-kmail-registrar.c
	* src/plugins/kmail/tracker-kmail-indexer.h
	* src/plugins/kmail/Makefile.am
	* src/plugins/kmail/tracker-kmail-registrar.h
	* src/tracker-indexer/tracker-push.c
	* src/tracker-indexer/tracker-push.h
	* src/trackerd/tracker-push-registrar.c
	* src/trackerd/tracker-push.c
	* src/trackerd/tracker-push-registrar.h
	* src/trackerd/tracker-push.h
	* src/plugins/evolution/tracker-evolution.h
	* src/plugins/evolution/tracker-evolution.c: New infrastructure for 
	so-called Push modules, these include the new support for Evolution



Added:
   trunk/src/plugins/kmail/
   trunk/src/plugins/kmail/Makefile.am
   trunk/src/plugins/kmail/tracker-kmail-common.h
   trunk/src/plugins/kmail/tracker-kmail-indexer.c
   trunk/src/plugins/kmail/tracker-kmail-indexer.h
   trunk/src/plugins/kmail/tracker-kmail-registrar.c
   trunk/src/plugins/kmail/tracker-kmail-registrar.h
   trunk/src/plugins/kmail/tracker-kmail-registrar.xml
   trunk/src/plugins/rss/
   trunk/src/plugins/rss/Makefile.am
   trunk/src/plugins/rss/tracker-rss-common.h
   trunk/src/plugins/rss/tracker-rss-indexer.c
   trunk/src/plugins/rss/tracker-rss-indexer.h
   trunk/src/plugins/rss/tracker-rss-registrar.c
   trunk/src/plugins/rss/tracker-rss-registrar.h
   trunk/src/plugins/rss/tracker-rss-registrar.xml
   trunk/src/tracker-indexer/tracker-push.c
   trunk/src/tracker-indexer/tracker-push.h
   trunk/src/trackerd/tracker-push-registrar.c
   trunk/src/trackerd/tracker-push-registrar.h
   trunk/src/trackerd/tracker-push.c
   trunk/src/trackerd/tracker-push.h
Removed:
   trunk/src/plugins/evolution/tracker-evolution.c
   trunk/src/plugins/evolution/tracker-evolution.h
Modified:
   trunk/ChangeLog
   trunk/configure.ac
   trunk/data/db/sqlite-tracker.sql
   trunk/src/plugins/Makefile.am
   trunk/src/plugins/evolution/Makefile.am
   trunk/src/plugins/evolution/tracker-evolution-indexer.c
   trunk/src/plugins/evolution/tracker-evolution-indexer.h
   trunk/src/plugins/evolution/tracker-evolution-plugin.xml
   trunk/src/plugins/evolution/tracker-evolution-registrar.c
   trunk/src/plugins/evolution/tracker-evolution-registrar.h
   trunk/src/plugins/evolution/tracker-evolution-registrar.xml
   trunk/src/tracker-indexer/Makefile.am
   trunk/src/tracker-indexer/tracker-main.c
   trunk/src/trackerd/Makefile.am
   trunk/src/trackerd/tracker-main.c

Modified: trunk/configure.ac
==============================================================================
--- trunk/configure.ac	(original)
+++ trunk/configure.ac	Thu Feb 12 15:47:13 2009
@@ -210,6 +210,33 @@
 DBUS_SERVICES_DIR="$services_dir"
 AC_SUBST(DBUS_SERVICES_DIR)
 
+####################################################################
+# Push modules
+####################################################################
+
+# In vstore we want to make these mandatory, please remove these
+# (as) options when merging to vstore. Thanks!
+
+AC_ARG_ENABLE([evolution_push_module],
+              AS_HELP_STRING([--enable-evolution-push-module=ARG],
+                             [enable support for Evolution push mechanism]),,
+              [enable_evolution_push_module=no])
+
+AM_CONDITIONAL(USING_EVOLUTION_PUSH_MODULE, test "x$enable_evolution_push_module" = "xyes")
+
+AC_ARG_ENABLE([kmail_push_module],
+              AS_HELP_STRING([--enable-kmail-push-module=ARG],
+                             [enable support for KMail push mechanism]),,
+              [enable_kmail_push_module=no])
+
+AM_CONDITIONAL(USING_KMAIL_PUSH_MODULE, test "x$enable_kmail_push_module" = "xyes")
+
+AC_ARG_ENABLE([rss_push_module],
+              AS_HELP_STRING([--enable-rss-push-module=ARG],
+                             [enable support for RSS push mechanism]),,
+              [enable_rss_push_module=no])
+
+AM_CONDITIONAL(USING_RSS_PUSH_MODULE, test "x$enable_rss_push_module" = "xyes")
 
 ####################################################################
 # Deskbar Applet Handler/Module
@@ -1083,12 +1110,7 @@
 # Enable Evolution plugin support?
 ##################################################################
 
-AC_ARG_ENABLE(evolution-plugin, 
-	      AS_HELP_STRING([--disable-evolution-plugin],
-			     [disable evolution plugin support]),,
-	      [enable_evolution_plugin=no])
-
-if test "x$enable_evolution_plugin" != "xno" ; then
+if test "x$enable_evolution_push_module" != "xno" ; then
    PKG_CHECK_MODULES(EVOLUTION_PLUGIN, [
    		     evolution-plugin >= $EVO_REQUIRED
 		     evolution-data-server-1.2 >= $EDS_REQUIRED], 
@@ -1242,6 +1264,8 @@
 	src/tracker-utils/Makefile
 	src/plugins/Makefile
 	src/plugins/evolution/Makefile
+	src/plugins/kmail/Makefile
+	src/plugins/rss/Makefile
 	tests/common/Makefile
 	tests/libtracker-common/Makefile
 	tests/libtracker-db/Makefile

Modified: trunk/data/db/sqlite-tracker.sql
==============================================================================
--- trunk/data/db/sqlite-tracker.sql	(original)
+++ trunk/data/db/sqlite-tracker.sql	Thu Feb 12 15:47:13 2009
@@ -9,7 +9,8 @@
 insert Into Options (OptionKey, OptionValue) values ('EventSequence', '1');
 insert Into Options (OptionKey, OptionValue) values ('UpdateCount', '0');
 insert Into Options (OptionKey, OptionValue) values ('EvolutionLastModseq', '0');
-
+insert Into Options (OptionKey, OptionValue) values ('KMailLastModseq', '0');
+insert Into Options (OptionKey, OptionValue) values ('RssLastModseq', '0');
 
 /* store volume and HAL info here for files */
 CREATE TABLE  Volumes

Modified: trunk/src/plugins/Makefile.am
==============================================================================
--- trunk/src/plugins/Makefile.am	(original)
+++ trunk/src/plugins/Makefile.am	Thu Feb 12 15:47:13 2009
@@ -2,7 +2,17 @@
 
 SUBDIRS = .
 
+if USING_RSS_PUSH_MODULE
+SUBDIRS += rss
+endif
+
+if USING_KMAIL_PUSH_MODULE
+SUBDIRS += kmail
+endif
+
+if USING_EVOLUTION_PUSH_MODULE
 if HAVE_EVOLUTION_PLUGIN
 SUBDIRS += evolution
 endif
+endif
 

Modified: trunk/src/plugins/evolution/Makefile.am
==============================================================================
--- trunk/src/plugins/evolution/Makefile.am	(original)
+++ trunk/src/plugins/evolution/Makefile.am	Thu Feb 12 15:47:13 2009
@@ -24,36 +24,46 @@
 
 eplugin_LTLIBRARIES = liborg-freedesktop-Tracker-evolution-plugin.la
 
-noinst_LTLIBRARIES = libtracker-evolution.la libtracker-evolution-indexer.la
+module_flags = -module -avoid-version -no-undefined
 
-libtracker_evolution_indexer_la_SOURCES =				\
+pushd_modulesdir = $(libdir)/tracker/push-modules/daemon
+pushi_modulesdir = $(libdir)/tracker/push-modules/indexer
+
+pushd_modules_LTLIBRARIES = libtracker-module-evolution-daemon-module.la
+pushi_modules_LTLIBRARIES = libtracker-module-evolution-indexer-module.la
+
+libtracker_module_evolution_indexer_module_la_SOURCES =			\
 	tracker-evolution-indexer.c					\
 	tracker-evolution-indexer.h					\
 	tracker-evolution-registrar-glue.h				\
 	tracker-evolution-common.h
 
-libtracker_evolution_la_SOURCES =	 				\
-	tracker-evolution.c						\
-	tracker-evolution.h						\
+libtracker_module_evolution_daemon_module_la_SOURCES =	 		\
 	tracker-evolution-registrar.c					\
 	tracker-evolution-registrar.h					\
 	tracker-evolution-common.h					\
 	tracker-evolution-registrar-glue.h
 
-libtracker_evolution_la_LIBADD = 					\
+libtracker_module_evolution_daemon_module_la_LDFLAGS = $(module_flags)
+
+libtracker_module_evolution_daemon_module_la_LIBADD = 			\
 	$(top_builddir)/src/libtracker-data/libtracker-data.la          \
 	$(top_builddir)/src/libtracker-db/libtracker-db.la              \
 	$(top_builddir)/src/libtracker-common/libtracker-common.la      \
+	$(GMODULE_LIBS)							\
 	$(DBUS_LIBS)                                                    \
 	$(GTHREAD_LIBS)                                                 \
 	$(GIO_LIBS)                                                     \
 	$(GLIB2_LIBS)                                                   \
 	$(RAPTOR_LIBS)
 
-libtracker_evolution_indexer_la_LIBADD = 				\
+libtracker_module_evolution_indexer_module_la_LDFLAGS = $(module_flags)
+
+libtracker_module_evolution_indexer_module_la_LIBADD = 			\
 	$(top_builddir)/src/libtracker-data/libtracker-data.la          \
 	$(top_builddir)/src/libtracker-db/libtracker-db.la              \
 	$(top_builddir)/src/libtracker-common/libtracker-common.la      \
+	$(GMODULE_LIBS)							\
 	$(DBUS_LIBS)                                                    \
 	$(GTHREAD_LIBS)                                                 \
 	$(GIO_LIBS)                                                     \

Modified: trunk/src/plugins/evolution/tracker-evolution-indexer.c
==============================================================================
--- trunk/src/plugins/evolution/tracker-evolution-indexer.c	(original)
+++ trunk/src/plugins/evolution/tracker-evolution-indexer.c	Thu Feb 12 15:47:13 2009
@@ -40,6 +40,7 @@
 
 /* This is okay, we run in-process of the indexer: we can access its symbols */
 #include <tracker-indexer/tracker-module.h>
+#include <tracker-indexer/tracker-push.h>
 #include <tracker-indexer/tracker-module-metadata-private.h>
 
 #include "tracker-evolution-indexer.h"
@@ -65,31 +66,19 @@
 #define METADATA_EMAIL_TEXT	     "Email:Body"
 #define METADATA_EMAIL_TAG	     "User:Keywords"
 
-#define TRACKER_EVOLUTION_INDEXER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_EVOLUTION_INDEXER, TrackerEvolutionIndexerPrivate))
-
 G_DEFINE_TYPE (TrackerEvolutionIndexer, tracker_evolution_indexer, G_TYPE_OBJECT)
 
 /* This runs in-process of tracker-indexer */
 
 static GObject *idx_indexer = NULL;
 
-typedef struct {
-	TrackerIndexer *indexer;
-} TrackerEvolutionIndexerPrivate;
-
 enum {
 	PROP_0,
-	PROP_INDEXER
 };
 
 static void
 tracker_evolution_indexer_finalize (GObject *object)
 {
-	TrackerEvolutionIndexerPrivate *priv = TRACKER_EVOLUTION_INDEXER_GET_PRIVATE (object);
-
-	if (priv->indexer)
-		g_object_unref (priv->indexer);
-
 	G_OBJECT_CLASS (tracker_evolution_indexer_parent_class)->finalize (object);
 }
 
@@ -99,18 +88,7 @@
 					const GValue *value,
 					GParamSpec   *pspec)
 {
-	TrackerEvolutionIndexerPrivate *priv = TRACKER_EVOLUTION_INDEXER_GET_PRIVATE (object);
-
 	switch (prop_id) {
-
-	case PROP_INDEXER:
-
-		if (priv->indexer)
-			g_object_unref (priv->indexer);
-
-		priv->indexer = g_value_dup_object (value);
-		break;
-
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -123,14 +101,7 @@
 					GValue     *value,
 					GParamSpec *pspec)
 {
-	TrackerEvolutionIndexerPrivate *priv;
-
-	priv = TRACKER_EVOLUTION_INDEXER_GET_PRIVATE (object);
-
 	switch (prop_id) {
-	case PROP_INDEXER:
-		g_value_set_object (value, priv->indexer);
-		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 		break;
@@ -145,24 +116,11 @@
 	object_class->finalize = tracker_evolution_indexer_finalize;
 	object_class->set_property = tracker_evolution_indexer_set_property;
 	object_class->get_property = tracker_evolution_indexer_get_property;
-
-	g_object_class_install_property (object_class,
-					 PROP_INDEXER,
-					 g_param_spec_object ("indexer",
-							      "Indexer",
-							      "Indexer",
-							      tracker_indexer_get_type (),
-							      G_PARAM_READWRITE |
-							      G_PARAM_CONSTRUCT));
-
-	g_type_class_add_private (object_class, sizeof (TrackerEvolutionIndexerPrivate));
 }
 
 static void
 tracker_evolution_indexer_init (TrackerEvolutionIndexer *object)
 {
-	TrackerEvolutionIndexerPrivate *priv = TRACKER_EVOLUTION_INDEXER_GET_PRIVATE (object);
-	priv->indexer = NULL;
 }
 
 
@@ -297,8 +255,7 @@
 
 	while (predicates [i] != NULL && values[i] != NULL) {
 
-		/* TODO: TRACKER_EVOLUTION_PREDICATE_SEEN (!)
-		 *       TRACKER_EVOLUTION_PREDICATE_JUNK (!)
+		/* TODO: TRACKER_EVOLUTION_PREDICATE_JUNK (!)
 		 *       TRACKER_EVOLUTION_PREDICATE_ANSWERED
 		 *       TRACKER_EVOLUTION_PREDICATE_FLAGGED
 		 *       TRACKER_EVOLUTION_PREDICATE_FORWARDED
@@ -432,7 +389,7 @@
 							    values[i]);
 		}
 
-		if (g_strcmp0 (predicates[i], METADATA_EMAIL_SENDER) == 0) {
+		if (g_strcmp0 (predicates[i], TRACKER_EVOLUTION_PREDICATE_FROM) == 0) {
 			tracker_module_metadata_add_string (metadata, 
 							    METADATA_EMAIL_SENDER, 
 							    values[i]);
@@ -479,7 +436,7 @@
 static void
 set_stored_last_modseq (guint last_modseq)
 {
-	tracker_data_manager_set_db_option_int ("EvolutionLastCheckout", (gint) last_modseq);
+	tracker_data_manager_set_db_option_int ("EvolutionLastModseq", (gint) last_modseq);
 }
 
 void
@@ -592,8 +549,7 @@
 }
 
 void
-tracker_evolution_storer_init (TrackerConfig *config, 
-			       TrackerIndexer *indexer)
+tracker_push_module_init (TrackerConfig *config)
 {
 	GError *error = NULL;
 	DBusGConnection *connection;
@@ -601,8 +557,7 @@
 	connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
 
 	if (!error) {
-		idx_indexer = g_object_new (TRACKER_TYPE_EVOLUTION_INDEXER, 
-					    "indexer", indexer, NULL);
+		idx_indexer = g_object_new (TRACKER_TYPE_EVOLUTION_INDEXER, NULL);
 
 		dbus_g_object_type_install_info (G_OBJECT_TYPE (idx_indexer), 
 						 &dbus_glib_tracker_evolution_indexer_object_info);
@@ -619,7 +574,7 @@
 }
 
 void
-tracker_evolution_storer_shutdown (void)
+tracker_push_module_shutdown (void)
 {
 	if (idx_indexer)
 		g_object_unref (idx_indexer);

Modified: trunk/src/plugins/evolution/tracker-evolution-indexer.h
==============================================================================
--- trunk/src/plugins/evolution/tracker-evolution-indexer.h	(original)
+++ trunk/src/plugins/evolution/tracker-evolution-indexer.h	Thu Feb 12 15:47:13 2009
@@ -96,10 +96,6 @@
 					     DBusGMethodInvocation *context,
 					     GError *derror);
 
-void  tracker_evolution_storer_init        (TrackerConfig *config, 
-					    TrackerIndexer *indexer);
-void  tracker_evolution_storer_shutdown    (void);
-
 G_END_DECLS
 
 #endif /* __LIBTRACKER_EVOLUTION_H__ */

Modified: trunk/src/plugins/evolution/tracker-evolution-plugin.xml
==============================================================================
--- trunk/src/plugins/evolution/tracker-evolution-plugin.xml	(original)
+++ trunk/src/plugins/evolution/tracker-evolution-plugin.xml	Thu Feb 12 15:47:13 2009
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <node name="/">
-  <interface name="org.gnome.evolution.metadata.Manager">  
+  <interface name="org.freedesktop.email.metadata.Manager">  
     <method name="Register">
       <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
       <arg type="o" name="registrar_path" direction="in" />

Modified: trunk/src/plugins/evolution/tracker-evolution-registrar.c
==============================================================================
--- trunk/src/plugins/evolution/tracker-evolution-registrar.c	(original)
+++ trunk/src/plugins/evolution/tracker-evolution-registrar.c	Thu Feb 12 15:47:13 2009
@@ -23,20 +23,35 @@
 
 #include "config.h"
 
+#include <glib-object.h>
+#include <dbus/dbus-glib-bindings.h>
+
 #include <libtracker-data/tracker-data-update.h>
+#include <libtracker-data/tracker-data-manager.h>
+
+#include <trackerd/tracker-push-registrar.h>
+
 #define __TRACKER_EVOLUTION_REGISTRAR_C__
+
 #include "tracker-evolution-registrar.h"
 #include "tracker-evolution-registrar-glue.h"
 
-const DBusGMethodInfo *registrar_methods = dbus_glib_tracker_evolution_registrar_methods;
-
 #define TRACKER_EVOLUTION_REGISTRAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_EVOLUTION_REGISTRAR, TrackerEvolutionRegistrarPrivate))
 
-G_DEFINE_TYPE (TrackerEvolutionRegistrar, tracker_evolution_registrar, G_TYPE_OBJECT)
+#define TRACKER_TYPE_EVOLUTION_PUSH_REGISTRAR    (tracker_evolution_push_registrar_get_type ())
+#define TRACKER_EVOLUTION_PUSH_REGISTRAR(module) (G_TYPE_CHECK_INSTANCE_CAST ((module), TRACKER_TYPE_EVOLUTION_PUSH_REGISTRAR, TrackerEvolutionPushRegistrar))
+
+typedef struct TrackerEvolutionPushRegistrar TrackerEvolutionPushRegistrar;
+typedef struct TrackerEvolutionPushRegistrarClass TrackerEvolutionPushRegistrarClass;
+
+struct TrackerEvolutionPushRegistrar {
+	TrackerPushRegistrar parent_instance;
+};
+
+struct TrackerEvolutionPushRegistrarClass {
+	TrackerPushRegistrarClass parent_class;
+};
 
-/* This runs in-process of trackerd. It simply proxies everything to the indexer
- * who wont always be running. Which is why this is needed (trackerd is always
- * running, so it's more suitable to respond to Evolution's requests). */
 
 typedef struct {
 	DBusGProxy *idx_proxy;
@@ -48,6 +63,15 @@
 	PROP_CONNECTION
 };
 
+static GType tracker_evolution_push_registrar_get_type (void) G_GNUC_CONST;
+
+G_DEFINE_TYPE (TrackerEvolutionRegistrar, tracker_evolution_registrar, G_TYPE_OBJECT)
+G_DEFINE_TYPE (TrackerEvolutionPushRegistrar, tracker_evolution_push_registrar, TRACKER_TYPE_PUSH_REGISTRAR);
+
+/* This runs in-process of trackerd. It simply proxies everything to the indexer
+ * who wont always be running. Which is why this is needed (trackerd is always
+ * running, so it's more suitable to respond to Evolution's requests). */
+
 static void
 tracker_evolution_registrar_finalize (GObject *object)
 {
@@ -253,3 +277,120 @@
 
 	dbus_g_method_return (context);
 }
+
+
+static void
+on_manager_destroy (DBusGProxy *proxy, gpointer user_data)
+{
+	return;
+}
+
+static void
+tracker_evolution_push_registrar_enable (TrackerPushRegistrar *registrar, 
+					 DBusGConnection      *connection,
+					 DBusGProxy           *dbus_proxy, 
+					 GError              **error)
+{
+	GError *nerror = NULL;
+	guint result;
+	DBusGProxy *manager_proxy;
+	GObject *object;
+
+	tracker_push_registrar_set_object (registrar, NULL);
+	tracker_push_registrar_set_manager (registrar, NULL);
+
+	manager_proxy = dbus_g_proxy_new_for_name (connection,
+						   TRACKER_EVOLUTION_MANAGER_SERVICE,
+						   TRACKER_EVOLUTION_MANAGER_PATH,
+						   TRACKER_EVOLUTION_MANAGER_INTERFACE);
+
+	/* Creation of the registrar */
+	if (!org_freedesktop_DBus_request_name (dbus_proxy, 
+						TRACKER_EVOLUTION_REGISTRAR_SERVICE,
+						DBUS_NAME_FLAG_DO_NOT_QUEUE,
+						&result, &nerror)) {
+
+		g_critical ("Could not setup DBus, %s in use\n", 
+			    TRACKER_EVOLUTION_REGISTRAR_SERVICE);
+
+		if (nerror) {
+			g_propagate_error (error, nerror);
+			return;
+		}
+	}
+
+	if (nerror) {
+		g_propagate_error (error, nerror);
+		return;
+	}
+
+	object = g_object_new (TRACKER_TYPE_EVOLUTION_REGISTRAR, 
+			       "connection", connection, NULL);
+
+	dbus_g_object_type_install_info (G_OBJECT_TYPE (object), 
+					 &dbus_glib_tracker_evolution_registrar_object_info);
+
+	dbus_g_connection_register_g_object (connection, 
+					     TRACKER_EVOLUTION_REGISTRAR_PATH, 
+					     object);
+
+	/* Registration of the registrar to the manager */
+	dbus_g_proxy_call_no_reply (manager_proxy, "Register",
+				    G_TYPE_OBJECT, object, 
+				    G_TYPE_UINT, (guint) tracker_data_manager_get_db_option_int ("EvolutionLastModseq"),
+				    G_TYPE_INVALID,
+				    G_TYPE_INVALID);
+
+	/* If while we had a proxy for the manager the manager shut itself down,
+	 * then we'll get rid of our registrar too, in on_manager_destroy */
+
+	g_signal_connect (manager_proxy, "destroy",
+			  G_CALLBACK (on_manager_destroy), registrar);
+
+	tracker_push_registrar_set_object (registrar, object);
+	tracker_push_registrar_set_manager (registrar, manager_proxy);
+
+	g_object_unref (object); /* sink own */
+	g_object_unref (manager_proxy);  /* sink own */
+}
+
+static void
+tracker_evolution_push_registrar_disable (TrackerPushRegistrar *registrar)
+{
+	tracker_push_registrar_set_object (registrar, NULL);
+	tracker_push_registrar_set_manager (registrar, NULL);
+}
+
+static void
+tracker_evolution_push_registrar_class_init (TrackerEvolutionPushRegistrarClass *klass)
+{
+	TrackerPushRegistrarClass *p_class = TRACKER_PUSH_REGISTRAR_CLASS (klass);
+
+	p_class->enable = tracker_evolution_push_registrar_enable;
+	p_class->disable = tracker_evolution_push_registrar_disable;
+}
+
+static void
+tracker_evolution_push_registrar_init (TrackerEvolutionPushRegistrar *registrar)
+{
+	return;
+}
+
+TrackerPushRegistrar *
+tracker_push_module_init (void)
+{
+	GObject *object;
+
+	object = g_object_new (TRACKER_TYPE_EVOLUTION_PUSH_REGISTRAR, NULL);
+
+	tracker_push_registrar_set_service (TRACKER_PUSH_REGISTRAR (object),
+					    TRACKER_EVOLUTION_MANAGER_SERVICE);
+
+	return TRACKER_PUSH_REGISTRAR (object);
+}
+
+void
+tracker_push_module_shutdown (TrackerPushRegistrar *registrar)
+{
+	tracker_evolution_push_registrar_disable (registrar);
+}

Modified: trunk/src/plugins/evolution/tracker-evolution-registrar.h
==============================================================================
--- trunk/src/plugins/evolution/tracker-evolution-registrar.h	(original)
+++ trunk/src/plugins/evolution/tracker-evolution-registrar.h	Thu Feb 12 15:47:13 2009
@@ -30,6 +30,7 @@
 
 #include <dbus/dbus-glib-bindings.h>
 
+#include <trackerd/tracker-push.h>
 #include "tracker-evolution-common.h"
 
 G_BEGIN_DECLS

Modified: trunk/src/plugins/evolution/tracker-evolution-registrar.xml
==============================================================================
--- trunk/src/plugins/evolution/tracker-evolution-registrar.xml	(original)
+++ trunk/src/plugins/evolution/tracker-evolution-registrar.xml	Thu Feb 12 15:47:13 2009
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <node name="/">
-  <interface name="org.gnome.evolution.metadata.Registrar">
+  <interface name="org.freedesktop.email.metadata.Registrar">
 
   <method name="Set">
       <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>

Added: trunk/src/plugins/kmail/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/src/plugins/kmail/Makefile.am	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,65 @@
+include $(top_srcdir)/Makefile.decl
+
+INCLUDES = -I$(top_srcdir)/src				\
+	-DGETTEXT_PACKAGE="\"$(GETTEXT_PACKAGE)\""	\
+	-DLOCALEDIR="\"$(LOCALEDIR)\""			\
+	-DTRACKER_COMPILATION				\
+	$(DBUS_CFLAGS)					\
+	$(GMIME_CFLAGS)
+
+module_flags = -module -avoid-version -no-undefined
+
+pushd_modulesdir = $(libdir)/tracker/push-modules/daemon
+pushi_modulesdir = $(libdir)/tracker/push-modules/indexer
+
+pushd_modules_LTLIBRARIES = libtracker-module_kmail-daemon-module.la
+pushi_modules_LTLIBRARIES = libtracker-module_kmail-indexer-module.la
+
+libtracker_module_kmail_indexer_module_la_SOURCES =		\
+	tracker-kmail-indexer.c					\
+	tracker-kmail-indexer.h					\
+	tracker-kmail-registrar-glue.h				\
+	tracker-kmail-common.h
+
+libtracker_module_kmail_daemon_module_la_SOURCES =	 	\
+	tracker-kmail-registrar.c				\
+	tracker-kmail-registrar.h				\
+	tracker-kmail-common.h					\
+	tracker-kmail-registrar-glue.h
+
+libtracker_module_kmail_daemon_module_la_LDFLAGS = $(module_flags)
+
+libtracker_module_kmail_daemon_module_la_LIBADD = 			\
+	$(top_builddir)/src/libtracker-data/libtracker-data.la          \
+	$(top_builddir)/src/libtracker-db/libtracker-db.la              \
+	$(top_builddir)/src/libtracker-common/libtracker-common.la      \
+	$(GMODULE_LIBS)							\
+	$(DBUS_LIBS)                                                    \
+	$(GTHREAD_LIBS)                                                 \
+	$(GIO_LIBS)                                                     \
+	$(GLIB2_LIBS)                                                   \
+	$(RAPTOR_LIBS)
+
+libtracker_module_kmail_indexer_module_la_LDFLAGS = $(module_flags)
+
+libtracker_module_kmail_indexer_module_la_LIBADD = 			\
+	$(top_builddir)/src/libtracker-data/libtracker-data.la          \
+	$(top_builddir)/src/libtracker-db/libtracker-db.la              \
+	$(top_builddir)/src/libtracker-common/libtracker-common.la      \
+	$(GMODULE_LIBS)							\
+	$(DBUS_LIBS)                                                    \
+	$(GTHREAD_LIBS)                                                 \
+	$(GIO_LIBS)                                                     \
+	$(GLIB2_LIBS)                                                   \
+	$(RAPTOR_LIBS)							\
+	$(GMIME_LIBS)
+
+dbus_sources = tracker-kmail-registrar-glue.h
+
+%-glue.h: %.xml
+	$(DBUSBINDINGTOOL) --mode=glib-server --output=$@ --prefix=$(subst -,_,$*) $^
+
+BUILT_SOURCES = $(dbus_sources)
+CLEANFILES = $(BUILT_SOURCES)
+EXTRA_DIST = $(BUILT_SOURCES)
+

Added: trunk/src/plugins/kmail/tracker-kmail-common.h
==============================================================================
--- (empty file)
+++ trunk/src/plugins/kmail/tracker-kmail-common.h	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,81 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#ifndef __TRACKER_KMAIL_COMMON_H__
+#define __TRACKER_KMAIL_COMMON_H__
+
+/* Latest spec location: http://live.kde.org/Evolution/Metadata */
+
+#define TRACKER_KMAIL_INDEXER_PATH		"/org/freedesktop/Tracker/Indexer/KMail/Registrar"
+
+#define TRACKER_KMAIL_REGISTRAR_SERVICE		"org.freedesktop.Tracker"
+#define TRACKER_KMAIL_REGISTRAR_PATH		"/org/freedesktop/Tracker/KMail/Registrar"
+#define TRACKER_KMAIL_REGISTRAR_INTERFACE	"org.freedesktop.email.metadata.Registrar"
+
+#define TRACKER_KMAIL_MANAGER_SERVICE		"org.kde.kmail"
+#define TRACKER_KMAIL_MANAGER_PATH		"/org/freedesktop/email/metadata/Manager"
+#define TRACKER_KMAIL_MANAGER_INTERFACE		"org.freedesktop.email.metadata.Manager"
+
+#define DBUS_ERROR_DOMAIN			"TrackerKMail"
+#define DBUS_ERROR				g_quark_from_static_string (DBUS_ERROR_DOMAIN)
+
+#define TRACKER_KMAIL_PREDICATE_SUBJECT		"EMailMeta:MessageSubject"
+#define TRACKER_KMAIL_PREDICATE_SENT		"EMailMeta:MessageSent"
+#define TRACKER_KMAIL_PREDICATE_FROM		"EMailMeta:MessageFrom"
+#define TRACKER_KMAIL_PREDICATE_TO		"EMailMeta:MessageTo"
+#define TRACKER_KMAIL_PREDICATE_CC		"EMailMeta:MessageCc"
+#define TRACKER_KMAIL_PREDICATE_SEEN		"EMailMeta:MessageSeen"
+#define TRACKER_KMAIL_PREDICATE_ANSWERED	"EMailMeta:MessageAnswered"
+#define TRACKER_KMAIL_PREDICATE_FORWARDED	"EMailMeta:MessageForwarded"
+#define TRACKER_KMAIL_PREDICATE_DELETED		"EMailMeta:MessageDeleted"
+#define TRACKER_KMAIL_PREDICATE_SIZE		"EMailMeta:MessageSize"
+
+#define TRACKER_KMAIL_PREDICATE_IDMD5		"KMail:MessageIdMD5"
+#define TRACKER_KMAIL_PREDICATE_UID 		"KMail:MessageUID"
+#define TRACKER_KMAIL_PREDICATE_TAG		"KMail:MessageTag"
+#define TRACKER_KMAIL_PREDICATE_SERNUM		"KMail:MessageSerNum"
+#define TRACKER_KMAIL_PREDICATE_SPAM		"KMail:MessageSpam"
+#define TRACKER_KMAIL_PREDICATE_HAM		"KMail:MessageHam"
+
+
+#define TRACKER_TYPE_G_STRV_ARRAY		(dbus_g_type_get_collection ("GPtrArray", G_TYPE_STRV))
+
+#define dbus_async_return_if_fail(expr,context)				\
+	G_STMT_START {							\
+		if G_LIKELY(expr) { } else {				\
+			GError *error = NULL;				\
+									\
+			g_set_error (&error,				\
+				     DBUS_ERROR,			\
+				     0,					\
+				     "Assertion `%s' failed",		\
+				     #expr);				\
+									\
+			dbus_g_method_return_error (context, error);	\
+			g_error_free (error);				\
+									\
+			return;						\
+		};							\
+	} G_STMT_END
+
+#endif /* __TRACKER_KMAIL_COMMON_H__ */

Added: trunk/src/plugins/kmail/tracker-kmail-indexer.c
==============================================================================
--- (empty file)
+++ trunk/src/plugins/kmail/tracker-kmail-indexer.c	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,358 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <glib.h>
+#include <gio/gio.h>
+#include <glib/gstdio.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <gmime/gmime.h>
+
+#include <libtracker-data/tracker-data-update.h>
+#include <libtracker-data/tracker-data-manager.h>
+
+/* This is okay, we run in-process of the indexer: we can access its symbols */
+#include <tracker-indexer/tracker-module.h>
+#include <tracker-indexer/tracker-push.h>
+#include <tracker-indexer/tracker-module-metadata-private.h>
+
+#include "tracker-kmail-indexer.h"
+
+/* These defines/renames are necessary for -glue.h */
+#define tracker_kmail_registrar_set tracker_kmail_indexer_set
+#define tracker_kmail_registrar_set_many tracker_kmail_indexer_set_many
+#define tracker_kmail_registrar_unset_many tracker_kmail_indexer_unset_many
+#define tracker_kmail_registrar_unset tracker_kmail_indexer_unset
+#define tracker_kmail_registrar_cleanup tracker_kmail_indexer_cleanup
+#define dbus_glib_tracker_kmail_indexer_object_info dbus_glib_tracker_kmail_registrar_object_info
+
+#include "tracker-kmail-registrar-glue.h"
+
+/* Based on data/services/email.metadata */
+
+#define METADATA_EMAIL_RECIPIENT     "Email:Recipient"
+#define METADATA_EMAIL_DATE	     "Email:Date"
+#define METADATA_EMAIL_SENDER	     "Email:Sender"
+#define METADATA_EMAIL_SUBJECT	     "Email:Subject"
+#define METADATA_EMAIL_SENT_TO	     "Email:SentTo"
+#define METADATA_EMAIL_CC	     "Email:CC"
+#define METADATA_EMAIL_TEXT	     "Email:Body"
+#define METADATA_EMAIL_TAG	     "User:Keywords"
+
+G_DEFINE_TYPE (TrackerKMailIndexer, tracker_kmail_indexer, G_TYPE_OBJECT)
+
+/* This runs in-process of tracker-indexer */
+
+static GObject *idx_indexer = NULL;
+
+
+enum {
+	PROP_0,
+};
+
+static void
+tracker_kmail_indexer_finalize (GObject *object)
+{
+	G_OBJECT_CLASS (tracker_kmail_indexer_parent_class)->finalize (object);
+}
+
+static void
+tracker_kmail_indexer_set_property (GObject      *object,
+					guint         prop_id,
+					const GValue *value,
+					GParamSpec   *pspec)
+{
+	switch (prop_id) {
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+tracker_kmail_indexer_get_property (GObject    *object,
+					guint       prop_id,
+					GValue     *value,
+					GParamSpec *pspec)
+{
+	switch (prop_id) {
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+tracker_kmail_indexer_class_init (TrackerKMailIndexerClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	object_class->finalize = tracker_kmail_indexer_finalize;
+	object_class->set_property = tracker_kmail_indexer_set_property;
+	object_class->get_property = tracker_kmail_indexer_get_property;
+}
+
+static void
+tracker_kmail_indexer_init (TrackerKMailIndexer *object)
+{
+}
+
+
+static void
+perform_set (TrackerKMailIndexer *object, 
+	     const gchar *subject, 
+	     const GStrv predicates, 
+	     const GStrv values)
+{
+	guint i = 0;
+	TrackerModuleMetadata *metadata;
+	GHashTable *data;
+
+	metadata = tracker_module_metadata_new ();
+
+	while (predicates [i] != NULL && values[i] != NULL) {
+
+		/* TODO: TRACKER_KMAIL_PREDICATE_IDMD5
+		 *       TRACKER_KMAIL_PREDICATE_UID
+		 *       TRACKER_KMAIL_PREDICATE_SERNUM
+		 *       TRACKER_KMAIL_PREDICATE_SPAM
+		 *       TRACKER_KMAIL_PREDICATE_HAM
+		 *
+		 * I don't have predicates in Tracker's ontology for these. In
+		 * JÃrg's vstore branch we are working with Nepomuk as ontology-
+		 * set. Perhaps when we merge this to that branch that we can 
+		 * improve this situation. */
+
+		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_TAG) == 0) {
+			tracker_module_metadata_add_string (metadata, 
+							    METADATA_EMAIL_TAG, 
+							    values[i]);
+		}
+
+		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_SUBJECT) == 0) {
+			tracker_module_metadata_add_string (metadata, 
+							    METADATA_EMAIL_SUBJECT, 
+							    values[i]);
+		}
+
+		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_SENT) == 0) {
+			tracker_module_metadata_add_string (metadata, 
+							    METADATA_EMAIL_DATE, 
+							    values[i]);
+		}
+
+		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_FROM) == 0) {
+			tracker_module_metadata_add_string (metadata, 
+							    METADATA_EMAIL_SENDER, 
+							    values[i]);
+		}
+
+		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_TO) == 0) {
+			tracker_module_metadata_add_string (metadata, 
+							    METADATA_EMAIL_SENT_TO, 
+							    values[i]);
+		}
+
+		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_CC) == 0) {
+			tracker_module_metadata_add_string (metadata, 
+							    METADATA_EMAIL_CC, 
+							    values[i]);
+		}
+
+		i++;
+	}
+
+	data = tracker_module_metadata_get_hash_table (metadata);
+
+	tracker_data_update_replace_service (subject, "KMailEmails", data);
+
+	g_hash_table_destroy (data);
+	g_object_unref (metadata);
+}
+
+static void 
+perform_unset (TrackerKMailIndexer *object, 
+	       const gchar *subject)
+{
+	tracker_data_update_delete_service_by_path (subject, "KMailEmails"); 
+}
+
+static void
+perform_cleanup (TrackerKMailIndexer *object)
+{
+	tracker_data_update_delete_service_all ("KMailEmails");
+}
+
+static void
+set_stored_last_modseq (guint last_modseq)
+{
+	tracker_data_manager_set_db_option_int ("KMailLastModseq", (gint) last_modseq);
+}
+
+void
+tracker_kmail_indexer_set (TrackerKMailIndexer *object, 
+			   const gchar *subject, 
+			   const GStrv predicates,
+			   const GStrv values,
+			   const guint modseq,
+			   DBusGMethodInvocation *context,
+			   GError *derror)
+{
+	dbus_async_return_if_fail (subject != NULL, context);
+
+	if (predicates && values) {
+
+		dbus_async_return_if_fail (g_strv_length (predicates) == 
+					   g_strv_length (values), context);
+
+		perform_set (object, subject, predicates, values);
+	}
+
+	set_stored_last_modseq (modseq);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_kmail_indexer_set_many (TrackerKMailIndexer *object, 
+				const GStrv subjects, 
+				const GPtrArray *predicates,
+				const GPtrArray *values,
+				const guint modseq,
+				DBusGMethodInvocation *context,
+				GError *derror)
+{
+	guint len;
+	guint i = 0;
+
+	dbus_async_return_if_fail (subjects != NULL, context);
+	dbus_async_return_if_fail (predicates != NULL, context);
+	dbus_async_return_if_fail (values != NULL, context);
+
+	len = g_strv_length (subjects);
+
+	dbus_async_return_if_fail (len == predicates->len, context);
+	dbus_async_return_if_fail (len == values->len, context);
+
+	while (subjects[i] != NULL) {
+		GStrv preds = g_ptr_array_index (predicates, i);
+		GStrv vals = g_ptr_array_index (values, i);
+
+		perform_set (object, subjects[i], preds, vals);
+
+		i++;
+	}
+
+	set_stored_last_modseq (modseq);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_kmail_indexer_unset_many (TrackerKMailIndexer *object, 
+				  const GStrv subjects, 
+				  const guint modseq,
+				  DBusGMethodInvocation *context,
+				  GError *derror)
+{
+	guint i = 0;
+
+	dbus_async_return_if_fail (subjects != NULL, context);
+
+	while (subjects[i] != NULL) {
+
+		perform_unset (object, subjects[i]);
+
+		i++;
+	}
+
+	set_stored_last_modseq (modseq);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_kmail_indexer_unset (TrackerKMailIndexer *object, 
+			     const gchar *subject, 
+			     const guint modseq,
+			     DBusGMethodInvocation *context,
+			     GError *derror)
+{
+	dbus_async_return_if_fail (subject != NULL, context);
+
+	perform_unset (object, subject);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_kmail_indexer_cleanup (TrackerKMailIndexer *object, 
+			       const guint modseq,
+			       DBusGMethodInvocation *context,
+			       GError *derror)
+{
+	perform_cleanup (object);
+
+	set_stored_last_modseq (modseq);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_push_module_init (TrackerConfig *config)
+{
+	GError *error = NULL;
+	DBusGConnection *connection;
+
+	connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+
+	if (!error) {
+		idx_indexer = g_object_new (TRACKER_TYPE_KMAIL_INDEXER, NULL);
+
+		dbus_g_object_type_install_info (G_OBJECT_TYPE (idx_indexer), 
+						 &dbus_glib_tracker_kmail_indexer_object_info);
+
+		dbus_g_connection_register_g_object (connection, 
+						     TRACKER_KMAIL_INDEXER_PATH, 
+						     idx_indexer);
+	}
+
+	if (error) {
+		g_critical ("Can't init DBus for KMail support: %s", error->message);
+		g_error_free (error);
+	}
+}
+
+void
+tracker_push_module_shutdown (void)
+{
+	if (idx_indexer)
+		g_object_unref (idx_indexer);
+}

Added: trunk/src/plugins/kmail/tracker-kmail-indexer.h
==============================================================================
--- (empty file)
+++ trunk/src/plugins/kmail/tracker-kmail-indexer.h	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,101 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#ifndef __LIBTRACKER_KMAIL_H__
+#define __LIBTRACKER_KMAIL_H__
+
+#if !defined (TRACKER_ENABLE_INTERNALS) && !defined (TRACKER_COMPILATION)
+#error "TRACKER_ENABLE_INTERNALS not defined, this must be defined to use tracker's internal functions"
+#endif
+
+#include <glib.h>
+
+#include <libtracker-common/tracker-common.h>
+
+G_BEGIN_DECLS
+
+#if !defined (TRACKER_ENABLE_INTERNALS) && !defined (TRACKER_COMPILATION)
+#error "TRACKER_ENABLE_INTERNALS not defined, this must be defined to use tracker's internal functions"
+#endif
+
+#include <glib.h>
+#include <dbus/dbus-glib-bindings.h>
+
+#include <tracker-indexer/tracker-indexer.h>
+
+#include "tracker-kmail-common.h"
+
+G_BEGIN_DECLS
+
+#define TRACKER_TYPE_KMAIL_INDEXER          (tracker_kmail_indexer_get_type())
+#define TRACKER_KMAIL_INDEXER(o)            (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_KMAIL_INDEXER, TrackerKMailIndexer))
+#define TRACKER_KMAIL_INDEXER_CLASS(c)      (G_TYPE_CHECK_CLASS_CAST ((c), TRACKER_TYPE_KMAIL_INDEXER, TrackerKMailIndexerClass))
+#define TRACKER_KMAIL_INDEXER_GET_CLASS(o)  (G_TYPE_INSTANCE_GET_CLASS ((o), TRACKER_TYPE_KMAIL_INDEXER, TrackerKMailIndexerClass))
+
+G_BEGIN_DECLS
+
+typedef struct TrackerKMailIndexer TrackerKMailIndexer;
+typedef struct TrackerKMailIndexerClass TrackerKMailIndexerClass;
+
+struct TrackerKMailIndexer {
+	GObject parent;
+};
+
+struct TrackerKMailIndexerClass {
+	GObjectClass parent;
+};
+
+GType  tracker_kmail_indexer_get_type   (void);
+
+void  tracker_kmail_indexer_set         (TrackerKMailIndexer *object, 
+					 const gchar *subject, 
+					 const GStrv predicates,
+					 const GStrv values,
+					 const guint modseq,
+					 DBusGMethodInvocation *context,
+					 GError *derror);
+void  tracker_kmail_indexer_set_many    (TrackerKMailIndexer *object, 
+					 const GStrv subjects, 
+					 const GPtrArray *predicates,
+					 const GPtrArray *values,
+					 const guint modseq,
+					 DBusGMethodInvocation *context,
+					 GError *derror);
+void  tracker_kmail_indexer_unset_many  (TrackerKMailIndexer *object, 
+					 const GStrv subjects, 
+					 const guint modseq,
+					 DBusGMethodInvocation *context,
+					 GError *derror);
+void  tracker_kmail_indexer_unset       (TrackerKMailIndexer *object, 
+					 const gchar *subject, 
+					 const guint modseq,
+					 DBusGMethodInvocation *context,
+					 GError *derror);
+void  tracker_kmail_indexer_cleanup     (TrackerKMailIndexer *object, 
+					 const guint modseq,
+					 DBusGMethodInvocation *context,
+					 GError *derror);
+
+G_END_DECLS
+
+#endif /* __LIBTRACKER_KMAIL_H__ */

Added: trunk/src/plugins/kmail/tracker-kmail-registrar.c
==============================================================================
--- (empty file)
+++ trunk/src/plugins/kmail/tracker-kmail-registrar.c	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,396 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#include "config.h"
+
+#include <glib-object.h>
+#include <dbus/dbus-glib-bindings.h>
+
+#include <libtracker-data/tracker-data-update.h>
+#include <libtracker-data/tracker-data-manager.h>
+
+#include <trackerd/tracker-push-registrar.h>
+
+#define __TRACKER_KMAIL_REGISTRAR_C__
+
+#include "tracker-kmail-registrar.h"
+#include "tracker-kmail-registrar-glue.h"
+
+#define TRACKER_KMAIL_REGISTRAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_KMAIL_REGISTRAR, TrackerKMailRegistrarPrivate))
+
+#define TRACKER_TYPE_KMAIL_PUSH_REGISTRAR    (tracker_kmail_push_registrar_get_type ())
+#define TRACKER_KMAIL_PUSH_REGISTRAR(module) (G_TYPE_CHECK_INSTANCE_CAST ((module), TRACKER_TYPE_KMAIL_PUSH_REGISTRAR, TrackerKMailPushRegistrar))
+
+typedef struct TrackerKMailPushRegistrar TrackerKMailPushRegistrar;
+typedef struct TrackerKMailPushRegistrarClass TrackerKMailPushRegistrarClass;
+
+struct TrackerKMailPushRegistrar {
+	TrackerPushRegistrar parent_instance;
+};
+
+struct TrackerKMailPushRegistrarClass {
+	TrackerPushRegistrarClass parent_class;
+};
+
+
+typedef struct {
+	DBusGProxy *idx_proxy;
+	DBusGConnection *connection;
+} TrackerKMailRegistrarPrivate;
+
+enum {
+	PROP_0,
+	PROP_CONNECTION
+};
+
+static GType tracker_kmail_push_registrar_get_type (void) G_GNUC_CONST;
+
+G_DEFINE_TYPE (TrackerKMailRegistrar, tracker_kmail_registrar, G_TYPE_OBJECT)
+G_DEFINE_TYPE (TrackerKMailPushRegistrar, tracker_kmail_push_registrar, TRACKER_TYPE_PUSH_REGISTRAR);
+
+/* This runs in-process of trackerd. It simply proxies everything to the indexer
+ * who wont always be running. Which is why this is needed (trackerd is always
+ * running, so it's more suitable to respond to KMail's requests). */
+
+static void
+tracker_kmail_registrar_finalize (GObject *object)
+{
+	TrackerKMailRegistrarPrivate *priv = TRACKER_KMAIL_REGISTRAR_GET_PRIVATE (object);
+
+	if (priv->idx_proxy)
+		g_object_unref (priv->idx_proxy);
+
+	G_OBJECT_CLASS (tracker_kmail_registrar_parent_class)->finalize (object);
+}
+
+static void 
+tracker_kmail_registrar_set_connection (TrackerKMailRegistrar *object, 
+					DBusGConnection *connection)
+{
+	TrackerKMailRegistrarPrivate *priv = TRACKER_KMAIL_REGISTRAR_GET_PRIVATE (object);
+
+	priv->connection = connection; /* weak */
+
+	priv->idx_proxy = dbus_g_proxy_new_for_name (priv->connection, 
+						     "org.freedesktop.Tracker.Indexer",
+						     TRACKER_KMAIL_INDEXER_PATH,
+						     TRACKER_KMAIL_REGISTRAR_INTERFACE);
+}
+
+static void
+tracker_kmail_registrar_set_property (GObject      *object,
+				      guint         prop_id,
+				      const GValue *value,
+				      GParamSpec   *pspec)
+{
+	switch (prop_id) {
+	case PROP_CONNECTION:
+		tracker_kmail_registrar_set_connection (TRACKER_KMAIL_REGISTRAR (object),
+							    g_value_get_pointer (value));
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+	}
+}
+
+static void
+tracker_kmail_registrar_get_property (GObject    *object,
+					  guint       prop_id,
+					  GValue     *value,
+					  GParamSpec *pspec)
+{
+	TrackerKMailRegistrarPrivate *priv = TRACKER_KMAIL_REGISTRAR_GET_PRIVATE (object);
+
+	switch (prop_id) {
+	case PROP_CONNECTION:
+		g_value_set_pointer (value, priv->connection);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+	}
+}
+
+static void
+tracker_kmail_registrar_class_init (TrackerKMailRegistrarClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	object_class->finalize = tracker_kmail_registrar_finalize;
+	object_class->set_property = tracker_kmail_registrar_set_property;
+	object_class->get_property = tracker_kmail_registrar_get_property;
+
+	g_object_class_install_property (object_class,
+					 PROP_CONNECTION,
+					 g_param_spec_pointer ("connection",
+							       "DBus connection",
+							       "DBus connection",
+							       G_PARAM_READWRITE |
+							       G_PARAM_CONSTRUCT));
+
+	g_type_class_add_private (object_class, sizeof (TrackerKMailRegistrarPrivate));
+}
+
+static void
+tracker_kmail_registrar_init (TrackerKMailRegistrar *object)
+{
+}
+
+void
+tracker_kmail_registrar_set (TrackerKMailRegistrar *object, 
+				 const gchar *subject, 
+				 const GStrv predicates,
+				 const GStrv values,
+				 const guint modseq,
+				 DBusGMethodInvocation *context,
+				 GError *derror)
+{
+	TrackerKMailRegistrarPrivate *priv = TRACKER_KMAIL_REGISTRAR_GET_PRIVATE (object);
+
+	dbus_async_return_if_fail (subject != NULL, context);
+
+	if (predicates && values) {
+
+		dbus_async_return_if_fail (g_strv_length (predicates) == 
+					   g_strv_length (values), context);
+
+		dbus_g_proxy_call_no_reply (priv->idx_proxy,
+					    "Set",
+					    G_TYPE_STRING, subject,
+					    G_TYPE_STRV, predicates,
+					    G_TYPE_STRV, values,
+					    G_TYPE_UINT, modseq,
+					    G_TYPE_INVALID, 
+					    G_TYPE_INVALID);
+	}
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_kmail_registrar_set_many (TrackerKMailRegistrar *object, 
+				      const GStrv subjects, 
+				      const GPtrArray *predicates,
+				      const GPtrArray *values,
+				      const guint modseq,
+				      DBusGMethodInvocation *context,
+				      GError *derror)
+{
+	TrackerKMailRegistrarPrivate *priv = TRACKER_KMAIL_REGISTRAR_GET_PRIVATE (object);
+	guint len;
+
+	dbus_async_return_if_fail (subjects != NULL, context);
+	dbus_async_return_if_fail (predicates != NULL, context);
+	dbus_async_return_if_fail (values != NULL, context);
+
+	len = g_strv_length (subjects);
+
+	dbus_async_return_if_fail (len == predicates->len, context);
+	dbus_async_return_if_fail (len == values->len, context);
+
+	dbus_g_proxy_call_no_reply (priv->idx_proxy,
+				    "SetMany",
+				    G_TYPE_STRV, subjects,
+				    TRACKER_TYPE_G_STRV_ARRAY, predicates,
+				    TRACKER_TYPE_G_STRV_ARRAY, values,
+				    G_TYPE_UINT, modseq,
+				    G_TYPE_INVALID, 
+				    G_TYPE_INVALID);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_kmail_registrar_unset_many (TrackerKMailRegistrar *object, 
+				    const GStrv subjects, 
+				    const guint modseq,
+				    DBusGMethodInvocation *context,
+				    GError *derror)
+{
+	TrackerKMailRegistrarPrivate *priv = TRACKER_KMAIL_REGISTRAR_GET_PRIVATE (object);
+
+	dbus_async_return_if_fail (subjects != NULL, context);
+
+	dbus_g_proxy_call_no_reply (priv->idx_proxy,
+				    "UnsetMany",
+				    G_TYPE_STRV, subjects,
+				    G_TYPE_UINT, modseq,
+				    G_TYPE_INVALID, 
+				    G_TYPE_INVALID);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_kmail_registrar_unset (TrackerKMailRegistrar *object, 
+			       const gchar *subject, 
+			       const guint modseq,
+			       DBusGMethodInvocation *context,
+			       GError *derror)
+{
+	TrackerKMailRegistrarPrivate *priv = TRACKER_KMAIL_REGISTRAR_GET_PRIVATE (object);
+
+	dbus_async_return_if_fail (subject != NULL, context);
+
+	dbus_g_proxy_call_no_reply (priv->idx_proxy,
+				    "Unset",
+				    G_TYPE_STRING, subject,
+				    G_TYPE_UINT, modseq,
+				    G_TYPE_INVALID, 
+				    G_TYPE_INVALID);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_kmail_registrar_cleanup (TrackerKMailRegistrar *object, 
+				 const guint modseq,
+				 DBusGMethodInvocation *context,
+				 GError *derror)
+{
+	TrackerKMailRegistrarPrivate *priv = TRACKER_KMAIL_REGISTRAR_GET_PRIVATE (object);
+
+	dbus_g_proxy_call_no_reply (priv->idx_proxy,
+				    "Cleanup",
+				    G_TYPE_UINT, modseq,
+				    G_TYPE_INVALID, 
+				    G_TYPE_INVALID);
+
+	dbus_g_method_return (context);
+}
+
+
+static void
+on_manager_destroy (DBusGProxy *proxy, gpointer user_data)
+{
+	return;
+}
+
+static void
+tracker_kmail_push_registrar_enable (TrackerPushRegistrar *registrar, 
+				     DBusGConnection      *connection,
+				     DBusGProxy           *dbus_proxy, 
+				     GError              **error)
+{
+	GError *nerror = NULL;
+	guint result;
+	DBusGProxy *manager_proxy;
+	GObject *object;
+
+	tracker_push_registrar_set_object (registrar, NULL);
+	tracker_push_registrar_set_manager (registrar, NULL);
+
+	manager_proxy = dbus_g_proxy_new_for_name (connection,
+						   TRACKER_KMAIL_MANAGER_SERVICE,
+						   TRACKER_KMAIL_MANAGER_PATH,
+						   TRACKER_KMAIL_MANAGER_INTERFACE);
+
+	/* Creation of the registrar */
+	if (!org_freedesktop_DBus_request_name (dbus_proxy, 
+						TRACKER_KMAIL_REGISTRAR_SERVICE,
+						DBUS_NAME_FLAG_DO_NOT_QUEUE,
+						&result, &nerror)) {
+
+		g_critical ("Could not setup DBus, %s in use\n", 
+			    TRACKER_KMAIL_REGISTRAR_SERVICE);
+
+		if (nerror) {
+			g_propagate_error (error, nerror);
+			return;
+		}
+	}
+
+	if (nerror) {
+		g_propagate_error (error, nerror);
+		return;
+	}
+
+	object = g_object_new (TRACKER_TYPE_KMAIL_REGISTRAR, 
+			       "connection", connection, NULL);
+
+	dbus_g_object_type_install_info (G_OBJECT_TYPE (object), 
+					 &dbus_glib_tracker_kmail_registrar_object_info);
+
+	dbus_g_connection_register_g_object (connection, 
+					     TRACKER_KMAIL_REGISTRAR_PATH, 
+					     object);
+
+	/* Registration of the registrar to the manager */
+	dbus_g_proxy_call_no_reply (manager_proxy, "Register",
+				    G_TYPE_OBJECT, object, 
+				    G_TYPE_UINT, (guint) tracker_data_manager_get_db_option_int ("KMailLastModseq"),
+				    G_TYPE_INVALID,
+				    G_TYPE_INVALID);
+
+	/* If while we had a proxy for the manager the manager shut itself down,
+	 * then we'll get rid of our registrar too, in on_manager_destroy */
+
+	g_signal_connect (manager_proxy, "destroy",
+			  G_CALLBACK (on_manager_destroy), registrar);
+
+	tracker_push_registrar_set_object (registrar, object);
+	tracker_push_registrar_set_manager (registrar, manager_proxy);
+
+	g_object_unref (object); /* sink own */
+	g_object_unref (manager_proxy);  /* sink own */
+}
+
+static void
+tracker_kmail_push_registrar_disable (TrackerPushRegistrar *registrar)
+{
+	tracker_push_registrar_set_object (registrar, NULL);
+	tracker_push_registrar_set_manager (registrar, NULL);
+}
+
+static void
+tracker_kmail_push_registrar_class_init (TrackerKMailPushRegistrarClass *klass)
+{
+	TrackerPushRegistrarClass *p_class = TRACKER_PUSH_REGISTRAR_CLASS (klass);
+
+	p_class->enable = tracker_kmail_push_registrar_enable;
+	p_class->disable = tracker_kmail_push_registrar_disable;
+}
+
+static void
+tracker_kmail_push_registrar_init (TrackerKMailPushRegistrar *registrar)
+{
+	return;
+}
+
+TrackerPushRegistrar *
+tracker_push_module_init (void)
+{
+	GObject *object;
+
+	object = g_object_new (TRACKER_TYPE_KMAIL_PUSH_REGISTRAR, NULL);
+
+	tracker_push_registrar_set_service (TRACKER_PUSH_REGISTRAR (object),
+					    TRACKER_KMAIL_MANAGER_SERVICE);
+
+	return TRACKER_PUSH_REGISTRAR (object);
+}
+
+void
+tracker_push_module_shutdown (TrackerPushRegistrar *registrar)
+{
+	tracker_kmail_push_registrar_disable (registrar);
+}

Added: trunk/src/plugins/kmail/tracker-kmail-registrar.h
==============================================================================
--- (empty file)
+++ trunk/src/plugins/kmail/tracker-kmail-registrar.h	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,94 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#ifndef __LIBTRACKER_KMAIL_REGISTRAR_H__
+#define __LIBTRACKER_KMAIL_REGISTRAR_H__
+
+#if !defined (TRACKER_ENABLE_INTERNALS) && !defined (TRACKER_COMPILATION)
+#error "TRACKER_ENABLE_INTERNALS not defined, this must be defined to use tracker's internal functions"
+#endif
+
+#include <dbus/dbus-glib-bindings.h>
+
+#include <trackerd/tracker-push.h>
+#include "tracker-kmail-common.h"
+
+G_BEGIN_DECLS
+
+#define TRACKER_TYPE_KMAIL_REGISTRAR          (tracker_kmail_registrar_get_type())
+#define TRACKER_KMAIL_REGISTRAR(o)            (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_KMAIL_REGISTRAR, TrackerKMailRegistrar))
+#define TRACKER_KMAIL_REGISTRAR_CLASS(c)      (G_TYPE_CHECK_CLASS_CAST ((c), TRACKER_TYPE_KMAIL_REGISTRAR, TrackerKMailRegistrarClass))
+#define TRACKER_KMAIL_REGISTRAR_GET_CLASS(o)  (G_TYPE_INSTANCE_GET_CLASS ((o), TRACKER_TYPE_KMAIL_REGISTRAR, TrackerKMailRegistrarClass))
+
+G_BEGIN_DECLS
+
+#ifndef __TRACKER_KMAIL_REGISTRAR_C__
+extern const DBusGMethodInfo *registrar_methods;
+#endif
+
+typedef struct TrackerKMailRegistrar TrackerKMailRegistrar;
+typedef struct TrackerKMailRegistrarClass TrackerKMailRegistrarClass;
+
+struct TrackerKMailRegistrar {
+	GObject parent;
+};
+
+struct TrackerKMailRegistrarClass {
+	GObjectClass parent;
+};
+
+GType  tracker_kmail_registrar_get_type   (void);
+
+void  tracker_kmail_registrar_set         (TrackerKMailRegistrar *object, 
+					   const gchar *subject, 
+					   const GStrv predicates,
+					   const GStrv values,
+					   const guint modseq,
+					   DBusGMethodInvocation *context,
+					   GError *derror);
+void  tracker_kmail_registrar_set_many    (TrackerKMailRegistrar *object, 
+					   const GStrv subjects, 
+					   const GPtrArray *predicates,
+					   const GPtrArray *values,
+					   const guint modseq,
+					   DBusGMethodInvocation *context,
+					   GError *derror);
+void  tracker_kmail_registrar_unset_many  (TrackerKMailRegistrar *object, 
+					   const GStrv subjects, 
+					   const guint modseq,
+					   DBusGMethodInvocation *context,
+					   GError *derror);
+void  tracker_kmail_registrar_unset       (TrackerKMailRegistrar *object, 
+					   const gchar *subject, 
+					   const guint modseq,
+					   DBusGMethodInvocation *context,
+					   GError *derror);
+void  tracker_kmail_registrar_cleanup     (TrackerKMailRegistrar *object, 
+					   const guint modseq,
+					   DBusGMethodInvocation *context,
+					   GError *derror);
+
+
+G_END_DECLS
+
+#endif /* __LIBTRACKER_KMAIL_REGISTRAR_H__ */

Added: trunk/src/plugins/kmail/tracker-kmail-registrar.xml
==============================================================================
--- (empty file)
+++ trunk/src/plugins/kmail/tracker-kmail-registrar.xml	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<node name="/">
+  <interface name="org.freedesktop.email.metadata.Registrar">
+
+  <method name="Set">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="s" name="subject" direction="in" />
+      <arg type="as" name="predicates" direction="in" />
+      <arg type="as" name="values" direction="in" />
+      <arg type="u" name="modseq" direction="in" />
+    </method>
+
+    <method name="SetMany">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="as" name="subjects" direction="in" />
+      <arg type="aas" name="predicates" direction="in" />
+      <arg type="aas" name="values" direction="in" />
+      <arg type="u" name="modseq" direction="in" />
+    </method>
+
+    <method name="Unset">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="s" name="subject" direction="in" />
+      <arg type="u" name="modseq" direction="in" />
+    </method>
+
+    <method name="UnsetMany">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="as" name="subjects" direction="in" />
+      <arg type="u" name="modseq" direction="in" />
+    </method>
+
+    <method name="Cleanup">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="u" name="modseq" direction="in" />
+    </method>
+
+  </interface>
+</node>

Added: trunk/src/plugins/rss/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/src/plugins/rss/Makefile.am	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,65 @@
+include $(top_srcdir)/Makefile.decl
+
+INCLUDES = -I$(top_srcdir)/src				\
+	-DGETTEXT_PACKAGE="\"$(GETTEXT_PACKAGE)\""	\
+	-DLOCALEDIR="\"$(LOCALEDIR)\""			\
+	-DTRACKER_COMPILATION				\
+	$(DBUS_CFLAGS)					\
+	$(GMIME_CFLAGS)
+
+module_flags = -module -avoid-version -no-undefined
+
+pushd_modulesdir = $(libdir)/tracker/push-modules/daemon
+pushi_modulesdir = $(libdir)/tracker/push-modules/indexer
+
+pushd_modules_LTLIBRARIES = libtracker-module-rss-daemon-module.la
+pushi_modules_LTLIBRARIES = libtracker-module-rss-indexer-module.la
+
+libtracker_module_rss_indexer_module_la_SOURCES =		\
+	tracker-rss-indexer.c					\
+	tracker-rss-indexer.h					\
+	tracker-rss-registrar-glue.h				\
+	tracker-rss-common.h
+
+libtracker_module_rss_daemon_module_la_SOURCES =	\
+	tracker-rss-registrar.c				\
+	tracker-rss-registrar.h				\
+	tracker-rss-common.h				\
+	tracker-rss-registrar-glue.h
+
+libtracker_module_rss_daemon_module_la_LDFLAGS = $(module_flags)
+
+libtracker_module_rss_daemon_module_la_LIBADD = 			\
+	$(top_builddir)/src/libtracker-data/libtracker-data.la          \
+	$(top_builddir)/src/libtracker-db/libtracker-db.la              \
+	$(top_builddir)/src/libtracker-common/libtracker-common.la      \
+	$(GMODULE_LIBS)							\
+	$(DBUS_LIBS)                                                    \
+	$(GTHREAD_LIBS)                                                 \
+	$(GIO_LIBS)                                                     \
+	$(GLIB2_LIBS)                                                   \
+	$(RAPTOR_LIBS)
+
+libtracker_module_rss_indexer_module_la_LDFLAGS = $(module_flags)
+
+libtracker_module_rss_indexer_module_la_LIBADD = 			\
+	$(top_builddir)/src/libtracker-data/libtracker-data.la          \
+	$(top_builddir)/src/libtracker-db/libtracker-db.la              \
+	$(top_builddir)/src/libtracker-common/libtracker-common.la      \
+	$(GMODULE_LIBS)							\
+	$(DBUS_LIBS)                                                    \
+	$(GTHREAD_LIBS)                                                 \
+	$(GIO_LIBS)                                                     \
+	$(GLIB2_LIBS)                                                   \
+	$(RAPTOR_LIBS)							\
+	$(GMIME_LIBS)
+
+dbus_sources = tracker-rss-registrar-glue.h
+
+%-glue.h: %.xml
+	$(DBUSBINDINGTOOL) --mode=glib-server --output=$@ --prefix=$(subst -,_,$*) $^
+
+BUILT_SOURCES = $(dbus_sources)
+CLEANFILES = $(BUILT_SOURCES)
+EXTRA_DIST = $(BUILT_SOURCES)
+

Added: trunk/src/plugins/rss/tracker-rss-common.h
==============================================================================
--- (empty file)
+++ trunk/src/plugins/rss/tracker-rss-common.h	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,64 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#ifndef __TRACKER_RSS_COMMON_H__
+#define __TRACKER_RSS_COMMON_H__
+
+/* Latest spec location: http://live.gnome.org/Rss/Metadata */
+
+#define TRACKER_RSS_INDEXER_PATH		"/org/freedesktop/Tracker/Indexer/Rss/Registrar"
+
+#define TRACKER_RSS_REGISTRAR_SERVICE		"org.freedesktop.Tracker"
+#define TRACKER_RSS_REGISTRAR_PATH		"/org/freedesktop/Tracker/Rss/Registrar"
+#define TRACKER_RSS_REGISTRAR_INTERFACE		"my.rss.metadata.Registrar"
+
+#define TRACKER_RSS_MANAGER_SERVICE		"my.rss.service"
+#define TRACKER_RSS_MANAGER_PATH		"/my/rss/metadata/Manager"
+#define TRACKER_RSS_MANAGER_INTERFACE		"my.rss.metadata.Manager"
+
+#define DBUS_ERROR_DOMAIN			"TrackerRss"
+#define DBUS_ERROR				g_quark_from_static_string (DBUS_ERROR_DOMAIN)
+
+#define TRACKER_RSS_PREDICATE_THING		"RssMeta:Thing"
+
+#define TRACKER_TYPE_G_STRV_ARRAY		(dbus_g_type_get_collection ("GPtrArray", G_TYPE_STRV))
+
+#define dbus_async_return_if_fail(expr,context)				\
+	G_STMT_START {							\
+		if G_LIKELY(expr) { } else {				\
+			GError *error = NULL;				\
+									\
+			g_set_error (&error,				\
+				     DBUS_ERROR,			\
+				     0,					\
+				     "Assertion `%s' failed",		\
+				     #expr);				\
+									\
+			dbus_g_method_return_error (context, error);	\
+			g_error_free (error);				\
+									\
+			return;						\
+		};							\
+	} G_STMT_END
+
+#endif /* __TRACKER_RSS_COMMON_H__ */

Added: trunk/src/plugins/rss/tracker-rss-indexer.c
==============================================================================
--- (empty file)
+++ trunk/src/plugins/rss/tracker-rss-indexer.c	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,310 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <glib.h>
+#include <gio/gio.h>
+#include <glib/gstdio.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <gmime/gmime.h>
+
+#include <libtracker-data/tracker-data-update.h>
+#include <libtracker-data/tracker-data-manager.h>
+
+/* This is okay, we run in-process of the indexer: we can access its symbols */
+#include <tracker-indexer/tracker-module.h>
+#include <tracker-indexer/tracker-push.h>
+#include <tracker-indexer/tracker-module-metadata-private.h>
+
+#include "tracker-rss-indexer.h"
+
+/* These defines/renames are necessary for -glue.h */
+#define tracker_rss_registrar_set tracker_rss_indexer_set
+#define tracker_rss_registrar_set_many tracker_rss_indexer_set_many
+#define tracker_rss_registrar_unset_many tracker_rss_indexer_unset_many
+#define tracker_rss_registrar_unset tracker_rss_indexer_unset
+#define tracker_rss_registrar_cleanup tracker_rss_indexer_cleanup
+#define dbus_glib_tracker_rss_indexer_object_info dbus_glib_tracker_rss_registrar_object_info
+
+#include "tracker-rss-registrar-glue.h"
+
+/* Based on data/services/email.metadata */
+
+G_DEFINE_TYPE (TrackerRssIndexer, tracker_rss_indexer, G_TYPE_OBJECT)
+
+/* This runs in-process of tracker-indexer */
+
+static GObject *idx_indexer = NULL;
+
+enum {
+	PROP_0,
+};
+
+static void
+tracker_rss_indexer_finalize (GObject *object)
+{
+	G_OBJECT_CLASS (tracker_rss_indexer_parent_class)->finalize (object);
+}
+
+static void
+tracker_rss_indexer_set_property (GObject      *object,
+				  guint         prop_id,
+				  const GValue *value,
+				  GParamSpec   *pspec)
+{
+	switch (prop_id) {
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+tracker_rss_indexer_get_property (GObject    *object,
+				  guint       prop_id,
+				  GValue     *value,
+				  GParamSpec *pspec)
+{
+	switch (prop_id) {
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+tracker_rss_indexer_class_init (TrackerRssIndexerClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	object_class->finalize = tracker_rss_indexer_finalize;
+	object_class->set_property = tracker_rss_indexer_set_property;
+	object_class->get_property = tracker_rss_indexer_get_property;
+}
+
+static void
+tracker_rss_indexer_init (TrackerRssIndexer *object)
+{
+}
+
+
+static void
+perform_set (TrackerRssIndexer *object, 
+	     const gchar *subject, 
+	     const GStrv predicates, 
+	     const GStrv values)
+{
+	guint i = 0;
+	TrackerModuleMetadata *metadata;
+	GHashTable *data;
+
+	metadata = tracker_module_metadata_new ();
+
+	while (predicates [i] != NULL && values[i] != NULL) {
+
+		if (g_strcmp0 (predicates[i], TRACKER_RSS_PREDICATE_THING) == 0) {
+			tracker_module_metadata_add_string (metadata, 
+							    "Rss:Something", 
+							    values[i]);
+		}
+
+		i++;
+	}
+
+	data = tracker_module_metadata_get_hash_table (metadata);
+
+	// TODO: the service for RSS
+	tracker_data_update_replace_service (subject, "Rss", data);
+
+	g_hash_table_destroy (data);
+	g_object_unref (metadata);
+}
+
+static void 
+perform_unset (TrackerRssIndexer *object, 
+	       const gchar *subject)
+{
+	// TODO: the service for RSS
+	tracker_data_update_delete_service_by_path (subject, "Rss"); 
+}
+
+static void
+perform_cleanup (TrackerRssIndexer *object)
+{
+	// TODO: the service for RSS
+	tracker_data_update_delete_service_all ("Rss");
+}
+
+static void
+set_stored_last_modseq (guint last_modseq)
+{
+	tracker_data_manager_set_db_option_int ("RssLastModseq", (gint) last_modseq);
+}
+
+void
+tracker_rss_indexer_set (TrackerRssIndexer *object, 
+			 const gchar *subject, 
+			 const GStrv predicates,
+			 const GStrv values,
+			 const guint modseq,
+			 DBusGMethodInvocation *context,
+			 GError *derror)
+{
+	dbus_async_return_if_fail (subject != NULL, context);
+
+	if (predicates && values) {
+
+		dbus_async_return_if_fail (g_strv_length (predicates) == 
+					   g_strv_length (values), context);
+
+		perform_set (object, subject, predicates, values);
+	}
+
+	set_stored_last_modseq (modseq);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_erssindexer_set_many (TrackerRssIndexer *object, 
+			      const GStrv subjects, 
+			      const GPtrArray *predicates,
+			      const GPtrArray *values,
+			      const guint modseq,
+			      DBusGMethodInvocation *context,
+			      GError *derror)
+{
+	guint len;
+	guint i = 0;
+
+	dbus_async_return_if_fail (subjects != NULL, context);
+	dbus_async_return_if_fail (predicates != NULL, context);
+	dbus_async_return_if_fail (values != NULL, context);
+
+	len = g_strv_length (subjects);
+
+	dbus_async_return_if_fail (len == predicates->len, context);
+	dbus_async_return_if_fail (len == values->len, context);
+
+	while (subjects[i] != NULL) {
+		GStrv preds = g_ptr_array_index (predicates, i);
+		GStrv vals = g_ptr_array_index (values, i);
+
+		perform_set (object, subjects[i], preds, vals);
+
+		i++;
+	}
+
+	set_stored_last_modseq (modseq);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_rss_indexer_unset_many (TrackerRssIndexer *object, 
+				const GStrv subjects, 
+				const guint modseq,
+				DBusGMethodInvocation *context,
+				GError *derror)
+{
+	guint i = 0;
+
+	dbus_async_return_if_fail (subjects != NULL, context);
+
+	while (subjects[i] != NULL) {
+
+		perform_unset (object, subjects[i]);
+
+		i++;
+	}
+
+	set_stored_last_modseq (modseq);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_rss_indexer_unset (TrackerRssIndexer *object, 
+			   const gchar *subject, 
+			   const guint modseq,
+			   DBusGMethodInvocation *context,
+			   GError *derror)
+{
+	dbus_async_return_if_fail (subject != NULL, context);
+
+	perform_unset (object, subject);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_rss_indexer_cleanup (TrackerRssIndexer *object, 
+			     const guint modseq,
+			     DBusGMethodInvocation *context,
+			     GError *derror)
+{
+	perform_cleanup (object);
+
+	set_stored_last_modseq (modseq);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_push_module_init (TrackerConfig *config)
+{
+	GError *error = NULL;
+	DBusGConnection *connection;
+
+	connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+
+	if (!error) {
+		idx_indexer = g_object_new (TRACKER_TYPE_RSS_INDEXER, NULL);
+
+		dbus_g_object_type_install_info (G_OBJECT_TYPE (idx_indexer), 
+						 &dbus_glib_tracker_rss_indexer_object_info);
+
+		dbus_g_connection_register_g_object (connection, 
+						     TRACKER_RSS_INDEXER_PATH, 
+						     idx_indexer);
+	}
+
+	if (error) {
+		g_critical ("Can't init DBus for Rss support: %s", error->message);
+		g_error_free (error);
+	}
+}
+
+void
+tracker_push_module_shutdown (void)
+{
+	if (idx_indexer)
+		g_object_unref (idx_indexer);
+}

Added: trunk/src/plugins/rss/tracker-rss-indexer.h
==============================================================================
--- (empty file)
+++ trunk/src/plugins/rss/tracker-rss-indexer.h	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,101 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#ifndef __LIBTRACKER_RSS_H__
+#define __LIBTRACKER_RSS_H__
+
+#if !defined (TRACKER_ENABLE_INTERNALS) && !defined (TRACKER_COMPILATION)
+#error "TRACKER_ENABLE_INTERNALS not defined, this must be defined to use tracker's internal functions"
+#endif
+
+#include <glib.h>
+
+#include <libtracker-common/tracker-common.h>
+
+G_BEGIN_DECLS
+
+#if !defined (TRACKER_ENABLE_INTERNALS) && !defined (TRACKER_COMPILATION)
+#error "TRACKER_ENABLE_INTERNALS not defined, this must be defined to use tracker's internal functions"
+#endif
+
+#include <glib.h>
+#include <dbus/dbus-glib-bindings.h>
+
+#include <tracker-indexer/tracker-indexer.h>
+
+#include "tracker-rss-common.h"
+
+G_BEGIN_DECLS
+
+#define TRACKER_TYPE_RSS_INDEXER          (tracker_rss_indexer_get_type())
+#define TRACKER_RSS_INDEXER(o)            (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_RSS_INDEXER, TrackerRssIndexer))
+#define TRACKER_RSS_INDEXER_CLASS(c)      (G_TYPE_CHECK_CLASS_CAST ((c), TRACKER_TYPE_RSS_INDEXER, TrackerRssIndexerClass))
+#define TRACKER_RSS_INDEXER_GET_CLASS(o)  (G_TYPE_INSTANCE_GET_CLASS ((o), TRACKER_TYPE_RSS_INDEXER, TrackerRssIndexerClass))
+
+G_BEGIN_DECLS
+
+typedef struct TrackerRssIndexer TrackerRssIndexer;
+typedef struct TrackerRssIndexerClass TrackerRssIndexerClass;
+
+struct TrackerRssIndexer {
+	GObject parent;
+};
+
+struct TrackerRssIndexerClass {
+	GObjectClass parent;
+};
+
+GType  tracker_rss_indexer_get_type   (void);
+
+void  tracker_rss_indexer_set         (TrackerRssIndexer *object, 
+				       const gchar *subject, 
+				       const GStrv predicates,
+				       const GStrv values,
+				       const guint modseq,
+				       DBusGMethodInvocation *context,
+				       GError *derror);
+void  tracker_rss_indexer_set_many    (TrackerRssIndexer *object, 
+				       const GStrv subjects, 
+				       const GPtrArray *predicates,
+				       const GPtrArray *values,
+				       const guint modseq,
+				       DBusGMethodInvocation *context,
+				       GError *derror);
+void  tracker_rss_indexer_unset_many  (TrackerRssIndexer *object, 
+				       const GStrv subjects, 
+				       const guint modseq,
+				       DBusGMethodInvocation *context,
+				       GError *derror);
+void  tracker_rss_indexer_unset       (TrackerRssIndexer *object, 
+				       const gchar *subject, 
+				       const guint modseq,
+				       DBusGMethodInvocation *context,
+				       GError *derror);
+void  tracker_rss_indexer_cleanup     (TrackerRssIndexer *object, 
+				       const guint modseq,
+				       DBusGMethodInvocation *context,
+				       GError *derror);
+
+G_END_DECLS
+
+#endif /* __LIBTRACKER_RSS_H__ */

Added: trunk/src/plugins/rss/tracker-rss-registrar.c
==============================================================================
--- (empty file)
+++ trunk/src/plugins/rss/tracker-rss-registrar.c	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,396 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#include "config.h"
+
+#include <glib-object.h>
+#include <dbus/dbus-glib-bindings.h>
+
+#include <libtracker-data/tracker-data-update.h>
+#include <libtracker-data/tracker-data-manager.h>
+
+#include <trackerd/tracker-push-registrar.h>
+
+#define __TRACKER_RSS_REGISTRAR_C__
+
+#include "tracker-rss-registrar.h"
+#include "tracker-rss-registrar-glue.h"
+
+#define TRACKER_RSS_REGISTRAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_RSS_REGISTRAR, TrackerRssRegistrarPrivate))
+
+#define TRACKER_TYPE_RSS_PUSH_REGISTRAR    (tracker_rss_push_registrar_get_type ())
+#define TRACKER_RSS_PUSH_REGISTRAR(module) (G_TYPE_CHECK_INSTANCE_CAST ((module), TRACKER_TYPE_RSS_PUSH_REGISTRAR, TrackerRssPushRegistrar))
+
+typedef struct TrackerRssPushRegistrar TrackerRssPushRegistrar;
+typedef struct TrackerRssPushRegistrarClass TrackerRssPushRegistrarClass;
+
+struct TrackerRssPushRegistrar {
+	TrackerPushRegistrar parent_instance;
+};
+
+struct TrackerRssPushRegistrarClass {
+	TrackerPushRegistrarClass parent_class;
+};
+
+
+typedef struct {
+	DBusGProxy *idx_proxy;
+	DBusGConnection *connection;
+} TrackerRssRegistrarPrivate;
+
+enum {
+	PROP_0,
+	PROP_CONNECTION
+};
+
+static GType tracker_rss_push_registrar_get_type (void) G_GNUC_CONST;
+
+G_DEFINE_TYPE (TrackerRssRegistrar, tracker_rss_registrar, G_TYPE_OBJECT)
+G_DEFINE_TYPE (TrackerRssPushRegistrar, tracker_rss_push_registrar, TRACKER_TYPE_PUSH_REGISTRAR);
+
+/* This runs in-process of trackerd. It simply proxies everything to the indexer
+ * who wont always be running. Which is why this is needed (trackerd is always
+ * running, so it's more suitable to respond to Rss's requests). */
+
+static void
+tracker_rss_registrar_finalize (GObject *object)
+{
+	TrackerRssRegistrarPrivate *priv = TRACKER_RSS_REGISTRAR_GET_PRIVATE (object);
+
+	if (priv->idx_proxy)
+		g_object_unref (priv->idx_proxy);
+
+	G_OBJECT_CLASS (tracker_rss_registrar_parent_class)->finalize (object);
+}
+
+static void 
+tracker_rss_registrar_set_connection (TrackerRssRegistrar *object, 
+					    DBusGConnection *connection)
+{
+	TrackerRssRegistrarPrivate *priv = TRACKER_RSS_REGISTRAR_GET_PRIVATE (object);
+
+	priv->connection = connection; /* weak */
+
+	priv->idx_proxy = dbus_g_proxy_new_for_name (priv->connection, 
+						     "org.freedesktop.Tracker.Indexer",
+						     TRACKER_RSS_INDEXER_PATH,
+						     TRACKER_RSS_REGISTRAR_INTERFACE);
+}
+
+static void
+tracker_rss_registrar_set_property (GObject      *object,
+					  guint         prop_id,
+					  const GValue *value,
+					  GParamSpec   *pspec)
+{
+	switch (prop_id) {
+	case PROP_CONNECTION:
+		tracker_rss_registrar_set_connection (TRACKER_RSS_REGISTRAR (object),
+							    g_value_get_pointer (value));
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+	}
+}
+
+static void
+tracker_rss_registrar_get_property (GObject    *object,
+					  guint       prop_id,
+					  GValue     *value,
+					  GParamSpec *pspec)
+{
+	TrackerRssRegistrarPrivate *priv = TRACKER_RSS_REGISTRAR_GET_PRIVATE (object);
+
+	switch (prop_id) {
+	case PROP_CONNECTION:
+		g_value_set_pointer (value, priv->connection);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+	}
+}
+
+static void
+tracker_rss_registrar_class_init (TrackerRssRegistrarClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	object_class->finalize = tracker_rss_registrar_finalize;
+	object_class->set_property = tracker_rss_registrar_set_property;
+	object_class->get_property = tracker_rss_registrar_get_property;
+
+	g_object_class_install_property (object_class,
+					 PROP_CONNECTION,
+					 g_param_spec_pointer ("connection",
+							       "DBus connection",
+							       "DBus connection",
+							       G_PARAM_READWRITE |
+							       G_PARAM_CONSTRUCT));
+
+	g_type_class_add_private (object_class, sizeof (TrackerRssRegistrarPrivate));
+}
+
+static void
+tracker_rss_registrar_init (TrackerRssRegistrar *object)
+{
+}
+
+void
+tracker_rss_registrar_set (TrackerRssRegistrar *object, 
+			   const gchar *subject, 
+			   const GStrv predicates,
+			   const GStrv values,
+			   const guint modseq,
+			   DBusGMethodInvocation *context,
+			   GError *derror)
+{
+	TrackerRssRegistrarPrivate *priv = TRACKER_RSS_REGISTRAR_GET_PRIVATE (object);
+
+	dbus_async_return_if_fail (subject != NULL, context);
+
+	if (predicates && values) {
+
+		dbus_async_return_if_fail (g_strv_length (predicates) == 
+					   g_strv_length (values), context);
+
+		dbus_g_proxy_call_no_reply (priv->idx_proxy,
+					    "Set",
+					    G_TYPE_STRING, subject,
+					    G_TYPE_STRV, predicates,
+					    G_TYPE_STRV, values,
+					    G_TYPE_UINT, modseq,
+					    G_TYPE_INVALID, 
+					    G_TYPE_INVALID);
+	}
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_rss_registrar_set_many (TrackerRssRegistrar *object, 
+				const GStrv subjects, 
+				const GPtrArray *predicates,
+				const GPtrArray *values,
+				const guint modseq,
+				DBusGMethodInvocation *context,
+				GError *derror)
+{
+	TrackerRssRegistrarPrivate *priv = TRACKER_RSS_REGISTRAR_GET_PRIVATE (object);
+	guint len;
+
+	dbus_async_return_if_fail (subjects != NULL, context);
+	dbus_async_return_if_fail (predicates != NULL, context);
+	dbus_async_return_if_fail (values != NULL, context);
+
+	len = g_strv_length (subjects);
+
+	dbus_async_return_if_fail (len == predicates->len, context);
+	dbus_async_return_if_fail (len == values->len, context);
+
+	dbus_g_proxy_call_no_reply (priv->idx_proxy,
+				    "SetMany",
+				    G_TYPE_STRV, subjects,
+				    TRACKER_TYPE_G_STRV_ARRAY, predicates,
+				    TRACKER_TYPE_G_STRV_ARRAY, values,
+				    G_TYPE_UINT, modseq,
+				    G_TYPE_INVALID, 
+				    G_TYPE_INVALID);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_rss_registrar_unset_many (TrackerRssRegistrar *object, 
+				  const GStrv subjects, 
+				  const guint modseq,
+				  DBusGMethodInvocation *context,
+				  GError *derror)
+{
+	TrackerRssRegistrarPrivate *priv = TRACKER_RSS_REGISTRAR_GET_PRIVATE (object);
+
+	dbus_async_return_if_fail (subjects != NULL, context);
+
+	dbus_g_proxy_call_no_reply (priv->idx_proxy,
+				    "UnsetMany",
+				    G_TYPE_STRV, subjects,
+				    G_TYPE_UINT, modseq,
+				    G_TYPE_INVALID, 
+				    G_TYPE_INVALID);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_rss_registrar_unset (TrackerRssRegistrar *object, 
+				   const gchar *subject, 
+				   const guint modseq,
+				   DBusGMethodInvocation *context,
+				   GError *derror)
+{
+	TrackerRssRegistrarPrivate *priv = TRACKER_RSS_REGISTRAR_GET_PRIVATE (object);
+
+	dbus_async_return_if_fail (subject != NULL, context);
+
+	dbus_g_proxy_call_no_reply (priv->idx_proxy,
+				    "Unset",
+				    G_TYPE_STRING, subject,
+				    G_TYPE_UINT, modseq,
+				    G_TYPE_INVALID, 
+				    G_TYPE_INVALID);
+
+	dbus_g_method_return (context);
+}
+
+void
+tracker_rss_registrar_cleanup (TrackerRssRegistrar *object, 
+				     const guint modseq,
+				     DBusGMethodInvocation *context,
+				     GError *derror)
+{
+	TrackerRssRegistrarPrivate *priv = TRACKER_RSS_REGISTRAR_GET_PRIVATE (object);
+
+	dbus_g_proxy_call_no_reply (priv->idx_proxy,
+				    "Cleanup",
+				    G_TYPE_UINT, modseq,
+				    G_TYPE_INVALID, 
+				    G_TYPE_INVALID);
+
+	dbus_g_method_return (context);
+}
+
+
+static void
+on_manager_destroy (DBusGProxy *proxy, gpointer user_data)
+{
+	return;
+}
+
+static void
+tracker_rss_push_registrar_enable (TrackerPushRegistrar *registrar, 
+					 DBusGConnection      *connection,
+					 DBusGProxy           *dbus_proxy, 
+					 GError              **error)
+{
+	GError *nerror = NULL;
+	guint result;
+	DBusGProxy *manager_proxy;
+	GObject *object;
+
+	tracker_push_registrar_set_object (registrar, NULL);
+	tracker_push_registrar_set_manager (registrar, NULL);
+
+	manager_proxy = dbus_g_proxy_new_for_name (connection,
+						   TRACKER_RSS_MANAGER_SERVICE,
+						   TRACKER_RSS_MANAGER_PATH,
+						   TRACKER_RSS_MANAGER_INTERFACE);
+
+	/* Creation of the registrar */
+	if (!org_freedesktop_DBus_request_name (dbus_proxy, 
+						TRACKER_RSS_REGISTRAR_SERVICE,
+						DBUS_NAME_FLAG_DO_NOT_QUEUE,
+						&result, &nerror)) {
+
+		g_critical ("Could not setup DBus, %s in use\n", 
+			    TRACKER_RSS_REGISTRAR_SERVICE);
+
+		if (nerror) {
+			g_propagate_error (error, nerror);
+			return;
+		}
+	}
+
+	if (nerror) {
+		g_propagate_error (error, nerror);
+		return;
+	}
+
+	object = g_object_new (TRACKER_TYPE_RSS_REGISTRAR, 
+			       "connection", connection, NULL);
+
+	dbus_g_object_type_install_info (G_OBJECT_TYPE (object), 
+					 &dbus_glib_tracker_rss_registrar_object_info);
+
+	dbus_g_connection_register_g_object (connection, 
+					     TRACKER_RSS_REGISTRAR_PATH, 
+					     object);
+
+	/* Registration of the registrar to the manager */
+	dbus_g_proxy_call_no_reply (manager_proxy, "Register",
+				    G_TYPE_OBJECT, object, 
+				    G_TYPE_UINT, (guint) tracker_data_manager_get_db_option_int ("RssLastModseq"),
+				    G_TYPE_INVALID,
+				    G_TYPE_INVALID);
+
+	/* If while we had a proxy for the manager the manager shut itself down,
+	 * then we'll get rid of our registrar too, in on_manager_destroy */
+
+	g_signal_connect (manager_proxy, "destroy",
+			  G_CALLBACK (on_manager_destroy), registrar);
+
+	tracker_push_registrar_set_object (registrar, object);
+	tracker_push_registrar_set_manager (registrar, manager_proxy);
+
+	g_object_unref (object); /* sink own */
+	g_object_unref (manager_proxy);  /* sink own */
+}
+
+static void
+tracker_rss_push_registrar_disable (TrackerPushRegistrar *registrar)
+{
+	tracker_push_registrar_set_object (registrar, NULL);
+	tracker_push_registrar_set_manager (registrar, NULL);
+}
+
+static void
+tracker_rss_push_registrar_class_init (TrackerRssPushRegistrarClass *klass)
+{
+	TrackerPushRegistrarClass *p_class = TRACKER_PUSH_REGISTRAR_CLASS (klass);
+
+	p_class->enable = tracker_rss_push_registrar_enable;
+	p_class->disable = tracker_rss_push_registrar_disable;
+}
+
+static void
+tracker_rss_push_registrar_init (TrackerRssPushRegistrar *registrar)
+{
+	return;
+}
+
+TrackerPushRegistrar *
+tracker_push_module_init (void)
+{
+	GObject *object;
+
+	object = g_object_new (TRACKER_TYPE_RSS_PUSH_REGISTRAR, NULL);
+
+	tracker_push_registrar_set_service (TRACKER_PUSH_REGISTRAR (object),
+					    TRACKER_RSS_MANAGER_SERVICE);
+
+	return TRACKER_PUSH_REGISTRAR (object);
+}
+
+void
+tracker_push_module_shutdown (TrackerPushRegistrar *registrar)
+{
+	tracker_rss_push_registrar_disable (registrar);
+}

Added: trunk/src/plugins/rss/tracker-rss-registrar.h
==============================================================================
--- (empty file)
+++ trunk/src/plugins/rss/tracker-rss-registrar.h	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,94 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#ifndef __LIBTRACKER_RSS_REGISTRAR_H__
+#define __LIBTRACKER_RSS_REGISTRAR_H__
+
+#if !defined (TRACKER_ENABLE_INTERNALS) && !defined (TRACKER_COMPILATION)
+#error "TRACKER_ENABLE_INTERNALS not defined, this must be defined to use tracker's internal functions"
+#endif
+
+#include <dbus/dbus-glib-bindings.h>
+
+#include <trackerd/tracker-push.h>
+#include "tracker-rss-common.h"
+
+G_BEGIN_DECLS
+
+#define TRACKER_TYPE_RSS_REGISTRAR          (tracker_rss_registrar_get_type())
+#define TRACKER_RSS_REGISTRAR(o)            (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_RSS_REGISTRAR, TrackerRssRegistrar))
+#define TRACKER_RSS_REGISTRAR_CLASS(c)      (G_TYPE_CHECK_CLASS_CAST ((c), TRACKER_TYPE_RSS_REGISTRAR, TrackerRssRegistrarClass))
+#define TRACKER_RSS_REGISTRAR_GET_CLASS(o)  (G_TYPE_INSTANCE_GET_CLASS ((o), TRACKER_TYPE_RSS_REGISTRAR, TrackerRssRegistrarClass))
+
+G_BEGIN_DECLS
+
+#ifndef __TRACKER_RSS_REGISTRAR_C__
+extern const DBusGMethodInfo *registrar_methods;
+#endif
+
+typedef struct TrackerRssRegistrar TrackerRssRegistrar;
+typedef struct TrackerRssRegistrarClass TrackerRssRegistrarClass;
+
+struct TrackerRssRegistrar {
+	GObject parent;
+};
+
+struct TrackerRssRegistrarClass {
+	GObjectClass parent;
+};
+
+GType  tracker_rss_registrar_get_type   (void);
+
+void  tracker_rss_registrar_set         (TrackerRssRegistrar *object, 
+					 const gchar *subject, 
+					 const GStrv predicates,
+					 const GStrv values,
+					 const guint modseq,
+					 DBusGMethodInvocation *context,
+					 GError *derror);
+void  tracker_rss_registrar_set_many    (TrackerRssRegistrar *object, 
+					 const GStrv subjects, 
+					 const GPtrArray *predicates,
+					 const GPtrArray *values,
+					 const guint modseq,
+					 DBusGMethodInvocation *context,
+					 GError *derror);
+void  tracker_rss_registrar_unset_many  (TrackerRssRegistrar *object, 
+					 const GStrv subjects, 
+					 const guint modseq,
+					 DBusGMethodInvocation *context,
+					 GError *derror);
+void  tracker_rss_registrar_unset       (TrackerRssRegistrar *object, 
+					 const gchar *subject, 
+					 const guint modseq,
+					 DBusGMethodInvocation *context,
+					 GError *derror);
+void  tracker_rss_registrar_cleanup     (TrackerRssRegistrar *object, 
+					 const guint modseq,
+					 DBusGMethodInvocation *context,
+					 GError *derror);
+
+
+G_END_DECLS
+
+#endif /* __LIBTRACKER_RSS_REGISTRAR_H__ */

Added: trunk/src/plugins/rss/tracker-rss-registrar.xml
==============================================================================
--- (empty file)
+++ trunk/src/plugins/rss/tracker-rss-registrar.xml	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<node name="/">
+  <interface name="my.rss.metadata.Registrar">
+
+  <method name="Set">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="s" name="subject" direction="in" />
+      <arg type="as" name="predicates" direction="in" />
+      <arg type="as" name="values" direction="in" />
+      <arg type="u" name="modseq" direction="in" />
+    </method>
+
+    <method name="SetMany">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="as" name="subjects" direction="in" />
+      <arg type="aas" name="predicates" direction="in" />
+      <arg type="aas" name="values" direction="in" />
+      <arg type="u" name="modseq" direction="in" />
+    </method>
+
+    <method name="Unset">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="s" name="subject" direction="in" />
+      <arg type="u" name="modseq" direction="in" />
+    </method>
+
+    <method name="UnsetMany">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="as" name="subjects" direction="in" />
+      <arg type="u" name="modseq" direction="in" />
+    </method>
+
+    <method name="Cleanup">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="u" name="modseq" direction="in" />
+    </method>
+
+  </interface>
+</node>

Modified: trunk/src/tracker-indexer/Makefile.am
==============================================================================
--- trunk/src/tracker-indexer/Makefile.am	(original)
+++ trunk/src/tracker-indexer/Makefile.am	Thu Feb 12 15:47:13 2009
@@ -8,6 +8,7 @@
 	-DLIBDIR=\""$(libdir)"\"					\
 	-DLOCALEDIR=\""$(localedir)"\" 					\
 	-DINDEXER_MODULES_DIR=\""$(libdir)/tracker/indexer-modules"\"	\
+	-DPUSH_MODULES_DIR=\""$(libdir)/tracker/push-modules/indexer"\" \
 	-DLIBEXEC_PATH=\""$(libexecdir)"\"				\
 	-DG_LOG_DOMAIN=\"Tracker\"					\
 	-DTRACKER_COMPILATION						\
@@ -48,12 +49,9 @@
 	tracker-module-metadata-private.h				\
 	tracker-marshal-main.c						\
 	tracker-removable-device.c					\
-	tracker-removable-device.h					
-
-if HAVE_EVOLUTION_PLUGIN
-plugin_libs =								\
-	$(top_builddir)/src/plugins/evolution/libtracker-evolution-indexer.la
-endif
+	tracker-removable-device.h					\
+	tracker-push.c							\
+	tracker-push.h
 
 tracker_indexer_LDADD =							\
 	$(plugin_libs)							\

Modified: trunk/src/tracker-indexer/tracker-main.c
==============================================================================
--- trunk/src/tracker-indexer/tracker-main.c	(original)
+++ trunk/src/tracker-indexer/tracker-main.c	Thu Feb 12 15:47:13 2009
@@ -48,10 +48,10 @@
 #include <libtracker-data/tracker-turtle.h>
 #include <libtracker-data/tracker-data-manager.h>
 
-#include <plugins/evolution/tracker-evolution-indexer.h>
 
 #include "tracker-dbus.h"
 #include "tracker-indexer.h"
+#include "tracker-push.h"
 
 #define ABOUT								  \
 	"Tracker " PACKAGE_VERSION "\n"					  \
@@ -435,9 +435,7 @@
 
 	tracker_data_manager_init (config, language, file_index, email_index);
 
-#ifdef HAVE_EVOLUTION_PLUGIN
-	tracker_evolution_storer_init (config, indexer);
-#endif
+	tracker_push_init (config, indexer);
 
 	tracker_turtle_init ();
 
@@ -464,9 +462,7 @@
 
 	tracker_data_manager_shutdown ();
 
-#ifdef HAVE_EVOLUTION_PLUGIN
-	tracker_evolution_storer_shutdown ();
-#endif
+	tracker_push_shutdown ();
 
 	tracker_thumbnailer_shutdown ();
 	tracker_dbus_shutdown ();

Added: trunk/src/tracker-indexer/tracker-push.c
==============================================================================
--- (empty file)
+++ trunk/src/tracker-indexer/tracker-push.c	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,150 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#include "config.h"
+
+#include <gmodule.h>
+#include <string.h>
+#include <time.h>
+
+#include "tracker-push.h"
+
+typedef struct {
+	TrackerConfig *config;
+	TrackerIndexer *indexer;
+	GList *modules;
+} PushSupportPrivate;
+
+typedef struct {
+	void (*init) (TrackerConfig *config);
+	void (*shutdown) (void);
+	GModule *module;
+} PushModule;
+
+static GStaticPrivate private_key = G_STATIC_PRIVATE_INIT;
+
+static void
+unload_modules (PushSupportPrivate *private)
+{
+	GList *copy = private->modules;
+
+	while (copy) {
+		PushModule *p_module = copy->data;
+
+		p_module->shutdown ();
+
+		g_module_close (p_module->module);
+		g_slice_free (PushModule, p_module);
+
+		copy = g_list_next (copy);
+	}
+
+	g_list_free (private->modules);
+	private->modules = NULL;
+}
+
+static void
+load_modules (PushSupportPrivate *private)
+{
+	GError *error = NULL;
+	GDir *dir = g_dir_open (PUSH_MODULES_DIR, 0, &error);
+	const gchar *name;
+
+	if (error) {
+		g_debug ("%s\n", error->message);
+		g_error_free (error);
+		return;
+	}
+
+	while ((name = g_dir_read_name (dir)) != NULL) {
+		if (g_str_has_suffix (name, G_MODULE_SUFFIX)) {
+			gchar *path = g_build_filename (PUSH_MODULES_DIR, name, NULL);
+			PushModule *p_module = g_slice_new (PushModule);
+
+			p_module->module = g_module_open (path, G_MODULE_BIND_LOCAL);
+
+			if (!g_module_symbol (p_module->module, "tracker_push_module_shutdown",
+					      (gpointer *) &p_module->shutdown) ||
+			    !g_module_symbol (p_module->module, "tracker_push_module_init",
+					      (gpointer *) &p_module->init)) {
+
+				g_warning ("Could not load module symbols for '%s': %s",
+					   path, g_module_error ());
+
+				g_module_close (p_module->module);
+				g_slice_free (PushModule, p_module);
+
+			} else {
+				g_module_make_resident (p_module->module);
+
+				p_module->init (private->config);
+
+				private->modules = g_list_prepend (private->modules,
+								   p_module);
+			}
+
+			g_free (path);
+		}
+	}
+}
+
+static void
+free_private (PushSupportPrivate *private)
+{
+	if (private->config)
+		g_object_unref (private->config);
+	if (private->indexer)
+		g_object_unref (private->indexer);
+
+	g_free (private);
+}
+
+void
+tracker_push_init (TrackerConfig *config, TrackerIndexer *indexer)
+{
+	PushSupportPrivate *private;
+
+	private = g_new0 (PushSupportPrivate, 1);
+
+	g_static_private_set (&private_key,
+			      private,
+			      (GDestroyNotify) free_private);
+
+	private->indexer = g_object_ref (indexer);
+	private->config = g_object_ref (config);
+
+	load_modules (private);
+}
+
+void
+tracker_push_shutdown (void)
+{
+	PushSupportPrivate *private;
+
+	private = g_static_private_get (&private_key);
+	g_return_if_fail (private != NULL);
+
+	unload_modules (private);
+
+	g_static_private_set (&private_key, NULL, NULL);
+}

Added: trunk/src/tracker-indexer/tracker-push.h
==============================================================================
--- (empty file)
+++ trunk/src/tracker-indexer/tracker-push.h	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,37 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#ifndef __TRACKER_INDEXER_PUSH_H__
+#define __TRACKER_INDEXER_PUSH_H__
+
+#include <tracker-indexer/tracker-indexer.h>
+#include <libtracker-common/tracker-config.h>
+
+G_BEGIN_DECLS
+
+void tracker_push_init            (TrackerConfig *config, TrackerIndexer *indexer);
+void tracker_push_shutdown        (void);
+
+G_END_DECLS
+
+#endif /* __TRACKER_INDEXER_PUSH_H__ */

Modified: trunk/src/trackerd/Makefile.am
==============================================================================
--- trunk/src/trackerd/Makefile.am	(original)
+++ trunk/src/trackerd/Makefile.am	Thu Feb 12 15:47:13 2009
@@ -5,6 +5,7 @@
 	-DLIBDIR=\""$(libdir)"\"					\
 	-DLOCALEDIR=\""$(localedir)"\" 					\
 	-DMAIL_MODULES_DIR=\""$(libdir)"/tracker/mail-modules\"         \
+	-DPUSH_MODULES_DIR=\""$(libdir)/tracker/push-modules/daemon"\"	\
 	-DG_LOG_DOMAIN=\"Tracker\"					\
 	-DTRACKER_COMPILATION						\
 	-I$(top_srcdir)/src						\
@@ -18,7 +19,7 @@
 	$(GMODULE_CFLAGS)						\
 	$(GTHREAD_CFLAGS)						\
 	$(RAPTOR_CFLAGS)						\
-	$(GLIB2_CFLAGS)
+	$(GLIB2_CFLAGS)							
 
 if HAVE_INOTIFY
 inotify_libs = $(top_builddir)/src/libinotify/libinotify.la
@@ -66,17 +67,16 @@
 	tracker-xesam-live-search.c					\
 	tracker-xesam-live-search.h					\
 	tracker-cleanup.c						\
-	tracker-cleanup.h
+	tracker-cleanup.h						\
+	tracker-push.c							\
+	tracker-push.h							\
+	tracker-push-registrar.c					\
+	tracker-push-registrar.h
 
 if OS_WIN32
 trackerd_win_libs = -lws2_32 -lkernel32
 endif
 
-if HAVE_EVOLUTION_PLUGIN
-plugin_libs =								\
-	$(top_builddir)/src/plugins/evolution/libtracker-evolution.la
-endif
-
 trackerd_LDADD =							\
 	$(plugin_libs)							\
 	$(top_builddir)/src/libtracker-data/libtracker-data.la		\

Modified: trunk/src/trackerd/tracker-main.c
==============================================================================
--- trunk/src/trackerd/tracker-main.c	(original)
+++ trunk/src/trackerd/tracker-main.c	Thu Feb 12 15:47:13 2009
@@ -58,7 +58,7 @@
 #include <libtracker-data/tracker-data-manager.h>
 #include <libtracker-data/tracker-turtle.h>
 
-#include <plugins/evolution/tracker-evolution.h>
+#include <tracker-push.h>
 
 #include "tracker-crawler.h"
 #include "tracker-dbus.h"
@@ -1171,9 +1171,7 @@
 		return EXIT_FAILURE;
 	}
 
-#ifdef HAVE_EVOLUTION_PLUGIN
-	tracker_evolution_init (config);
-#endif
+	tracker_push_init (config);
 
 	g_message ("Waiting for DBus requests...");
 
@@ -1245,10 +1243,8 @@
 	shutdown_directories ();
 
 	/* Shutdown major subsystems */
-	
-#ifdef HAVE_EVOLUTION_PLUGIN
-	tracker_evolution_shutdown ();
-#endif
+
+	tracker_push_shutdown ();
 
 	tracker_cleanup_shutdown ();
 	tracker_xesam_manager_shutdown ();

Added: trunk/src/trackerd/tracker-push-registrar.c
==============================================================================
--- (empty file)
+++ trunk/src/trackerd/tracker-push-registrar.c	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,341 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#include "tracker-push-registrar.h"
+
+#define TRACKER_PUSH_REGISTRAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRACKER_TYPE_PUSH_REGISTRAR, TrackerPushRegistrarPrivate))
+
+typedef struct TrackerPushRegistrarPrivate TrackerPushRegistrarPrivate;
+
+struct TrackerPushRegistrarPrivate {
+	DBusGProxy *manager_proxy;
+	GObject *object;
+	const gchar *service;
+};
+
+enum {
+	PROP_0,
+	PROP_MANAGER,
+	PROP_OBJECT,
+	PROP_SERVICE
+};
+
+static void   tracker_push_registrar_finalize     (GObject      *object);
+static void   tracker_push_registrar_constructed  (GObject      *object);
+static void   tracker_push_registrar_set_property (GObject      *object,
+						   guint         prop_id,
+						   const GValue *value,
+						   GParamSpec   *pspec);
+static void   tracker_push_registrar_get_property (GObject      *object,
+						   guint         prop_id,
+						   GValue       *value,
+						   GParamSpec   *pspec);
+
+G_DEFINE_TYPE (TrackerPushRegistrar, tracker_push_registrar, G_TYPE_OBJECT)
+
+static void
+tracker_push_registrar_class_init (TrackerPushRegistrarClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	object_class->finalize = tracker_push_registrar_finalize;
+
+	object_class->constructed = tracker_push_registrar_constructed;
+	object_class->set_property = tracker_push_registrar_set_property;
+	object_class->get_property = tracker_push_registrar_get_property;
+
+	g_object_class_install_property (object_class,
+					 PROP_MANAGER,
+					 g_param_spec_object ("manager",
+							      "Manager",
+							      "Manager ",
+							      G_TYPE_OBJECT,
+							      G_PARAM_READWRITE));
+
+	g_object_class_install_property (object_class,
+					 PROP_OBJECT,
+					 g_param_spec_object ("object",
+							      "Object",
+							      "Object ",
+							      G_TYPE_OBJECT,
+							      G_PARAM_READWRITE));
+
+	g_object_class_install_property (object_class,
+					 PROP_MANAGER,
+					 g_param_spec_string ("service",
+							      "Service",
+							      "Service ",
+							      NULL,
+							      G_PARAM_READWRITE));
+
+	g_type_class_add_private (object_class, sizeof (TrackerPushRegistrarPrivate));
+}
+
+static void
+tracker_push_registrar_init (TrackerPushRegistrar *registrar)
+{
+}
+
+static void
+tracker_push_registrar_finalize (GObject *object)
+{
+	TrackerPushRegistrarPrivate *priv;
+
+	priv = TRACKER_PUSH_REGISTRAR_GET_PRIVATE (object);
+
+	if (priv->object)
+		g_object_unref (priv->object);
+
+	if (priv->manager_proxy)
+		g_object_unref (priv->manager_proxy);
+
+	G_OBJECT_CLASS (tracker_push_registrar_parent_class)->finalize (object);
+}
+
+static void
+tracker_push_registrar_constructed (GObject *object)
+{
+	if (G_OBJECT_CLASS (tracker_push_registrar_parent_class)->constructed) {
+		G_OBJECT_CLASS (tracker_push_registrar_parent_class)->constructed (object);
+	}
+}
+
+static void
+tracker_push_registrar_set_property (GObject      *object,
+				     guint         prop_id,
+				     const GValue *value,
+				     GParamSpec   *pspec)
+{
+	TrackerPushRegistrarPrivate *priv;
+
+	priv = TRACKER_PUSH_REGISTRAR_GET_PRIVATE (object);
+
+	switch (prop_id) {
+	case PROP_MANAGER:
+		tracker_push_registrar_set_manager (TRACKER_PUSH_REGISTRAR (object),
+						    g_value_get_object (value));
+		break;
+	case PROP_OBJECT:
+		tracker_push_registrar_set_object (TRACKER_PUSH_REGISTRAR (object),
+						   g_value_get_object (value));
+		break;
+	case PROP_SERVICE:
+		tracker_push_registrar_set_service (TRACKER_PUSH_REGISTRAR (object),
+						    g_value_get_string (value));
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+	}
+}
+
+static void
+tracker_push_registrar_get_property (GObject    *object,
+				     guint       prop_id,
+				     GValue     *value,
+				     GParamSpec *pspec)
+{
+	TrackerPushRegistrarPrivate *priv;
+
+	priv = TRACKER_PUSH_REGISTRAR_GET_PRIVATE (object);
+
+	switch (prop_id) {
+	case PROP_MANAGER:
+		g_value_set_object (value, priv->manager_proxy);
+		break;
+	case PROP_OBJECT:
+		g_value_set_object (value, priv->object);
+		break;
+	case PROP_SERVICE:
+		g_value_set_static_string (value, priv->service);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+	}
+}
+
+/**
+ * tracker_push_registrar_get_service:
+ * @registrar: A #TrackerPushRegistrar
+ *
+ * Returns the DBus service that @registrar consumes.
+ *
+ * Returns: The DBus service name.
+ **/
+G_CONST_RETURN gchar *
+tracker_push_registrar_get_service (TrackerPushRegistrar *registrar)
+{
+	TrackerPushRegistrarPrivate *priv;
+
+	priv = TRACKER_PUSH_REGISTRAR_GET_PRIVATE (registrar);
+
+	return priv->service;
+}
+
+/**
+ * tracker_push_registrar_get_object:
+ * @registrar: A #TrackerPushRegistrar
+ *
+ * Returns the DBus object that @registrar provides
+ *
+ * Returns: The DBus object.
+ **/
+GObject *
+tracker_push_registrar_get_object (TrackerPushRegistrar *registrar)
+{
+	TrackerPushRegistrarPrivate *priv;
+
+	priv = TRACKER_PUSH_REGISTRAR_GET_PRIVATE (registrar);
+
+	return priv->object;
+}
+
+/**
+ * tracker_push_registrar_get_manager:
+ * @registrar: A #TrackerPushRegistrar
+ *
+ * Returns the DBus proxy to the DBus object that @registrar consumes
+ *
+ * Returns: The DBus proxy.
+ **/
+DBusGProxy * 
+tracker_push_registrar_get_manager (TrackerPushRegistrar *registrar)
+{
+	TrackerPushRegistrarPrivate *priv;
+
+	priv = TRACKER_PUSH_REGISTRAR_GET_PRIVATE (registrar);
+
+	return priv->manager_proxy;
+}
+
+/**
+ * tracker_push_registrar_set_service:
+ * @registrar: A #TrackerPushRegistrar
+ * @service: a DBus service string
+ *
+ * Set the DBus service string that @registrar will consumes
+ *
+ **/
+void
+tracker_push_registrar_set_service (TrackerPushRegistrar *registrar,
+				    const gchar *service)
+{
+	TrackerPushRegistrarPrivate *priv;
+
+	priv = TRACKER_PUSH_REGISTRAR_GET_PRIVATE (registrar);
+
+	priv->service = service;
+
+	g_object_notify (G_OBJECT (registrar), "service");
+}
+
+/**
+ * tracker_push_registrar_set_object:
+ * @registrar: A #TrackerPushRegistrar
+ * @object: a DBus object
+ *
+ * Set the DBus object created
+ **/
+void
+tracker_push_registrar_set_object (TrackerPushRegistrar *registrar,
+				   GObject              *object)
+{
+	TrackerPushRegistrarPrivate *priv;
+
+	priv = TRACKER_PUSH_REGISTRAR_GET_PRIVATE (registrar);
+
+	if (object) {
+		g_object_ref (object);
+	}
+
+	if (priv->object) {
+		g_object_unref (priv->object);
+	}
+
+	priv->object = object;
+
+	g_object_notify (G_OBJECT (registrar), "object");
+}
+
+/**
+ * tracker_push_registrar_set_manager:
+ * @registrar: A #TrackerPushRegistrar
+ * @manager: a DBus proxy
+ *
+ * Set the DBus proxy to the manager DBus object being consumed
+ **/
+void
+tracker_push_registrar_set_manager (TrackerPushRegistrar *registrar,
+				    DBusGProxy           *manager)
+{
+	TrackerPushRegistrarPrivate *priv;
+
+	priv = TRACKER_PUSH_REGISTRAR_GET_PRIVATE (registrar);
+
+	if (manager) {
+		g_object_ref (manager);
+	}
+
+	if (priv->manager_proxy) {
+		g_object_unref (priv->manager_proxy);
+	}
+
+	priv->manager_proxy = manager;
+
+	g_object_notify (G_OBJECT (registrar), "manager");
+
+}
+
+/**
+ * tracker_push_registrar_enable:
+ * @registrar: A #TrackerPushRegistrar
+ *
+ * Enables the feature
+ *
+ **/
+void
+tracker_push_registrar_enable (TrackerPushRegistrar *registrar,
+			      DBusGConnection *connection, 
+			      DBusGProxy *dbus_proxy, 
+			      GError **error)
+{
+	if (TRACKER_PUSH_REGISTRAR_GET_CLASS (registrar)->enable) {
+		TRACKER_PUSH_REGISTRAR_GET_CLASS (registrar)->enable (registrar,
+								      connection,
+								      dbus_proxy,
+								      error);
+	}
+}
+
+/**
+ * tracker_push_registrar_disable:
+ * @registrar: A #TrackerPushRegistrar
+ *
+ * Disables the feature
+ *
+ **/
+void
+tracker_push_registrar_disable (TrackerPushRegistrar *registrar)
+{
+	if (TRACKER_PUSH_REGISTRAR_GET_CLASS (registrar)->disable)
+		TRACKER_PUSH_REGISTRAR_GET_CLASS (registrar)->disable (registrar);
+}

Added: trunk/src/trackerd/tracker-push-registrar.h
==============================================================================
--- (empty file)
+++ trunk/src/trackerd/tracker-push-registrar.h	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,83 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#ifndef __TRACKER_PUSH_REGISTRAR_H__
+#define __TRACKER_PUSH_REGISTRAR_H__
+
+#include <glib-object.h>
+#include <gmodule.h>
+#include <dbus/dbus-glib-bindings.h>
+
+G_BEGIN_DECLS
+
+#define TRACKER_TYPE_PUSH_REGISTRAR         (tracker_push_registrar_get_type())
+#define TRACKER_PUSH_REGISTRAR(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), TRACKER_TYPE_PUSH_REGISTRAR, TrackerPushRegistrar))
+#define TRACKER_PUSH_REGISTRAR_CLASS(c)     (G_TYPE_CHECK_CLASS_CAST ((c),    TRACKER_TYPE_PUSH_REGISTRAR, TrackerPushRegistrarClass))
+#define TRACKER_IS_PUSH_REGISTRAR(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), TRACKER_TYPE_PUSH_REGISTRAR))
+#define TRACKER_IS_PUSH_REGISTRAR_CLASS(c)  (G_TYPE_CHECK_CLASS_TYPE ((c),    TRACKER_TYPE_PUSH_REGISTRAR))
+#define TRACKER_PUSH_REGISTRAR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),  TRACKER_TYPE_PUSH_REGISTRAR, TrackerPushRegistrarClass))
+
+typedef struct TrackerPushRegistrar TrackerPushRegistrar;
+typedef struct TrackerPushRegistrarClass TrackerPushRegistrarClass;
+
+struct TrackerPushRegistrar {
+	GObject parent_instance;
+};
+
+struct TrackerPushRegistrarClass {
+	GObjectClass parent_class;
+
+	void (*enable) (TrackerPushRegistrar *registrar,
+			DBusGConnection      *connection, 
+			DBusGProxy           *dbus_proxy, 
+			GError              **error);
+
+	void (*disable) (TrackerPushRegistrar *registrar);
+};
+
+GType                   tracker_push_registrar_get_type      (void) G_GNUC_CONST;
+
+G_CONST_RETURN gchar *  tracker_push_registrar_get_service   (TrackerPushRegistrar *registrar);
+GObject *               tracker_push_registrar_get_object    (TrackerPushRegistrar *registrar);
+DBusGProxy *            tracker_push_registrar_get_manager   (TrackerPushRegistrar *registrar);
+
+void                    tracker_push_registrar_set_service   (TrackerPushRegistrar *registrar,
+							      const gchar *service);
+void                    tracker_push_registrar_set_object    (TrackerPushRegistrar *registrar,
+							      GObject              *object);
+void                    tracker_push_registrar_set_manager   (TrackerPushRegistrar *registrar,
+							      DBusGProxy           *manager);
+
+
+void                    tracker_push_registrar_enable        (TrackerPushRegistrar *registrar, 
+							      DBusGConnection      *connection, 
+							      DBusGProxy           *dbus_proxy, 
+							      GError              **error);
+void                    tracker_push_registrar_disable       (TrackerPushRegistrar *registrar);
+
+TrackerPushRegistrar *  tracker_push_module_init             (void);
+void                    tracker_push_module_shutdown         (TrackerPushRegistrar *registrar);
+
+G_END_DECLS
+
+#endif /* __TRACKER_PUSH_REGISTRAR_H__ */

Added: trunk/src/trackerd/tracker-push.c
==============================================================================
--- (empty file)
+++ trunk/src/trackerd/tracker-push.c	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,358 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <time.h>
+
+#include <dbus/dbus-glib-lowlevel.h>
+
+#include "tracker-push.h"
+#include "tracker-push-registrar.h"
+
+
+typedef struct {
+	TrackerConfig *config;
+	DBusGConnection *connection;
+	DBusGProxy *dbus_proxy;
+	GList *modules;
+} PushSupportPrivate;
+
+typedef struct {
+	TrackerPushRegistrar* (*init) (void);
+	void (*shutdown) (TrackerPushRegistrar *registrar);
+	TrackerPushRegistrar *registrar;
+	GModule *module;
+} PushModule;
+
+static GStaticPrivate private_key = G_STATIC_PRIVATE_INIT;
+
+
+static void
+load_modules (PushSupportPrivate *private)
+{
+	GError *error = NULL;
+	GDir *dir = g_dir_open (PUSH_MODULES_DIR, 0, &error);
+	const gchar *name;
+
+
+	if (error) {
+		g_debug ("%s\n", error->message);
+		g_error_free (error);
+		return;
+	}
+
+	while ((name = g_dir_read_name (dir)) != NULL) {
+		if (g_str_has_suffix (name, G_MODULE_SUFFIX)) {
+			gchar *path = g_build_filename (PUSH_MODULES_DIR, name, NULL);
+			PushModule *p_module = g_slice_new (PushModule);
+
+			p_module->module = g_module_open (path, G_MODULE_BIND_LOCAL);
+
+			if (!g_module_symbol (p_module->module, "tracker_push_module_shutdown",
+					      (gpointer *) &p_module->shutdown) ||
+			    !g_module_symbol (p_module->module, "tracker_push_module_init",
+					      (gpointer *) &p_module->init)) {
+
+				g_warning ("Could not load module symbols for '%s': %s",
+					   path, g_module_error ());
+
+				g_module_close (p_module->module);
+				g_slice_free (PushModule, p_module);
+
+			} else {
+				g_module_make_resident (p_module->module);
+
+				p_module->registrar = p_module->init ();
+
+				private->modules = g_list_prepend (private->modules,
+								   p_module);
+			}
+
+			g_free (path);
+		}
+	}
+}
+
+static void
+name_owner_changed_cb (DBusGProxy *proxy, 
+		       gchar *name, 
+		       gchar *old_owner, 
+		       gchar *new_owner, 
+		       gpointer user_data)
+{
+	GList *copy;
+	PushSupportPrivate *private;
+	gboolean found = FALSE;
+
+	private = g_static_private_get (&private_key);
+	g_return_if_fail (private != NULL);
+
+	/* If we receive a NameOwnerChanged about the manager's service */
+
+	copy = private->modules;
+
+	for (; copy && !found; copy = g_list_next (copy)) {
+		PushModule *p_module = copy->data;
+		TrackerPushRegistrar *registrar = p_module->registrar;
+		const gchar *service = tracker_push_registrar_get_service (registrar);
+
+		if (g_strcmp0 (name, service) == 0) {
+
+			if (tracker_is_empty_string (new_owner) && !tracker_is_empty_string (old_owner)) {
+				tracker_push_registrar_disable (registrar);
+			}
+
+			if (tracker_is_empty_string (old_owner) && !tracker_is_empty_string (new_owner)) {
+				GError *error  = NULL;
+
+				tracker_push_registrar_enable (registrar, 
+							       private->connection,
+							       private->dbus_proxy,
+							       &error);
+
+				if (error) {
+					g_debug ("%s\n", error->message);
+					g_error_free (error);
+				}
+			}
+
+			found = TRUE;
+		}
+	}
+
+	if (!found) {
+		copy = private->modules;
+
+		/* If the manager's service is found, start the registrar */
+
+		for (; copy; copy = g_list_next (copy)) {
+			PushModule *p_module = copy->data;
+			TrackerPushRegistrar *registrar = p_module->registrar;
+			const gchar *service = tracker_push_registrar_get_service (registrar);
+
+			if (g_strcmp0 (name, service) == 0) {
+				GError *error  = NULL;
+
+				tracker_push_registrar_enable (registrar, 
+							       private->connection,
+							       private->dbus_proxy,
+							       &error);
+
+				if (error) {
+					g_debug ("%s\n", error->message);
+					g_error_free (error);
+				}
+
+				break;
+			}
+		}
+	}
+}
+
+static void
+list_names_reply_cb (DBusGProxy     *proxy,
+		     DBusGProxyCall *call,
+		     gpointer        user_data)
+{
+	PushSupportPrivate *private;
+	GError *error = NULL;
+	GStrv names = NULL;
+	guint i = 0;
+	gboolean found = FALSE;
+
+	private = g_static_private_get (&private_key);
+	g_return_if_fail (private != NULL);
+
+	dbus_g_proxy_end_call (proxy, call, &error,
+			       G_TYPE_STRV, &names,
+			       G_TYPE_INVALID);
+
+	if (error) {
+		g_warning ("%s", error->message);
+		g_error_free (error);
+		if (names)
+			g_strfreev (names); 
+		return;
+	}
+
+	while (names[i] != NULL && !found) {
+		GList *copy = private->modules;
+
+		/* If the manager's service is found, start the registrar */
+
+		for (; copy; copy = g_list_next (copy)) {
+			PushModule *p_module = copy->data;
+			TrackerPushRegistrar *registrar = p_module->registrar;
+			const gchar *service = tracker_push_registrar_get_service (registrar);
+
+			if (g_strcmp0 (names[i], service) == 0) {
+				GError *lerror  = NULL;
+
+				tracker_push_registrar_enable (registrar, 
+							       private->connection,
+							       private->dbus_proxy,
+							       &lerror);
+
+				if (lerror) {
+					g_debug ("%s\n", lerror->message);
+					g_error_free (lerror);
+				}
+
+				found = TRUE;
+				break;
+			}
+		}
+		i++;
+	}
+
+	g_strfreev (names); 
+}
+
+static void
+free_private (PushSupportPrivate *private)
+{
+	if (private->connection)
+		dbus_g_connection_unref (private->connection);
+	if (private->config)
+		g_object_unref (private->config);
+	g_free (private);
+}
+
+void
+tracker_push_init (TrackerConfig *config)
+{
+	DBusGConnection *connection;
+	GError *error = NULL;
+	PushSupportPrivate *private;
+
+	private = g_new0 (PushSupportPrivate, 1);
+
+	g_static_private_set (&private_key,
+			      private,
+			      (GDestroyNotify) free_private);
+
+	load_modules (private);
+
+	connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+
+	if (!error) {
+		GList *copy;
+		DBusError dbus_error;
+
+		private->config = g_object_ref (config);
+		private->connection = dbus_g_connection_ref (connection);
+
+		private->dbus_proxy = dbus_g_proxy_new_for_name (private->connection, 
+								 DBUS_SERVICE_DBUS,
+								 DBUS_PATH_DBUS,
+								 DBUS_INTERFACE_DBUS);
+
+		/* We listen for NameOwnerChanged to know when the manager's service 
+		 * comes up and to know when it goes down */
+
+		dbus_g_proxy_add_signal (private->dbus_proxy, "NameOwnerChanged",
+					 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+					 G_TYPE_INVALID);
+
+		dbus_g_proxy_connect_signal (private->dbus_proxy, "NameOwnerChanged",
+					     G_CALLBACK (name_owner_changed_cb),
+					     NULL, NULL);
+
+		dbus_error_init (&dbus_error);
+
+		copy = private->modules;
+
+		for (; copy; copy = g_list_next (copy)) {
+
+			PushModule *p_module = copy->data;
+			TrackerPushRegistrar *registrar = p_module->registrar;
+			const gchar *service = tracker_push_registrar_get_service (registrar);
+
+			gchar *dbus_string = g_strdup_printf ("type='signal',"
+					    "sender='" DBUS_SERVICE_DBUS
+					    "',interface='" DBUS_INTERFACE_DBUS
+					    "',path='" DBUS_PATH_DBUS
+					    "',member='NameOwnerChanged',"
+					     "arg0='%s'", service);
+
+			dbus_bus_add_match ((DBusConnection *) dbus_g_connection_get_connection (private->connection),
+					    dbus_string, &dbus_error);
+
+			if (dbus_error_is_set (&dbus_error)) {
+				g_warning ("%s for rule=%s\n", dbus_error.message, dbus_string);
+				g_free (dbus_string);
+				dbus_error_free (&dbus_error);
+				break;
+			}
+
+			g_free (dbus_string);
+		}
+
+		/* If the manager service is up and running, then list_names_reply_cb
+		 * will execute activate_registrar, as it'll appear in the results of
+		 * the ListNames DBus function. If not then we will just wait for the
+		 * NameOwnerChanged to emit that the manager's service has came up. */
+
+		dbus_g_proxy_begin_call (private->dbus_proxy, "ListNames",
+					 list_names_reply_cb, NULL, NULL,
+					 G_TYPE_INVALID,
+					 G_TYPE_INVALID);
+
+	} else {
+		g_critical ("Could not setup DBus, %s\n", error->message);
+		g_error_free (error);
+	}
+}
+
+static void
+unload_module (gpointer data, gpointer user_data)
+{
+	PushModule *p_module = data;
+	p_module->shutdown (p_module->registrar);
+	g_object_unref (p_module->registrar);
+	g_module_close (p_module->module);
+	g_slice_free (PushModule, p_module);
+}
+
+
+void
+tracker_push_shutdown (void)
+{
+	PushSupportPrivate *private;
+
+	private = g_static_private_get (&private_key);
+	g_return_if_fail (private != NULL);
+
+	if (private->dbus_proxy) {
+		g_object_unref (private->dbus_proxy);
+		private->dbus_proxy = NULL;
+	}
+
+	g_list_foreach (private->modules, unload_module, NULL);
+	g_list_free (private->modules);
+	private->modules = NULL;
+
+	g_static_private_set (&private_key, NULL, NULL);
+}

Added: trunk/src/trackerd/tracker-push.h
==============================================================================
--- (empty file)
+++ trunk/src/trackerd/tracker-push.h	Thu Feb 12 15:47:13 2009
@@ -0,0 +1,45 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ *
+ * Authors:
+ *  Philip Van Hoof <philip codeminded be>
+ */
+
+#ifndef __TRACKERD_PUSH_H__
+#define __TRACKERD_PUSH_H__
+
+#if !defined (TRACKER_ENABLE_INTERNALS) && !defined (TRACKER_COMPILATION)
+#error "TRACKER_ENABLE_INTERNALS not defined, this must be defined to use tracker's internal functions"
+#endif
+
+#include <glib.h>
+#include <gmodule.h>
+#include <glib-object.h>
+#include <dbus/dbus-glib-bindings.h>
+
+#include <libtracker-common/tracker-common.h>
+
+G_BEGIN_DECLS
+
+void tracker_push_init     (TrackerConfig *config);
+void tracker_push_shutdown (void);
+
+G_END_DECLS
+
+#endif /* __TRACKERD_PUSH_H__ */



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