tracker r1987 - in branches/indexer-split: . src/trackerd



Author: mr
Date: Mon Aug  4 09:45:45 2008
New Revision: 1987
URL: http://svn.gnome.org/viewvc/tracker?rev=1987&view=rev

Log:
	* src/trackerd/tracker-daemon.c: Fixed referencing so we now
	actually finalize the daemon and the processor modules.

	* src/trackerd/tracker-marshal.list: 
	* src/trackerd/tracker-monitor.c: Added "is_directory" boolean
	to monitor events.

	* src/trackerd/tracker-processor.c: Now we create a TrackerCrawler
	for each module and we don't clean them up after the module is
	processed, we keep them around for the duration of the daemon's
	life. The reason being, we need to make sure we can call on the
	crawler for monitor event path filtering.


Modified:
   branches/indexer-split/ChangeLog
   branches/indexer-split/src/trackerd/tracker-crawler.c
   branches/indexer-split/src/trackerd/tracker-crawler.h
   branches/indexer-split/src/trackerd/tracker-daemon.c
   branches/indexer-split/src/trackerd/tracker-marshal.list
   branches/indexer-split/src/trackerd/tracker-monitor.c
   branches/indexer-split/src/trackerd/tracker-processor.c

Modified: branches/indexer-split/src/trackerd/tracker-crawler.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-crawler.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-crawler.c	Mon Aug  4 09:45:45 2008
@@ -269,14 +269,15 @@
  */
 
 static gboolean
