2003-12-09 Lutz Mueller <lutz@users.sourceforge.net>
authorLutz Mueller <lutz.s.mueller@gmail.com>
Tue, 9 Dec 2003 19:50:00 +0000 (20:50 +0100)
committerLutz Mueller <lutz.s.mueller@gmail.com>
Tue, 9 Dec 2003 19:50:00 +0000 (20:50 +0100)
A couple of fixes by Jan Patera <patera@pictview.com>:

* libexif

ChangeLog
libexif/canon/mnote-canon-entry.c
libexif/exif-entry.c
libexif/olympus/mnote-olympus-entry.c

index 415a769..516366b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2003-12-09  Lutz Mueller <lutz@users.sourceforge.net>
+
+       A couple of fixes by Jan Patera <patera@pictview.com>:
+
+       * libexif
+
 2003-12-08  Lutz Mueller <lutz@users.sourceforge.net>
 
        Suggestion by Jan Patera <patera@pictview.com>:
index e1036e4..9804568 100644 (file)
@@ -32,6 +32,9 @@
 
 /* #define DEBUG */
 
+#undef  MIN
+#define MIN(a, b)  (((a) < (b)) ? (a) : (b))
+
 #define CF(format,target,v)                                     \
 {                                                               \
         if (format != target) {                                 \
                 break;                                                  \
         }                                                               \
 }
+#define CC2(number,t1,t2,v)                                             \
+{                                                                       \
+       if ((number != t1) && (number != t2)) {                         \
+               snprintf (v, sizeof (v),                                \
+                       _("Invalid number of components (%i, "          \
+                       "expected %i or %i)."), (int) number,           \
+                       (int) t1, (int) t2);                            \
+               break;                                                  \
+       }                                                               \
+}
 
 char *
 mnote_canon_entry_get_value (const MnoteCanonEntry *entry)
@@ -511,13 +524,13 @@ mnote_canon_entry_get_value (const MnoteCanonEntry *entry)
        case MNOTE_CANON_TAG_OWNER:
                CF (entry->format, EXIF_FORMAT_ASCII, v);
                CC (entry->components, 32, v);
-               strncpy (v,data,sizeof (v));
+               strncpy (v,data,MIN (entry->size, sizeof (v) - 1));
                break;
 
        case MNOTE_CANON_TAG_FIRMWARE:
                CF (entry->format, EXIF_FORMAT_ASCII, v);
-               CC (entry->components, 24, v);
-               strncpy (v,data,sizeof (v));
+               CC2 (entry->components, 24, 32, v);
+               strncpy (v,data,MIN (entry->size, sizeof (v) - 1));
                break;
 
        case MNOTE_CANON_TAG_IMAGE_NUMBER:
@@ -566,7 +579,7 @@ mnote_canon_entry_get_value (const MnoteCanonEntry *entry)
                        printf ("Value%d=%d\n", i, vs);
                }
                else if (entry->format == EXIF_FORMAT_ASCII)
-                       strncpy (v, data, sizeof (v));
+                   strncpy (v,data,MIN (entry->size, sizeof (v) - 1));
 #endif
                break;
         }
index 2694d05..86c985d 100644 (file)
@@ -153,6 +153,18 @@ exif_entry_get_value (ExifEntry *e)
        ExifByteOrder o;
        double d;
        ExifEntry *entry;
+       static struct {
+               char *label;
+               char major, minor;
+       } versions[] = {
+               {"0110", 1,  1},
+               {"0120", 1,  2},
+               {"0200", 2,  0},
+               {"0210", 2,  1},
+               {"0220", 2,  2},
+               {"0221", 2, 21},
+               {NULL  , 0,  0}
+       };
 
        bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
        bindtextdomain (GETTEXT_PACKAGE, LIBEXIF_LOCALEDIR);
@@ -177,26 +189,29 @@ exif_entry_get_value (ExifEntry *e)
        case EXIF_TAG_USER_COMMENT:
                CF (e->format, EXIF_FORMAT_UNDEFINED, v);
                if (e->size < 8) break;
-               strncpy (v, e->data + 8, MIN (e->size, sizeof (v) - 1));
+               strncpy (v, e->data + 8, MIN (e->size - 8, sizeof (v) - 1));
                break;
        case EXIF_TAG_EXIF_VERSION:
                CF (e->format, EXIF_FORMAT_UNDEFINED, v);
                CC (e->components, 4, v);
-               if (!memcmp (e->data, "0110", 4))
-                       strncpy (v, "Exif Version 1.1", sizeof (v) - 1);
-               else if (!memcmp (e->data, "0200", 4))
-                       strncpy (v, "Exif Version 2.0", sizeof (v) - 1);
-               else if (!memcmp (e->data, "0210", 4))
-                       strncpy (v, "Exif Version 2.1", sizeof (v) - 1);
-               else if (!memcmp (e->data, "0220", 4))
-                       strncpy (v, "Exif Version 2.2", sizeof (v) - 1);
-               else strncpy (v, _("Unknown Exif Version"), sizeof (v) - 1);
+               strncpy (v, _("Unknown Exif Version"), sizeof (v) - 1);
+               for (i = 0; versions[i].label; i++) {
+                       if (!memcmp (e->data, versions[i].label, 4)) {
+                               snprintf (v, sizeof (v) - 1,
+                                       _("Exif Version %d.%d"),
+                                       versions[i].major,
+                                       versions[i].minor);
+                               break;
+                       }
+               }
                break;
        case EXIF_TAG_FLASH_PIX_VERSION:
                CF (e->format, EXIF_FORMAT_UNDEFINED, v);
                CC (e->components, 4, v);
                if (!memcmp (e->data, "0100", 4))
-                       strncpy (v, "FlashPix Version 1.0", sizeof (v));
+                       strncpy (v, _("FlashPix Version 1.0"), sizeof (v));
+               else if (!memcmp (e->data, "0101", 4))
+                       strncpy (v, _("FlashPix Version 1.01"), sizeof (v));
                else
                        strncpy (v, _("Unknown FlashPix Version"), sizeof (v));
                break;
@@ -979,6 +994,11 @@ exif_entry_get_value (ExifEntry *e)
                                strncat (v, b, sizeof (v));
                        }
                        break;
+               case EXIF_FORMAT_DOUBLE:
+               case EXIF_FORMAT_FLOAT:
+               default:
+                       /* What to do here? */
+                       break;
                }
        }
 
index f37c40d..7a1796f 100644 (file)
@@ -66,6 +66,9 @@ mnote_olympus_entry_get_value (MnoteOlympusEntry *entry)
                return (NULL);
 
        memset (v, 0, sizeof (v));
+
+       if ((!entry->data) && (entry->components > 0)) return (strdup(v));
+
        switch (entry->tag) {
        case MNOTE_OLYMPUS_TAG_MODE:
                CF (entry->format, EXIF_FORMAT_LONG, v);