tracker r2925 - in trunk: . data/db src/plugins src/plugins/evolution src/plugins/kmail src/plugins/rss src/tracker-indexer src/trackerd
- From: pvanhoof svn gnome org
- To: svn-commits-list gnome org
- Subject: tracker r2925 - in trunk: . data/db src/plugins src/plugins/evolution src/plugins/kmail src/plugins/rss src/tracker-indexer src/trackerd
- Date: Thu, 12 Feb 2009 15:47:13 +0000 (UTC)
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]