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