-path_should_be_ignored (TrackerCrawler *crawler,
-			const gchar    *path,
-			gboolean        is_directory)
+is_path_ignored (TrackerCrawler *crawler,
+		 const gchar    *path,
+		 gboolean        is_directory)
 {
 	GList    *l;
 	gchar    *basename;
         gboolean  ignore;
 
+
 	if (tracker_is_empty_string (path)) {
 		return TRUE;
 	}
@@ -347,7 +348,7 @@
 
 	path = g_file_get_path (file);
 
-	if (path_should_be_ignored (crawler, path, FALSE)) {
+	if (is_path_ignored (crawler, path, FALSE)) {
 		crawler->private->files_ignored++;
 
 		g_debug ("Ignored:'%s' (%d)",
@@ -376,7 +377,7 @@
 
 	path = g_file_get_path (file);
 
-	if (path_should_be_ignored (crawler, path, TRUE)) {
+	if (is_path_ignored (crawler, path, TRUE)) {
 		crawler->private->directories_ignored++;
 
 		g_debug ("Ignored:'%s' (%d)",
@@ -861,3 +862,18 @@
 
 	priv->use_module_paths = use_paths;
 }
+
+gboolean
+tracker_crawler_is_path_ignored (TrackerCrawler *crawler,
+				 const gchar    *path,
+				 gboolean        is_directory)
+{
+	g_return_val_if_fail (TRACKER_IS_CRAWLER (crawler), TRUE);
+	
+	/* We have an internal function here we call. The reason for
+	 * this is that it is expensive to type check the Crawler
+	 * object for EVERY file we process. Internally, we don't do
+	 * that. Externally we do.
+	 */
+	return is_path_ignored (crawler, path, is_directory);
+}

Modified: branches/indexer-split/src/trackerd/tracker-crawler.h
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-crawler.h	(original)
+++ branches/indexer-split/src/trackerd/tracker-crawler.h	Mon Aug  4 09:45:45 2008
@@ -54,6 +54,9 @@
 						      const gchar    *module_name);
 gboolean        tracker_crawler_start                (TrackerCrawler *crawler);
 void            tracker_crawler_stop                 (TrackerCrawler *crawler);
+gboolean        tracker_crawler_is_path_ignored      (TrackerCrawler *crawler,
+						      const gchar    *path,
+						      gboolean        is_directory);
 
 /* Convenience API for old .cfg file */
 void            tracker_crawler_add_path             (TrackerCrawler *crawler,

Modified: branches/indexer-split/src/trackerd/tracker-daemon.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-daemon.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-daemon.c	Mon Aug  4 09:45:45 2008
@@ -143,10 +143,10 @@
 
 	dbus_g_proxy_disconnect_signal (priv->indexer_proxy, "Continued",
 					G_CALLBACK (indexer_continued_cb),
-					daemon);
+					NULL);
 	dbus_g_proxy_disconnect_signal (priv->indexer_proxy, "Paused",
 					G_CALLBACK (indexer_paused_cb),
-					daemon);
+					NULL);
 	g_object_unref (priv->indexer_proxy);
 
 	g_object_unref (priv->processor);
@@ -178,12 +178,12 @@
 
 	dbus_g_proxy_connect_signal (proxy, "Paused",
 				     G_CALLBACK (indexer_paused_cb),
-				     g_object_ref (object),
-				     (GClosureNotify) g_object_unref);
+				     object,
+				     NULL);
 	dbus_g_proxy_connect_signal (proxy, "Continued",
 				     G_CALLBACK (indexer_continued_cb),
-				     g_object_ref (object),
-				     (GClosureNotify) g_object_unref);
+				     object,
+				     NULL);
 
 	return object;
 }

Modified: branches/indexer-split/src/trackerd/tracker-marshal.list
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-marshal.list	(original)
+++ branches/indexer-split/src/trackerd/tracker-marshal.list	Mon Aug  4 09:45:45 2008
@@ -2,6 +2,7 @@
 VOID:STRING,STRING,INT,INT,INT
 VOID:STRING,STRING,STRING
 VOID:STRING,BOOLEAN,BOOLEAN,BOOLEAN,BOOLEAN,BOOLEAN,BOOLEAN
+VOID:STRING,OBJECT,BOOLEAN
 VOID:STRING,OBJECT
 
 # XESAM signals -- HitsRemoved, HitsModified

Modified: branches/indexer-split/src/trackerd/tracker-monitor.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-monitor.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-monitor.c	Mon Aug  4 09:45:45 2008
@@ -73,33 +73,36 @@
 			      G_SIGNAL_RUN_LAST,
 			      0,
 			      NULL, NULL,
-			      tracker_marshal_VOID__STRING_OBJECT,
+			      tracker_marshal_VOID__STRING_OBJECT_BOOLEAN,
 			      G_TYPE_NONE, 
-			      2,
+			      3,
 			      G_TYPE_STRING,
-			      G_TYPE_OBJECT);
+			      G_TYPE_OBJECT,
+			      G_TYPE_BOOLEAN);
 	signals[ITEM_UPDATED] = 
 		g_signal_new ("item-updated",
 			      G_TYPE_FROM_CLASS (klass),
 			      G_SIGNAL_RUN_LAST,
 			      0,
 			      NULL, NULL,
-			      tracker_marshal_VOID__STRING_OBJECT,
+			      tracker_marshal_VOID__STRING_OBJECT_BOOLEAN,
 			      G_TYPE_NONE, 
-			      2,
+			      3,
 			      G_TYPE_STRING,
-			      G_TYPE_OBJECT);
+			      G_TYPE_OBJECT,
+			      G_TYPE_BOOLEAN);
 	signals[ITEM_DELETED] = 
 		g_signal_new ("item-deleted",
 			      G_TYPE_FROM_CLASS (klass),
 			      G_SIGNAL_RUN_LAST,
 			      0,
 			      NULL, NULL,
-			      tracker_marshal_VOID__STRING_OBJECT,
+			      tracker_marshal_VOID__STRING_OBJECT_BOOLEAN,
 			      G_TYPE_NONE, 
-			      2,
+			      3,
 			      G_TYPE_STRING,
-			      G_TYPE_OBJECT);
+			      G_TYPE_OBJECT,
+			      G_TYPE_BOOLEAN);
 
 	g_type_class_add_private (object_class, sizeof (TrackerMonitorPrivate));
 }
