[tracker/tracker-0.6] Fixes NB#110584, Image:HasKeywords working incorrectly



commit cfb4698c239686ca5ab586b30ddcaa780648937d
Author: Mikael Ottela <mikael ottela ixonos com>
Date:   Wed May 20 18:51:10 2009 +0300

    Fixes NB#110584, Image:HasKeywords working incorrectly
    Fixes NB#113083, Tracker extracts Sub-location instead of Location field.
---
 src/tracker-extract/tracker-extract-jpeg.c |    1 -
 src/tracker-extract/tracker-iptc.c         |   53 +++++++++++++++++-----------
 src/tracker-extract/tracker-xmp.c          |   13 +++++++
 3 files changed, 45 insertions(+), 22 deletions(-)

diff --git a/src/tracker-extract/tracker-extract-jpeg.c b/src/tracker-extract/tracker-extract-jpeg.c
index 647e549..6c23a28 100644
--- a/src/tracker-extract/tracker-extract-jpeg.c
+++ b/src/tracker-extract/tracker-extract-jpeg.c
@@ -396,7 +396,6 @@ extract_jpeg (const gchar *filename,
 						     tracker_escape_metadata (str));
 				g_free (str);
 				break;
-				
 			case JPEG_APP0+1:
 				str = (gchar*) marker->data;
 				len = marker->data_length;
diff --git a/src/tracker-extract/tracker-iptc.c b/src/tracker-extract/tracker-iptc.c
index 44efab7..bf76d74 100644
--- a/src/tracker-extract/tracker-iptc.c
+++ b/src/tracker-extract/tracker-iptc.c
@@ -59,7 +59,7 @@ static IptcTagType iptctags[] = {
 };
 
 static void
-metadata_append (GHashTable *metadata, gchar *key, gchar *value, gboolean append)
+metadata_append (GHashTable *metadata, gchar *key, gchar *value, gboolean append, gboolean set_additional)
 {
 	gchar   *new_value;
 	gchar   *orig;
@@ -67,45 +67,56 @@ metadata_append (GHashTable *metadata, gchar *key, gchar *value, gboolean append
 	gboolean found = FALSE;
 	guint    i;
 
-	if (append && (orig = g_hash_table_lookup (metadata, key))) {
-		gchar *escaped;
-		
-		escaped = tracker_escape_metadata (value);
+	/* Iptc is always low priority, don't overwrite */
+	if ( (orig = g_hash_table_lookup (metadata, key)) != NULL) {
+		if (append) {
+			gchar *escaped;
 
-		list = g_strsplit (orig, "|", -1);			
-		for (i=0; list[i]; i++) {
-			if (strcmp (list[i], escaped) == 0) {
-				found = TRUE;
-				break;
+			escaped = tracker_escape_metadata (value);
+
+			list = g_strsplit (orig, "|", -1);
+			for (i=0; list[i]; i++) {
+				/* Check 32 first characters (truncated) */
+				if (strncmp (list[i], escaped, 32) == 0) {
+					found = TRUE;
+					break;
+				}
 			}
-		}			
-		g_strfreev(list);
+			g_strfreev(list);
 
-		if (!found) {
-			new_value = g_strconcat (orig, "|", escaped, NULL);
-			g_hash_table_insert (metadata, g_strdup (key), new_value);
-		}
+			if (!found) {
+				new_value = g_strconcat (orig, "|", escaped, NULL);
+				g_hash_table_insert (metadata, g_strdup (key), new_value);
+			}
 
-		g_free (escaped);		
+			g_free (escaped);
+		}
 	} else {
 		new_value = tracker_escape_metadata (value);
 		g_hash_table_insert (metadata, g_strdup (key), new_value);
 
 		/* FIXME Postprocessing is evil and should be elsewhere */
-		if (strcmp (key, "Image:Keywords") == 0) {
+		if (set_additional && strcmp (key, "Image:Keywords") == 0) {
 			g_hash_table_insert (metadata,
 					     g_strdup ("Image:HasKeywords"),
 					     tracker_escape_metadata ("1"));			
 		}		
 	}
 
-	/* Adding certain fields also to keywords FIXME Postprocessing is evil */
+	/* Giving certain properties HasKeywords FIXME Postprocessing is evil */
 	if ((strcmp (key, "Image:Title") == 0) ||
 	    (strcmp (key, "Image:Description") == 0) ) {
 		g_hash_table_insert (metadata,
 				     g_strdup ("Image:HasKeywords"),
 				     tracker_escape_metadata ("1"));
 	}
+	/* Adding certain fields also to keywords */
+	if ((strcmp (key, "Image:Location") == 0) ||
+	    (strcmp (key, "Image:Sublocation") == 0) ||
+	    (strcmp (key, "Image:Country") == 0) ||
+	    (strcmp (key, "Image:City") == 0) ) {
+		metadata_append (metadata, "Image:Keywords", value, TRUE, FALSE);
+	}
 }
 
 static gchar *
@@ -148,9 +159,9 @@ tracker_read_iptc (const unsigned char *buffer,
 			iptc_dataset_get_as_str (dataset, buffer, 1024);
 			
 			if (p->post) {
-				metadata_append (metadata,p->name,(*p->post) (buffer), p->multi);
+				metadata_append (metadata,p->name,(*p->post) (buffer), p->multi, TRUE);
 			} else {
-				metadata_append (metadata, p->name, buffer, p->multi);
+				metadata_append (metadata, p->name, buffer, p->multi, TRUE);
 			}
 		}
 	}
diff --git a/src/tracker-extract/tracker-xmp.c b/src/tracker-extract/tracker-xmp.c
index 5b4a5a1..73b8696 100644
--- a/src/tracker-extract/tracker-xmp.c
+++ b/src/tracker-extract/tracker-xmp.c
@@ -397,18 +397,31 @@ tracker_xmp_iter_simple (GHashTable  *metadata,
 	else if (strcmp (schema,  NS_IPTC4XMP) == 0) {
 	        if (strcmp (name, "Location") == 0) {
 		        tracker_append_string_to_hash_table (metadata, "Image:Location", value, append, FALSE);
+
+			/* Added to the valid keywords */
+		        tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE, FALSE);
+
 		}
 		if (strcmp (name, "Sublocation") == 0) {
 		        tracker_append_string_to_hash_table (metadata, "Image:Sublocation", value, append, FALSE);
+
+			/* Added to the valid keywords */
+		        tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE, FALSE);
 		}
 	}
 	/* Photoshop scheme */
 	else if (strcmp (schema,  NS_PHOTOSHOP) == 0) {
 	        if (strcmp (name, "City") == 0) {
 		        tracker_append_string_to_hash_table (metadata, "Image:City", value, append, FALSE);
+
+			/* Added to the valid keywords */
+		        tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE, FALSE);
 		}
 		else if (strcmp (name, "Country") == 0) {
 			tracker_append_string_to_hash_table (metadata, "Image:Country", value, append, FALSE);
+
+			/* Added to the valid keywords */
+		        tracker_append_string_to_hash_table (metadata, "Image:Keywords", value, TRUE, FALSE);
 		}
 	}
 



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