[tracker/libtracker-miner] Fix processor/crawler so they can include/exclude files/directories



commit 83412c4779a2a1f942e6eff1a82430c42dad0e0a
Author: Martyn Russell <martyn imendio com>
Date:   Mon Aug 3 17:59:07 2009 +0100

    Fix processor/crawler so they can include/exclude files/directories

 src/libtracker-miner/tracker-crawler.c   |  120 ++++++++++++++----------------
 src/libtracker-miner/tracker-processor.c |   38 +++++----
 2 files changed, 78 insertions(+), 80 deletions(-)
---
diff --git a/src/libtracker-miner/tracker-crawler.c b/src/libtracker-miner/tracker-crawler.c
index ef24339..2ecdb8e 100644
--- a/src/libtracker-miner/tracker-crawler.c
+++ b/src/libtracker-miner/tracker-crawler.c
@@ -108,8 +108,8 @@ struct _TrackerCrawlerPrivate {
 };
 
 enum {
-	PROCESSING_DIRECTORY,
-	PROCESSING_FILE,
+	PROCESS_DIRECTORY,
+	PROCESS_FILE,
 	FINISHED,
 	LAST_SIGNAL
 };
@@ -144,24 +144,24 @@ tracker_crawler_class_init (TrackerCrawlerClass *klass)
 
 	object_class->finalize = tracker_crawler_finalize;
 
