$NetBSD: patch-ae,v 1.1 2010/12/03 16:51:04 drochner Exp $

--- gexiv2/gexiv2-metadata.cpp.orig	2010-09-10 21:52:54.000000000 +0000
+++ gexiv2/gexiv2-metadata.cpp
@@ -380,62 +380,51 @@ gchar* gexiv2_metadata_get_date_time (GE
     g_return_val_if_fail(GEXIV2_IS_METADATA (self), NULL);
     g_return_val_if_fail(self->priv->image.get() != NULL, NULL);
     
-    Exiv2::ExifData& exif_data = self->priv->image->exifData();
-    
-    if (!exif_data.empty ()) {
-        Exiv2::ExifKey key ("Exif.Photo.DateTimeOriginal");
-        Exiv2::ExifData::iterator it = exif_data.findKey (key);
-        if (it != exif_data.end ())
-            return g_strdup (it->toString ().c_str ());
-                
-        key = Exiv2::ExifKey ("Exif.Image.DateTime");
-        it = exif_data.findKey (key);
-        if (it != exif_data.end ())
-            return g_strdup (it->toString ().c_str ());
-        
-        key = Exiv2::ExifKey ("Exif.Photo.DateTimeDigitized");
-        it = exif_data.findKey (key);
-        if (it != exif_data.end ())
-            return g_strdup (it->toString ().c_str ());
+    if (gexiv2_metadata_has_exif(self)) {
+        gchar *datetime = gexiv2_metadata_get_exif_tag_interpreted_string(self,
+            "Exif.Photo.DateTimeOriginal");;
+        if (datetime != NULL)
+            return datetime;
+        
+        datetime = gexiv2_metadata_get_exif_tag_interpreted_string(self, "Exif.Image.DateTime");
+        if (datetime != NULL)
+            return datetime;
+        
+        datetime = gexiv2_metadata_get_exif_tag_interpreted_string(self,
+            "Exif.Image.DateTimeDigitized");
+        if (datetime != NULL)
+            return datetime;
     }
     
-    Exiv2::XmpData& xmp_data = self->priv->image->xmpData();
-    
-    if (!xmp_data.empty ()) {
-        Exiv2::XmpKey key ("Xmp.exif.DateTimeOriginal");
-        Exiv2::XmpData::iterator it = xmp_data.findKey (key);
-        if (it != xmp_data.end ())
-            return g_strdup (it->toString ().c_str ());
-        
-        key = Exiv2::XmpKey ("Xmp.xmp.CreateDate");
-        it = xmp_data.findKey (key);
-        if (it != xmp_data.end ())
-            return g_strdup (it->toString ().c_str ());
-        
-        key = Exiv2::XmpKey ("Xmp.exif.DateTimeDigitized");
-        it = xmp_data.findKey (key);
-        if (it != xmp_data.end ())
-            return g_strdup (it->toString ().c_str ());
-        
-        key = Exiv2::XmpKey ("Xmp.tiff.DateTime");
-        it = xmp_data.findKey (key);
-        if (it != xmp_data.end ())
-            return g_strdup (it->toString ().c_str ());
-        
-        key = Exiv2::XmpKey ("Xmp.photoshop.DateCreated");
-        it = xmp_data.findKey (key);
-        if (it != xmp_data.end ())
-            return g_strdup (it->toString ().c_str ());
-        
-        key = Exiv2::XmpKey ("Xmp.xmp.ModifyDate");
-        it = xmp_data.findKey (key);
-        if (it != xmp_data.end ())
-            return g_strdup (it->toString ().c_str ());
-        
-        key = Exiv2::XmpKey ("Xmp.xmp.MetadataDate");
-        it = xmp_data.findKey (key);
-        if (it != xmp_data.end ())
-            return g_strdup (it->toString ().c_str ());
+    if (gexiv2_metadata_has_xmp(self)) {
+        gchar *datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, 
+            "Xmp.exif.DateTimeOriginal");
+        if (datetime != NULL)
+            return datetime;
+        
+        datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, "Xmp.xmp.CreateDate");
+        if (datetime != NULL)
+            return datetime;
+        
+        datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, "Xmp.exif.DateTimeDigitized");
+        if (datetime != NULL)
+            return datetime;
+        
+        datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, "Xmp.tiff.DateTime");
+        if (datetime != NULL)
+            return datetime;
+        
+        datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, "Xmp.photoshop.DateCreated");
+        if (datetime != NULL)
+            return datetime;
+        
+        datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, "Xmp.xmp.ModifyDate");
+        if (datetime != NULL)
+            return datetime;
+        
+        datetime = gexiv2_metadata_get_xmp_tag_interpreted_string(self, "Xmp.xmp.MetadataDate");
+        if (datetime != NULL)
+            return datetime;
     }
     
     /* FIXME: handle IPTC Date */
