Log when a subsidiary IFD (EXIF, GPS, Interoperability, thumbnail) is found
[platform/upstream/libexif.git] / libexif / exif-data.c
1 /* exif-data.c
2  *
3  * Copyright (c) 2001 Lutz Mueller <lutz@users.sourceforge.net>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 #include <config.h>
22
23 #include <libexif/exif-mnote-data.h>
24 #include <libexif/exif-data.h>
25 #include <libexif/exif-ifd.h>
26 #include <libexif/exif-mnote-data-priv.h>
27 #include <libexif/exif-utils.h>
28 #include <libexif/exif-loader.h>
29 #include <libexif/exif-log.h>
30 #include <libexif/i18n.h>
31 #include <libexif/exif-system.h>
32
33 #include <libexif/canon/exif-mnote-data-canon.h>
34 #include <libexif/fuji/exif-mnote-data-fuji.h>
35 #include <libexif/olympus/exif-mnote-data-olympus.h>
36 #include <libexif/pentax/exif-mnote-data-pentax.h>
37
38 #include <stdlib.h>
39 #include <stdio.h>
40 #include <string.h>
41
42 #if defined(__WATCOMC__) || defined(_MSC_VER)
43 #      define strncasecmp strnicmp
44 #endif
45
46 #undef JPEG_MARKER_SOI
47 #define JPEG_MARKER_SOI  0xd8
48 #undef JPEG_MARKER_APP0
49 #define JPEG_MARKER_APP0 0xe0
50 #undef JPEG_MARKER_APP1
51 #define JPEG_MARKER_APP1 0xe1
52
53 static const unsigned char ExifHeader[] = {0x45, 0x78, 0x69, 0x66, 0x00, 0x00};
54
55 struct _ExifDataPrivate
56 {
57         ExifByteOrder order;
58
59         ExifMnoteData *md;
60
61         ExifLog *log;
62         ExifMem *mem;
63
64         unsigned int ref_count;
65
66         /* Temporarily used while loading data */
67         unsigned int offset_mnote;
68
69         ExifDataOption options;
70         ExifDataType data_type;
71 };
72
73 static void *
74 exif_data_alloc (ExifData *data, unsigned int i)
75 {
76         void *d;
77
78         if (!data || !i) 
79                 return NULL;
80
81         d = exif_mem_alloc (data->priv->mem, i);
82         if (d) 
83                 return d;
84
85         EXIF_LOG_NO_MEMORY (data->priv->log, "ExifData", i);
86         return NULL;
87 }
88
89 ExifMnoteData *
90 exif_data_get_mnote_data (ExifData *d)
91 {
92         return (d && d->priv) ? d->priv->md : NULL;
93 }
94
95 ExifData *
96 exif_data_new (void)
97 {
98         ExifMem *mem = exif_mem_new_default ();
99         ExifData *d = exif_data_new_mem (mem);
100
101         exif_mem_unref (mem);
102
103         return d;
104 }
105
106 ExifData *
107 exif_data_new_mem (ExifMem *mem)
108 {
109         ExifData *data;
110         unsigned int i;
111
112         if (!mem) 
113                 return NULL;
114
115         data = exif_mem_alloc (mem, sizeof (ExifData));
116         if (!data) 
117                 return (NULL);
118         data->priv = exif_mem_alloc (mem, sizeof (ExifDataPrivate));
119         if (!data->priv) { 
120                 exif_mem_free (mem, data); 
121                 return (NULL); 
122         }
123         data->priv->ref_count = 1;
124
125         data->priv->mem = mem;
126         exif_mem_ref (mem);
127
128         for (i = 0; i < EXIF_IFD_COUNT; i++) {
129                 data->ifd[i] = exif_content_new_mem (data->priv->mem);
130                 if (!data->ifd[i]) {
131                         exif_data_free (data);
132                         return (NULL);
133                 }
134                 data->ifd[i]->parent = data;
135         }
136
137         /* Default options */
138 #ifndef NO_VERBOSE_TAG_STRINGS
139         /*
140          * When the tag list is compiled away, setting this option prevents
141          * any tags from being loaded
142          */
143         exif_data_set_option (data, EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS);
144 #endif
145         exif_data_set_option (data, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION);
146
147         /* Default data type: none */
148         exif_data_set_data_type (data, EXIF_DATA_TYPE_COUNT);
149
150         return (data);
151 }
152
153 ExifData *
154 exif_data_new_from_data (const unsigned char *data, unsigned int size)
155 {
156         ExifData *edata;
157
158         edata = exif_data_new ();
159         exif_data_load_data (edata, data, size);
160         return (edata);
161 }
162
163 static int
164 exif_data_load_data_entry (ExifData *data, ExifEntry *entry,
165                            const unsigned char *d,
166                            unsigned int size, unsigned int offset)
167 {
168         unsigned int s, doff;
169
170         entry->tag        = exif_get_short (d + offset + 0, data->priv->order);
171         entry->format     = exif_get_short (d + offset + 2, data->priv->order);
172         entry->components = exif_get_long  (d + offset + 4, data->priv->order);
173
174         /* FIXME: should use exif_tag_get_name_in_ifd here but entry->parent 
175          * has not been set yet
176          */
177         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
178                   "Loading entry 0x%x ('%s')...", entry->tag,
179                   exif_tag_get_name (entry->tag));
180
181         /* {0,1,2,4,8} x { 0x00000000 .. 0xffffffff } 
182          *   -> { 0x000000000 .. 0x7fffffff8 } */
183         s = exif_format_get_size(entry->format) * entry->components;
184         if (s < entry->components) {
185                 return 0;
186         }
187         if (0 == s)
188                 return 0;
189         /*
190          * Size? If bigger than 4 bytes, the actual data is not
191          * in the entry but somewhere else (offset).
192          */
193         if (s > 4)
194                 doff = exif_get_long (d + offset + 8, data->priv->order);
195         else
196                 doff = offset + 8;
197
198         /* Sanity checks */
199         if ((doff + s < doff) || (doff + s < s))
200                 return 0;
201         if (size < doff + s)
202                 return 0;
203
204         entry->data = exif_data_alloc (data, s);
205         if (entry->data) {
206                 entry->size = s;
207                 memcpy (entry->data, d + doff, s);
208         } else {
209                 /* FIXME: What do our callers do if (entry->data == NULL)? */
210                 EXIF_LOG_NO_MEMORY(data->priv->log, "ExifData", s);
211         }
212
213         /* If this is the MakerNote, remember the offset */
214         if (entry->tag == EXIF_TAG_MAKER_NOTE) {
215                 if (!entry->data) {
216                         exif_log (data->priv->log,
217                                                EXIF_LOG_CODE_DEBUG, "ExifData",
218                                                "MakerNote found with NULL data");       
219                 } else if (entry->size > 6) {
220                         exif_log (data->priv->log,
221                                                EXIF_LOG_CODE_DEBUG, "ExifData",
222                                                "MakerNote found (%02x %02x %02x %02x "
223                                                "%02x %02x %02x...).",
224                                                entry->data[0], entry->data[1], entry->data[2],
225                                                entry->data[3], entry->data[4], entry->data[5],
226                                                entry->data[6]);
227                 }
228                 data->priv->offset_mnote = doff;
229         }
230         return 1;
231 }
232
233 static void
234 exif_data_save_data_entry (ExifData *data, ExifEntry *e,
235                            unsigned char **d, unsigned int *ds,
236                            unsigned int offset)
237 {
238         unsigned int doff, s;
239         unsigned char *t;
240         unsigned int ts;
241
242         if (!data || !data->priv) 
243                 return;
244
245         /*
246          * Each entry is 12 bytes long. The memory for the entry has
247          * already been allocated.
248          */
249         exif_set_short (*d + 6 + offset + 0,
250                         data->priv->order, (ExifShort) e->tag);
251         exif_set_short (*d + 6 + offset + 2,
252                         data->priv->order, (ExifShort) e->format);
253
254         if (!(data->priv->options & EXIF_DATA_OPTION_DONT_CHANGE_MAKER_NOTE)) {
255                 /* If this is the maker note tag, update it. */
256                 if ((e->tag == EXIF_TAG_MAKER_NOTE) && data->priv->md) {
257                         exif_mem_free (data->priv->mem, e->data);
258                         e->data = NULL;
259                         e->size = 0;
260                         exif_mnote_data_set_offset (data->priv->md, *ds - 6);
261                         exif_mnote_data_save (data->priv->md, &e->data, &e->size);
262                         e->components = e->size;
263                 }
264         }
265
266         exif_set_long  (*d + 6 + offset + 4,
267                         data->priv->order, e->components);
268
269         /*
270          * Size? If bigger than 4 bytes, the actual data is not in
271          * the entry but somewhere else.
272          */
273         s = exif_format_get_size (e->format) * e->components;
274         if (s > 4) {
275                 doff = *ds - 6;
276                 ts = *ds + s;
277
278                 /*
279                  * According to the TIFF specification,
280                  * the offset must be an even number. If we need to introduce
281                  * a padding byte, we set it to 0.
282                  */
283                 if (s & 1)
284                         ts++;
285                 t = exif_mem_realloc (data->priv->mem, *d, ts);
286                 if (!t) {
287                         EXIF_LOG_NO_MEMORY (data->priv->log, "ExifData", ts);
288                         return;
289                 }
290                 *d = t;
291                 *ds = ts;
292                 exif_set_long (*d + 6 + offset + 8, data->priv->order, doff);
293                 if (s & 1) 
294                         *(*d + *ds - 1) = '\0';
295
296         } else
297                 doff = offset + 8;
298
299         /* Write the data. Fill unneeded bytes with 0. Do not crash with
300          * e->data is NULL */
301         if (e->data) {
302                 memcpy (*d + 6 + doff, e->data, s);
303         } else {
304                 memset (*d + 6 + doff, 0, s);
305         }
306         if (s < 4) 
307                 memset (*d + 6 + doff + s, 0, (4 - s));
308 }
309
310 static void
311 exif_data_load_data_thumbnail (ExifData *data, const unsigned char *d,
312                                unsigned int ds, ExifLong offset, ExifLong size)
313 {
314         if ((ds < offset + size) || (offset > ds)) {
315                 exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
316                           "Bogus thumbnail offset (%u) or size (%u).",
317                           offset, size);
318                 return;
319         }
320         if (data->data) 
321                 exif_mem_free (data->priv->mem, data->data);
322         data->size = size;
323         data->data = exif_data_alloc (data, data->size);
324         if (!data->data) 
325                 return;
326         memcpy (data->data, d + offset, data->size);
327 }
328
329 #undef CHECK_REC
330 #define CHECK_REC(i)                                    \
331 if ((i) == ifd) {                               \
332         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, \
333                 "ExifData", "Recursive entry in IFD "   \
334                 "'%s' detected. Skipping...",           \
335                 exif_ifd_get_name (i));                 \
336         break;                                          \
337 }                                                       \
338 if (data->ifd[(i)]->count) {                            \
339         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, \
340                 "ExifData", "Attempt to load IFD "      \
341                 "'%s' multiple times detected. "        \
342                 "Skipping...",                          \
343                 exif_ifd_get_name (i));                 \
344         break;                                          \
345 }
346
347 /*! Load data for an IFD.
348  *
349  * \param[in/out] data #ExifData
350  * \param[in] ifd IFD to load
351  * \param[in] d pointer to buffer containing raw IFD data
352  * \param[in] ds size of raw data in buffer at \c d
353  * \param[in] offset offset into buffer at \c d at which IFD starts
354  * \param[in] recursion_depth number of times this function has been
355  * recursively called without returning
356  */
357 static void
358 exif_data_load_data_content (ExifData *data, ExifIfd ifd,
359                              const unsigned char *d,
360                              unsigned int ds, unsigned int offset, unsigned int recursion_depth)
361 {
362         ExifLong o, thumbnail_offset = 0, thumbnail_length = 0;
363         ExifShort n;
364         ExifEntry *entry;
365         unsigned int i;
366         ExifTag tag;
367
368         if (!data || !data->priv) 
369                 return;
370
371         /* check for valid ExifIfd enum range */
372         if (( ((int)ifd) < 0) || ( ((int)ifd) >= EXIF_IFD_COUNT))
373           return;
374
375         if (recursion_depth > 150) {
376                 exif_log (data->priv->log, EXIF_LOG_CODE_CORRUPT_DATA, "ExifData",
377                           "Deep recursion detected!");
378                 return;
379         }
380
381         /* Read the number of entries */
382         if (offset >= ds - 1) 
383                 return;
384         n = exif_get_short (d + offset, data->priv->order);
385         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
386                   "Loading %i entries...", n);
387         offset += 2;
388
389         /* Check if we have enough data. */
390         if (offset + 12 * n > ds) 
391                 n = (ds - offset) / 12;
392
393         for (i = 0; i < n; i++) {
394
395                 tag = exif_get_short (d + offset + 12 * i, data->priv->order);
396                 switch (tag) {
397                 case EXIF_TAG_EXIF_IFD_POINTER:
398                 case EXIF_TAG_GPS_INFO_IFD_POINTER:
399                 case EXIF_TAG_INTEROPERABILITY_IFD_POINTER:
400                 case EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH:
401                 case EXIF_TAG_JPEG_INTERCHANGE_FORMAT:
402                         o = exif_get_long (d + offset + 12 * i + 8,
403                                            data->priv->order);
404                         /* FIXME: IFD_POINTER tags aren't marked as being in a
405                          * specific IFD, so exif_tag_get_name_in_ifd won't work
406                          */
407                         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
408                                   "IFD entry 0x%x at %u.", tag, o);
409                         switch (tag) {
410                         case EXIF_TAG_EXIF_IFD_POINTER:
411                                 CHECK_REC (EXIF_IFD_EXIF);
412                                 exif_data_load_data_content (data, EXIF_IFD_EXIF, d, ds, o, recursion_depth + 1);
413                                 break;
414                         case EXIF_TAG_GPS_INFO_IFD_POINTER:
415                                 CHECK_REC (EXIF_IFD_GPS);
416                                 exif_data_load_data_content (data, EXIF_IFD_GPS, d, ds, o, recursion_depth + 1);
417                                 break;
418                         case EXIF_TAG_INTEROPERABILITY_IFD_POINTER:
419                                 CHECK_REC (EXIF_IFD_INTEROPERABILITY);
420                                 exif_data_load_data_content (data, EXIF_IFD_INTEROPERABILITY, d, ds, o, recursion_depth + 1);
421                                 break;
422                         case EXIF_TAG_JPEG_INTERCHANGE_FORMAT:
423                                 thumbnail_offset = o;
424                                 if (thumbnail_offset && thumbnail_length)
425                                         exif_data_load_data_thumbnail (data, d,
426                                                                        ds, thumbnail_offset,
427                                                                        thumbnail_length);
428                                 break;
429                         case EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH:
430                                 thumbnail_length = o;
431                                 if (thumbnail_offset && thumbnail_length)
432                                         exif_data_load_data_thumbnail (data, d,
433                                                                        ds, thumbnail_offset,
434                                                                        thumbnail_length);
435                                 break;
436                         default:
437                                 return;
438                         }
439                         break;
440                 default:
441
442                         /*
443                          * If we don't know the tag, don't fail. It could be that new 
444                          * versions of the standard have defined additional tags. Note that
445                          * 0 is a valid tag in the GPS IFD.
446                          */
447                         if (!exif_tag_get_name_in_ifd (tag, ifd)) {
448
449                                 /*
450                                  * Special case: Tag and format 0. That's against specification.
451                                  * At least up to 2.2. But Photoshop writes it anyways.
452                                  */
453                                 if (!memcmp (d + offset + 12 * i, "\0\0\0\0", 4)) {
454                                         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
455                                                   "Skipping empty entry at position %i in '%s'.", i, 
456                                                   exif_ifd_get_name (ifd));
457                                         break;
458                                 }
459                                 exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
460                                           "Unknown tag 0x%04x (entry %i in '%s'). Please report this tag "
461                                           "to <libexif-devel@lists.sourceforge.net>.", tag, i,
462                                           exif_ifd_get_name (ifd));
463                                 if (data->priv->options & EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS)
464                                         break;
465                         }
466                         entry = exif_entry_new_mem (data->priv->mem);
467                         if (exif_data_load_data_entry (data, entry, d, ds,
468                                                    offset + 12 * i))
469                                 exif_content_add_entry (data->ifd[ifd], entry);
470                         exif_entry_unref (entry);
471                         break;
472                 }
473         }
474 }
475
476 static int
477 cmp_func (const unsigned char *p1, const unsigned char *p2, ExifByteOrder o)
478 {
479         ExifShort tag1 = exif_get_short (p1, o);
480         ExifShort tag2 = exif_get_short (p2, o);
481
482         return (tag1 < tag2) ? -1 : (tag1 > tag2) ? 1 : 0;
483 }
484
485 static int
486 cmp_func_intel (const void *elem1, const void *elem2)
487 {
488         return cmp_func ((const unsigned char *) elem1,
489                          (const unsigned char *) elem2, EXIF_BYTE_ORDER_INTEL);
490 }
491
492 static int
493 cmp_func_motorola (const void *elem1, const void *elem2)
494 {
495         return cmp_func ((const unsigned char *) elem1,
496                          (const unsigned char *) elem2, EXIF_BYTE_ORDER_MOTOROLA);
497 }
498
499 static void
500 exif_data_save_data_content (ExifData *data, ExifContent *ifd,
501                              unsigned char **d, unsigned int *ds,
502                              unsigned int offset)
503 {
504         unsigned int j, n_ptr = 0, n_thumb = 0;
505         ExifIfd i;
506         unsigned char *t;
507         unsigned int ts;
508
509         if (!data || !data->priv || !ifd || !d || !ds) 
510                 return;
511
512         for (i = 0; i < EXIF_IFD_COUNT; i++)
513                 if (ifd == data->ifd[i])
514                         break;
515         if (i == EXIF_IFD_COUNT)
516                 return;
517
518         /*
519          * Check if we need some extra entries for pointers or the thumbnail.
520          */
521         switch (i) {
522         case EXIF_IFD_0:
523
524                 /*
525                  * The pointer to IFD_EXIF is in IFD_0. The pointer to
526                  * IFD_INTEROPERABILITY is in IFD_EXIF.
527                  */
528                 if (data->ifd[EXIF_IFD_EXIF]->count ||
529                     data->ifd[EXIF_IFD_INTEROPERABILITY]->count)
530                         n_ptr++;
531
532                 /* The pointer to IFD_GPS is in IFD_0. */
533                 if (data->ifd[EXIF_IFD_GPS]->count)
534                         n_ptr++;
535
536                 break;
537         case EXIF_IFD_1:
538                 if (data->size)
539                         n_thumb = 2;
540                 break;
541         case EXIF_IFD_EXIF:
542                 if (data->ifd[EXIF_IFD_INTEROPERABILITY]->count)
543                         n_ptr++;
544         default:
545                 break;
546         }
547
548         /*
549          * Allocate enough memory for all entries
550          * and the number of entries.
551          */
552         ts = *ds + (2 + (ifd->count + n_ptr + n_thumb) * 12 + 4);
553         t = exif_mem_realloc (data->priv->mem, *d, ts);
554         if (!t) {
555                 EXIF_LOG_NO_MEMORY (data->priv->log, "ExifData", ts);
556                 return;
557         }
558         *d = t;
559         *ds = ts;
560
561         /* Save the number of entries */
562         exif_set_short (*d + 6 + offset, data->priv->order,
563                         (ExifShort) (ifd->count + n_ptr + n_thumb));
564         offset += 2;
565
566         /*
567          * Save each entry. Make sure that no memcpys from NULL pointers are
568          * performed
569          */
570         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
571                   "Saving %i entries (IFD '%s', offset: %i)...",
572                   ifd->count, exif_ifd_get_name (i), offset);
573         for (j = 0; j < ifd->count; j++) {
574                 if (ifd->entries[j]) {
575                         exif_data_save_data_entry (data, ifd->entries[j], d, ds,
576                                 offset + 12 * j);
577                 }
578         }
579
580         offset += 12 * ifd->count;
581
582         /* Now save special entries. */
583         switch (i) {
584         case EXIF_IFD_0:
585
586                 /*
587                  * The pointer to IFD_EXIF is in IFD_0.
588                  * However, the pointer to IFD_INTEROPERABILITY is in IFD_EXIF,
589                  * therefore, if IFD_INTEROPERABILITY is not empty, we need
590                  * IFD_EXIF even if latter is empty.
591                  */
592                 if (data->ifd[EXIF_IFD_EXIF]->count ||
593                     data->ifd[EXIF_IFD_INTEROPERABILITY]->count) {
594                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
595                                         EXIF_TAG_EXIF_IFD_POINTER);
596                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
597                                         EXIF_FORMAT_LONG);
598                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
599                                         1);
600                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
601                                         *ds - 6);
602                         exif_data_save_data_content (data,
603                                                      data->ifd[EXIF_IFD_EXIF], d, ds, *ds - 6);
604                         offset += 12;
605                 }
606
607                 /* The pointer to IFD_GPS is in IFD_0, too. */
608                 if (data->ifd[EXIF_IFD_GPS]->count) {
609                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
610                                         EXIF_TAG_GPS_INFO_IFD_POINTER);
611                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
612                                         EXIF_FORMAT_LONG);
613                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
614                                         1);
615                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
616                                         *ds - 6);
617                         exif_data_save_data_content (data,
618                                                      data->ifd[EXIF_IFD_GPS], d, ds, *ds - 6);
619                         offset += 12;
620                 }
621
622                 break;
623         case EXIF_IFD_EXIF:
624
625                 /*
626                  * The pointer to IFD_INTEROPERABILITY is in IFD_EXIF.
627                  * See note above.
628                  */
629                 if (data->ifd[EXIF_IFD_INTEROPERABILITY]->count) {
630                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
631                                         EXIF_TAG_INTEROPERABILITY_IFD_POINTER);
632                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
633                                         EXIF_FORMAT_LONG);
634                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
635                                         1);
636                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
637                                         *ds - 6);
638                         exif_data_save_data_content (data,
639                                                      data->ifd[EXIF_IFD_INTEROPERABILITY], d, ds,
640                                                      *ds - 6);
641                         offset += 12;
642                 }
643
644                 break;
645         case EXIF_IFD_1:
646
647                 /*
648                  * Information about the thumbnail (if any) is saved in
649                  * IFD_1.
650                  */
651                 if (data->size) {
652
653                         /* EXIF_TAG_JPEG_INTERCHANGE_FORMAT */
654                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
655                                         EXIF_TAG_JPEG_INTERCHANGE_FORMAT);
656                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
657                                         EXIF_FORMAT_LONG);
658                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
659                                         1);
660                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
661                                         *ds - 6);
662                         ts = *ds + data->size;
663                         t = exif_mem_realloc (data->priv->mem, *d, ts);
664                         if (!t) {
665                                 EXIF_LOG_NO_MEMORY (data->priv->log, "ExifData",
666                                                     ts);
667                                 return;
668                         }
669                         *d = t;
670                         *ds = ts;
671                         memcpy (*d + *ds - data->size, data->data, data->size);
672                         offset += 12;
673
674                         /* EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH */
675                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
676                                         EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH);
677                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
678                                         EXIF_FORMAT_LONG);
679                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
680                                         1);
681                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
682                                         data->size);
683                         offset += 12;
684                 }
685
686                 break;
687         default:
688                 break;
689         }
690
691         /* Sort the directory according to TIFF specification */
692         qsort (*d + 6 + offset - (ifd->count + n_ptr + n_thumb) * 12,
693                (ifd->count + n_ptr + n_thumb), 12,
694                (data->priv->order == EXIF_BYTE_ORDER_INTEL) ? cmp_func_intel : cmp_func_motorola);
695
696         /* Correctly terminate the directory */
697         if (i == EXIF_IFD_0 && (data->ifd[EXIF_IFD_1]->count ||
698                                 data->size)) {
699
700                 /*
701                  * We are saving IFD 0. Tell where IFD 1 starts and save
702                  * IFD 1.
703                  */
704                 exif_set_long (*d + 6 + offset, data->priv->order, *ds - 6);
705                 exif_data_save_data_content (data, data->ifd[EXIF_IFD_1], d, ds,
706                                              *ds - 6);
707         } else
708                 exif_set_long (*d + 6 + offset, data->priv->order, 0);
709 }
710
711 typedef enum {
712         EXIF_DATA_TYPE_MAKER_NOTE_NONE          = 0,
713         EXIF_DATA_TYPE_MAKER_NOTE_CANON         = 1,
714         EXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS       = 2,
715         EXIF_DATA_TYPE_MAKER_NOTE_PENTAX                = 3,
716         EXIF_DATA_TYPE_MAKER_NOTE_NIKON         = 4,
717         EXIF_DATA_TYPE_MAKER_NOTE_CASIO         = 5,
718         EXIF_DATA_TYPE_MAKER_NOTE_FUJI          = 6
719 } ExifDataTypeMakerNote;
720
721 static ExifDataTypeMakerNote
722 exif_data_get_type_maker_note (ExifData *d)
723 {
724         ExifEntry *e, *em;
725         char value[1024];
726
727         if (!d) 
728                 return EXIF_DATA_TYPE_MAKER_NOTE_NONE;
729         
730         e = exif_data_get_entry (d, EXIF_TAG_MAKER_NOTE);
731         if (!e) 
732                 return EXIF_DATA_TYPE_MAKER_NOTE_NONE;
733
734         /* Olympus & Nikon & Sanyo */
735         if ((e->size >= 8) && ( !memcmp (e->data, "OLYMP", 6) ||
736                                 !memcmp (e->data, "OLYMPUS", 8) ||
737                                 !memcmp (e->data, "SANYO", 6) ||
738                                 !memcmp (e->data, "Nikon", 6)))
739                 return EXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS;
740
741         em = exif_data_get_entry (d, EXIF_TAG_MAKE);
742         if (!em) 
743                 return EXIF_DATA_TYPE_MAKER_NOTE_NONE;
744
745         /* Canon */
746         if (!strcmp (exif_entry_get_value (em, value, sizeof (value)), "Canon"))
747                 return EXIF_DATA_TYPE_MAKER_NOTE_CANON;
748
749         /* Pentax & some variant of Nikon */
750         if ((e->size >= 2) && (e->data[0] == 0x00) && (e->data[1] == 0x1b)) {
751                 if (!strncasecmp (
752                             exif_entry_get_value (em, value, sizeof(value)),
753                             "Nikon", 5))
754                         return EXIF_DATA_TYPE_MAKER_NOTE_NIKON;
755                 else
756                         return EXIF_DATA_TYPE_MAKER_NOTE_PENTAX;
757         }
758         if ((e->size >= 8) && !memcmp (e->data, "AOC", 4)) {
759                 return EXIF_DATA_TYPE_MAKER_NOTE_PENTAX;
760         }
761         if ((e->size >= 8) && !memcmp (e->data, "QVC", 4)) {
762                 return EXIF_DATA_TYPE_MAKER_NOTE_CASIO;
763         }
764         if ((e->size >= 12) && !memcmp (e->data, "FUJIFILM", 8)) {
765                 return EXIF_DATA_TYPE_MAKER_NOTE_FUJI;
766         }
767
768         return EXIF_DATA_TYPE_MAKER_NOTE_NONE;
769 }
770
771 #define LOG_TOO_SMALL \
772 exif_log (data->priv->log, EXIF_LOG_CODE_CORRUPT_DATA, "ExifData", \
773                 _("Size of data too small to allow for EXIF data."));
774
775 void
776 exif_data_load_data (ExifData *data, const unsigned char *d_orig,
777                      unsigned int ds_orig)
778 {
779         unsigned int l;
780         ExifLong offset;
781         ExifShort n;
782         const unsigned char *d = d_orig;
783         unsigned int ds = ds_orig, len;
784
785         if (!data || !data->priv || !d || !ds) 
786                 return;
787
788         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
789                   "Parsing %i byte(s) EXIF data...\n", ds);
790
791         /*
792          * It can be that the data starts with the EXIF header. If it does
793          * not, search the EXIF marker.
794          */
795         if (ds < 6) {
796                 LOG_TOO_SMALL;
797                 return;
798         }
799         if (!memcmp (d, ExifHeader, 6)) {
800                 exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
801                           "Found EXIF header.");
802         } else {
803                 while (1) {
804                         while ((d[0] == 0xff) && ds) {
805                                 d++;
806                                 ds--;
807                         }
808
809                         /* JPEG_MARKER_SOI */
810                         if (d[0] == JPEG_MARKER_SOI) {
811                                 d++;
812                                 ds--;
813                                 continue;
814                         }
815
816                         /* JPEG_MARKER_APP0 */
817                         if (d[0] == JPEG_MARKER_APP0) {
818                                 d++;
819                                 ds--;
820                                 l = (d[0] << 8) | d[1];
821                                 if (l > ds)
822                                         return;
823                                 d += l;
824                                 ds -= l;
825                                 continue;
826                         }
827
828                         /* JPEG_MARKER_APP1 */
829                         if (d[0] == JPEG_MARKER_APP1)
830                                 break;
831
832                         /* Unknown marker or data. Give up. */
833                         exif_log (data->priv->log, EXIF_LOG_CODE_CORRUPT_DATA,
834                                   "ExifData", _("EXIF marker not found."));
835                         return;
836                 }
837                 d++;
838                 ds--;
839                 if (ds < 2) {
840                         LOG_TOO_SMALL;
841                         return;
842                 }
843                 len = (d[0] << 8) | d[1];
844                 exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
845                           "We have to deal with %i byte(s) of EXIF data.",
846                           len);
847                 d += 2;
848                 ds -= 2;
849         }
850
851         /*
852          * Verify the exif header
853          * (offset 2, length 6).
854          */
855         if (ds < 6) {
856                 LOG_TOO_SMALL;
857                 return;
858         }
859         if (memcmp (d, ExifHeader, 6)) {
860                 exif_log (data->priv->log, EXIF_LOG_CODE_CORRUPT_DATA,
861                           "ExifData", _("EXIF header not found."));
862                 return;
863         }
864
865         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
866                   "Found EXIF header.");
867
868         /* Byte order (offset 6, length 2) */
869         if (ds < 14)
870                 return;
871         if (!memcmp (d + 6, "II", 2))
872                 data->priv->order = EXIF_BYTE_ORDER_INTEL;
873         else if (!memcmp (d + 6, "MM", 2))
874                 data->priv->order = EXIF_BYTE_ORDER_MOTOROLA;
875         else {
876                 exif_log (data->priv->log, EXIF_LOG_CODE_CORRUPT_DATA,
877                           "ExifData", _("Unknown encoding."));
878                 return;
879         }
880
881         /* Fixed value */
882         if (exif_get_short (d + 8, data->priv->order) != 0x002a)
883                 return;
884
885         /* IFD 0 offset */
886         offset = exif_get_long (d + 10, data->priv->order);
887         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData", 
888                   "IFD 0 at %i.", (int) offset);
889
890         /* Parse the actual exif data (usually offset 14 from start) */
891         exif_data_load_data_content (data, EXIF_IFD_0, d + 6, ds - 6, offset, 0);
892
893         /* IFD 1 offset */
894         if (offset + 6 + 2 > ds) {
895                 return;
896         }
897         n = exif_get_short (d + 6 + offset, data->priv->order);
898         if (offset + 6 + 2 + 12 * n + 4 > ds) {
899                 return;
900         }
901         offset = exif_get_long (d + 6 + offset + 2 + 12 * n, data->priv->order);
902         if (offset) {
903                 exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
904                           "IFD 1 at %i.", (int) offset);
905
906                 /* Sanity check. */
907                 if (offset > ds - 6) {
908                         exif_log (data->priv->log, EXIF_LOG_CODE_CORRUPT_DATA,
909                                   "ExifData", "Bogus offset of IFD1.");
910                 } else {
911                    exif_data_load_data_content (data, EXIF_IFD_1, d + 6, ds - 6, offset, 0);
912                 }
913         }
914
915         /*
916          * If we got an EXIF_TAG_MAKER_NOTE, try to interpret it. Some
917          * cameras use pointers in the maker note tag that point to the
918          * space between IFDs. Here is the only place where we have access
919          * to that data.
920          */
921         switch (exif_data_get_type_maker_note (data)) {
922         case EXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS:
923         case EXIF_DATA_TYPE_MAKER_NOTE_NIKON:
924                 data->priv->md = exif_mnote_data_olympus_new (data->priv->mem);
925                 break;
926         case EXIF_DATA_TYPE_MAKER_NOTE_PENTAX:
927         case EXIF_DATA_TYPE_MAKER_NOTE_CASIO:
928                 data->priv->md = exif_mnote_data_pentax_new (data->priv->mem);
929                 break;
930         case EXIF_DATA_TYPE_MAKER_NOTE_CANON:
931                 data->priv->md = exif_mnote_data_canon_new (data->priv->mem, data->priv->options);
932                 break;
933         case EXIF_DATA_TYPE_MAKER_NOTE_FUJI:
934                 data->priv->md = exif_mnote_data_fuji_new (data->priv->mem);
935                 break;
936         default:
937                 break;
938         }
939
940         /* 
941          * If we are able to interpret the maker note, do so.
942          */
943         if (data->priv->md) {
944                 exif_mnote_data_log (data->priv->md, data->priv->log);
945                 exif_mnote_data_set_byte_order (data->priv->md,
946                                                 data->priv->order);
947                 exif_mnote_data_set_offset (data->priv->md,
948                                             data->priv->offset_mnote);
949                 exif_mnote_data_load (data->priv->md, d, ds);
950         }
951
952         if (data->priv->options & EXIF_DATA_OPTION_FOLLOW_SPECIFICATION)
953                 exif_data_fix (data);
954 }
955
956 void
957 exif_data_save_data (ExifData *data, unsigned char **d, unsigned int *ds)
958 {
959         if (ds)
960                 *ds = 0;        /* This means something went wrong */
961
962         if (!data || !d || !ds)
963                 return;
964
965         /* Header */
966         *ds = 14;
967         *d = exif_data_alloc (data, *ds);
968         if (!*d)  {
969                 *ds = 0;
970                 return;
971         }
972         memcpy (*d, ExifHeader, 6);
973
974         /* Order (offset 6) */
975         if (data->priv->order == EXIF_BYTE_ORDER_INTEL) {
976                 memcpy (*d + 6, "II", 2);
977         } else {
978                 memcpy (*d + 6, "MM", 2);
979         }
980
981         /* Fixed value (2 bytes, offset 8) */
982         exif_set_short (*d + 8, data->priv->order, 0x002a);
983
984         /*
985          * IFD 0 offset (4 bytes, offset 10).
986          * We will start 8 bytes after the
987          * EXIF header (2 bytes for order, another 2 for the test, and
988          * 4 bytes for the IFD 0 offset make 8 bytes together).
989          */
990         exif_set_long (*d + 10, data->priv->order, 8);
991
992         /* Now save IFD 0. IFD 1 will be saved automatically. */
993         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
994                   "Saving IFDs...");
995         exif_data_save_data_content (data, data->ifd[EXIF_IFD_0], d, ds,
996                                      *ds - 6);
997         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, "ExifData",
998                   "Saved %i byte(s) EXIF data.", *ds);
999 }
1000
1001 ExifData *
1002 exif_data_new_from_file (const char *path)
1003 {
1004         ExifData *edata;
1005         ExifLoader *loader;
1006
1007         loader = exif_loader_new ();
1008         exif_loader_write_file (loader, path);
1009         edata = exif_loader_get_data (loader);
1010         exif_loader_unref (loader);
1011
1012         return (edata);
1013 }
1014
1015 void
1016 exif_data_ref (ExifData *data)
1017 {
1018         if (!data)
1019                 return;
1020
1021         data->priv->ref_count++;
1022 }
1023
1024 void
1025 exif_data_unref (ExifData *data)
1026 {
1027         if (!data) 
1028                 return;
1029
1030         data->priv->ref_count--;
1031         if (!data->priv->ref_count) 
1032                 exif_data_free (data);
1033 }
1034
1035 void
1036 exif_data_free (ExifData *data)
1037 {
1038         unsigned int i;
1039         ExifMem *mem = (data && data->priv) ? data->priv->mem : NULL;
1040
1041         if (!data) 
1042                 return;
1043
1044         for (i = 0; i < EXIF_IFD_COUNT; i++) {
1045                 if (data->ifd[i]) {
1046                         exif_content_unref (data->ifd[i]);
1047                         data->ifd[i] = NULL;
1048                 }
1049         }
1050
1051         if (data->data) {
1052                 exif_mem_free (mem, data->data);
1053                 data->data = NULL;
1054         }
1055
1056         if (data->priv) {
1057                 if (data->priv->log) {
1058                         exif_log_unref (data->priv->log);
1059                         data->priv->log = NULL;
1060                 }
1061                 if (data->priv->md) {
1062                         exif_mnote_data_unref (data->priv->md);
1063                         data->priv->md = NULL;
1064                 }
1065                 exif_mem_free (mem, data->priv);
1066                 exif_mem_free (mem, data);
1067         }
1068
1069         exif_mem_unref (mem);
1070 }
1071
1072 void
1073 exif_data_dump (ExifData *data)
1074 {
1075         unsigned int i;
1076
1077         if (!data)
1078                 return;
1079
1080         for (i = 0; i < EXIF_IFD_COUNT; i++) {
1081                 if (data->ifd[i] && data->ifd[i]->count) {
1082                         printf ("Dumping IFD '%s'...\n",
1083                                 exif_ifd_get_name (i));
1084                         exif_content_dump (data->ifd[i], 0);
1085                 }
1086         }
1087
1088         if (data->data) {
1089                 printf ("%i byte(s) thumbnail data available.", data->size);
1090                 if (data->size >= 4) {
1091                         printf ("0x%02x 0x%02x ... 0x%02x 0x%02x\n",
1092                                 data->data[0], data->data[1],
1093                                 data->data[data->size - 2],
1094                                 data->data[data->size - 1]);
1095                 }
1096         }
1097 }
1098
1099 ExifByteOrder
1100 exif_data_get_byte_order (ExifData *data)
1101 {
1102         if (!data)
1103                 return (0);
1104
1105         return (data->priv->order);
1106 }
1107
1108 void
1109 exif_data_foreach_content (ExifData *data, ExifDataForeachContentFunc func,
1110                            void *user_data)
1111 {
1112         unsigned int i;
1113
1114         if (!data || !func)
1115                 return;
1116
1117         for (i = 0; i < EXIF_IFD_COUNT; i++)
1118                 func (data->ifd[i], user_data);
1119 }
1120
1121 typedef struct _ByteOrderChangeData ByteOrderChangeData;
1122 struct _ByteOrderChangeData {
1123         ExifByteOrder old, new;
1124 };
1125
1126 static void
1127 entry_set_byte_order (ExifEntry *e, void *data)
1128 {
1129         ByteOrderChangeData *d = data;
1130
1131         if (!e)
1132                 return;
1133
1134         exif_array_set_byte_order (e->format, e->data, e->components, d->old, d->new);
1135 }
1136
1137 static void
1138 content_set_byte_order (ExifContent *content, void *data)
1139 {
1140         exif_content_foreach_entry (content, entry_set_byte_order, data);
1141 }
1142
1143 void
1144 exif_data_set_byte_order (ExifData *data, ExifByteOrder order)
1145 {
1146         ByteOrderChangeData d;
1147
1148         if (!data || (order == data->priv->order))
1149                 return;
1150
1151         d.old = data->priv->order;
1152         d.new = order;
1153         exif_data_foreach_content (data, content_set_byte_order, &d);
1154         data->priv->order = order;
1155         if (data->priv->md)
1156                 exif_mnote_data_set_byte_order (data->priv->md, order);
1157 }
1158
1159 void
1160 exif_data_log (ExifData *data, ExifLog *log)
1161 {
1162         unsigned int i;
1163
1164         if (!data || !data->priv) 
1165                 return;
1166         exif_log_unref (data->priv->log);
1167         data->priv->log = log;
1168         exif_log_ref (log);
1169
1170         for (i = 0; i < EXIF_IFD_COUNT; i++)
1171                 exif_content_log (data->ifd[i], log);
1172 }
1173
1174 /* Used internally within libexif */
1175 ExifLog *exif_data_get_log (ExifData *);
1176 ExifLog *
1177 exif_data_get_log (ExifData *data)
1178 {
1179         if (!data || !data->priv) 
1180                 return NULL;
1181         return data->priv->log;
1182 }
1183
1184 static const struct {
1185         ExifDataOption option;
1186         const char *name;
1187         const char *description;
1188 } exif_data_option[] = {
1189         {EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS, N_("Ignore unknown tags"),
1190          N_("Ignore unknown tags when loading EXIF data.")},
1191         {EXIF_DATA_OPTION_FOLLOW_SPECIFICATION, N_("Follow specification"),
1192          N_("Add, correct and remove entries to get EXIF data that follows "
1193             "the specification.")},
1194         {EXIF_DATA_OPTION_DONT_CHANGE_MAKER_NOTE, N_("Do not change maker note"),
1195          N_("When loading and resaving Exif data, save the maker note unmodified."
1196             " Be aware that the maker note can get corrupted.")},
1197         {0, NULL, NULL}
1198 };
1199
1200 const char *
1201 exif_data_option_get_name (ExifDataOption o)
1202 {
1203         unsigned int i;
1204
1205         for (i = 0; exif_data_option[i].name; i++)
1206                 if (exif_data_option[i].option == o) 
1207                         break;
1208         return _(exif_data_option[i].name);
1209 }
1210
1211 const char *
1212 exif_data_option_get_description (ExifDataOption o)
1213 {
1214         unsigned int i;
1215
1216         for (i = 0; exif_data_option[i].description; i++)
1217                 if (exif_data_option[i].option == o) 
1218                         break;
1219         return _(exif_data_option[i].description);
1220 }
1221
1222 void
1223 exif_data_set_option (ExifData *d, ExifDataOption o)
1224 {
1225         if (!d) 
1226                 return;
1227
1228         d->priv->options |= o;
1229 }
1230
1231 void
1232 exif_data_unset_option (ExifData *d, ExifDataOption o)
1233 {
1234         if (!d) 
1235                 return;
1236
1237         d->priv->options &= ~o;
1238 }
1239
1240 static void
1241 fix_func (ExifContent *c, void *UNUSED(data))
1242 {
1243         switch (exif_content_get_ifd (c)) {
1244         case EXIF_IFD_1:
1245                 if (c->parent->data)
1246                         exif_content_fix (c);
1247                 else {
1248                         exif_log (c->parent->priv->log, EXIF_LOG_CODE_DEBUG, "exif-data",
1249                                   "No thumbnail but entries on thumbnail. These entries have been "
1250                                   "removed.");
1251                         while (c->count) {
1252                                 unsigned int cnt = c->count;
1253                                 exif_content_remove_entry (c, c->entries[c->count - 1]);
1254                                 if (cnt == c->count) {
1255                                         /* safety net */
1256                                         exif_log (c->parent->priv->log, EXIF_LOG_CODE_DEBUG, "exif-data",
1257                                         "failed to remove last entry from entries.");
1258                                         c->count--;
1259                                 }
1260                         }
1261                 }
1262                 break;
1263         default:
1264                 exif_content_fix (c);
1265         }
1266 }
1267
1268 void
1269 exif_data_fix (ExifData *d)
1270 {
1271         exif_data_foreach_content (d, fix_func, NULL);
1272 }
1273
1274 void
1275 exif_data_set_data_type (ExifData *d, ExifDataType dt)
1276 {
1277         if (!d || !d->priv) 
1278                 return;
1279
1280         d->priv->data_type = dt;
1281 }
1282
1283 ExifDataType
1284 exif_data_get_data_type (ExifData *d)
1285 {
1286         return (d && d->priv) ? d->priv->data_type : EXIF_DATA_TYPE_COUNT;
1287 }