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