2003-10-26 Lutz Mueller <lutz@users.sourceforge.net>
[platform/upstream/libexif.git] / libexif / exif-data.c
1 /* exif-data.c
2  *
3  * Copyright © 2001 Lutz Müller <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 #include "exif-mnote-data.h"
23
24 #include "exif-data.h"
25 #include "exif-ifd.h"
26 #include "exif-mnote-data-priv.h"
27 #include "exif-utils.h"
28 #include "exif-loader.h"
29 #include "jpeg-marker.h"
30
31 #include <libexif/olympus/exif-mnote-data-olympus.h>
32 #include <libexif/canon/exif-mnote-data-canon.h>
33 #include <libexif/pentax/exif-mnote-data-pentax.h>
34
35 #include <stdlib.h>
36 #include <stdio.h>
37 #include <string.h>
38
39 #undef MAX
40 #define MAX(a, b)  (((a) > (b)) ? (a) : (b))
41
42 /* #define DEBUG */
43
44 static const unsigned char ExifHeader[] = {0x45, 0x78, 0x69, 0x66, 0x00, 0x00};
45
46 struct _ExifDataPrivate
47 {
48         ExifByteOrder order;
49
50         ExifMnoteData *md;
51
52         unsigned int ref_count;
53 };
54
55 ExifData *
56 exif_data_new (void)
57 {
58         ExifData *data;
59         unsigned int i;
60
61         data = malloc (sizeof (ExifData));
62         if (!data)
63                 return (NULL);
64         memset (data, 0, sizeof (ExifData));
65         data->priv = malloc (sizeof (ExifDataPrivate));
66         if (!data->priv) {
67                 free (data);
68                 return (NULL);
69         }
70         memset (data->priv, 0, sizeof (ExifDataPrivate));
71         data->priv->ref_count = 1;
72
73         for (i = 0; i < EXIF_IFD_COUNT; i++) {
74                 data->ifd[i] = exif_content_new ();
75                 if (!data->ifd[i]) {
76                         exif_data_free (data);
77                         return (NULL);
78                 }
79                 data->ifd[i]->parent = data;
80         }
81
82         return (data);
83 }
84
85 ExifData *
86 exif_data_new_from_data (const unsigned char *data, unsigned int size)
87 {
88         ExifData *edata;
89
90         edata = exif_data_new ();
91         exif_data_load_data (edata, data, size);
92         return (edata);
93 }
94
95 static void
96 exif_data_load_data_entry (ExifData *data, ExifEntry *entry,
97                            const unsigned char *d,
98                            unsigned int size, unsigned int offset)
99 {
100         unsigned int s, doff;
101
102         entry->tag        = exif_get_short (d + offset + 0, data->priv->order);
103         entry->format     = exif_get_short (d + offset + 2, data->priv->order);
104         entry->components = exif_get_long  (d + offset + 4, data->priv->order);
105
106         /*
107          * Size? If bigger than 4 bytes, the actual data is not
108          * in the entry but somewhere else (offset).
109          */
110         s = exif_format_get_size (entry->format) * entry->components;
111         if (!s)
112                 return;
113         if (s > 4)
114                 doff = exif_get_long (d + offset + 8, data->priv->order);
115         else
116                 doff = offset + 8;
117
118         /* Sanity check */
119         if (size < doff + s)
120                 return;
121
122         entry->data = malloc (sizeof (char) * s);
123         if (!entry->data)
124                 return;
125         entry->size = s;
126         memcpy (entry->data, d + doff, s);
127 }
128
129 static void
130 exif_data_save_data_entry (ExifData *data, ExifEntry *entry,
131                            unsigned char **d, unsigned int *ds,
132                            unsigned int offset)
133 {
134         unsigned int doff, s;
135
136         /*
137          * Each entry is 12 bytes long. The memory for the entry has
138          * already been allocated.
139          */
140         exif_set_short (*d + 6 + offset + 0,
141                         data->priv->order, entry->tag);
142         exif_set_short (*d + 6 + offset + 2,
143                         data->priv->order, entry->format);
144         exif_set_long  (*d + 6 + offset + 4,
145                         data->priv->order, entry->components);
146
147         /*
148          * Size? If bigger than 4 bytes, the actual data is not in
149          * the entry but somewhere else.
150          */
151         s = exif_format_get_size (entry->format) * entry->components;
152         if (!s)
153                 return;
154         if (s > 4) {
155                 *ds += entry->size;
156                 *d = realloc (*d, sizeof (char) * *ds);
157                 doff = *ds - 6 - entry->size;
158                 exif_set_long (*d + 6 + offset + 8,
159                                data->priv->order, doff);
160         } else
161                 doff = offset + 8;
162
163         /* Write the data. Fill unneeded bytes with 0. */
164         memcpy (*d + 6 + doff, entry->data, entry->size);
165         if (s < 4) memset (*d + 6 + doff + s, 0, (4 - s));
166 }
167
168 static void
169 exif_data_load_data_thumbnail (ExifData *data, const unsigned char *d,
170                                unsigned int ds, ExifLong offset, ExifLong size)
171 {
172         if (ds < offset + size) {
173 #ifdef DEBUG
174                 printf ("Bogus thumbnail offset and size: %i < %i + %i.\n",
175                         (int) ds, (int) offset, (int) size);
176 #endif
177                 return;
178         }
179         if (data->data)
180                 free (data->data);
181         data->size = size;
182         data->data = malloc (sizeof (char) * data->size);
183         memcpy (data->data, d + offset, data->size);
184 }
185
186 static void
187 exif_data_load_data_content (ExifData *data, ExifContent *ifd,
188                              const unsigned char *d,
189                              unsigned int ds, unsigned int offset)
190 {
191         ExifLong o, thumbnail_offset = 0, thumbnail_length = 0;
192         ExifShort n;
193         ExifEntry *entry;
194         unsigned int i;
195         ExifTag tag;
196
197         /* Read the number of entries */
198         if (offset >= ds - 1) return;
199         n = exif_get_short (d + offset, data->priv->order);
200 #ifdef DEBUG
201         printf ("Loading %i entries...\n", n);
202 #endif
203         offset += 2;
204
205         /* Check if we have enough data. */
206         if (offset + 12 * n > ds) n = (ds - offset) / 12;
207
208         for (i = 0; i < n; i++) {
209
210                 tag = exif_get_short (d + offset + 12 * i, data->priv->order);
211 #ifdef DEBUG
212                 printf ("Loading entry '%s' (%i of %i)...\n",
213                         exif_tag_get_name (tag), i + 1, n);
214 #endif
215                 switch (tag) {
216                 case EXIF_TAG_EXIF_IFD_POINTER:
217                 case EXIF_TAG_GPS_INFO_IFD_POINTER:
218                 case EXIF_TAG_INTEROPERABILITY_IFD_POINTER:
219                 case EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH:
220                 case EXIF_TAG_JPEG_INTERCHANGE_FORMAT:
221                         o = exif_get_long (d + offset + 12 * i + 8,
222                                            data->priv->order);
223                         switch (tag) {
224                         case EXIF_TAG_EXIF_IFD_POINTER:
225                                 exif_data_load_data_content (data,
226                                         data->ifd[EXIF_IFD_EXIF], d, ds, o);
227                                 break;
228                         case EXIF_TAG_GPS_INFO_IFD_POINTER:
229                                 exif_data_load_data_content (data,
230                                         data->ifd[EXIF_IFD_GPS], d, ds, o);
231                                 break;
232                         case EXIF_TAG_INTEROPERABILITY_IFD_POINTER:
233                                 exif_data_load_data_content (data,
234                                         data->ifd[EXIF_IFD_INTEROPERABILITY], d, ds, o);
235                                 break;
236                         case EXIF_TAG_JPEG_INTERCHANGE_FORMAT:
237 #ifdef DEBUG
238                                 printf ("Thumbnail at %i.\n", (int) o);
239 #endif
240                                 thumbnail_offset = o;
241                                 if (thumbnail_offset && thumbnail_length)
242                                         exif_data_load_data_thumbnail (data, d,
243                                                 ds, thumbnail_offset,
244                                                 thumbnail_length);
245                                 break;
246                         case EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH:
247 #ifdef DEBUG
248                                 printf ("Thumbnail size: %i.\n", (int) o);
249 #endif
250                                 thumbnail_length = o;
251                                 if (thumbnail_offset && thumbnail_length)
252                                         exif_data_load_data_thumbnail (data, d,
253                                                 ds, thumbnail_offset,
254                                                 thumbnail_length);
255                                 break;
256                         default:
257                                 return;
258                         }
259                         break;
260                 default:
261                         entry = exif_entry_new ();
262                         exif_content_add_entry (ifd, entry);
263                         exif_data_load_data_entry (data, entry, d, ds,
264                                                    offset + 12 * i);
265                         exif_entry_unref (entry);
266                         break;
267                 }
268         }
269 }
270
271 static void
272 exif_data_save_data_content (ExifData *data, ExifContent *ifd,
273                              unsigned char **d, unsigned int *ds,
274                              unsigned int offset)
275 {
276         unsigned int j, n_ptr = 0, n_thumb = 0;
277         ExifIfd i;
278
279         if (!data || !ifd || !d || !ds)
280                 return;
281
282         for (i = 0; i < EXIF_IFD_COUNT; i++)
283                 if (ifd == data->ifd[i])
284                         break;
285         if (i == EXIF_IFD_COUNT)
286                 return;
287
288         /*
289          * Check if we need some extra entries for pointers or the thumbnail.
290          */
291         switch (i) {
292         case EXIF_IFD_0:
293
294                 /*
295                  * The pointer to IFD_EXIF is in IFD_0. The pointer to
296                  * IFD_INTEROPERABILITY is in IFD_EXIF.
297                  */
298                 if (data->ifd[EXIF_IFD_EXIF]->count ||
299                     data->ifd[EXIF_IFD_INTEROPERABILITY]->count)
300                         n_ptr++;
301
302                 /* The pointer to IFD_GPS is in IFD_0. */
303                 if (data->ifd[EXIF_IFD_GPS]->count)
304                         n_ptr++;
305
306                 break;
307         case EXIF_IFD_1:
308                 if (data->size)
309                         n_thumb = 2;
310                 break;
311         case EXIF_IFD_EXIF:
312                 if (data->ifd[EXIF_IFD_INTEROPERABILITY]->count)
313                         n_ptr++;
314         default:
315                 break;
316         }
317
318         /*
319          * Allocate enough memory for all entries
320          * and the number of entries.
321          */
322         *ds += (2 + (ifd->count + n_ptr + n_thumb) * 12 + 4);
323         *d = realloc (*d, sizeof (char) * *ds);
324
325         /* Save the number of entries */
326         exif_set_short (*d + 6 + offset, data->priv->order,
327                         ifd->count + n_ptr + n_thumb);
328         offset += 2;
329
330 #ifdef DEBUG
331         printf ("Saving %i entries (IFD '%s', offset: %i)...\n",
332                 ifd->count, exif_ifd_get_name (i), offset);
333 #endif
334
335         /* Save each entry */
336         for (j = 0; j < ifd->count; j++)
337                 exif_data_save_data_entry (data, ifd->entries[j],
338                                 d, ds, offset + 12 * j);
339         offset += 12 * ifd->count;
340
341         /* Now save special entries. */
342         switch (i) {
343         case EXIF_IFD_0:
344
345                 /*
346                  * The pointer to IFD_EXIF is in IFD_0.
347                  * However, the pointer to IFD_INTEROPERABILITY is in IFD_EXIF,
348                  * therefore, if IFD_INTEROPERABILITY is not empty, we need
349                  * IFD_EXIF even if latter is empty.
350                  */
351                 if (data->ifd[EXIF_IFD_EXIF]->count ||
352                     data->ifd[EXIF_IFD_INTEROPERABILITY]->count) {
353                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
354                                         EXIF_TAG_EXIF_IFD_POINTER);
355                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
356                                         EXIF_FORMAT_LONG);
357                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
358                                         1);
359                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
360                                         *ds - 6);
361                         exif_data_save_data_content (data,
362                                 data->ifd[EXIF_IFD_EXIF], d, ds, *ds - 6);
363                         offset += 12;
364                 }
365
366                 /* The pointer to IFD_GPS is in IFD_0, too. */
367                 if (data->ifd[EXIF_IFD_GPS]->count) {
368                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
369                                         EXIF_TAG_GPS_INFO_IFD_POINTER);
370                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
371                                         EXIF_FORMAT_LONG);
372                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
373                                         1);
374                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
375                                         *ds - 6);
376                         exif_data_save_data_content (data,
377                                 data->ifd[EXIF_IFD_GPS], d, ds, *ds - 6);
378                         offset += 12;
379                 }
380
381                 break;
382         case EXIF_IFD_EXIF:
383
384                 /*
385                  * The pointer to IFD_INTEROPERABILITY is in IFD_EXIF.
386                  * See note above.
387                  */
388                 if (data->ifd[EXIF_IFD_INTEROPERABILITY]->count) {
389                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
390                                         EXIF_TAG_INTEROPERABILITY_IFD_POINTER);
391                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
392                                         EXIF_FORMAT_LONG);
393                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
394                                         1);
395                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
396                                         *ds - 6);
397                         exif_data_save_data_content (data,
398                                 data->ifd[EXIF_IFD_INTEROPERABILITY], d, ds,
399                                 *ds - 6);
400                         offset += 12;
401                 }
402
403                 break;
404         case EXIF_IFD_1:
405
406                 /*
407                  * Information about the thumbnail (if any) is saved in
408                  * IFD_1.
409                  */
410                 if (data->size) {
411
412                         /* EXIF_TAG_JPEG_INTERCHANGE_FORMAT */
413                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
414                                         EXIF_TAG_JPEG_INTERCHANGE_FORMAT);
415                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
416                                         EXIF_FORMAT_LONG);
417                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
418                                         1);
419                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
420                                         *ds - 6);
421                         *ds += data->size;
422                         *d = realloc (*d, sizeof (char) * *ds);
423                         memcpy (*d + *ds - data->size, data->data, data->size);
424                         offset += 12;
425 #ifdef DEBUG
426                         printf ("Wrote %i bytes of thumbnail data at offset "
427                                 "%i.\n", data->size, *ds - data->size);
428                         printf ("We currently have %i bytes EXIF data.\n", *ds);
429 #endif
430
431                         /* EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH */
432                         exif_set_short (*d + 6 + offset + 0, data->priv->order,
433                                 EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH);
434                         exif_set_short (*d + 6 + offset + 2, data->priv->order,
435                                         EXIF_FORMAT_LONG);
436                         exif_set_long  (*d + 6 + offset + 4, data->priv->order,
437                                         1);
438                         exif_set_long  (*d + 6 + offset + 8, data->priv->order,
439                                         data->size);
440                         offset += 12;
441                 }
442
443                 break;
444         default:
445                 break;
446         }
447
448         /* Correctly terminate the directory */
449         if (i == EXIF_IFD_0 && (data->ifd[EXIF_IFD_1]->count ||
450                                              data->size)) {
451
452                 /*
453                  * We are saving IFD 0. Tell where IFD 1 starts and save
454                  * IFD 1.
455                  */
456                 exif_set_long (*d + 6 + offset, data->priv->order, *ds - 6);
457                 exif_data_save_data_content (data, data->ifd[EXIF_IFD_1], d, ds,
458                                              *ds - 6);
459         } else
460                 exif_set_long (*d + 6 + offset, data->priv->order, 0);
461 }
462
463 static void
464 exif_data_remove_entry (ExifData *d, ExifTag t)
465 {
466         exif_content_remove_entry (d->ifd[EXIF_IFD_0],
467                 exif_content_get_entry (d->ifd[EXIF_IFD_0], t));
468         exif_content_remove_entry (d->ifd[EXIF_IFD_1],
469                 exif_content_get_entry (d->ifd[EXIF_IFD_1], t));
470         exif_content_remove_entry (d->ifd[EXIF_IFD_EXIF],
471                 exif_content_get_entry (d->ifd[EXIF_IFD_EXIF], t));
472         exif_content_remove_entry (d->ifd[EXIF_IFD_GPS],
473                 exif_content_get_entry (d->ifd[EXIF_IFD_GPS], t));
474         exif_content_remove_entry (d->ifd[EXIF_IFD_INTEROPERABILITY],
475                 exif_content_get_entry (d->ifd[EXIF_IFD_INTEROPERABILITY], t));
476 }
477
478 void
479 exif_data_load_data (ExifData *data, const unsigned char *d_orig,
480                      unsigned int ds_orig)
481 {
482         unsigned int l;
483         ExifLong offset;
484         ExifShort n;
485         ExifEntry *e, *em;
486         const unsigned char *d = d_orig;
487         unsigned int size = ds_orig, len;
488
489         if (!data)
490                 return;
491         if (!d || !size)
492                 return;
493
494 #ifdef DEBUG
495         printf ("Parsing %i byte(s) EXIF data...\n", size);
496 #endif
497
498         /*
499          * It can be that the data starts with the EXIF header. If it does
500          * not, search the EXIF marker.
501          */
502         if (size < 6) {
503 #ifdef DEBUG
504                 printf ("Size too small.\n");
505 #endif
506                 return;
507         }
508         if (!memcmp (d, ExifHeader, 6)) {
509 #ifdef DEBUG
510                 printf ("Found EXIF header.\n");
511 #endif
512         } else {
513 #ifdef DEBUG
514                 printf ("Data begins with 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x "
515                         "0x%x...\n", d[0], d[1], d[2], d[3], d[4], d[5], d[6]);
516 #endif
517                 while (1) {
518                         while ((d[0] == 0xff) && size) {
519                                 d++;
520                                 size--;
521                         }
522
523                         /* JPEG_MARKER_SOI */
524                         if (d[0] == JPEG_MARKER_SOI) {
525                                 d++;
526                                 size--;
527                                 continue;
528                         }
529
530                         /* JPEG_MARKER_APP0 */
531                         if (d[0] == JPEG_MARKER_APP0) {
532                                 d++;
533                                 size--;
534                                 l = (d[0] << 8) | d[1];
535                                 if (l > size)
536                                         return;
537                                 d += l;
538                                 size -= l;
539                                 continue;
540                         }
541
542                         /* JPEG_MARKER_APP1 */
543                         if (d[0] == JPEG_MARKER_APP1)
544                                 break;
545
546                         /* Unknown marker or data. Give up. */
547 #ifdef DEBUG
548                         printf ("EXIF marker not found.\n");
549 #endif
550                         return;
551                 }
552                 d++;
553                 size--;
554                 if (size < 2) {
555 #ifdef DEBUG
556                         printf ("Size too small.\n");
557 #endif
558                         return;
559                 }
560                 len = (d[0] << 8) | d[1];
561 #ifdef DEBUG
562                 printf ("We have to deal with %i byte(s) of EXIF data.\n", len);
563 #endif
564                 d += 2;
565                 size -= 2;
566         }
567
568         /*
569          * Verify the exif header
570          * (offset 2, length 6).
571          */
572         if (size < 6) {
573 #ifdef DEBUG
574                 printf ("Size too small.\n");
575 #endif
576                 return;
577         }
578         if (memcmp (d, ExifHeader, 6)) {
579 #ifdef DEBUG
580                 printf ("EXIF header not found.\n");
581 #endif
582                 return;
583         }
584
585 #ifdef DEBUG
586         printf ("Found EXIF header.\n");
587 #endif
588
589         /* Byte order (offset 6, length 2) */
590         if (size < 12)
591                 return;
592         if (!memcmp (d + 6, "II", 2))
593                 data->priv->order = EXIF_BYTE_ORDER_INTEL;
594         else if (!memcmp (d + 6, "MM", 2))
595                 data->priv->order = EXIF_BYTE_ORDER_MOTOROLA;
596         else
597                 return;
598
599         /* Fixed value */
600         if (exif_get_short (d + 8, data->priv->order) != 0x002a)
601                 return;
602
603         /* IFD 0 offset */
604         offset = exif_get_long (d + 10, data->priv->order);
605 #ifdef DEBUG
606         printf ("IFD 0 at %i.\n", (int) offset);
607 #endif
608
609         /* Parse the actual exif data (offset 14) */
610         exif_data_load_data_content (data, data->ifd[EXIF_IFD_0], d + 6,
611                                      size - 6, offset);
612
613         /* IFD 1 offset */
614         n = exif_get_short (d + 6 + offset, data->priv->order);
615         offset = exif_get_long (d + 6 + offset + 2 + 12 * n, data->priv->order);
616         if (offset) {
617 #ifdef DEBUG
618                 printf ("IFD 1 at %i.\n", (int) offset);
619 #endif
620
621                 /* Sanity check. */
622                 if (offset > size - 6) {
623 #ifdef DEBUG
624                         printf ("Bogus offset!\n");
625 #endif
626                         return;
627                 }
628
629                 exif_data_load_data_content (data, data->ifd[EXIF_IFD_1], d + 6,
630                                              size - 6, offset);
631         }
632
633         /*
634          * If we got an EXIF_TAG_MAKER_NOTE, try to interpret it. Some
635          * cameras use pointers in the maker note tag that point to the
636          * space between IFDs. Here is the only place where we have access
637          * to that data.
638          */
639         e = exif_data_get_entry (data, EXIF_TAG_MAKER_NOTE);
640         if (e) {
641
642             /* Olympus */
643             if ((e->size >= 5) && (!memcmp (e->data, "OLYMP", 5)))
644                 data->priv->md = exif_mnote_data_olympus_new (
645                                                 data->priv->order);
646
647             /* Pentax */
648             else if ((e->size >= 2) && (e->data[0] == 0x00)
649                                     && (e->data[1] == 0x1b))
650                 data->priv->md = exif_mnote_data_pentax_new (
651                                                 data->priv->order);
652
653             else {
654                 em = exif_data_get_entry (data, EXIF_TAG_MAKE);
655                 if (em) {
656
657                     /* Canon */
658                     if (!strcmp (exif_entry_get_value (em), "Canon"))
659                         data->priv->md = exif_mnote_data_canon_new (
660                                                         data->priv->order);
661                 }
662             }
663
664             /* 
665              * If we are able to interpret the maker note, interpret it and
666              * remove the corresponding entry as it may contain invalid
667              * pointers after this function here returns.
668              */
669             if (data->priv->md) {
670                 exif_mnote_data_load (data->priv->md, d_orig, ds_orig);
671                 exif_data_remove_entry (data, EXIF_TAG_MAKER_NOTE);
672             }
673         }
674 }
675
676 void
677 exif_data_save_data (ExifData *data, unsigned char **d, unsigned int *ds)
678 {
679         if (!data)
680                 return;
681         if (!d || !ds)
682                 return;
683
684         /* Header */
685         *ds = 6;
686         *d = malloc (sizeof (char) * *ds);
687         memcpy (*d, ExifHeader, 6);
688
689         /* Order (offset 6) */
690         *ds += 2;
691         *d = realloc (*d, sizeof (char) * *ds);
692         if (data->priv->order == EXIF_BYTE_ORDER_INTEL) {
693                 memcpy (*d + 6, "II", 2);
694         } else {
695                 memcpy (*d + 6, "MM", 2);
696         }
697
698         /* Fixed value (2 bytes, offset 8) */
699         *ds += 2;
700         *d = realloc (*d, sizeof (char) * *ds);
701         exif_set_short (*d + 8, data->priv->order, 0x002a);
702
703         /*
704          * IFD 0 offset (4 bytes, offset 10).
705          * We will start 8 bytes after the
706          * EXIF header (2 bytes for order, another 2 for the test, and
707          * 4 bytes for the IFD 0 offset make 8 bytes together).
708          */
709         *ds += 4;
710         *d = realloc (*d, sizeof (char) * *ds);
711         exif_set_long (*d + 10, data->priv->order, 8);
712
713         /* Now save IFD 0. IFD 1 will be saved automatically. */
714 #ifdef DEBUG
715         printf ("Saving IFDs...\n");
716 #endif
717         exif_data_save_data_content (data, data->ifd[EXIF_IFD_0], d, ds,
718                                      *ds - 6);
719
720 #ifdef DEBUG
721         printf ("Saved %i byte(s) EXIF data.\n", *ds);
722 #endif
723 }
724
725 ExifData *
726 exif_data_new_from_file (const char *path)
727 {
728         FILE *f;
729         int size;
730         ExifData *edata;
731         ExifLoader *loader;
732         unsigned char data[1024];
733
734         f = fopen (path, "rb");
735         if (!f)
736                 return (NULL);
737
738         loader = exif_loader_new ();
739         while (1) {
740                 size = fread (data, 1, 1024, f);
741                 if (size <= 0) break;
742                 if (!exif_loader_write (loader, data, size)) break;
743         }
744         fclose (f);
745
746         edata = exif_loader_get_data (loader);
747         exif_loader_unref (loader);
748
749         return (edata);
750 }
751
752 void
753 exif_data_ref (ExifData *data)
754 {
755         if (!data)
756                 return;
757
758         data->priv->ref_count++;
759 }
760
761 void
762 exif_data_unref (ExifData *data)
763 {
764         if (!data)
765                 return;
766
767         data->priv->ref_count--;
768         if (!data->priv->ref_count)
769                 exif_data_free (data);
770 }
771
772 void
773 exif_data_free (ExifData *data)
774 {
775         unsigned int i;
776
777         if (!data)
778                 return;
779
780         for (i = 0; i < EXIF_IFD_COUNT; i++) {
781                 if (data->ifd[i]) {
782                         exif_content_unref (data->ifd[i]);
783                         data->ifd[i] = NULL;
784                 }
785         }
786         if (data->data) {
787                 free (data->data);
788                 data->data = NULL;
789         }
790         if (data->priv) {
791                 if (data->priv->md) {
792                         exif_mnote_data_unref (data->priv->md);
793                         data->priv->md = NULL;
794                 }
795                 free (data->priv);
796                 data->priv = NULL;
797         }
798         free (data);
799 }
800
801 void
802 exif_data_dump (ExifData *data)
803 {
804         unsigned int i;
805
806         if (!data)
807                 return;
808
809         for (i = 0; i < EXIF_IFD_COUNT; i++) {
810                 if (data->ifd[i] && data->ifd[i]->count) {
811                         printf ("Dumping IFD '%s'...\n",
812                                 exif_ifd_get_name (i));
813                         exif_content_dump (data->ifd[i], 0);
814                 }
815         }
816
817         if (data->data) {
818                 printf ("%i byte(s) thumbnail data available.", data->size);
819                 if (data->size >= 4) {
820                         printf ("0x%02x 0x%02x ... 0x%02x 0x%02x\n",
821                                 data->data[0], data->data[1],
822                                 data->data[data->size - 2],
823                                 data->data[data->size - 1]);
824                 }
825         }
826 }
827
828 ExifByteOrder
829 exif_data_get_byte_order (ExifData *data)
830 {
831         if (!data)
832                 return (0);
833
834         return (data->priv->order);
835 }
836
837 void
838 exif_data_foreach_content (ExifData *data, ExifDataForeachContentFunc func,
839                            void *user_data)
840 {
841         unsigned int i;
842
843         if (!data || !func)
844                 return;
845
846         for (i = 0; i < EXIF_IFD_COUNT; i++)
847                 func (data->ifd[i], user_data);
848 }
849
850 typedef struct _ByteOrderChangeData ByteOrderChangeData;
851 struct _ByteOrderChangeData {
852         ExifByteOrder old, new;
853 };
854
855 static void
856 entry_set_byte_order (ExifEntry *e, void *data)
857 {
858         ByteOrderChangeData *d = data;
859         unsigned int i;
860         ExifShort s;
861         ExifLong l;
862         ExifSLong sl;
863         ExifRational r;
864         ExifSRational sr;
865
866         if (!e)
867                 return;
868
869         switch (e->format) {
870         case EXIF_FORMAT_SHORT:
871                 for (i = 0; i < e->components; i++) {
872                         s = exif_get_short (e->data +
873                                 (i * exif_format_get_size (e->format)),
874                                 d->old);
875                         exif_set_short (e->data +
876                                 (i * exif_format_get_size (e->format)),
877                                 d->new, s);
878                 }
879                 break;
880         case EXIF_FORMAT_LONG:
881                 for (i = 0; i < e->components; i++) {
882                         l = exif_get_long (e->data +
883                                 (i * exif_format_get_size (e->format)),
884                                 d->old);
885                         exif_set_long (e->data +
886                                 (i * exif_format_get_size (e->format)),
887                                 d->new, l);
888                 }
889                 break;
890         case EXIF_FORMAT_RATIONAL:
891                 for (i = 0; i < e->components; i++) {
892                         r = exif_get_rational (e->data +
893                                 (i * exif_format_get_size (e->format)),
894                                 d->old);
895                         exif_set_rational (e->data +
896                                 (i * exif_format_get_size (e->format)),
897                                 d->new, r);
898                 }
899                 break;
900         case EXIF_FORMAT_SLONG:
901                 for (i = 0; i < e->components; i++) {
902                         sl = exif_get_slong (e->data +
903                                 (i * exif_format_get_size (e->format)),
904                                 d->old);
905                         exif_set_slong (e->data +
906                                 (i * exif_format_get_size (e->format)),
907                                 d->new, sl);
908                 }
909                 break;
910         case EXIF_FORMAT_SRATIONAL:
911                 for (i = 0; i < e->components; i++) {
912                         sr = exif_get_srational (e->data +
913                                 (i * exif_format_get_size (e->format)),
914                                 d->old);
915                         exif_set_srational (e->data +
916                                 (i * exif_format_get_size (e->format)),
917                                 d->new, sr);
918                 }
919                 break;
920         case EXIF_FORMAT_UNDEFINED:
921         case EXIF_FORMAT_BYTE:
922         case EXIF_FORMAT_ASCII:
923         default:
924                 /* Nothing here. */
925                 break;
926         }
927 }
928
929 static void
930 content_set_byte_order (ExifContent *content, void *data)
931 {
932         exif_content_foreach_entry (content, entry_set_byte_order, data);
933 }
934
935 void
936 exif_data_set_byte_order (ExifData *data, ExifByteOrder order)
937 {
938         ByteOrderChangeData d;
939
940         if (!data || (order == data->priv->order))
941                 return;
942
943         d.old = data->priv->order;
944         d.new = order;
945         exif_data_foreach_content (data, content_set_byte_order, &d);
946         data->priv->order = order;
947 }