diff src/exiv2.cc @ 1288:10073464e6aa

use metadata_read_* functions where possible switch exiv2 to utf8 charset support for exiv2 formatting that depends on other tags: http://dev.robotbattle.com/bugs/view.php?id=0000516
author nadvornik
date Sat, 07 Feb 2009 19:01:21 +0000
parents 8b89e3ff286b
children 91bed0d66cf2
line wrap: on
line diff
--- a/src/exiv2.cc	Fri Feb 06 23:49:03 2009 +0000
+++ b/src/exiv2.cc	Sat Feb 07 19:01:21 2009 +0000
@@ -350,6 +350,16 @@
 
 extern "C" {
 
+
+void exif_init(void)
+{
+#ifdef EXV_ENABLE_NLS
+	bind_textdomain_codeset (EXV_PACKAGE, "UTF-8");
+#endif
+}
+
+
+
 static void _ExifDataProcessed_update_xmp(gpointer key, gpointer value, gpointer data)
 {
 	exif_update_metadata((ExifData *)data, (gchar *)key, (GList *)value);
@@ -604,7 +614,7 @@
 {
 	try {
 		if (!item) return NULL;
-		return g_locale_to_utf8(((Exiv2::Metadatum *)item)->tagLabel().c_str(), -1, NULL, NULL, NULL);
+		return utf8_validate_or_convert(((Exiv2::Metadatum *)item)->tagLabel().c_str());
 	}
 	catch (std::exception& e) {
 //		std::cout << "Caught Exiv2 exception '" << e << "'\n";
@@ -678,7 +688,7 @@
 		if (!item) return NULL;
 		Exiv2::Metadatum *metadatum = (Exiv2::Metadatum *)item;
 #if EXIV2_TEST_VERSION(0,17,0)
-		return g_locale_to_utf8(metadatum->print().c_str(), -1, NULL, NULL, NULL);
+		return utf8_validate_or_convert(metadatum->print().c_str());
 #else
 		std::stringstream str;
 		Exiv2::Exifdatum *exifdatum;
@@ -695,7 +705,7 @@
 			str << *xmpdatum;
 #endif
 
-		return g_locale_to_utf8(str.str().c_str(), -1, NULL, NULL, NULL);
+		return utf8_validate_or_convert(str.str().c_str());
 #endif
 	}
 	catch (Exiv2::AnyError& e) {
@@ -720,8 +730,7 @@
 			if (pos != std::string::npos) str = str.substr(pos+1);
 			}
 
-//		return g_locale_to_utf8(str.c_str(), -1, NULL, NULL, NULL); // FIXME
-		return g_strdup(str.c_str());
+		return utf8_validate_or_convert(str.c_str());
 	}
 	catch (Exiv2::AnyError& e) {
 		return NULL;
@@ -764,7 +773,7 @@
 {
 	try {
 		Exiv2::ExifKey ekey(key);
-		return g_locale_to_utf8(Exiv2::ExifTags::tagLabel(ekey.tag(), ekey.ifdId ()), -1, NULL, NULL, NULL);
+		return utf8_validate_or_convert(Exiv2::ExifTags::tagLabel(ekey.tag(), ekey.ifdId ()));
 	}
 	catch (Exiv2::AnyError& e) {
 		std::cout << "Caught Exiv2 exception '" << e << "'\n";
@@ -875,11 +884,12 @@
 }
 
 
-static GList *exif_add_value_to_glist(GList *list, Exiv2::Metadatum &item)
+static GList *exif_add_value_to_glist(GList *list, Exiv2::Metadatum &item, MetadataFormat format, const Exiv2::ExifData *metadata)
 {
 #if EXIV2_TEST_VERSION(0,16,0)
 	Exiv2::TypeId id = item.typeId();
-	if (id == Exiv2::asciiString ||
+	if (format == METADATA_FORMATTED ||
+	    id == Exiv2::asciiString ||
 	    id == Exiv2::undefined ||
 	    id == Exiv2::string ||
 	    id == Exiv2::date ||
@@ -891,11 +901,48 @@
 		{
 #endif 
 		/* read as a single entry */
-		std::string str = item.toString();
-		if (str.length() > 5 && str.substr(0, 5) == "lang=")
+		std::string str;
+		
+		if (format == METADATA_FORMATTED)
 			{
-			std::string::size_type pos = str.find_first_of(' ');
-			if (pos != std::string::npos) str = str.substr(pos+1);
+#if EXIV2_TEST_VERSION(0,17,0)
+			str = item.print(
+#if EXIV2_TEST_VERSION(0,18,0)
+					metadata
+#endif 
+					);
+#else
+			std::stringstream stream;
+			Exiv2::Exifdatum *exifdatum;
+			Exiv2::Iptcdatum *iptcdatum;
+#if EXIV2_TEST_VERSION(0,16,0)
+			Exiv2::Xmpdatum *xmpdatum;
+#endif
+			if ((exifdatum = dynamic_cast<Exiv2::Exifdatum *>(metadatum)))
+				stream << *exifdatum;
+			else if ((iptcdatum = dynamic_cast<Exiv2::Iptcdatum *>(metadatum)))
+				stream << *iptcdatum;
+#if EXIV2_TEST_VERSION(0,16,0)
+			else if ((xmpdatum = dynamic_cast<Exiv2::Xmpdatum *>(metadatum)))
+				stream << *xmpdatum;
+#endif
+			str = stream.str();
+#endif
+			if (str.length() > 1024)
+				{
+				/* truncate very long strings, they cause problems in gui */
+				str.erase(1024);
+				str.append("...");
+				}
+			}
+		else
+			{
+			str = item.toString();
+			if (str.length() > 5 && str.substr(0, 5) == "lang=")
+				{
+				std::string::size_type pos = str.find_first_of(' ');
+				if (pos != std::string::npos) str = str.substr(pos+1);
+				}
 			}
 		list = g_list_append(list, utf8_validate_or_convert(str.c_str())); 
 #if EXIV2_TEST_VERSION(0,16,0)
@@ -911,16 +958,15 @@
 	return list;
 }
 
-static GList *exif_get_metadata_simple(ExifData *exif, const gchar *key)
+static GList *exif_get_metadata_simple(ExifData *exif, const gchar *key, MetadataFormat format)
 {
 	GList *list = NULL;
 	try {
 		try {
 			Exiv2::ExifKey ekey(key);
-			
 			Exiv2::ExifData::iterator pos = exif->exifData().findKey(ekey);
 			if (pos != exif->exifData().end())
-				list = exif_add_value_to_glist(list, *pos);
+				list = exif_add_value_to_glist(list, *pos, format, &exif->exifData());
 
 		}
 		catch (Exiv2::AnyError& e) {
@@ -930,7 +976,7 @@
 				while (pos != exif->iptcData().end())
 					{
 					if (pos->key() == key)
-						list = exif_add_value_to_glist(list, *pos);
+						list = exif_add_value_to_glist(list, *pos, format, NULL);
 					++pos;
 					}
 
@@ -940,7 +986,7 @@
 				Exiv2::XmpKey ekey(key);
 				Exiv2::XmpData::iterator pos = exif->xmpData().findKey(ekey);
 				if (pos != exif->xmpData().end())
-					list = exif_add_value_to_glist(list, *pos);
+					list = exif_add_value_to_glist(list, *pos, format, NULL);
 #endif
 			}
 		}
@@ -951,23 +997,33 @@
 	return list;
 }
 
-GList *exif_get_metadata(ExifData *exif, const gchar *key)
+GList *exif_get_metadata(ExifData *exif, const gchar *key, MetadataFormat format)
 {
 	GList *list = NULL;
-	
-	list = exif_get_metadata_simple(exif, key);
+
+	if (!key) return NULL;
+
+	if (format == METADATA_FORMATTED)
+		{
+		gchar *text;
+		gint key_valid;
+		text = exif_get_formatted_by_key(exif, key, &key_valid);
+		if (key_valid) return g_list_append(NULL, text);
+		}
+		
+	list = exif_get_metadata_simple(exif, key, format);
 	
 	/* the following code can be ifdefed out as soon as Exiv2 supports it */
 	if (!list)
 		{
 		const AltKey *alt_key = find_alt_key(key);
 		if (alt_key && alt_key->iptc_key)
-			list = exif_get_metadata_simple(exif, alt_key->iptc_key);
+			list = exif_get_metadata_simple(exif, alt_key->iptc_key, format);
 
 #if !EXIV2_TEST_VERSION(0,17,0)	
 		/* with older Exiv2 versions exif is not synced */
 		if (!list && alt_key && alt_key->exif_key)
-			list = exif_get_metadata_simple(exif, alt_key->exif_key);
+			list = exif_get_metadata_simple(exif, alt_key->exif_key, format);
 #endif
 		}
 	return list;