-	signals[PROCESSING_DIRECTORY] =
-		g_signal_new ("processing-directory",
+	signals[PROCESS_DIRECTORY] =
+		g_signal_new ("process-directory",
 			      G_TYPE_FROM_CLASS (klass),
 			      G_SIGNAL_RUN_LAST,
 			      0,
 			      NULL, NULL,
-			      g_cclosure_marshal_VOID__OBJECT,
-			      G_TYPE_NONE,
+			      tracker_marshal_BOOLEAN__OBJECT,
+			      G_TYPE_BOOLEAN,
 			      1,
 			      G_TYPE_OBJECT);
-	signals[PROCESSING_FILE] =
-		g_signal_new ("processing-file",
+	signals[PROCESS_FILE] =
+		g_signal_new ("process-file",
 			      G_TYPE_FROM_CLASS (klass),
 			      G_SIGNAL_RUN_LAST,
 			      0,
 			      NULL, NULL,
-			      g_cclosure_marshal_VOID__OBJECT,
-			      G_TYPE_NONE,
+			      tracker_marshal_BOOLEAN__OBJECT,
+			      G_TYPE_BOOLEAN,
 			      1,
 			      G_TYPE_OBJECT);
 	signals[FINISHED] =
@@ -400,76 +400,84 @@ static void
 add_file (TrackerCrawler *crawler,
 	  GFile		 *file)
 {
-	gchar *path;
+	g_return_if_fail (G_IS_FILE (file));
 
+	g_queue_push_tail (crawler->private->files, g_object_ref (file));
+}
+
+static void
+add_directory (TrackerCrawler *crawler,
+	       GFile	      *file,
+	       gboolean        override)
+{
 	g_return_if_fail (G_IS_FILE (file));
 
+	if (crawler->private->recurse || override) {
+		g_queue_push_tail (crawler->private->directories, g_object_ref (file));
+	}
+}
+
+static gboolean
+process_file (TrackerCrawler *crawler,
+	      GFile	     *file)
+{
+	gchar *path;
+	gboolean should_process = TRUE;
+
+	g_signal_emit (crawler, signals[PROCESS_FILE], 0, file, &should_process);
+
 	path = g_file_get_path (file);
 
-#ifdef FIX
-	if (is_path_ignored (crawler, path, FALSE)) {
-		crawler->private->files_ignored++;
+	crawler->private->files_found++;
 
-		g_debug ("Ignored:'%s' (%d)",
+	if (should_process) {
+		g_debug ("Found  :'%s' (%d)",
 			 path,
 			 crawler->private->enumerations);
-	} else
-#endif
-	{
-		crawler->private->files_found++;
 
-		g_debug ("Found  :'%s' (%d)",
+	} else {
+		g_debug ("Ignored:'%s' (%d)",
 			 path,
 			 crawler->private->enumerations);
 
-		g_queue_push_tail (crawler->private->files, g_object_ref (file));
+		crawler->private->files_ignored++;
 	}
 
 	g_free (path);
+	
+	return should_process;
 }
 
-static void
-add_directory (TrackerCrawler *crawler,
-	       GFile	      *file)
+static gboolean
+process_directory (TrackerCrawler *crawler,
+		   GFile	  *file)
 {
 	gchar *path;
+	gboolean should_process = TRUE;
 
-	g_return_if_fail (G_IS_FILE (file));
+	g_signal_emit (crawler, signals[PROCESS_DIRECTORY], 0, file, &should_process);
 
 	path = g_file_get_path (file);
 
-#ifdef FIX
-	if (is_path_ignored (crawler, path, TRUE)) {
-		crawler->private->directories_ignored++;
+	crawler->private->directories_found++;
 
-		g_debug ("Ignored:'%s' (%d)",
+	if (should_process) {
+		g_debug ("Found  :'%s' (%d)",
 			 path,
 			 crawler->private->enumerations);
-	} else 
-#endif
-	{
-		g_debug ("Found  :'%s' (%d)",
+
+		file_enumerate_children (crawler, file);
+	} else {
+		g_debug ("Ignored:'%s' (%d)",
 			 path,
 			 crawler->private->enumerations);
 
-		g_queue_push_tail (crawler->private->directories, g_object_ref (file));
+		crawler->private->directories_ignored++;
 	}
 
 	g_free (path);
-}
 
-static void
-process_file (TrackerCrawler *crawler,
-	      GFile	     *file)
-{
-	g_signal_emit (crawler, signals[PROCESSING_FILE], 0, file);
-}
-
-static void
-process_directory (TrackerCrawler *crawler,
-		   GFile	  *file)
-{
-	file_enumerate_children (crawler, file);
+	return should_process;
 }
 
 static gboolean
@@ -693,25 +701,11 @@ enumerator_data_process (EnumeratorData *ed)
 	}
 #endif
 
-	crawler->private->directories_found++;
-	g_signal_emit (crawler, signals[PROCESSING_DIRECTORY], 0, ed->parent);
-
 	g_hash_table_iter_init (&iter, ed->children);
 
 	while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &cd)) {
 		if (cd->is_dir) {
-			/* This is a bit of a hack, but we assume this is a
-			 * recursive lookup because the current non-recursive
-			 * path is NULL, meaning they have all been traversed
-			 * already.
-			 */
-#ifdef FIX
-			if (crawler->private->paths_are_done) {
-#endif
-				add_directory (crawler, cd->child);
-#ifdef FIX
-			}
-#endif
+			add_directory (crawler, cd->child, FALSE);
 		} else {
 			add_file (crawler, cd->child);
 		}
@@ -1107,7 +1101,7 @@ tracker_crawler_start (TrackerCrawler *crawler,
 	priv->idle_id = g_idle_add (process_func, crawler);
 
 	/* Start things off */
-	add_directory (crawler, file);
+	add_directory (crawler, file, TRUE);
 	g_object_unref (file);
 
 	return TRUE;
diff --git a/src/libtracker-miner/tracker-processor.c b/src/libtracker-miner/tracker-processor.c
index 32ec530..e67ea18 100644
--- a/src/libtracker-miner/tracker-processor.c
+++ b/src/libtracker-miner/tracker-processor.c
@@ -128,10 +128,10 @@ static void monitor_item_moved_cb             (TrackerMonitor   *monitor,
 					       gboolean          is_directory,
 					       gboolean          is_source_monitored,
 					       gpointer          user_data);
-static void crawler_processing_file_cb        (TrackerCrawler   *crawler,
+static gboolean crawler_process_file_cb           (TrackerCrawler   *crawler,
 					       GFile            *file,
 					       gpointer          user_data);
-static void crawler_processing_directory_cb   (TrackerCrawler   *crawler,
+static gboolean crawler_process_directory_cb      (TrackerCrawler   *crawler,
 					       GFile            *file,
 					       gpointer          user_data);
 static void crawler_finished_cb               (TrackerCrawler   *crawler,
@@ -229,14 +229,14 @@ tracker_processor_finalize (GObject *object)
 								 0,
 								 0,
 								 NULL,
-								 G_CALLBACK (crawler_processing_file_cb),
+								 G_CALLBACK (crawler_process_file_cb),
 								 NULL);
 		lsignals = g_signal_handlers_disconnect_matched (priv->crawler,
 								 G_SIGNAL_MATCH_FUNC,
 								 0,
 								 0,
 								 NULL,
-								 G_CALLBACK (crawler_processing_directory_cb),
+								 G_CALLBACK (crawler_process_directory_cb),
 								 NULL);
 		lsignals = g_signal_handlers_disconnect_matched (priv->crawler,
 								 G_SIGNAL_MATCH_FUNC,
@@ -798,7 +798,7 @@ process_files_start (TrackerProcessor *processor)
 	/* Gets all files and directories */
 	tracker_status_set_and_signal (TRACKER_STATUS_PENDING);
 
-	tracker_crawler_start (processor->private->crawler, g_get_home_dir (), TRUE);
+	tracker_crawler_start (processor->private->crawler, g_get_home_dir (), FALSE);
 }
 
 static void
@@ -1227,10 +1227,10 @@ monitor_item_moved_cb (TrackerMonitor *monitor,
 	}
 }
 
-static void
-crawler_processing_file_cb (TrackerCrawler *crawler,
-			    GFile	   *file,
-			    gpointer	    user_data)
+static gboolean
+crawler_process_file_cb (TrackerCrawler *crawler,
+			 GFile	        *file,
+			 gpointer	 user_data)
 {
 	TrackerProcessor *processor;
 
@@ -1241,12 +1241,14 @@ crawler_processing_file_cb (TrackerCrawler *crawler,
 			   g_object_ref (file));
 
 	item_queue_handlers_set_up (processor);
+
+	return TRUE;
 }
 
-static void
-crawler_processing_directory_cb (TrackerCrawler *crawler,
-				 GFile		*file,
-				 gpointer	 user_data)
+static gboolean
+crawler_process_directory_cb (TrackerCrawler *crawler,
+			      GFile	     *file,
+			      gpointer	      user_data)
 {
 	TrackerProcessor *processor;
 	gboolean	  add_monitor;
@@ -1269,6 +1271,8 @@ crawler_processing_directory_cb (TrackerCrawler *crawler,
 			   g_object_ref (file));
 
 	item_queue_handlers_set_up (processor);
+
+	return TRUE;
 }
 
 static void
@@ -1428,11 +1432,11 @@ tracker_processor_new (TrackerStorage *storage)
 	/* Set up the crawlers now we have config and hal */
 	priv->crawler = tracker_crawler_new ();
 
-	g_signal_connect (priv->crawler, "processing-file",
-			  G_CALLBACK (crawler_processing_file_cb),
+	g_signal_connect (priv->crawler, "process-file",
+			  G_CALLBACK (crawler_process_file_cb),
 			  processor);
-	g_signal_connect (priv->crawler, "processing-directory",
-			  G_CALLBACK (crawler_processing_directory_cb),
+	g_signal_connect (priv->crawler, "process-directory",
+			  G_CALLBACK (crawler_process_directory_cb),
 			  processor);
 	g_signal_connect (priv->crawler, "finished",
 			  G_CALLBACK (crawler_finished_cb),



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