[tracker] Enable/disable files availability when volumes are mounted/unmounted.



commit 5b018f47a1ceeff928025c744987547436ebf223
Author: Carlos Garnacho <carlos lanedo com>
Date:   Tue Jul 28 18:07:46 2009 +0200

    Enable/disable files availability when volumes are mounted/unmounted.
    
    There are lots of dead code to remove with this commit. This also takes into
    account volumes initialization during tracker-miner-fs startup.

 data/ontologies/90-tracker.ontology    |    7 +-
 src/tracker-miner-fs/tracker-indexer.c |  206 +++++++++++++++++++++++++++++---
 2 files changed, 195 insertions(+), 18 deletions(-)
---
diff --git a/data/ontologies/90-tracker.ontology b/data/ontologies/90-tracker.ontology
index 07eb3a1..c15cb5c 100644
--- a/data/ontologies/90-tracker.ontology
+++ b/data/ontologies/90-tracker.ontology
@@ -39,7 +39,10 @@ tracker:mountPoint a rdf:Property ;
 	rdfs:domain tracker:Volume ;
 	rdfs:range rdfs:Resource .
 
+tracker:available a rdf:Property ;
+	nrl:maxCardinality 1 ;
+        rdfs:domain nie:DataObject ;
+        rdfs:range xsd:boolean .
+
 fts: a tracker:Namespace ;
 	tracker:prefix "fts" .
-
-
diff --git a/src/tracker-miner-fs/tracker-indexer.c b/src/tracker-miner-fs/tracker-indexer.c
index f3ba724..523b033 100644
--- a/src/tracker-miner-fs/tracker-indexer.c
+++ b/src/tracker-miner-fs/tracker-indexer.c
@@ -817,6 +817,174 @@ indexer_get_property (GObject	 *object,
 }
 
 static void
