diff src/exiv2.cc @ 1211:e2bbe90b0dcd

most of the metadata options now works
author nadvornik
date Sun, 21 Dec 2008 21:20:36 +0000
parents 4742b47b75d1
children ebfd305d902e
line wrap: on
line diff
--- a/src/exiv2.cc	Sun Dec 21 16:26:03 2008 +0000
+++ b/src/exiv2.cc	Sun Dec 21 21:20:36 2008 +0000
@@ -76,7 +76,7 @@
 	{
 	}
 	
-	virtual void writeMetadata()
+	virtual void writeMetadata(gchar *path = NULL)
 	{
 		g_critical("Unsupported method of writing metadata");
 	}
@@ -254,45 +254,35 @@
 		return imageData_;
 	}
 
-	virtual void writeMetadata()
+	virtual void writeMetadata(gchar *path = NULL)
 	{
 #if EXIV2_TEST_VERSION(0,17,0)
 		syncExifWithXmp(exifData_, xmpData_);
-		copyXmpToIptc(xmpData_, iptcData_); //FIXME it should be configurable
 #endif
-		if (sidecarData_) 
+		if (!path)
 			{
-			sidecarData_->image()->setXmpData(xmpData_);
-			//Exiv2 sidecar converts xmp to exif and iptc, we don't want it.
-			sidecarData_->image()->clearExifData();
-			sidecarData_->image()->clearIptcData();
-			sidecarData_->image()->writeMetadata();
-			}
+#if EXIV2_TEST_VERSION(0,17,0)
+			if (options->metadata.save_legacy_IPTC) copyXmpToIptc(xmpData_, iptcData_);
+#endif
+			imageData_->image()->setExifData(exifData_);
+			imageData_->image()->setIptcData(iptcData_);
+			imageData_->image()->setXmpData(xmpData_);
+			imageData_->image()->writeMetadata();
+			} 
 		else
 			{
-			try 	{
-				imageData_->image()->setExifData(exifData_);
-				imageData_->image()->setIptcData(iptcData_);
-				imageData_->image()->setXmpData(xmpData_);
-				imageData_->image()->writeMetadata();
-				} 
-			catch (Exiv2::AnyError& e) 
-				{
-				// can't write into the image, create sidecar
 #if EXIV2_TEST_VERSION(0,17,0)
-				gchar *base = remove_extension_from_path(imageData_->image()->io().path().c_str());
-				gchar *pathl = g_strconcat(base, ".xmp", NULL);
+			gchar *pathl = path_from_utf8(path);;
 
-				Exiv2::Image::AutoPtr sidecar = Exiv2::ImageFactory::create(Exiv2::ImageType::xmp, pathl);
+			Exiv2::Image::AutoPtr sidecar = Exiv2::ImageFactory::create(Exiv2::ImageType::xmp, pathl);
 				
-				g_free(base);
-				g_free(pathl);
-				
-				sidecarData_ = new _ExifDataOriginal(sidecar);
-				sidecarData_->image()->setXmpData(xmpData_);
-				sidecarData_->image()->writeMetadata();
+			g_free(pathl);
+
+			sidecar->setXmpData(xmpData_);
+			sidecar->writeMetadata();
+#else
+			throw Exiv2::Error(3, "xmp");
 #endif
-				}
 			}
 	}
 	
@@ -352,15 +342,27 @@
 	
 }
 
-int exif_write(ExifData *exif)
+gboolean exif_write(ExifData *exif)
 {
 	try {
 		exif->writeMetadata();
-		return 1;
+		return TRUE;
 	}
 	catch (Exiv2::AnyError& e) {
 		std::cout << "Caught Exiv2 exception '" << e << "'\n";
-		return 0;
+		return FALSE;
+	}
+}
+
+gboolean exif_write_sidecar(ExifData *exif, gchar *path)
+{
+	try {
+		exif->writeMetadata(path);
+		return TRUE;
+	}
+	catch (Exiv2::AnyError& e) {
+		std::cout << "Caught Exiv2 exception '" << e << "'\n";
+		return FALSE;
 	}
 	
 }