diff src/exiv2.cc @ 188:0584cb78aa14

write comment and keywords to xmp, sidecars are used if exist
author nadvornik
date Sun, 16 Mar 2008 10:32:52 +0000
parents 9eafc4957f1a
children 19df9953a5d1
line wrap: on
line diff
--- a/src/exiv2.cc	Sat Mar 15 19:53:33 2008 +0000
+++ b/src/exiv2.cc	Sun Mar 16 10:32:52 2008 +0000
@@ -28,6 +28,7 @@
 
 extern "C" {
 #include <glib.h> 
+#include "gqview.h"
 #include "exif.h"
 
 }
@@ -35,36 +36,66 @@
 struct _ExifData
 {
 	Exiv2::Image::AutoPtr image;
+	Exiv2::Image::AutoPtr sidecar;
 	Exiv2::ExifData::const_iterator exifIter; /* for exif_get_next_item */
 	Exiv2::IptcData::const_iterator iptcIter; /* for exif_get_next_item */
 	Exiv2::XmpData::const_iterator xmpIter; /* for exif_get_next_item */
+	bool have_sidecar;
 
-	_ExifData(gchar *path, gint parse_color_profile)
+
+	_ExifData(gchar *path, gchar *sidecar_path, gint parse_color_profile)
 	{
+		have_sidecar = false;
 		image = Exiv2::ImageFactory::open(path);
 //		g_assert (image.get() != 0);
 		image->readMetadata();
+		
+		printf("xmp count %d\n", image->xmpData().count());
+		if (sidecar_path && image->xmpData().empty())
+			{
+			sidecar = Exiv2::ImageFactory::open(sidecar_path);
+			sidecar->readMetadata();
+			have_sidecar = sidecar->good();
+			printf("sidecar xmp count %d\n", sidecar->xmpData().count());
+			}
+		
 	}
 	
 	void writeMetadata()
 	{
+		if (have_sidecar) sidecar->writeMetadata();
 		image->writeMetadata();
 	}
 	
+	Exiv2::ExifData &exifData ()
+	{
+		return image->exifData();
+	}
+
+	Exiv2::IptcData &iptcData ()
+	{
+		return image->iptcData();
+	}
+
+	Exiv2::XmpData &xmpData ()
+	{
+		return have_sidecar ? sidecar->xmpData() : image->xmpData();
+	}
+	
 
 };
 
 extern "C" {
 
-ExifData *exif_read(gchar *path, gint parse_color_profile)
+ExifData *exif_read(gchar *path, gchar *sidecar_path, gint parse_color_profile)
 {
-	printf("exif %s\n", path);
+	printf("exif %s %s\n", path, sidecar_path ? sidecar_path : "-");
 	try {
-		return new ExifData(path, parse_color_profile);
+		return new ExifData(path, sidecar_path, parse_color_profile);
 	}
 	catch (Exiv2::AnyError& e) {
 		std::cout << "Caught Exiv2 exception '" << e << "'\n";
-		return 0;
+		return NULL;
 	}
 	
 }
@@ -95,21 +126,21 @@
 		Exiv2::Metadatum *item;
 		try {
 			Exiv2::ExifKey ekey(key);
-			Exiv2::ExifData::iterator pos = exif->image->exifData().findKey(ekey);
-			if (pos == exif->image->exifData().end()) return NULL;
+			Exiv2::ExifData::iterator pos = exif->exifData().findKey(ekey);
+			if (pos == exif->exifData().end()) return NULL;
 			item = &*pos;
 		}
 		catch (Exiv2::AnyError& e) {
 			try {
 				Exiv2::IptcKey ekey(key);
-				Exiv2::IptcData::iterator pos = exif->image->iptcData().findKey(ekey);
-				if (pos == exif->image->iptcData().end()) return NULL;
+				Exiv2::IptcData::iterator pos = exif->iptcData().findKey(ekey);
+				if (pos == exif->iptcData().end()) return NULL;
 				item = &*pos;
 			}
 			catch (Exiv2::AnyError& e) {
 				Exiv2::XmpKey ekey(key);
-				Exiv2::XmpData::iterator pos = exif->image->xmpData().findKey(ekey);
-				if (pos == exif->image->xmpData().end()) return NULL;
+				Exiv2::XmpData::iterator pos = exif->xmpData().findKey(ekey);
+				if (pos == exif->xmpData().end()) return NULL;
 				item = &*pos;
 			}
 		}
@@ -127,23 +158,23 @@
 		Exiv2::Metadatum *item;
 		try {
 			Exiv2::ExifKey ekey(key);
-			exif->image->exifData().add(ekey, NULL);
-			Exiv2::ExifData::iterator pos = exif->image->exifData().end(); // a hack, there should be a better way to get the currently added item
+			exif->exifData().add(ekey, NULL);
+			Exiv2::ExifData::iterator pos = exif->exifData().end(); // a hack, there should be a better way to get the currently added item
 			pos--;
 			item = &*pos;
 		}
 		catch (Exiv2::AnyError& e) {
 			try {
 				Exiv2::IptcKey ekey(key);
-				exif->image->iptcData().add(ekey, NULL);
-				Exiv2::IptcData::iterator pos = exif->image->iptcData().end();
+				exif->iptcData().add(ekey, NULL);
+				Exiv2::IptcData::iterator pos = exif->iptcData().end();
 				pos--;
 				item = &*pos;
 			}
 			catch (Exiv2::AnyError& e) {
 				Exiv2::XmpKey ekey(key);
-				exif->image->xmpData().add(ekey, NULL);
-				Exiv2::XmpData::iterator pos = exif->image->xmpData().end();
+				exif->xmpData().add(ekey, NULL);
+				Exiv2::XmpData::iterator pos = exif->xmpData().end();
 				pos--;
 				item = &*pos;
 			}
@@ -160,22 +191,22 @@
 ExifItem *exif_get_first_item(ExifData *exif)
 {
 	try {
-		exif->exifIter = exif->image->exifData().begin();
-		exif->iptcIter = exif->image->iptcData().begin();
-		exif->xmpIter = exif->image->xmpData().begin();
-		if (exif->exifIter != exif->image->exifData().end()) 
+		exif->exifIter = exif->exifData().begin();
+		exif->iptcIter = exif->iptcData().begin();
+		exif->xmpIter = exif->xmpData().begin();
+		if (exif->exifIter != exif->exifData().end()) 
 			{
 			const Exiv2::Metadatum *item = &*exif->exifIter;
 			exif->exifIter++;
 			return (ExifItem *)item;
 			}
-		if (exif->iptcIter != exif->image->iptcData().end()) 
+		if (exif->iptcIter != exif->iptcData().end()) 
 			{
 			const Exiv2::Metadatum *item = &*exif->iptcIter;
 			exif->iptcIter++;
 			return (ExifItem *)item;
 			}
-		if (exif->xmpIter != exif->image->xmpData().end()) 
+		if (exif->xmpIter != exif->xmpData().end()) 
 			{
 			const Exiv2::Metadatum *item = &*exif->xmpIter;
 			exif->xmpIter++;
@@ -193,19 +224,19 @@
 ExifItem *exif_get_next_item(ExifData *exif)
 {
 	try {
-		if (exif->exifIter != exif->image->exifData().end())
+		if (exif->exifIter != exif->exifData().end())
 			{
 			const Exiv2::Metadatum *item = &*exif->exifIter;
 			exif->exifIter++;
 			return (ExifItem *)item;
 		}
-		if (exif->iptcIter != exif->image->iptcData().end())
+		if (exif->iptcIter != exif->iptcData().end())
 			{
 			const Exiv2::Metadatum *item = &*exif->iptcIter;
 			exif->iptcIter++;
 			return (ExifItem *)item;
 		}
-		if (exif->xmpIter != exif->image->xmpData().end())
+		if (exif->xmpIter != exif->xmpData().end())
 			{
 			const Exiv2::Metadatum *item = &*exif->xmpIter;
 			exif->xmpIter++;
@@ -345,6 +376,26 @@
 	}
 }
 
+gchar *exif_item_get_string(ExifItem *item, int idx)
+{
+	try {
+		if (!item) return NULL;
+		Exiv2::Metadatum *em = (Exiv2::Metadatum *)item;
+		std::string str = em->toString(idx);
+		if (idx == 0 && str == "") str = em->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);
+			}
+
+		return g_strdup(str.c_str());
+	}
+	catch (Exiv2::AnyError& e) {
+		return NULL;
+	}
+}
+
 
 gint exif_item_get_integer(ExifItem *item, gint *value)
 {
@@ -403,21 +454,21 @@
 {
 	try {
 		if (!item) return 0;
-		for (Exiv2::ExifData::iterator i = exif->image->exifData().begin(); i != exif->image->exifData().end(); ++i) {
+		for (Exiv2::ExifData::iterator i = exif->exifData().begin(); i != exif->exifData().end(); ++i) {
 			if (((Exiv2::Metadatum *)item) == &*i) {
-				i = exif->image->exifData().erase(i);
+				i = exif->exifData().erase(i);
 				return 1;
 			}
 		}
-		for (Exiv2::IptcData::iterator i = exif->image->iptcData().begin(); i != exif->image->iptcData().end(); ++i) {
+		for (Exiv2::IptcData::iterator i = exif->iptcData().begin(); i != exif->iptcData().end(); ++i) {
 			if (((Exiv2::Metadatum *)item) == &*i) {
-				i = exif->image->iptcData().erase(i);
+				i = exif->iptcData().erase(i);
 				return 1;
 			}
 		}
-		for (Exiv2::XmpData::iterator i = exif->image->xmpData().begin(); i != exif->image->xmpData().end(); ++i) {
+		for (Exiv2::XmpData::iterator i = exif->xmpData().begin(); i != exif->xmpData().end(); ++i) {
 			if (((Exiv2::Metadatum *)item) == &*i) {
-				i = exif->image->xmpData().erase(i);
+				i = exif->xmpData().erase(i);
 				return 1;
 			}
 		}