@@ -332,6 +335,7 @@
 {
 	TrackerMonitor        *monitor;
 	TrackerMonitorPrivate *priv;
+	gboolean               is_directory = TRUE;
 	const gchar           *module_name;
 	gchar                 *str1;
 	gchar                 *str2;
@@ -365,6 +369,8 @@
 			
 			return;
 		}
+
+		is_directory = FALSE;
 	}
 
 	if (other_file) {
@@ -383,19 +389,19 @@
 	case G_FILE_MONITOR_EVENT_CHANGED:
 	case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: 
 	case G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED:
-		g_signal_emit (monitor, signals[ITEM_UPDATED], 0, module_name, file);
+		g_signal_emit (monitor, signals[ITEM_UPDATED], 0, module_name, file, is_directory);
 		break;
 
 	case G_FILE_MONITOR_EVENT_DELETED:
-		g_signal_emit (monitor, signals[ITEM_DELETED], 0, module_name, file);
+		g_signal_emit (monitor, signals[ITEM_DELETED], 0, module_name, file, is_directory);
 		break;
 
 	case G_FILE_MONITOR_EVENT_CREATED:
-		g_signal_emit (monitor, signals[ITEM_CREATED], 0, module_name, file);
+		g_signal_emit (monitor, signals[ITEM_CREATED], 0, module_name, file, is_directory);
 		break;
 
 	case G_FILE_MONITOR_EVENT_PRE_UNMOUNT:
-		g_signal_emit (monitor, signals[ITEM_DELETED], 0, module_name, file);
+		g_signal_emit (monitor, signals[ITEM_DELETED], 0, module_name, file, is_directory);
 		break;
 
 	case G_FILE_MONITOR_EVENT_UNMOUNTED:

Modified: branches/indexer-split/src/trackerd/tracker-processor.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-processor.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-processor.c	Mon Aug  4 09:45:45 2008
@@ -61,10 +61,12 @@
 	TrackerConfig  *config;
 	TrackerHal     *hal;
 	TrackerMonitor *monitor;
-	TrackerCrawler *crawler;
 
 	DBusGProxy     *indexer_proxy;
 
+	/* Crawlers */
+	GHashTable     *crawlers;
+
 	/* File queues for indexer */
 	guint           item_queues_handler_id;
 
@@ -103,6 +105,7 @@
 };
 
 static void tracker_processor_finalize      (GObject          *object);