+set_up_mount_point (TrackerIndexer *indexer,
+		    const gchar    *removable_device_urn,
+		    const gchar    *mount_point,
+		    gboolean        mounted)
+{
+	GString *queries;
+	GError *error = NULL;
+
+	g_debug ("Setting up mount point '%s'", removable_device_urn);
+
+	queries = g_string_new (NULL);
+
+	if (mounted) {
+		if (mount_point) {
+			GFile *file;
+			gchar *uri;
+
+			file = g_file_new_for_path (mount_point);
+			uri = g_file_get_uri (file);
+
+			g_string_append_printf (queries,
+						"INSERT { <%s> a tracker:Volume; tracker:mountPoint <%s> } ",
+						removable_device_urn, uri);
+
+			g_object_unref (file);
+			g_free (uri);
+		}
+
+		g_string_append_printf (queries,
+					"INSERT { <%s> a tracker:Volume; tracker:isMounted true } ",
+					removable_device_urn);
+
+		g_string_append_printf (queries,
+					"INSERT { ?do tracker:available true } WHERE { ?do nie:dataSource <%s> }",
+					removable_device_urn);
+	} else {
+		gchar *now;
+
+		now = tracker_date_to_string (time (NULL));
+
+		g_string_append_printf (queries,
+					"INSERT { <%s> a tracker:Volume; tracker:unmountDate \"%s\" } ",
+					removable_device_urn, now);
+
+		g_string_append_printf (queries,
+					"INSERT { <%s> a tracker:Volume; tracker:isMounted false } ",
+					removable_device_urn);
+
+		g_string_append_printf (queries,
+					"DELETE { ?do tracker:available true } WHERE { ?do nie:dataSource <%s> }",
+					removable_device_urn);
+		g_free (now);
+	}
+
+	tracker_resources_batch_sparql_update (indexer->private->client, queries->str, &error);
+	g_string_free (queries, TRUE);
+
+	if (error) {
+		g_critical ("Could not set up mount point '%s': %s",
+			    removable_device_urn, error->message);
+		g_error_free (error);
+	}
+}
+
+static void
+mount_point_added_cb (TrackerStorage *storage,
+		      const gchar    *udi,
+		      const gchar    *mount_point,
+		      gpointer        user_data)
+{
+	TrackerIndexer *indexer;
+	gchar *urn;
+
+	g_debug ("Configuring added mount point '%s'", mount_point);
+
+	indexer = TRACKER_INDEXER (user_data);
+	urn = g_strdup_printf (TRACKER_DATASOURCE_URN_PREFIX "%s", udi);
+
+	set_up_mount_point (indexer, urn, mount_point, TRUE);
+	tracker_resources_batch_commit (indexer->private->client, NULL);
+	g_free (urn);
+}
+
+static void
+mount_point_removed_cb (TrackerStorage *storage,
+			const gchar    *udi,
+			const gchar    *mount_point,
+			gpointer        user_data)
+{
+	TrackerIndexer *indexer;
+	gchar *urn;
+
+	g_debug ("Removing mount point '%s'", mount_point);
+
+	indexer = TRACKER_INDEXER (user_data);
+	urn = g_strdup_printf (TRACKER_DATASOURCE_URN_PREFIX "%s", udi);
+
+	set_up_mount_point (indexer, urn, mount_point, FALSE);
+	tracker_resources_batch_commit (indexer->private->client, NULL);
+	g_free (urn);
+}
+
+static void
+disable_all_mount_points (TrackerIndexer *indexer)
+{
+	GString *queries;
+	GError *error = NULL;
+
+	g_debug ("Disabling all mount points");
+
+	queries = g_string_new (NULL);
+
+	/* FIXME: no need to remove tracker:available for files in non removable media */
+	g_string_append (queries,
+			 "DELETE { ?do tracker:available true } WHERE { ?do nie:dataSource ?u } ");
+
+	g_string_append (queries,
+			 "DELETE { ?o tracker:isMounted ?d } WHERE { ?o tracker:isMounted ?d "
+			 "FILTER (?o != <" TRACKER_NON_REMOVABLE_MEDIA_DATASOURCE_URN ">) } ");
+
+	g_string_append (queries,
+			 "INSERT { ?o a tracker:Volume; tracker:isMounted false } WHERE { ?o a tracker:Volume "
+			 "FILTER (?o != <" TRACKER_NON_REMOVABLE_MEDIA_DATASOURCE_URN ">) }");
+
+	tracker_resources_batch_sparql_update (indexer->private->client, queries->str, &error);
+	g_string_free (queries, TRUE);
+
+	if (error) {
+		g_critical ("Could not disable all mount points: %s", error->message);
+		g_error_free (error);
+	}
+}
+
+static void
+init_mount_points (TrackerIndexer *indexer)
+{
+#ifdef HAVE_HAL
+	GList *udis, *u;
+#endif
+
+	disable_all_mount_points (indexer);
+
+	/* set up root mount point */
+	set_up_mount_point (indexer,
+			    TRACKER_NON_REMOVABLE_MEDIA_DATASOURCE_URN,
+			    NULL, TRUE);
+
+#ifdef HAVE_HAL
+	udis = tracker_storage_get_removable_device_udis (indexer->private->storage);
+
+	for (u = udis; u; u = u->next) {
+		gchar *removable_device_urn;
+		const gchar *udi, *mount_point;
+
+		udi = u->data;
+		mount_point = tracker_storage_udi_get_mount_point (indexer->private->storage, udi);
+		removable_device_urn = g_strdup_printf (TRACKER_DATASOURCE_URN_PREFIX "%s", udi);
+
+		set_up_mount_point (indexer, removable_device_urn, mount_point, TRUE);
+
+		g_free (removable_device_urn);
+	}
+
+	g_list_free (udis);
+#endif
+}
+
+static void
 indexer_constructed (GObject *object)
 {
 	TrackerIndexer *indexer;
@@ -829,6 +997,15 @@ indexer_constructed (GObject *object)
 	tracker_status_init (indexer->private->config, 
 			     indexer->private->power);
 
+#ifdef HAVE_HAL
+	g_signal_connect (indexer->private->storage, "mount-point-added",
+			  G_CALLBACK (mount_point_added_cb), indexer);
+	g_signal_connect (indexer->private->storage, "mount-point-removed",
+			  G_CALLBACK (mount_point_removed_cb), indexer);
+#endif /* HAVE_HAL */
+
+	init_mount_points (indexer);
+
 	/* Set our status as running, if this is FALSE, threads stop
 	 * doing what they do and shutdown.
 	 */
@@ -1149,6 +1326,7 @@ item_add_to_datasource (TrackerIndexer *indexer,
 {
 	GFile *file;
 	const gchar *removable_device_udi;
+	gchar *removable_device_urn;
 
 	file = tracker_module_file_get_file (module_file);
 
@@ -1160,27 +1338,23 @@ item_add_to_datasource (TrackerIndexer *indexer,
 #endif
 
 	if (removable_device_udi) {
-		gchar *removable_device_urn;
-
-		removable_device_urn = g_strdup_printf (TRACKER_DATASOURCE_URN_PREFIX "%s", 
+		removable_device_urn = g_strdup_printf (TRACKER_DATASOURCE_URN_PREFIX "%s",
 						        removable_device_udi);
+	} else {
+		removable_device_urn = g_strdup (TRACKER_NON_REMOVABLE_MEDIA_DATASOURCE_URN);
+	}
 
-		tracker_sparql_builder_subject_iri (sparql, removable_device_urn);
-		tracker_sparql_builder_predicate (sparql, "a");
-		tracker_sparql_builder_object (sparql, "tracker:Volume");
+	tracker_sparql_builder_subject_iri (sparql, uri);
+	tracker_sparql_builder_predicate (sparql, "a");
+	tracker_sparql_builder_object (sparql, "nfo:FileDataObject");
 
-		tracker_sparql_builder_predicate (sparql, "nie:dataSource");
-		tracker_sparql_builder_object_iri (sparql, removable_device_urn);
+	tracker_sparql_builder_predicate (sparql, "nie:dataSource");
+	tracker_sparql_builder_object_iri (sparql, removable_device_urn);
 
-		g_free (removable_device_urn);
-	} else {
-		tracker_sparql_builder_subject_iri (sparql, TRACKER_NON_REMOVABLE_MEDIA_DATASOURCE_URN);
-		tracker_sparql_builder_predicate (sparql, "a");
-		tracker_sparql_builder_object (sparql, "tracker:Volume");
+	tracker_sparql_builder_predicate (sparql, "tracker:available");
+	tracker_sparql_builder_object_boolean (sparql, TRUE);
 
-		tracker_sparql_builder_predicate (sparql, "nie:dataSource");
-		tracker_sparql_builder_object_iri (sparql, TRACKER_NON_REMOVABLE_MEDIA_DATASOURCE_URN);
-	}
+	g_free (removable_device_urn);
 }
 
 static void



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