@@ -471,76 +460,43 @@ GExiv2Orientation gexiv2_metadata_get_or
     g_return_val_if_fail(GEXIV2_IS_METADATA (self), GEXIV2_ORIENTATION_UNSPECIFIED);
     g_return_val_if_fail(self->priv->image.get() != NULL, GEXIV2_ORIENTATION_UNSPECIFIED);
     
-    Exiv2::ExifData& exif_data = self->priv->image->exifData();
-    
-    if (!exif_data.empty ()) {
-        /* Because some camera set a wrong standard exif orientation tag,
-           We need to check makernote tags first!
-         */
-        Exiv2::ExifKey minolta_key1 ("Exif.MinoltaCs7D.Rotation");
-        Exiv2::ExifData::iterator it = exif_data.findKey (minolta_key1);
-        if (it != exif_data.end ()) {
-            switch (it->toLong ()) {
+    if (gexiv2_metadata_has_exif(self)) {
+        // Because some camera set a wrong standard exif orientation tag,
+        // We need to check makernote tags first!
+        if (gexiv2_metadata_has_exif_tag(self, "Exif.MinoltaCs7D.Rotation")) {
+            switch (gexiv2_metadata_get_exif_tag_long(self, "Exif.MinoltaCs7D.Rotation")) {
                 case 76:
                     return GEXIV2_ORIENTATION_ROT_90;
+                
                 case 82:
                     return GEXIV2_ORIENTATION_ROT_270;
-                default:
-                    return GEXIV2_ORIENTATION_NORMAL;
             }
         }
         
-        Exiv2::ExifKey minolta_key2 ("Exif.MinoltaCs5D.Rotation");
-        it = exif_data.findKey (minolta_key2);
-        if (it != exif_data.end ()) {
-            switch (it->toLong ()) {
+        if (gexiv2_metadata_has_exif_tag(self, "Exif.MinoltaCs5D.Rotation")) {
+            switch (gexiv2_metadata_get_exif_tag_long(self, "Exif.MinoltaCs5D.Rotation")) {
                 case 76:
                     return GEXIV2_ORIENTATION_ROT_90;
+                
                 case 82:
                     return GEXIV2_ORIENTATION_ROT_270;
-                default:
-                    return GEXIV2_ORIENTATION_NORMAL;
             }
         }
-    
-        Exiv2::ExifKey std_key ("Exif.Image.Orientation");
-        it = exif_data.findKey (std_key);
         
-        // TODO: This was added in response to http://trac.yorba.org/ticket/2514
-        // The user supplied a file to us with two Exif.Image.Orientation fields, one reported (the
-        // first) as zero by exiv2.  I discovered that field has a count() of zero, or is emtpy,
-        // which causes a segfault when the iterator is dereferenced.
-        //
-        // This searches for the first matching non-empty key.  A better solution would be to guard
-        // against this in all searches for all domains, but that's too much of a change for now.
-        // We'll probably need to do this for the next release.
-        while (it != exif_data.end() && it->count() == 0)
-            it++;
-        
-        if (it != exif_data.end ()) {
-            GExiv2Orientation orientation = (GExiv2Orientation) it->toLong ();
-
-            return ((orientation < GEXIV2_ORIENTATION_MIN || 
-                    orientation > GEXIV2_ORIENTATION_MAX) ?
-                    GEXIV2_ORIENTATION_UNSPECIFIED : orientation);
-        }
+        GExiv2Orientation orientation = (GExiv2Orientation) gexiv2_metadata_get_exif_tag_long(self,
+            "Exif.Image.Orientation");
+        if (orientation >= GEXIV2_ORIENTATION_MIN && orientation <= GEXIV2_ORIENTATION_MAX)
+            return orientation;
     }
     
-    Exiv2::XmpData& xmp_data = self->priv->image->xmpData();
-    
-    if (!xmp_data.empty ()) {
-        Exiv2::XmpKey tiff_width_key ("Xmp.tiff.ImageWidth");
-        Exiv2::XmpData::iterator it = xmp_data.findKey (tiff_width_key);
-        if (it != xmp_data.end ()) {
-            GExiv2Orientation orientation = (GExiv2Orientation) it->toLong ();
-
-            return ((orientation < GEXIV2_ORIENTATION_MIN || 
-                    orientation > GEXIV2_ORIENTATION_MAX) ?
-                    GEXIV2_ORIENTATION_UNSPECIFIED : orientation);
-        }
+    GExiv2Orientation orientation = GEXIV2_ORIENTATION_UNSPECIFIED;
+    if (gexiv2_metadata_has_xmp_tag(self, "Xmp.tiff.ImageWidth")) {
+        orientation = (GExiv2Orientation) gexiv2_metadata_get_xmp_tag_long(self,
+            "Xmp.tiff.ImageWidth");
     }
     
-    return GEXIV2_ORIENTATION_UNSPECIFIED;
+    return (orientation < GEXIV2_ORIENTATION_MIN || orientation > GEXIV2_ORIENTATION_MAX)
+        ? GEXIV2_ORIENTATION_UNSPECIFIED : orientation;
 }
 
 gboolean gexiv2_metadata_get_supports_exif (GExiv2Metadata *self) {
@@ -576,15 +532,8 @@ void gexiv2_metadata_set_orientation (GE
     exif_data["Exif.Image.Orientation"] = static_cast<uint16_t> (orientation);
     xmp_data["Xmp.tiff.ImageWidth"] = static_cast<uint16_t> (orientation);
     
-    Exiv2::ExifKey minolta_key1 ("Exif.MinoltaCs7D.Rotation");
-    Exiv2::ExifData::iterator it = exif_data.findKey (minolta_key1);
-    if (it != exif_data.end ())
-        exif_data.erase (it);
-    
-    Exiv2::ExifKey minolta_key2 ("Exif.MinoltaCs5D.Rotation");
-    it = exif_data.findKey (minolta_key2);
-    if (it != exif_data.end ())
-        exif_data.erase (it);
+    gexiv2_metadata_clear_exif_tag(self, "Exif.MinoltaCs7D.Rotation");
+    gexiv2_metadata_clear_exif_tag(self, "Exif.MinoltaCs5D.Rotation");
 }
 
 gint gexiv2_metadata_get_pixel_width (GExiv2Metadata *self) {
@@ -605,32 +554,20 @@ gint gexiv2_metadata_get_metadata_pixel_
     g_return_val_if_fail (GEXIV2_IS_METADATA (self), -1);
     g_return_val_if_fail(self->priv->image.get() != NULL, -1);
     
-    Exiv2::ExifData& exif_data = self->priv->image->exifData();
-    
-    if (!exif_data.empty ()) {
-        Exiv2::ExifKey pixel_dim_key ("Exif.Photo.PixelXDimension");
-        Exiv2::ExifData::iterator it = exif_data.findKey (pixel_dim_key);
-        if (it != exif_data.end ())
-            return it->toLong ();
-    
-        Exiv2::ExifKey image_width_key ("Exif.Image.ImageWidth");
-        it = exif_data.findKey (image_width_key);
-        if (it != exif_data.end ())
-            return it->toLong ();
+    if (gexiv2_metadata_has_exif(self)) {
+        if (gexiv2_metadata_has_exif_tag(self, "Exif.Photo.PixelXDimension"))
+            return gexiv2_metadata_get_exif_tag_long(self, "Exif.Photo.PixelXDimension");
+        
+        if (gexiv2_metadata_has_exif_tag(self, "Exif.Image.ImageWidth"))
+            return gexiv2_metadata_get_exif_tag_long(self, "Exif.Image.ImageWidth");
     }
     
-    Exiv2::XmpData& xmp_data = self->priv->image->xmpData();
-    
-    if (!exif_data.empty ()) {
-        Exiv2::XmpKey tiff_width_key ("Xmp.tiff.ImageWidth");
-        Exiv2::XmpData::iterator it = xmp_data.findKey (tiff_width_key);
-        if (it != xmp_data.end ())
-            return it->toLong ();
-    
-        Exiv2::XmpKey xmp_exif_key ("Xmp.exif.PixelXDimension");
-        it = xmp_data.findKey (xmp_exif_key);
-        if (it != xmp_data.end ())
-            return it->toLong ();
+    if (gexiv2_metadata_has_xmp(self)) {
+        if (gexiv2_metadata_has_xmp_tag(self, "Xmp.tiff.ImageWidth"))
+            return gexiv2_metadata_get_xmp_tag_long(self, "Xmp.tiff.ImageWidth");
+        
+        if (gexiv2_metadata_has_xmp_tag(self, "Xmp.exif.PixelXDimension"))
+            return gexiv2_metadata_get_xmp_tag_long(self, "Xmp.exif.PixelXDimension");
     }
     
     return -1;
@@ -640,32 +577,20 @@ gint gexiv2_metadata_get_metadata_pixel_
     g_return_val_if_fail (GEXIV2_IS_METADATA (self), -1);
     g_return_val_if_fail(self->priv->image.get() != NULL, -1);
     
-    Exiv2::ExifData& exif_data = self->priv->image->exifData();
-    
-    if (!exif_data.empty ()) {
-        Exiv2::ExifKey pixel_dim_key ("Exif.Photo.PixelYDimension");
-        Exiv2::ExifData::iterator it = exif_data.findKey (pixel_dim_key);
-        if (it != exif_data.end ())
-            return it->toLong ();
-    
-        Exiv2::ExifKey image_height_key ("Exif.Image.ImageHeight");
-        it = exif_data.findKey (image_height_key);
-        if (it != exif_data.end ())
-            return it->toLong ();
+    if (gexiv2_metadata_has_exif(self)) {
+        if (gexiv2_metadata_has_exif_tag(self, "Exif.Photo.PixelYDimension"))
+            return gexiv2_metadata_get_exif_tag_long(self, "Exif.Photo.PixelYDimension");
+        
+        if (gexiv2_metadata_has_exif_tag(self, "Exif.Image.ImageHeight"))
+            return gexiv2_metadata_get_exif_tag_long(self, "Exif.Image.ImageHeight");
     }
     
-    Exiv2::XmpData& xmp_data = self->priv->image->xmpData();
-    
-    if (!exif_data.empty ()) {
-        Exiv2::XmpKey tiff_height_key ("Xmp.tiff.ImageHeight");
-        Exiv2::XmpData::iterator it = xmp_data.findKey (tiff_height_key);
-        if (it != xmp_data.end ())
-            return it->toLong ();
-    
-        Exiv2::XmpKey xmp_exif_key ("Xmp.exif.PixelYDimension");
-        it = xmp_data.findKey (xmp_exif_key);
-        if (it != xmp_data.end ())
-            return it->toLong ();
+    if (gexiv2_metadata_has_xmp(self)) {
+        if (gexiv2_metadata_has_xmp_tag(self, "Xmp.tiff.ImageHeight"))
+            return gexiv2_metadata_get_xmp_tag_long(self, "Xmp.tiff.ImageHeight");
+            
+        if (gexiv2_metadata_has_xmp_tag(self, "Xmp.exif.PixelYDimension"))
+            return gexiv2_metadata_get_xmp_tag_long(self, "Xmp.exif.PixelYDimension");
     }
     
     return -1;