+static void crawler_destroy_notify          (gpointer          data);
 static void item_queue_destroy_notify       (gpointer          data);
 static void process_module_next             (TrackerProcessor *processor);
 static void indexer_status_cb               (DBusGProxy       *proxy,
@@ -118,14 +121,17 @@
 static void monitor_item_created_cb         (TrackerMonitor   *monitor,
 					     const gchar      *module_name,
 					     GFile            *file,
+					     gboolean          is_directory,
 					     gpointer          user_data);
 static void monitor_item_updated_cb         (TrackerMonitor   *monitor,
 					     const gchar      *module_name,
 					     GFile            *file,
+					     gboolean          is_directory,
 					     gpointer          user_data);
 static void monitor_item_deleted_cb         (TrackerMonitor   *monitor,
 					     const gchar      *module_name,
 					     GFile            *file,
+					     gboolean          is_directory,
 					     gpointer          user_data);
 static void crawler_processing_file_cb      (TrackerCrawler   *crawler,
 					     const gchar      *module_name,
@@ -185,6 +191,16 @@
 
 	priv->modules = tracker_module_config_get_modules ();
 
+	/* For each module we create a TrackerCrawler and keep them in
+	 * a hash table to look up.
+	 */
+	priv->crawlers = 
+		g_hash_table_new_full (g_str_hash,
+				       g_str_equal,
+				       g_free,
+				       crawler_destroy_notify);
+
+
 	/* For each module we create a hash table for queues for items
 	 * to update/create/delete in the indexer. This is sent on
 	 * when the queue is processed. 
@@ -249,29 +265,20 @@
 		g_hash_table_unref (priv->items_created_queues);
 	}
 
+	if (priv->crawlers) {
+		g_hash_table_unref (priv->crawlers);
+	}
+
 	g_list_free (priv->modules);
 
 	dbus_g_proxy_disconnect_signal (priv->indexer_proxy, "Finished",
 					G_CALLBACK (indexer_finished_cb),
-					processor);
+					NULL);
 	dbus_g_proxy_disconnect_signal (priv->indexer_proxy, "Status",
 					G_CALLBACK (indexer_status_cb),
-					processor);
+					NULL);
 	g_object_unref (priv->indexer_proxy);
 
-	if (priv->crawler) {
-		g_signal_handlers_disconnect_by_func (priv->crawler,
-						      G_CALLBACK (crawler_processing_file_cb),
-						      object);
-		g_signal_handlers_disconnect_by_func (priv->crawler,
-						      G_CALLBACK (crawler_processing_directory_cb),
-						      object);
-		g_signal_handlers_disconnect_by_func (priv->crawler,
-						      G_CALLBACK (crawler_finished_cb),
-						      object);
-		g_object_unref (priv->crawler);
-	}
-
 	g_signal_handlers_disconnect_by_func (priv->monitor,
 					      G_CALLBACK (monitor_item_deleted_cb),
 					      object);
@@ -432,6 +439,47 @@
 }
 
 static void
+crawler_destroy_notify (gpointer data)
+{
+	TrackerCrawler *crawler;
+
+	crawler = TRACKER_CRAWLER (data);
+
+	if (crawler) {
+		guint signals;
+
+		signals = g_signal_handlers_disconnect_matched (crawler, 
+								G_SIGNAL_MATCH_FUNC,
+								0,
+								0,
+								NULL,
+								G_CALLBACK (crawler_processing_file_cb),
+								NULL);
+		g_return_if_fail (signals > 0);
+
+		signals = g_signal_handlers_disconnect_matched (crawler, 
+								G_SIGNAL_MATCH_FUNC,
+								0,
+								0,
+								NULL,
+								G_CALLBACK (crawler_processing_directory_cb),
+								NULL);
+		g_return_if_fail (signals > 0);
+
+		signals = g_signal_handlers_disconnect_matched (crawler, 
+								G_SIGNAL_MATCH_FUNC,
+								0,
+								0,
+								NULL,
+								G_CALLBACK (crawler_finished_cb),
+								NULL);
+		g_return_if_fail (signals > 0);
+
+		g_object_unref (crawler);
+	}
+}
+
+static void
 item_queue_destroy_notify (gpointer data)
 {
 	GQueue *queue;
@@ -626,11 +674,15 @@
 process_module_files_add_removable_media (TrackerProcessor *processor) 
 {
 	TrackerProcessorPrivate *priv;
+	TrackerCrawler          *crawler;
 	GSList                  *roots;
 	GSList                  *l;
+	const gchar             *module_name = "files";
 
 	priv = TRACKER_PROCESSOR_GET_PRIVATE (processor);
 
+	crawler = g_hash_table_lookup (priv->crawlers, module_name);
+
 #ifdef HAVE_HAL 
 	roots = tracker_hal_get_removable_device_roots (priv->hal);
 #else  /* HAVE_HAL */
@@ -651,7 +703,7 @@
 		g_message ("    %s", (gchar*) l->data);
 		
 		file = g_file_new_for_path (l->data);
-		tracker_monitor_add (priv->monitor, "files", file);
+		tracker_monitor_add (priv->monitor, module_name, file);
 		g_object_unref (file);
 	}
 
@@ -669,25 +721,29 @@
 		}
 		
 		g_message ("    %s", (gchar*) l->data);
-		tracker_crawler_add_path (priv->crawler, l->data);
+		tracker_crawler_add_path (crawler, l->data);
 	}
 
 	if (g_slist_length (roots) == 0) {
 		g_message ("    NONE");
 	}
 
-	tracker_crawler_set_use_module_paths (priv->crawler, FALSE);
+	tracker_crawler_set_use_module_paths (crawler, FALSE);
 }
 
 static void
 process_module_files_add_legacy_options (TrackerProcessor *processor) 
 {
 	TrackerProcessorPrivate *priv;
+	TrackerCrawler          *crawler;
 	GSList                  *roots;
 	GSList                  *l;
+	const gchar             *module_name = "files";
 
 	priv = TRACKER_PROCESSOR_GET_PRIVATE (processor);
 
+	crawler = g_hash_table_lookup (priv->crawlers, module_name);
+
 	/* This module get special treatment to make sure legacy
 	 * options are supported.
 	 */
@@ -699,7 +755,7 @@
 		g_message ("    %s", (gchar*) l->data);
 		
 		file = g_file_new_for_path (l->data);
-		tracker_monitor_add (priv->monitor, "files", file);
+		tracker_monitor_add (priv->monitor, module_name, file);
 		g_object_unref (file);
 	}
 
@@ -712,7 +768,7 @@
 	for (l = roots; l; l = l->next) {
 		g_message ("    %s", (gchar*) l->data);
 		
-		tracker_crawler_add_path (priv->crawler, l->data);		
+		tracker_crawler_add_path (crawler, l->data);		
 	}
 
 	if (g_slist_length (roots) == 0) {
@@ -726,6 +782,7 @@
 		gboolean          is_removable_media)
 {
 	TrackerProcessorPrivate *priv;
+	TrackerCrawler          *crawler;
 	GSList                  *disabled_modules;
 
 	priv = TRACKER_PROCESSOR_GET_PRIVATE (processor);
@@ -763,7 +820,9 @@
 	/* Gets all files and directories */
 	tracker_status_set_and_signal (TRACKER_STATUS_PENDING);
 
-	if (!tracker_crawler_start (priv->crawler)) {
+	crawler = g_hash_table_lookup (priv->crawlers, module_name);
+
+	if (!tracker_crawler_start (crawler)) {
 		/* If there is nothing to crawl, we are done, process
 		 * the next module.
 		 */
@@ -772,58 +831,6 @@
 }
 
 static void
-process_module_create_crawler (TrackerProcessor *processor,
-			       const gchar      *module_name)
-{
-	TrackerProcessorPrivate *priv;
-	TrackerCrawler          *crawler;
-
-	priv = TRACKER_PROCESSOR_GET_PRIVATE (processor);
-
-	crawler = tracker_crawler_new (priv->config,
-				       priv->hal,
-				       module_name);
-
-	g_signal_connect (crawler, "processing-file",
-			  G_CALLBACK (crawler_processing_file_cb),
-			  processor);
-	g_signal_connect (crawler, "processing-directory",
-			  G_CALLBACK (crawler_processing_directory_cb),
-			  processor);
-	g_signal_connect (crawler, "finished",
-			  G_CALLBACK (crawler_finished_cb),
-			  processor);
-
-	priv->crawler = crawler;
-}
-
-static void
-process_module_free_crawler (TrackerProcessor *processor)
-{
-	TrackerProcessorPrivate *priv;
-	TrackerCrawler          *crawler;
-
-	priv = TRACKER_PROCESSOR_GET_PRIVATE (processor);
-
-	crawler = priv->crawler;
-	priv->crawler = NULL;
-
-	if (crawler) {
-		g_signal_handlers_disconnect_by_func (crawler,
-						      G_CALLBACK (crawler_processing_file_cb),
-						      processor);
-		g_signal_handlers_disconnect_by_func (crawler,
-						      G_CALLBACK (crawler_processing_directory_cb),
-						      processor);
-		g_signal_handlers_disconnect_by_func (crawler,
-						      G_CALLBACK (crawler_finished_cb),
-						      processor);
-
-		g_object_unref (crawler);
-	}
-}
-
-static void
 process_module_next (TrackerProcessor *processor)
 {
 	TrackerProcessorPrivate *priv;
@@ -831,9 +838,6 @@
 
 	priv = TRACKER_PROCESSOR_GET_PRIVATE (processor);
 
-	/* Clean up last module's work */
-	process_module_free_crawler (processor);
-
 	/* Don't recursively iterate the modules if this function is
 	 * called, check first.
 	 */
@@ -867,7 +871,6 @@
 	}
 	
 	/* Set up new crawler for new module */
-	process_module_create_crawler (processor, module_name);
 	process_module (processor, module_name, priv->iterated_removable_media);
 }
 
@@ -983,7 +986,6 @@
 		   items_done);
 	g_free (str);
 
-
 	/* Do we even need this step Optimizing ? */
 	tracker_status_set_and_signal (TRACKER_STATUS_OPTIMIZING);
 
@@ -999,13 +1001,31 @@
 monitor_item_created_cb (TrackerMonitor *monitor,
 			 const gchar    *module_name,
 			 GFile          *file,
+ 			 gboolean        is_directory,
 			 gpointer        user_data)
 {
 	TrackerProcessorPrivate *priv;
+	TrackerCrawler          *crawler;
 	GQueue                  *queue;
+	gboolean                 ignored;
+	gchar                   *path;
 
 	priv = TRACKER_PROCESSOR_GET_PRIVATE (user_data);
 
+	path = g_file_get_path (file);
+	crawler = g_hash_table_lookup (priv->crawlers, module_name);
+	ignored = tracker_crawler_is_path_ignored (crawler, path, is_directory);
+
+	g_debug ("%s:'%s' (created monitor event)",
+		 ignored ? "Ignored" : "Found ",
+		 path);
+
+	g_free (path);
+	
+	if (ignored) {
+		return;
+	}
+
 	queue = g_hash_table_lookup (priv->items_created_queues, module_name);
 	g_queue_push_tail (queue, g_object_ref (file));
 
@@ -1016,13 +1036,31 @@
 monitor_item_updated_cb (TrackerMonitor *monitor,
 			 const gchar    *module_name,
 			 GFile          *file,
+ 			 gboolean        is_directory,
 			 gpointer        user_data)
 {
 	TrackerProcessorPrivate *priv;
+	TrackerCrawler          *crawler;
 	GQueue                  *queue;
+	gchar                   *path;
+	gboolean                 ignored;
 
 	priv = TRACKER_PROCESSOR_GET_PRIVATE (user_data);
 
+	path = g_file_get_path (file);
+	crawler = g_hash_table_lookup (priv->crawlers, module_name);
+	ignored = tracker_crawler_is_path_ignored (crawler, path, is_directory);
+
+	g_debug ("%s:'%s' (updated monitor event)",
+		 ignored ? "Ignored" : "Found ",
+		 path);
+
+	g_free (path);
+	
+	if (ignored) {
+		return;
+	}
+
 	queue = g_hash_table_lookup (priv->items_updated_queues, module_name);
 	g_queue_push_tail (queue, g_object_ref (file));
 
@@ -1033,13 +1071,31 @@
 monitor_item_deleted_cb (TrackerMonitor *monitor,
 			 const gchar    *module_name,
 			 GFile          *file,
+ 			 gboolean        is_directory,
 			 gpointer        user_data)
 {
 	TrackerProcessorPrivate *priv;
+	TrackerCrawler          *crawler;
 	GQueue                  *queue;
+	gchar                   *path;
+	gboolean                 ignored;
 
 	priv = TRACKER_PROCESSOR_GET_PRIVATE (user_data);
 
+	path = g_file_get_path (file);
+	crawler = g_hash_table_lookup (priv->crawlers, module_name);
+	ignored = tracker_crawler_is_path_ignored (crawler, path, is_directory);
+
+	g_debug ("%s:'%s' (updated monitor event)",
+		 ignored ? "Ignored" : "Found ",
+		 path);
+
+	g_free (path);
+	
+	if (ignored) {
+		return;
+	}
+
 	queue = g_hash_table_lookup (priv->items_deleted_queues, module_name);
 	g_queue_push_tail (queue, g_object_ref (file));
 
@@ -1052,7 +1108,6 @@
 			    GFile          *file,
 			    gpointer        user_data)
 {
-	
 	TrackerProcessorPrivate *priv;
 	GQueue                  *queue;
 
@@ -1071,8 +1126,8 @@
 {
 	
 	TrackerProcessorPrivate *priv;
-	gboolean                 add_monitor;
 	GQueue                  *queue;
+	gboolean                 add_monitor;
 
 	priv = TRACKER_PROCESSOR_GET_PRIVATE (user_data);
 
@@ -1089,7 +1144,6 @@
 
 	/* Add files in queue to our queues to send to the indexer */
 	queue = g_hash_table_lookup (priv->items_created_queues, module_name);
-	g_return_if_fail (queue);
 	g_queue_push_tail (queue, g_object_ref (file));
 }
 
@@ -1174,7 +1228,9 @@
 {
 	TrackerProcessor        *processor;
 	TrackerProcessorPrivate *priv;
+	TrackerCrawler          *crawler;
 	DBusGProxy              *proxy;
+	GList                   *l;
 
 	g_return_val_if_fail (TRACKER_IS_CONFIG (config), NULL);
 
@@ -1188,9 +1244,11 @@
 
 	priv = TRACKER_PROCESSOR_GET_PRIVATE (processor);
 
+	/* Set up config */
 	priv->config = g_object_ref (config);
 
 #ifdef HAVE_HAL
+	/* Set up hal */
  	priv->hal = g_object_ref (hal);
 
 	g_signal_connect (priv->hal, "mount-point-added",
@@ -1201,6 +1259,28 @@
 			  processor);
 #endif /* HAVE_HAL */
 
+	/* Set up the crawlers now we have config and hal */
+	for (l = priv->modules; l; l = l->next) {
+		crawler = tracker_crawler_new (priv->config,
+					       priv->hal,
+					       l->data);
+		
+		g_signal_connect (crawler, "processing-file",
+				  G_CALLBACK (crawler_processing_file_cb),
+				  processor);
+		g_signal_connect (crawler, "processing-directory",
+				  G_CALLBACK (crawler_processing_directory_cb),
+				  processor);
+		g_signal_connect (crawler, "finished",
+				  G_CALLBACK (crawler_finished_cb),
+				  processor);
+
+		g_hash_table_insert (priv->crawlers, 
+				     g_strdup (l->data), 
+				     crawler);
+	}
+
+	/* Set up the monitor */
 	priv->monitor = tracker_monitor_new (config);
 
 	g_signal_connect (priv->monitor, "item-created",
@@ -1221,12 +1301,12 @@
 	
 	dbus_g_proxy_connect_signal (proxy, "Status",
 				     G_CALLBACK (indexer_status_cb),
-				     g_object_ref (processor),
-				     (GClosureNotify) g_object_unref);
+				     processor,
+				     NULL);
 	dbus_g_proxy_connect_signal (proxy, "Finished",
 				     G_CALLBACK (indexer_finished_cb),
-				     g_object_ref (processor),
-				     (GClosureNotify) g_object_unref);
+				     processor,
+				     NULL);
 
 	return processor;
 }
@@ -1264,7 +1344,11 @@
 	priv = TRACKER_PROCESSOR_GET_PRIVATE (processor);
 
 	if (priv->interrupted) {
-		tracker_crawler_stop (priv->crawler);
+		TrackerCrawler *crawler;
+
+		crawler = g_hash_table_lookup (priv->crawlers, 
+					       priv->current_module->data);
+		tracker_crawler_stop (crawler);
 	}
 
 	g_message ("Process %s\n",



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