  
    
main.htmlMain Page     
classes.htmlData Structures     
files.htmlFiles     
dirs.htmlDirectories   
  
    
files.htmlFile List     
globals.htmlGlobals   
dir_20715630405f3b63e7ab7a5c713843d9.htmllibexif exif-data.c
exif-data_8c.htmlGo to the documentation of this file. 00001 /* exif-data.c 00002  * 00003  * Copyright © 2001 Lutz Müller <lutz@users.sourceforge.net> 00004  * 00005  * This library is free software; you can redistribute it and/or 00006  * modify it under the terms of the GNU Lesser General Public 00007  * License as published by the Free Software Foundation; either 00008  * version 2 of the License, or (at your option) any later version. 00009  * 00010  * This library is distributed in the hope that it will be useful, 00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 00013  * Lesser General Public License for more details. 00014  * 00015  * You should have received a copy of the GNU Lesser General Public 00016  * License along with this library; if not, write to the 00017  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00018  * Boston, MA 02111-1307, USA. 00019  */ 00020 
00021 #include <config.h> 00022 
00023 #include < exif-mnote-data_8h.htmllibexif/exif-mnote-data.h > 00024 #include < exif-data_8h.htmllibexif/exif-data.h > 00025 #include < exif-ifd_8h.htmllibexif/exif-ifd.h > 00026 #include < exif-mnote-data-priv_8h.htmllibexif/exif-mnote-data-priv.h > 00027 #include < exif-utils_8h.htmllibexif/exif-utils.h > 00028 #include < exif-loader_8h.htmllibexif/exif-loader.h > 00029 #include < exif-log_8h.htmllibexif/exif-log.h > 00030 #include < i18n_8h.htmllibexif/i18n.h > 00031 
00032 #include < exif-mnote-data-olympus_8h.htmllibexif/olympus/exif-mnote-data-olympus.h > 00033 #include < exif-mnote-data-canon_8h.htmllibexif/canon/exif-mnote-data-canon.h > 00034 #include < exif-mnote-data-pentax_8h.htmllibexif/pentax/exif-mnote-data-pentax.h > 00035 
00036 #include <stdlib.h> 00037 #include <stdio.h> 00038 #include <string.h> 00039 
00040 #undef MAX exif-data_8c.html#e67935c7e92c512da0c67299d467f06d00041  #define MAX(a, b)  (((a) > (b)) ? (a) : (b)) 00042 00043 #if defined(__WATCOMC__) || defined(_MSC_VER) 00044 #      define strncasecmp strnicmp 00045 #endif 00046 00047 #undef JPEG_MARKER_SOI exif-data_8c.html#08365525ee0dff7ff58f8231305c3e8900048  #define JPEG_MARKER_SOI  0xd8 00049 #undef JPEG_MARKER_APP0 exif-data_8c.html#7385540b8a640c8d67cf453b14aeddb300050  #define JPEG_MARKER_APP0 0xe0 00051 #undef JPEG_MARKER_APP1 exif-data_8c.html#203cbb3604314163bb57300f8a2aa88600052  #define JPEG_MARKER_APP1 0xe1 00053 exif-data_8c.html#2a54a3fd3af187fb5613823530f5015d00054  static const unsigned char exif-data_8c.html#2a54a3fd3af187fb5613823530f5015dExifHeader [] = {0x45, 0x78, 0x69, 0x66, 0x00, 0x00};
00055 
struct__ExifDataPrivate.html00056  struct struct__ExifDataPrivate.html_ExifDataPrivate 00057 {
struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe700058          exif-byte-order_8h.html#de4a9c512c9cd4723485181c5679f1d5ExifByteOrder  struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order ;
00059 
struct__ExifDataPrivate.html#e6cbc82fdf69415e9377350c577ab5d300060          struct__ExifMnoteData.htmlExifMnoteData  * struct__ExifDataPrivate.html#e6cbc82fdf69415e9377350c577ab5d3md ;
00061 
struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049c00062          struct__ExifLog.htmlExifLog  * struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog ;
struct__ExifDataPrivate.html#9bce3dacc65f4d974b3655ec15f7e55300063          struct__ExifMem.htmlExifMem  * struct__ExifDataPrivate.html#9bce3dacc65f4d974b3655ec15f7e553mem ;
00064 
struct__ExifDataPrivate.html#fc8a08a288ea36146c9465c33dbceeca00065          unsigned int struct__ExifDataPrivate.html#fc8a08a288ea36146c9465c33dbceecaref_count ;
00066 
00067         /* Temporarily used while loading data */ struct__ExifDataPrivate.html#d4c12427bf709755385394fe20d10fce00068          unsigned int struct__ExifDataPrivate.html#d4c12427bf709755385394fe20d10fceoffset_mnote ;
00069 
struct__ExifDataPrivate.html#86ed3cd215c450b712e04760d06c697800070          exif-data_8h.html#e7b8bb9385ee2311b5e9a22e8ea8a42bExifDataOption  struct__ExifDataPrivate.html#86ed3cd215c450b712e04760d06c6978options ;
struct__ExifDataPrivate.html#a7838bec895b580a546c46d5b3d1c77c00071          exif-data-type_8h.html#7ce2f6788670b1693c10514810a8cae1ExifDataType  struct__ExifDataPrivate.html#a7838bec895b580a546c46d5b3d1c77cdata_type ;
00072 };
00073 
00074 static void *
exif-data_8c.html#eab8bbe90e34d112c1daa52e2ac7c62a00075  exif-data_8c.html#eab8bbe90e34d112c1daa52e2ac7c62aexif_data_alloc  ( struct__ExifData.htmlExifData  *data, unsigned int i)
00076 {
00077         void *d;
00078 
00079         if (!data || !i) 
00080                 return NULL;
00081 
00082         d = exif-mem_8c.html#28065115ce31c8c9c7701df5b3f4ada5exif_mem_alloc  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#9bce3dacc65f4d974b3655ec15f7e553mem , i);
00083         if (d) 
00084                 return d;
00085 
00086         exif-log_8h.html#8e63681e2472538492dbd994318d55c1EXIF_LOG_NO_MEMORY  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , "ExifData", i);
00087         return NULL;
00088 }
00089 
00090 struct__ExifMnoteData.htmlExifMnoteData  *
exif-data_8h.html#fa1f57b9e93fd299b3f3e0923a8b2fd100091  exif-data_8c.html#394900119a441b45ef028f52151d97f0exif_data_get_mnote_data  ( struct__ExifData.htmlExifData  *d)
00092 {
00093         return (d && d-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv ) ? d-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#e6cbc82fdf69415e9377350c577ab5d3md  : NULL;
00094 }
00095 
00096 struct__ExifData.htmlExifData  *
exif-data_8h.html#7ad8ebe29430dd827a66dd7bec07d78300097  exif-data_8c.html#7ad8ebe29430dd827a66dd7bec07d783exif_data_new  (void)
00098 {
00099         struct__ExifMem.htmlExifMem  *mem = exif-mem_8c.html#44af1bc2ce5eecf37e731c5fe5dc98e0exif_mem_new_default  ();
00100         struct__ExifData.htmlExifData  *d = exif-data_8c.html#c8043bebb5ba91fe6799709a11c0c15cexif_data_new_mem  (mem);
00101 
00102         exif-mem_8c.html#fd6959367336c1459125c43e3f16fec8exif_mem_unref  (mem);
00103 
00104         return d;
00105 }
00106 
00107 struct__ExifData.htmlExifData  *
exif-data_8h.html#93659a64633540bae4cb547396765c0c00108  exif-data_8c.html#c8043bebb5ba91fe6799709a11c0c15cexif_data_new_mem  ( struct__ExifMem.htmlExifMem  *mem)
00109 {
00110         struct__ExifData.htmlExifData  *data;
00111         unsigned int i;
00112 
00113         if (!mem) 
00114                 return NULL;
00115 
00116         data = exif-mem_8c.html#28065115ce31c8c9c7701df5b3f4ada5exif_mem_alloc  (mem, sizeof ( struct__ExifData.htmlExifData ));
00117         if (!data) 
00118                 return (NULL);
00119         data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv  = exif-mem_8c.html#28065115ce31c8c9c7701df5b3f4ada5exif_mem_alloc  (mem, sizeof ( struct__ExifDataPrivate.htmlExifDataPrivate ));
00120         if (!data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv ) { 
00121                 exif-mem_8c.html#c18517acd3216e21942966d3dfab5f53exif_mem_free  (mem, data); 
00122                 return (NULL); 
00123         }
00124         data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#fc8a08a288ea36146c9465c33dbceecaref_count  = 1;
00125 
00126         data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#9bce3dacc65f4d974b3655ec15f7e553mem  = mem;
00127         exif-mem_8c.html#5e444d744fdb19c0c8d4438d9aad2b0bexif_mem_ref  (mem);
00128 
00129         for (i = 0; i < exif-ifd_8h.html#012eb589be30809b32b28959abda81e687c94414a3d6e5afbeabd959ff241113EXIF_IFD_COUNT ; i++) {
00130                 data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [i] = exif-content_8c.html#2316f2fdab06701f93ba43ac45c17e9dexif_content_new_mem  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#9bce3dacc65f4d974b3655ec15f7e553mem );
00131                 if (!data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [i]) {
00132                         exif-data_8c.html#0597d9864272e19c51dfec5541c7adedexif_data_free  (data);
00133                         return (NULL);
00134                 }
00135                 data->ifd[i]->parent = data;
00136         }
00137 
00138         /* Default options */ 00139         exif-data_8c.html#9ca00d92d42ff634036d1b1f050ca9a2exif_data_set_option  (data, exif-data_8h.html#e7b8bb9385ee2311b5e9a22e8ea8a42bdcc7d05eafa1b0d0b76b198cca319cb5EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS );
00140         exif-data_8c.html#9ca00d92d42ff634036d1b1f050ca9a2exif_data_set_option  (data, exif-data_8h.html#e7b8bb9385ee2311b5e9a22e8ea8a42b374dabd4abe879f7c7121d29fbd9b4baEXIF_DATA_OPTION_FOLLOW_SPECIFICATION );
00141 
00142         /* Default data type: none */ 00143         exif-data_8c.html#be8090b43fcdfb5a63d02c45f0a3fbdaexif_data_set_data_type  (data, exif-data-type_8h.html#7ce2f6788670b1693c10514810a8cae10ccee3347249b67411373054c2e7cfcdEXIF_DATA_TYPE_COUNT );
00144 
00145         return (data);
00146 }
00147 
00148 struct__ExifData.htmlExifData  *
exif-data_8h.html#62d58bfd5b4d9fc2e2fad80a9802e59400149  exif-data_8c.html#62d58bfd5b4d9fc2e2fad80a9802e594exif_data_new_from_data  (const unsigned char *data, unsigned int exif-format_8c.html#c1953082f2467dad4bbec15ebbc57a21size )
00150 {
00151         struct__ExifData.htmlExifData  *edata;
00152 
00153         edata = exif-data_8c.html#7ad8ebe29430dd827a66dd7bec07d783exif_data_new  ();
00154         exif-data_8c.html#df73ed60ae962be794a7514083552c02exif_data_load_data  (edata, data, size);
00155         return (edata);
00156 }
00157 
00158 static int exif-data_8c.html#c89a1325633d691577bfdca9e391b63d00159  exif-data_8c.html#c89a1325633d691577bfdca9e391b63dexif_data_load_data_entry  ( struct__ExifData.htmlExifData  *data, struct__ExifEntry.htmlExifEntry  *entry,
00160                            const unsigned char *d,
00161                            unsigned int exif-format_8c.html#c1953082f2467dad4bbec15ebbc57a21size , unsigned int offset)
00162 {
00163         unsigned int s, doff;
00164 
00165         entry-> struct__ExifEntry.html#8597b70e3caaad35ee423d3fd8af57b7tag         = exif-utils_8c.html#28505bc3777648fce6676fc01d74eb40exif_get_short  (d + offset + 0, data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order );
00166         entry-> struct__ExifEntry.html#630d2f54097574b308aaba7c693cf2fcformat      = exif-utils_8c.html#28505bc3777648fce6676fc01d74eb40exif_get_short  (d + offset + 2, data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order );
00167         entry-> struct__ExifEntry.html#5d0dc86b91a1ec39ea32ae6b693baf13components  = exif-utils_8c.html#c8ce446b600340ccf5f120d8735319f3exif_get_long   (d + offset + 4, data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order );
00168 
00169         exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00170                   "Loading entry 0x%x ('%s')...", entry-> struct__ExifEntry.html#8597b70e3caaad35ee423d3fd8af57b7tag ,
00171                   exif-tag_8c.html#89a0b669700f3021f3beddea6fcd8573exif_tag_get_name  (entry-> struct__ExifEntry.html#8597b70e3caaad35ee423d3fd8af57b7tag ));
00172 
00173         /* 00174          * Size? If bigger than 4 bytes, the actual data is not 00175          * in the entry but somewhere else (offset). 00176          */ 00177         s = exif-format_8c.html#0cd0c832a16f47c39d50aeaeb6c07e83exif_format_get_size  (entry-> struct__ExifEntry.html#630d2f54097574b308aaba7c693cf2fcformat ) * entry-> struct__ExifEntry.html#5d0dc86b91a1ec39ea32ae6b693baf13components ;
00178         if (!s)
00179                 return 0;
00180         if (s > 4)
00181                 doff = exif-utils_8c.html#c8ce446b600340ccf5f120d8735319f3exif_get_long  (d + offset + 8, data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order );
00182         else 00183                 doff = offset + 8;
00184 
00185         /* Sanity check */ 00186         if (size < doff + s)
00187                 return 0;
00188 
00189         entry-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata  = exif-data_8c.html#eab8bbe90e34d112c1daa52e2ac7c62aexif_data_alloc  (data, s);
00190         if (entry-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata ) {
00191                 entry-> struct__ExifEntry.html#67d1d36d044abfa9f4d94053c6a5b80dsize  = s;
00192                 memcpy (entry-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata , d + doff, s);
00193         }
00194 
00195         /* If this is the MakerNote, remember the offset */ 00196         if (entry-> struct__ExifEntry.html#8597b70e3caaad35ee423d3fd8af57b7tag  == exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a364166bee6e2b6784ae437f2d94b74b2fEXIF_TAG_MAKER_NOTE ) {
00197                 if (entry-> struct__ExifEntry.html#67d1d36d044abfa9f4d94053c6a5b80dsize  > 6) exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog ,
00198                                                exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00199                                                "MakerNote found (%02x %02x %02x %02x " 00200                                                "%02x %02x %02x...).",
00201                                                entry-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata [0], entry-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata [1], entry-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata [2],
00202                                                entry-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata [3], entry-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata [4], entry-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata [5],
00203                                                entry-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata [6]);
00204                 data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#d4c12427bf709755385394fe20d10fceoffset_mnote  = doff;
00205         }
00206         return 1;
00207 }
00208 
00209 static void exif-data_8c.html#c49d3a17d0de4695d8bdc1c923a28e8800210  exif-data_8c.html#c49d3a17d0de4695d8bdc1c923a28e88exif_data_save_data_entry  ( struct__ExifData.htmlExifData  *data, struct__ExifEntry.htmlExifEntry  *e,
00211                            unsigned char **d, unsigned int *ds,
00212                            unsigned int offset)
00213 {
00214         unsigned int doff, s;
00215 
00216         if (!data || !data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv ) 
00217                 return;
00218 
00219         /* 00220          * Each entry is 12 bytes long. The memory for the entry has 00221          * already been allocated. 00222          */ 00223         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 6 + offset + 0,
00224                         data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order , ( exif-utils_8h.html#23497f35004fb9e65a70b29fd1622a9cExifShort ) e-> struct__ExifEntry.html#8597b70e3caaad35ee423d3fd8af57b7tag );
00225         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 6 + offset + 2,
00226                         data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order , ( exif-utils_8h.html#23497f35004fb9e65a70b29fd1622a9cExifShort ) e-> struct__ExifEntry.html#630d2f54097574b308aaba7c693cf2fcformat );
00227 
00228 #ifndef EXIF_DONT_CHANGE_MAKER_NOTE 00229         /* If this is the maker note tag, update it. */ 00230         if ((e-> struct__ExifEntry.html#8597b70e3caaad35ee423d3fd8af57b7tag  == exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a364166bee6e2b6784ae437f2d94b74b2fEXIF_TAG_MAKER_NOTE ) && data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#e6cbc82fdf69415e9377350c577ab5d3md ) {
00231                 exif-mem_8c.html#c18517acd3216e21942966d3dfab5f53exif_mem_free  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#9bce3dacc65f4d974b3655ec15f7e553mem , e-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata );
00232                 e-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata  = NULL;
00233                 e-> struct__ExifEntry.html#67d1d36d044abfa9f4d94053c6a5b80dsize  = 0;
00234                 exif-mnote-data-priv_8h.html#cd453a059a4cf3fb6ff1fd87cb85db5cexif_mnote_data_set_offset  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#e6cbc82fdf69415e9377350c577ab5d3md , *ds - 6);
00235                 exif-mnote-data_8c.html#60a15ada14fb5f82818feb65d1a63029exif_mnote_data_save  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#e6cbc82fdf69415e9377350c577ab5d3md , &e-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata , &e-> struct__ExifEntry.html#67d1d36d044abfa9f4d94053c6a5b80dsize );
00236                 e-> struct__ExifEntry.html#5d0dc86b91a1ec39ea32ae6b693baf13components  = e-> struct__ExifEntry.html#67d1d36d044abfa9f4d94053c6a5b80dsize ;
00237         }
00238 #endif 00239 00240         exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long   (*d + 6 + offset + 4,
00241                         data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order , e-> struct__ExifEntry.html#5d0dc86b91a1ec39ea32ae6b693baf13components );
00242 
00243         /* 00244          * Size? If bigger than 4 bytes, the actual data is not in 00245          * the entry but somewhere else. 00246          */ 00247         s = exif-format_8c.html#0cd0c832a16f47c39d50aeaeb6c07e83exif_format_get_size  (e-> struct__ExifEntry.html#630d2f54097574b308aaba7c693cf2fcformat ) * e-> struct__ExifEntry.html#5d0dc86b91a1ec39ea32ae6b693baf13components ;
00248         if (s > 4) {
00249                 doff = *ds - 6;
00250                 *ds += s;
00251 
00252                 /* 00253                  * According to the TIFF specification, 00254                  * the offset must be an even number. If we need to introduce 00255                  * a padding byte, we set it to 0. 00256                  */ 00257                 if (s & 1) 
00258                         (*ds)++;
00259                 *d = exif-mem_8c.html#e29eb09328c6a3b7e24fb69e0078942cexif_mem_realloc  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#9bce3dacc65f4d974b3655ec15f7e553mem , *d, *ds);
00260                 if (!*d) {
00261                         exif-log_8h.html#8e63681e2472538492dbd994318d55c1EXIF_LOG_NO_MEMORY  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , "ExifData", *ds);
00262                         return;
00263                 }
00264                 exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long  (*d + 6 + offset + 8, data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order , doff);
00265                 if (s & 1) 
00266                         *(*d + *ds - 1) = '\0';
00267 
00268         } else 00269                 doff = offset + 8;
00270 
00271         /* Write the data. Fill unneeded bytes with 0. */ 00272         memcpy (*d + 6 + doff, e-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata , s);
00273         if (s < 4) 
00274                 memset (*d + 6 + doff + s, 0, (4 - s));
00275 }
00276 
00277 static void exif-data_8c.html#410e6bd9de88d48711dca3c0dc24f4ac00278  exif-data_8c.html#410e6bd9de88d48711dca3c0dc24f4acexif_data_load_data_thumbnail  ( struct__ExifData.htmlExifData  *data, const unsigned char *d,
00279                                unsigned int ds, exif-utils_8h.html#1601686195534cc6337c596fb8af54faExifLong  offset, exif-utils_8h.html#1601686195534cc6337c596fb8af54faExifLong  exif-format_8c.html#c1953082f2467dad4bbec15ebbc57a21size )
00280 {
00281         if (ds < offset + size) {
00282                 exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00283                           "Bogus thumbnail offset and size: %i < %i + %i.",
00284                           (int) ds, (int) offset, (int) size);
00285                 return;
00286         }
00287         if (data-> struct__ExifData.html#f044799f1429e8c4dbbc562f7a4006a7data ) 
00288                 exif-mem_8c.html#c18517acd3216e21942966d3dfab5f53exif_mem_free  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#9bce3dacc65f4d974b3655ec15f7e553mem , data-> struct__ExifData.html#f044799f1429e8c4dbbc562f7a4006a7data );
00289         data-> struct__ExifData.html#433fcb7b5b2f210f10d11aea7cd79381size  = size;
00290         data-> struct__ExifData.html#f044799f1429e8c4dbbc562f7a4006a7data  = exif-data_8c.html#eab8bbe90e34d112c1daa52e2ac7c62aexif_data_alloc  (data, data-> struct__ExifData.html#433fcb7b5b2f210f10d11aea7cd79381size );
00291         if (!data-> struct__ExifData.html#f044799f1429e8c4dbbc562f7a4006a7data ) 
00292                 return;
00293         memcpy (data-> struct__ExifData.html#f044799f1429e8c4dbbc562f7a4006a7data , d + offset, data-> struct__ExifData.html#433fcb7b5b2f210f10d11aea7cd79381size );
00294 }
00295 
00296 #undef CHECK_REC exif-data_8c.html#e71cd8e6f9bba4e2c8724b91c24ac50800297  #define CHECK_REC(i)                                    \ 00298 if ((i) == ifd) {                               \ 00299         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, \ 00300                 "ExifData", "Recursive entry in IFD "   \ 00301                 "'%s' detected. Skipping...",           \ 00302                 exif_ifd_get_name (i));                 \ 00303         break;                                          \ 00304 }                                                       \ 00305 if (data->ifd[(i)]->count) {                            \ 00306         exif_log (data->priv->log, EXIF_LOG_CODE_DEBUG, \ 00307                 "ExifData", "Attemt to load IFD "       \ 00308                 "'%s' multiple times detected. "        \ 00309                 "Skipping...",                          \ 00310                 exif_ifd_get_name (i));                 \ 00311         break;                                          \ 00312 } 00313 00314 static void exif-data_8c.html#281da75dacdd27a5e10d210788e6088500315  exif-data_8c.html#281da75dacdd27a5e10d210788e60885exif_data_load_data_content  ( struct__ExifData.htmlExifData  *data, exif-ifd_8h.html#012eb589be30809b32b28959abda81e6ExifIfd  exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd ,
00316                              const unsigned char *d,
00317                              unsigned int ds, unsigned int offset, unsigned int recursion_depth)
00318 {
00319         exif-utils_8h.html#1601686195534cc6337c596fb8af54faExifLong  o, thumbnail_offset = 0, thumbnail_length = 0;
00320         exif-utils_8h.html#23497f35004fb9e65a70b29fd1622a9cExifShort  n;
00321         struct__ExifEntry.htmlExifEntry  *entry;
00322         unsigned int i;
00323         exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a3ExifTag  mnote-canon-tag_8c.html#d88e1213ca240fe301a9559678bddd9btag ;
00324 
00325         if (!data || !data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv ) 
00326                 return;
00327         if ((ifd < 0) || (ifd >= exif-ifd_8h.html#012eb589be30809b32b28959abda81e687c94414a3d6e5afbeabd959ff241113EXIF_IFD_COUNT )) 
00328                 return;
00329 
00330         if (recursion_depth > 150) {
00331                 exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2375f88a49d1bdaaafc38597bf60e6d25EXIF_LOG_CODE_CORRUPT_DATA , "ExifData",
00332                           "Deep recursion detected!");
00333                 return;
00334         }
00335 
00336         /* Read the number of entries */ 00337         if (offset >= ds - 1) 
00338                 return;
00339         n = exif-utils_8c.html#28505bc3777648fce6676fc01d74eb40exif_get_short  (d + offset, data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order );
00340         exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00341                   "Loading %i entries...", n);
00342         offset += 2;
00343 
00344         /* Check if we have enough data. */ 00345         if (offset + 12 * n > ds) 
00346                 n = (ds - offset) / 12;
00347 
00348         for (i = 0; i < n; i++) {
00349 
00350                 tag = exif-utils_8c.html#28505bc3777648fce6676fc01d74eb40exif_get_short  (d + offset + 12 * i, data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order );
00351                 switch (tag) {
00352                 case exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a310dc58ac7717874466ef87ed8fcc3f65EXIF_TAG_EXIF_IFD_POINTER :
00353                 case exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a321c372e1d34e135e6b999a8f21e95f47EXIF_TAG_GPS_INFO_IFD_POINTER :
00354                 case exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a362d2ded22799c055e7c31dbc5217c2f4EXIF_TAG_INTEROPERABILITY_IFD_POINTER :
00355                 case exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a3afd0c558bee1193299ed6a201e69e69bEXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH :
00356                 case exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a3cb686c4d1f1b2dd828cb1bca6396f65dEXIF_TAG_JPEG_INTERCHANGE_FORMAT :
00357                         o = exif-utils_8c.html#c8ce446b600340ccf5f120d8735319f3exif_get_long  (d + offset + 12 * i + 8,
00358                                            data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order );
00359                         switch (tag) {
00360                         case exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a310dc58ac7717874466ef87ed8fcc3f65EXIF_TAG_EXIF_IFD_POINTER :
00361                                 exif-data_8c.html#e71cd8e6f9bba4e2c8724b91c24ac508CHECK_REC  ( exif-ifd_8h.html#012eb589be30809b32b28959abda81e60febbc743b5c7bca8248a7c39cfb1ebcEXIF_IFD_EXIF );
00362                                 exif-data_8c.html#281da75dacdd27a5e10d210788e60885exif_data_load_data_content  (data, EXIF_IFD_EXIF, d, ds, o, recursion_depth + 1);
00363                                 break;
00364                         case exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a321c372e1d34e135e6b999a8f21e95f47EXIF_TAG_GPS_INFO_IFD_POINTER :
00365                                 exif-data_8c.html#e71cd8e6f9bba4e2c8724b91c24ac508CHECK_REC  ( exif-ifd_8h.html#012eb589be30809b32b28959abda81e6671420cd9eccca3c34db0476949f7cedEXIF_IFD_GPS );
00366                                 exif-data_8c.html#281da75dacdd27a5e10d210788e60885exif_data_load_data_content  (data, exif-ifd_8h.html#012eb589be30809b32b28959abda81e6671420cd9eccca3c34db0476949f7cedEXIF_IFD_GPS , d, ds, o, recursion_depth + 1);
00367                                 break;
00368                         case exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a362d2ded22799c055e7c31dbc5217c2f4EXIF_TAG_INTEROPERABILITY_IFD_POINTER :
00369                                 exif-data_8c.html#e71cd8e6f9bba4e2c8724b91c24ac508CHECK_REC  ( exif-ifd_8h.html#012eb589be30809b32b28959abda81e6993503e00dda7ba098815692d761e037EXIF_IFD_INTEROPERABILITY );
00370                                 exif-data_8c.html#281da75dacdd27a5e10d210788e60885exif_data_load_data_content  (data, exif-ifd_8h.html#012eb589be30809b32b28959abda81e6993503e00dda7ba098815692d761e037EXIF_IFD_INTEROPERABILITY , d, ds, o, recursion_depth + 1);
00371                                 break;
00372                         case exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a3cb686c4d1f1b2dd828cb1bca6396f65dEXIF_TAG_JPEG_INTERCHANGE_FORMAT :
00373                                 thumbnail_offset = o;
00374                                 if (thumbnail_offset && thumbnail_length)
00375                                         exif-data_8c.html#410e6bd9de88d48711dca3c0dc24f4acexif_data_load_data_thumbnail  (data, d,
00376                                                                        ds, thumbnail_offset,
00377                                                                        thumbnail_length);
00378                                 break;
00379                         case exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a3afd0c558bee1193299ed6a201e69e69bEXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH :
00380                                 thumbnail_length = o;
00381                                 if (thumbnail_offset && thumbnail_length)
00382                                         exif-data_8c.html#410e6bd9de88d48711dca3c0dc24f4acexif_data_load_data_thumbnail  (data, d,
00383                                                                        ds, thumbnail_offset,
00384                                                                        thumbnail_length);
00385                                 break;
00386                         default:
00387                                 return;
00388                         }
00389                         break;
00390                 default:
00391 
00392                         /* 00393                          * If we don't know the tag, don't fail. It could be that new 00394                          * versions of the standard have defined additional tags. Note that 00395                          * 0 is a valid tag in the GPS IFD. 00396                          */ 00397                         if (! exif-tag_8c.html#651b30ac8ded8ab03ca18a9f34f84447exif_tag_get_name_in_ifd  ( mnote-canon-tag_8c.html#d88e1213ca240fe301a9559678bddd9btag , exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd )) {
00398 
00399                                 /* 00400                                  * Special case: Tag and format 0. That's against specification. 00401                                  * At least up to 2.2. But Photoshop writes it anyways. 00402                                  */ 00403                                 if (!memcmp (d + offset + 12 * i, "\0\0\0\0", 4)) {
00404                                         exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data->priv->log, exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00405                                                   "Skipping empty entry at position %i in '%s'.", i, 
00406                                                   exif-ifd_8c.html#13a16ae4cebfc6d3199b84cb693915cbexif_ifd_get_name  ( exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd ));
00407                                         break;
00408                                 }
00409                                 exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data->priv->log, exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00410                                           "Unknown tag 0x%04x (entry %i in '%s'). Please report this tag " 00411                                           "to <libexif-devel@lists.sourceforge.net>.", tag, i,
00412                                           exif-ifd_8c.html#13a16ae4cebfc6d3199b84cb693915cbexif_ifd_get_name  ( exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd ));
00413                                 if (data->priv->options & exif-data_8h.html#e7b8bb9385ee2311b5e9a22e8ea8a42bdcc7d05eafa1b0d0b76b198cca319cb5EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS )
00414                                         break;
00415                         }
00416                         entry = exif-entry_8c.html#f08048e0833b4398d6da5daf4f7cf068exif_entry_new_mem  (data->priv->mem);
00417                         if ( exif-data_8c.html#c89a1325633d691577bfdca9e391b63dexif_data_load_data_entry  (data, entry, d, ds,
00418                                                    offset + 12 * i))
00419                                 exif-content_8c.html#4c318d157f925ae3b44bd6d43d52dc71exif_content_add_entry  (data->ifd[ exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd ], entry);
00420                         exif-entry_8c.html#40616487cbcb314d606c831bad5ed1a7exif_entry_unref  (entry);
00421                         break;
00422                 }
00423         }
00424 }
00425 
00426 static int exif-data_8c.html#a7b5ffeabc801a678427291bd66ac15e00427  exif-data_8c.html#a7b5ffeabc801a678427291bd66ac15ecmp_func  (const unsigned char *p1, const unsigned char *p2, exif-byte-order_8h.html#de4a9c512c9cd4723485181c5679f1d5ExifByteOrder  o)
00428 {
00429         exif-utils_8h.html#23497f35004fb9e65a70b29fd1622a9cExifShort  tag1 = exif-utils_8c.html#28505bc3777648fce6676fc01d74eb40exif_get_short  (p1, o);
00430         exif-utils_8h.html#23497f35004fb9e65a70b29fd1622a9cExifShort  tag2 = exif-utils_8c.html#28505bc3777648fce6676fc01d74eb40exif_get_short  (p2, o);
00431 
00432         return (tag1 < tag2) ? -1 : (tag1 > tag2) ? 1 : 0;
00433 }
00434 
00435 static int exif-data_8c.html#5a35fe1633cc9d45e05e2c95ca44b5b000436  exif-data_8c.html#5a35fe1633cc9d45e05e2c95ca44b5b0cmp_func_intel  (const void *elem1, const void *elem2)
00437 {
00438         return exif-data_8c.html#a7b5ffeabc801a678427291bd66ac15ecmp_func  ((const unsigned char *) elem1,
00439                          (const unsigned char *) elem2, exif-byte-order_8h.html#de4a9c512c9cd4723485181c5679f1d58f11995303c860a57dc560623b0df1f3EXIF_BYTE_ORDER_INTEL );
00440 }
00441 
00442 static int exif-data_8c.html#7417959a6c385ddc3087a5cb141d2e4f00443  exif-data_8c.html#7417959a6c385ddc3087a5cb141d2e4fcmp_func_motorola  (const void *elem1, const void *elem2)
00444 {
00445         return exif-data_8c.html#a7b5ffeabc801a678427291bd66ac15ecmp_func  ((const unsigned char *) elem1,
00446                          (const unsigned char *) elem2, exif-byte-order_8h.html#de4a9c512c9cd4723485181c5679f1d5bdbfc66d5e97a77e4bea9f5ba9cf2b15EXIF_BYTE_ORDER_MOTOROLA );
00447 }
00448 
00449 static void exif-data_8c.html#9d101a3590192593e0df710bd11da3c600450  exif-data_8c.html#9d101a3590192593e0df710bd11da3c6exif_data_save_data_content  ( struct__ExifData.htmlExifData  *data, struct__ExifContent.htmlExifContent  * exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd ,
00451                              unsigned char **d, unsigned int *ds,
00452                              unsigned int offset)
00453 {
00454         unsigned int j, n_ptr = 0, n_thumb = 0;
00455         exif-ifd_8h.html#012eb589be30809b32b28959abda81e6ExifIfd  i;
00456 
00457         if (!data || !data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv  || ! exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd  || !d || !ds) 
00458                 return;
00459 
00460         for (i = 0; i < exif-ifd_8h.html#012eb589be30809b32b28959abda81e687c94414a3d6e5afbeabd959ff241113EXIF_IFD_COUNT ; i++)
00461                 if ( exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd  == data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [i])
00462                         break;
00463         if (i == EXIF_IFD_COUNT)
00464                 return;
00465 
00466         /* 00467          * Check if we need some extra entries for pointers or the thumbnail. 00468          */ 00469         switch (i) {
00470         case exif-ifd_8h.html#012eb589be30809b32b28959abda81e6fb0a630569c79615438114bf16038ea6EXIF_IFD_0 :
00471 
00472                 /* 00473                  * The pointer to IFD_EXIF is in IFD_0. The pointer to 00474                  * IFD_INTEROPERABILITY is in IFD_EXIF. 00475                  */ 00476                 if (data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [ exif-ifd_8h.html#012eb589be30809b32b28959abda81e60febbc743b5c7bca8248a7c39cfb1ebcEXIF_IFD_EXIF ]->count ||
00477                     data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [ exif-ifd_8h.html#012eb589be30809b32b28959abda81e6993503e00dda7ba098815692d761e037EXIF_IFD_INTEROPERABILITY ]->count)
00478                         n_ptr++;
00479 
00480                 /* The pointer to IFD_GPS is in IFD_0. */ 00481                 if (data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [ exif-ifd_8h.html#012eb589be30809b32b28959abda81e6671420cd9eccca3c34db0476949f7cedEXIF_IFD_GPS ]->count)
00482                         n_ptr++;
00483 
00484                 break;
00485         case exif-ifd_8h.html#012eb589be30809b32b28959abda81e6dde8e56fdee7c8874c72c7484e978218EXIF_IFD_1 :
00486                 if (data-> struct__ExifData.html#433fcb7b5b2f210f10d11aea7cd79381size )
00487                         n_thumb = 2;
00488                 break;
00489         case exif-ifd_8h.html#012eb589be30809b32b28959abda81e60febbc743b5c7bca8248a7c39cfb1ebcEXIF_IFD_EXIF :
00490                 if (data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [ exif-ifd_8h.html#012eb589be30809b32b28959abda81e6993503e00dda7ba098815692d761e037EXIF_IFD_INTEROPERABILITY ]->count)
00491                         n_ptr++;
00492         default:
00493                 break;
00494         }
00495 
00496         /* 00497          * Allocate enough memory for all entries 00498          * and the number of entries. 00499          */ 00500         *ds += (2 + ( exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd ->count + n_ptr + n_thumb) * 12 + 4);
00501         *d = exif-mem_8c.html#e29eb09328c6a3b7e24fb69e0078942cexif_mem_realloc  (data->priv->mem, *d, *ds);
00502         if (!*d) {
00503                 exif-log_8h.html#8e63681e2472538492dbd994318d55c1EXIF_LOG_NO_MEMORY  (data->priv->log, "ExifData", *ds);
00504                 return;
00505         }
00506 
00507         /* Save the number of entries */ 00508         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 6 + offset, data->priv->order,
00509                         ( exif-utils_8h.html#23497f35004fb9e65a70b29fd1622a9cExifShort ) ( exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd ->count + n_ptr + n_thumb));
00510         offset += 2;
00511 
00512         /* Save each entry */ 00513         exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data->priv->log, exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00514                   "Saving %i entries (IFD '%s', offset: %i)...",
00515                   exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd ->count, exif-ifd_8c.html#13a16ae4cebfc6d3199b84cb693915cbexif_ifd_get_name  (i), offset);
00516         for (j = 0; j < exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd ->count; j++)
00517                 exif-data_8c.html#c49d3a17d0de4695d8bdc1c923a28e88exif_data_save_data_entry  (data, exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd ->entries[j], d, ds, offset + 12 * j);
00518 
00519         offset += 12 * exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd ->count;
00520 
00521         /* Now save special entries. */ 00522         switch (i) {
00523         case exif-ifd_8h.html#012eb589be30809b32b28959abda81e6fb0a630569c79615438114bf16038ea6EXIF_IFD_0 :
00524 
00525                 /* 00526                  * The pointer to IFD_EXIF is in IFD_0. 00527                  * However, the pointer to IFD_INTEROPERABILITY is in IFD_EXIF, 00528                  * therefore, if IFD_INTEROPERABILITY is not empty, we need 00529                  * IFD_EXIF even if latter is empty. 00530                  */ 00531                 if (data->ifd[ exif-ifd_8h.html#012eb589be30809b32b28959abda81e60febbc743b5c7bca8248a7c39cfb1ebcEXIF_IFD_EXIF ]->count ||
00532                     data->ifd[ exif-ifd_8h.html#012eb589be30809b32b28959abda81e6993503e00dda7ba098815692d761e037EXIF_IFD_INTEROPERABILITY ]->count) {
00533                         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 6 + offset + 0, data->priv->order,
00534                                         exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a310dc58ac7717874466ef87ed8fcc3f65EXIF_TAG_EXIF_IFD_POINTER );
00535                         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 6 + offset + 2, data->priv->order,
00536                                         exif-format_8h.html#b34eef28c00c9728719334fa6a37bcd1b6f3a3c87b514af859dc91a1a1760f51EXIF_FORMAT_LONG );
00537                         exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long   (*d + 6 + offset + 4, data->priv->order,
00538                                         1);
00539                         exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long   (*d + 6 + offset + 8, data->priv->order,
00540                                         *ds - 6);
00541                         exif-data_8c.html#9d101a3590192593e0df710bd11da3c6exif_data_save_data_content  (data,
00542                                                      data->ifd[ exif-ifd_8h.html#012eb589be30809b32b28959abda81e60febbc743b5c7bca8248a7c39cfb1ebcEXIF_IFD_EXIF ], d, ds, *ds - 6);
00543                         offset += 12;
00544                 }
00545 
00546                 /* The pointer to IFD_GPS is in IFD_0, too. */ 00547                 if (data->ifd[ exif-ifd_8h.html#012eb589be30809b32b28959abda81e6671420cd9eccca3c34db0476949f7cedEXIF_IFD_GPS ]->count) {
00548                         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 6 + offset + 0, data->priv->order,
00549                                         exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a321c372e1d34e135e6b999a8f21e95f47EXIF_TAG_GPS_INFO_IFD_POINTER );
00550                         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 6 + offset + 2, data->priv->order,
00551                                         exif-format_8h.html#b34eef28c00c9728719334fa6a37bcd1b6f3a3c87b514af859dc91a1a1760f51EXIF_FORMAT_LONG );
00552                         exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long   (*d + 6 + offset + 4, data->priv->order,
00553                                         1);
00554                         exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long   (*d + 6 + offset + 8, data->priv->order,
00555                                         *ds - 6);
00556                         exif-data_8c.html#9d101a3590192593e0df710bd11da3c6exif_data_save_data_content  (data,
00557                                                      data->ifd[ exif-ifd_8h.html#012eb589be30809b32b28959abda81e6671420cd9eccca3c34db0476949f7cedEXIF_IFD_GPS ], d, ds, *ds - 6);
00558                         offset += 12;
00559                 }
00560 
00561                 break;
00562         case exif-ifd_8h.html#012eb589be30809b32b28959abda81e60febbc743b5c7bca8248a7c39cfb1ebcEXIF_IFD_EXIF :
00563 
00564                 /* 00565                  * The pointer to IFD_INTEROPERABILITY is in IFD_EXIF. 00566                  * See note above. 00567                  */ 00568                 if (data->ifd[ exif-ifd_8h.html#012eb589be30809b32b28959abda81e6993503e00dda7ba098815692d761e037EXIF_IFD_INTEROPERABILITY ]->count) {
00569                         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 6 + offset + 0, data->priv->order,
00570                                         exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a362d2ded22799c055e7c31dbc5217c2f4EXIF_TAG_INTEROPERABILITY_IFD_POINTER );
00571                         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 6 + offset + 2, data->priv->order,
00572                                         exif-format_8h.html#b34eef28c00c9728719334fa6a37bcd1b6f3a3c87b514af859dc91a1a1760f51EXIF_FORMAT_LONG );
00573                         exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long   (*d + 6 + offset + 4, data->priv->order,
00574                                         1);
00575                         exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long   (*d + 6 + offset + 8, data->priv->order,
00576                                         *ds - 6);
00577                         exif-data_8c.html#9d101a3590192593e0df710bd11da3c6exif_data_save_data_content  (data,
00578                                                      data->ifd[ exif-ifd_8h.html#012eb589be30809b32b28959abda81e6993503e00dda7ba098815692d761e037EXIF_IFD_INTEROPERABILITY ], d, ds,
00579                                                      *ds - 6);
00580                         offset += 12;
00581                 }
00582 
00583                 break;
00584         case exif-ifd_8h.html#012eb589be30809b32b28959abda81e6dde8e56fdee7c8874c72c7484e978218EXIF_IFD_1 :
00585 
00586                 /* 00587                  * Information about the thumbnail (if any) is saved in 00588                  * IFD_1. 00589                  */ 00590                 if (data->size) {
00591 
00592                         /* EXIF_TAG_JPEG_INTERCHANGE_FORMAT */ 00593                         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 6 + offset + 0, data->priv->order,
00594                                         exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a3cb686c4d1f1b2dd828cb1bca6396f65dEXIF_TAG_JPEG_INTERCHANGE_FORMAT );
00595                         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 6 + offset + 2, data->priv->order,
00596                                         exif-format_8h.html#b34eef28c00c9728719334fa6a37bcd1b6f3a3c87b514af859dc91a1a1760f51EXIF_FORMAT_LONG );
00597                         exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long   (*d + 6 + offset + 4, data->priv->order,
00598                                         1);
00599                         exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long   (*d + 6 + offset + 8, data->priv->order,
00600                                         *ds - 6);
00601                         *ds += data->size;
00602                         *d = exif-mem_8c.html#e29eb09328c6a3b7e24fb69e0078942cexif_mem_realloc  (data->priv->mem, *d, *ds);
00603                         if (!*d) {
00604                                 exif-log_8h.html#8e63681e2472538492dbd994318d55c1EXIF_LOG_NO_MEMORY  (data->priv->log, "ExifData",
00605                                                     *ds);
00606                                 return;
00607                         }
00608                         memcpy (*d + *ds - data->size, data->data, data->size);
00609                         offset += 12;
00610 
00611                         /* EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH */ 00612                         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 6 + offset + 0, data->priv->order,
00613                                         exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a3afd0c558bee1193299ed6a201e69e69bEXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH );
00614                         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 6 + offset + 2, data->priv->order,
00615                                         exif-format_8h.html#b34eef28c00c9728719334fa6a37bcd1b6f3a3c87b514af859dc91a1a1760f51EXIF_FORMAT_LONG );
00616                         exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long   (*d + 6 + offset + 4, data->priv->order,
00617                                         1);
00618                         exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long   (*d + 6 + offset + 8, data->priv->order,
00619                                         data->size);
00620                         offset += 12;
00621                 }
00622 
00623                 break;
00624         default:
00625                 break;
00626         }
00627 
00628         /* Sort the directory according to TIFF specification */ 00629         qsort (*d + 6 + offset - ( exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd ->count + n_ptr + n_thumb) * 12,
00630                ( exif-ifd_8c.html#b2d70b13403c886d20dd36201180b69fifd ->count + n_ptr + n_thumb), 12,
00631                (data->priv->order == exif-byte-order_8h.html#de4a9c512c9cd4723485181c5679f1d58f11995303c860a57dc560623b0df1f3EXIF_BYTE_ORDER_INTEL ) ? exif-data_8c.html#5a35fe1633cc9d45e05e2c95ca44b5b0cmp_func_intel  : exif-data_8c.html#7417959a6c385ddc3087a5cb141d2e4fcmp_func_motorola );
00632 
00633         /* Correctly terminate the directory */ 00634         if (i == exif-ifd_8h.html#012eb589be30809b32b28959abda81e6fb0a630569c79615438114bf16038ea6EXIF_IFD_0  && (data->ifd[ exif-ifd_8h.html#012eb589be30809b32b28959abda81e6dde8e56fdee7c8874c72c7484e978218EXIF_IFD_1 ]->count ||
00635                                 data->size)) {
00636 
00637                 /* 00638                  * We are saving IFD 0. Tell where IFD 1 starts and save 00639                  * IFD 1. 00640                  */ 00641                 exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long  (*d + 6 + offset, data->priv->order, *ds - 6);
00642                 exif-data_8c.html#9d101a3590192593e0df710bd11da3c6exif_data_save_data_content  (data, data->ifd[ exif-ifd_8h.html#012eb589be30809b32b28959abda81e6dde8e56fdee7c8874c72c7484e978218EXIF_IFD_1 ], d, ds,
00643                                              *ds - 6);
00644         } else 00645                 exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long  (*d + 6 + offset, data->priv->order, 0);
00646 }
00647 
exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f24400648  typedef enum {
00649         exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244761567149535e7318386db13a1e1ebe4EXIF_DATA_TYPE_MAKER_NOTE_NONE           = 0,
00650         exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244898cc47f0e1a996ff53945604f855f07EXIF_DATA_TYPE_MAKER_NOTE_CANON          = 1,
00651         exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244e943735627655ec460f69c7148b3bdeeEXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS        = 2,
00652         exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244e4cc94223a1ca0150b7cef32cacbbbeaEXIF_DATA_TYPE_MAKER_NOTE_PENTAX         = 3
00653 } exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244ExifDataTypeMakerNote ;
00654 
00655 static exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244ExifDataTypeMakerNote exif-data_8c.html#02e522bb05d645a4aad305409efd423f00656  exif-data_8c.html#02e522bb05d645a4aad305409efd423fexif_data_get_type_maker_note  ( struct__ExifData.htmlExifData  *d)
00657 {
00658         struct__ExifEntry.htmlExifEntry  *e, *em;
00659         char mnote-canon-entry_8c.html#085f2f5ed7bf991a182ba0cb960f1c7bvalue [1024];
00660 
00661         if (!d) 
00662                 return exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244761567149535e7318386db13a1e1ebe4EXIF_DATA_TYPE_MAKER_NOTE_NONE ;
00663         
00664         e = exif-data_8h.html#702d1117b3ab55815503553bef347ebfexif_data_get_entry  (d, exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a364166bee6e2b6784ae437f2d94b74b2fEXIF_TAG_MAKER_NOTE );
00665         if (!e) 
00666                 return exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244761567149535e7318386db13a1e1ebe4EXIF_DATA_TYPE_MAKER_NOTE_NONE ;
00667 
00668         /* Olympus & Nikon */ 00669         if ((e-> struct__ExifEntry.html#67d1d36d044abfa9f4d94053c6a5b80dsize  >= 5) && (!memcmp (e-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata , "OLYMP", 5) ||
00670                                !memcmp (e-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata , "Nikon", 5)))
00671                 return exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244e943735627655ec460f69c7148b3bdeeEXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS ;
00672 
00673         em = exif-data_8h.html#702d1117b3ab55815503553bef347ebfexif_data_get_entry  (d, exif-tag_8h.html#c9815913f16bb40205dcbc2b4d9f36a30287c974434f7b994450f4613df5759bEXIF_TAG_MAKE );
00674         if (!em) 
00675                 return exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244761567149535e7318386db13a1e1ebe4EXIF_DATA_TYPE_MAKER_NOTE_NONE ;
00676 
00677         /* Canon */ 00678         if (!strcmp ( exif-entry_8c.html#cc379259f966d0b0e024dba3f0d7c42bexif_entry_get_value  (em, value, sizeof (value)), "Canon"))
00679                 return exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244898cc47f0e1a996ff53945604f855f07EXIF_DATA_TYPE_MAKER_NOTE_CANON ;
00680 
00681         /* Pentax & some variant of Nikon */ 00682         if ((e-> struct__ExifEntry.html#67d1d36d044abfa9f4d94053c6a5b80dsize  >= 2) && (e-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata [0] == 0x00) && (e-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata [1] == 0x1b)) {
00683                 if (!strncasecmp (
00684                             exif-entry_8c.html#cc379259f966d0b0e024dba3f0d7c42bexif_entry_get_value  (em, value, sizeof(value)),
00685                             "Nikon", 5))
00686                         return exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244e943735627655ec460f69c7148b3bdeeEXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS ;
00687                 else 00688                         return exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244e4cc94223a1ca0150b7cef32cacbbbeaEXIF_DATA_TYPE_MAKER_NOTE_PENTAX ;
00689         }
00690 
00691         return exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244761567149535e7318386db13a1e1ebe4EXIF_DATA_TYPE_MAKER_NOTE_NONE ;
00692 }
00693 
exif-data_8c.html#30a27577f2e9dd4d2195969867ad621800694  #define LOG_TOO_SMALL \ 00695 exif_log (data->priv->log, EXIF_LOG_CODE_CORRUPT_DATA, "ExifData", \ 00696                 _("Size of data too small to allow for EXIF data.")); 00697 00698 void exif-data_8h.html#19e4b26e9d7c070619ab57c815ae0f0a00699  exif-data_8c.html#df73ed60ae962be794a7514083552c02exif_data_load_data  ( struct__ExifData.htmlExifData  *data, const unsigned char *d_orig,
00700                      unsigned int ds_orig)
00701 {
00702         unsigned int l;
00703         exif-utils_8h.html#1601686195534cc6337c596fb8af54faExifLong  offset;
00704         exif-utils_8h.html#23497f35004fb9e65a70b29fd1622a9cExifShort  n;
00705         const unsigned char *d = d_orig;
00706         unsigned int ds = ds_orig, len;
00707 
00708         if (!data || !data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv  || !d || !ds) 
00709                 return;
00710 
00711         exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00712                   "Parsing %i byte(s) EXIF data...\n", ds);
00713 
00714         /* 00715          * It can be that the data starts with the EXIF header. If it does 00716          * not, search the EXIF marker. 00717          */ 00718         if (ds < 6) {
00719                 exif-data_8c.html#30a27577f2e9dd4d2195969867ad6218LOG_TOO_SMALL ;
00720                 return;
00721         }
00722         if (!memcmp (d, exif-data_8c.html#2a54a3fd3af187fb5613823530f5015dExifHeader , 6)) {
00723                 exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00724                           "Found EXIF header.");
00725         } else {
00726                 while (1) {
00727                         while ((d[0] == 0xff) && ds) {
00728                                 d++;
00729                                 ds--;
00730                         }
00731 
00732                         /* JPEG_MARKER_SOI */ 00733                         if (d[0] == exif-data_8c.html#08365525ee0dff7ff58f8231305c3e89JPEG_MARKER_SOI ) {
00734                                 d++;
00735                                 ds--;
00736                                 continue;
00737                         }
00738 
00739                         /* JPEG_MARKER_APP0 */ 00740                         if (d[0] == exif-data_8c.html#7385540b8a640c8d67cf453b14aeddb3JPEG_MARKER_APP0 ) {
00741                                 d++;
00742                                 ds--;
00743                                 l = (d[0] << 8) | d[1];
00744                                 if (l > ds)
00745                                         return;
00746                                 d += l;
00747                                 ds -= l;
00748                                 continue;
00749                         }
00750 
00751                         /* JPEG_MARKER_APP1 */ 00752                         if (d[0] == exif-data_8c.html#203cbb3604314163bb57300f8a2aa886JPEG_MARKER_APP1 )
00753                                 break;
00754 
00755                         /* Unknown marker or data. Give up. */ 00756                         exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2375f88a49d1bdaaafc38597bf60e6d25EXIF_LOG_CODE_CORRUPT_DATA ,
00757                                   "ExifData", i18n_8h.html#709240620a80c25aca1c4e2576c3cba8_ ("EXIF marker not found."));
00758                         return;
00759                 }
00760                 d++;
00761                 ds--;
00762                 if (ds < 2) {
00763                         exif-data_8c.html#30a27577f2e9dd4d2195969867ad6218LOG_TOO_SMALL ;
00764                         return;
00765                 }
00766                 len = (d[0] << 8) | d[1];
00767                 exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00768                           "We have to deal with %i byte(s) of EXIF data.",
00769                           len);
00770                 d += 2;
00771                 ds -= 2;
00772         }
00773 
00774         /* 00775          * Verify the exif header 00776          * (offset 2, length 6). 00777          */ 00778         if (ds < 6) {
00779                 exif-data_8c.html#30a27577f2e9dd4d2195969867ad6218LOG_TOO_SMALL ;
00780                 return;
00781         }
00782         if (memcmp (d, exif-data_8c.html#2a54a3fd3af187fb5613823530f5015dExifHeader , 6)) {
00783                 exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2375f88a49d1bdaaafc38597bf60e6d25EXIF_LOG_CODE_CORRUPT_DATA ,
00784                           "ExifData", i18n_8h.html#709240620a80c25aca1c4e2576c3cba8_ ("EXIF header not found."));
00785                 return;
00786         }
00787 
00788         exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00789                   "Found EXIF header.");
00790 
00791         /* Byte order (offset 6, length 2) */ 00792         if (ds < 14)
00793                 return;
00794         if (!memcmp (d + 6, "II", 2))
00795                 data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order  = exif-byte-order_8h.html#de4a9c512c9cd4723485181c5679f1d58f11995303c860a57dc560623b0df1f3EXIF_BYTE_ORDER_INTEL ;
00796         else if (!memcmp (d + 6, "MM", 2))
00797                 data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order  = exif-byte-order_8h.html#de4a9c512c9cd4723485181c5679f1d5bdbfc66d5e97a77e4bea9f5ba9cf2b15EXIF_BYTE_ORDER_MOTOROLA ;
00798         else {
00799                 exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2375f88a49d1bdaaafc38597bf60e6d25EXIF_LOG_CODE_CORRUPT_DATA ,
00800                           "ExifData", i18n_8h.html#709240620a80c25aca1c4e2576c3cba8_ ("Unknown encoding."));
00801                 return;
00802         }
00803 
00804         /* Fixed value */ 00805         if ( exif-utils_8c.html#28505bc3777648fce6676fc01d74eb40exif_get_short  (d + 8, data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order ) != 0x002a)
00806                 return;
00807 
00808         /* IFD 0 offset */ 00809         offset = exif-utils_8c.html#c8ce446b600340ccf5f120d8735319f3exif_get_long  (d + 10, data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order );
00810         exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData", 
00811                   "IFD 0 at %i.", (int) offset);
00812 
00813         /* Parse the actual exif data (usually offset 14 from start) */ 00814         exif-data_8c.html#281da75dacdd27a5e10d210788e60885exif_data_load_data_content  (data, exif-ifd_8h.html#012eb589be30809b32b28959abda81e6fb0a630569c79615438114bf16038ea6EXIF_IFD_0 , d + 6, ds - 6, offset, 0);
00815 
00816         /* IFD 1 offset */ 00817         if (offset + 6 + 2 > ds) {
00818                 return;
00819         }
00820         n = exif-utils_8c.html#28505bc3777648fce6676fc01d74eb40exif_get_short  (d + 6 + offset, data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order );
00821         if (offset + 6 + 2 + 12 * n + 4 > ds) {
00822                 return;
00823         }
00824         offset = exif-utils_8c.html#c8ce446b600340ccf5f120d8735319f3exif_get_long  (d + 6 + offset + 2 + 12 * n, data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order );
00825         if (offset) {
00826                 exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00827                           "IFD 1 at %i.", (int) offset);
00828 
00829                 /* Sanity check. */ 00830                 if (offset > ds - 6) {
00831                         exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2375f88a49d1bdaaafc38597bf60e6d25EXIF_LOG_CODE_CORRUPT_DATA ,
00832                                   "ExifData", "Bogus offset.");
00833                         return;
00834                 }
00835 
00836                 exif-data_8c.html#281da75dacdd27a5e10d210788e60885exif_data_load_data_content  (data, exif-ifd_8h.html#012eb589be30809b32b28959abda81e6dde8e56fdee7c8874c72c7484e978218EXIF_IFD_1 , d + 6, ds - 6, offset, 0);
00837         }
00838 
00839         /* 00840          * If we got an EXIF_TAG_MAKER_NOTE, try to interpret it. Some 00841          * cameras use pointers in the maker note tag that point to the 00842          * space between IFDs. Here is the only place where we have access 00843          * to that data. 00844          */ 00845         switch ( exif-data_8c.html#02e522bb05d645a4aad305409efd423fexif_data_get_type_maker_note  (data)) {
00846         case exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244e943735627655ec460f69c7148b3bdeeEXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS :
00847                 data->priv->md = exif-mnote-data-olympus_8c.html#270bc935e8d8cf13d2dde4007ed76eb3exif_mnote_data_olympus_new  (data->priv->mem);
00848                 break;
00849         case exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244e4cc94223a1ca0150b7cef32cacbbbeaEXIF_DATA_TYPE_MAKER_NOTE_PENTAX :
00850                 data->priv->md = exif-mnote-data-pentax_8c.html#58800d279c7e06b6b9af9248f4059b26exif_mnote_data_pentax_new  (data->priv->mem);
00851                 break;
00852         case exif-data_8c.html#5d5a699c2ba7f21f71d17ac9ac67f244898cc47f0e1a996ff53945604f855f07EXIF_DATA_TYPE_MAKER_NOTE_CANON :
00853                 data->priv->md = exif-mnote-data-canon_8c.html#0ae1c332b1e8eb17a3f910b5c80dad36exif_mnote_data_canon_new  (data->priv->mem);
00854                 break;
00855         default:
00856                 break;
00857         }
00858 
00859         /* 00860          * If we are able to interpret the maker note, do so. 00861          */ 00862         if (data->priv->md) {
00863                 exif-mnote-data_8c.html#287e1c41b51b5abe79a51c80e7f9983fexif_mnote_data_log  (data->priv->md, data->priv->log);
00864                 exif-mnote-data-priv_8h.html#97ad703423084ddc95e573fe891905dfexif_mnote_data_set_byte_order  (data->priv->md,
00865                                                 data->priv->order);
00866                 exif-mnote-data-priv_8h.html#cd453a059a4cf3fb6ff1fd87cb85db5cexif_mnote_data_set_offset  (data->priv->md,
00867                                             data->priv->offset_mnote);
00868                 exif-mnote-data_8c.html#c720f234ab333f18dd36b3b5320dd350exif_mnote_data_load  (data->priv->md, d, ds);
00869         }
00870 
00871         if (data->priv->options & exif-data_8h.html#e7b8bb9385ee2311b5e9a22e8ea8a42b374dabd4abe879f7c7121d29fbd9b4baEXIF_DATA_OPTION_FOLLOW_SPECIFICATION )
00872                 exif-data_8c.html#bf4e54a6fa109aeb1e1319d6713e114fexif_data_fix  (data);
00873 }
00874 
00875 void exif-data_8h.html#e3075a349d72d7f57ede50a163bdfdda00876  exif-data_8c.html#86033aa3c568c7db13395e4608c90810exif_data_save_data  ( struct__ExifData.htmlExifData  *data, unsigned char **d, unsigned int *ds)
00877 {
00878         if (!data || !d || !ds)
00879                 return;
00880 
00881         /* Header */ 00882         *ds = 14;
00883         *d = exif-data_8c.html#eab8bbe90e34d112c1daa52e2ac7c62aexif_data_alloc  (data, *ds);
00884         if (!*d) 
00885                 return;
00886         memcpy (*d, exif-data_8c.html#2a54a3fd3af187fb5613823530f5015dExifHeader , 6);
00887 
00888         /* Order (offset 6) */ 00889         if (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order  == exif-byte-order_8h.html#de4a9c512c9cd4723485181c5679f1d58f11995303c860a57dc560623b0df1f3EXIF_BYTE_ORDER_INTEL ) {
00890                 memcpy (*d + 6, "II", 2);
00891         } else {
00892                 memcpy (*d + 6, "MM", 2);
00893         }
00894 
00895         /* Fixed value (2 bytes, offset 8) */ 00896         exif-utils_8c.html#3c3f4df2af5ea90902c44b23b05e20c3exif_set_short  (*d + 8, data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order , 0x002a);
00897 
00898         /* 00899          * IFD 0 offset (4 bytes, offset 10). 00900          * We will start 8 bytes after the 00901          * EXIF header (2 bytes for order, another 2 for the test, and 00902          * 4 bytes for the IFD 0 offset make 8 bytes together). 00903          */ 00904         exif-utils_8c.html#73d539019fccab7808a97c9501e3154dexif_set_long  (*d + 10, data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order , 8);
00905 
00906         /* Now save IFD 0. IFD 1 will be saved automatically. */ 00907         exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00908                   "Saving IFDs...");
00909         exif-data_8c.html#9d101a3590192593e0df710bd11da3c6exif_data_save_data_content  (data, data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [ exif-ifd_8h.html#012eb589be30809b32b28959abda81e6fb0a630569c79615438114bf16038ea6EXIF_IFD_0 ], d, ds,
00910                                      *ds - 6);
00911         exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog , exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "ExifData",
00912                   "Saved %i byte(s) EXIF data.", *ds);
00913 }
00914 
00915 struct__ExifData.htmlExifData  *
exif-data_8h.html#d60728ac31b4c5be464437bc6014906800916  exif-data_8c.html#d60728ac31b4c5be464437bc60149068exif_data_new_from_file  (const char *path)
00917 {
00918         struct__ExifData.htmlExifData  *edata;
00919         struct__ExifLoader.htmlExifLoader  *loader;
00920 
00921         loader = exif-loader_8c.html#3950d3770c3b0b5960e6f9818cac759eexif_loader_new  ();
00922         exif-loader_8c.html#8e5095d608ceb8ef7e92b9f56f6f52faexif_loader_write_file  (loader, path);
00923         edata = exif-loader_8c.html#4f42fd6580d0cc1bda2822c8232d63f1exif_loader_get_data  (loader);
00924         exif-loader_8c.html#0a31eab6b3bc0d2a7d935da2c25e114bexif_loader_unref  (loader);
00925 
00926         return (edata);
00927 }
00928 
00929 void exif-data_8h.html#780e04ad271a5e1a80af97c3ed3d304400930  exif-data_8c.html#780e04ad271a5e1a80af97c3ed3d3044exif_data_ref  ( struct__ExifData.htmlExifData  *data)
00931 {
00932         if (!data)
00933                 return;
00934 
00935         data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#fc8a08a288ea36146c9465c33dbceecaref_count ++;
00936 }
00937 
00938 void exif-data_8h.html#4b5f9b7dd1577a90e74b7a8d5c40462500939  exif-data_8c.html#4b5f9b7dd1577a90e74b7a8d5c404625exif_data_unref  ( struct__ExifData.htmlExifData  *data)
00940 {
00941         if (!data) 
00942                 return;
00943 
00944         data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#fc8a08a288ea36146c9465c33dbceecaref_count --;
00945         if (!data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#fc8a08a288ea36146c9465c33dbceecaref_count ) 
00946                 exif-data_8c.html#0597d9864272e19c51dfec5541c7adedexif_data_free  (data);
00947 }
00948 
00949 void exif-data_8h.html#0597d9864272e19c51dfec5541c7aded00950  exif-data_8c.html#0597d9864272e19c51dfec5541c7adedexif_data_free  ( struct__ExifData.htmlExifData  *data)
00951 {
00952         unsigned int i;
00953         struct__ExifMem.htmlExifMem  *mem = (data && data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv ) ? data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#9bce3dacc65f4d974b3655ec15f7e553mem  : NULL;
00954 
00955         if (!data) 
00956                 return;
00957 
00958         for (i = 0; i < exif-ifd_8h.html#012eb589be30809b32b28959abda81e687c94414a3d6e5afbeabd959ff241113EXIF_IFD_COUNT ; i++) {
00959                 if (data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [i]) {
00960                         exif-content_8c.html#814bd004542dc1ec8bbb53204e0b6d4aexif_content_unref  (data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [i]);
00961                         data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [i] = NULL;
00962                 }
00963         }
00964 
00965         if (data->data) {
00966                 exif-mem_8c.html#c18517acd3216e21942966d3dfab5f53exif_mem_free  (mem, data->data);
00967                 data->data = NULL;
00968         }
00969 
00970         if (data->priv) {
00971                 if (data->priv->log) {
00972                         exif-log_8c.html#a4f16b2e2aa992cd5d1598fbf68d2fb7exif_log_unref  (data->priv->log);
00973                         data->priv->log = NULL;
00974                 }
00975                 if (data->priv->md) {
00976                         exif-mnote-data_8c.html#ee4bc15f166486917b7401fb36a609f7exif_mnote_data_unref  (data->priv->md);
00977                         data->priv->md = NULL;
00978                 }
00979                 exif-mem_8c.html#c18517acd3216e21942966d3dfab5f53exif_mem_free  (mem, data->priv);
00980                 exif-mem_8c.html#c18517acd3216e21942966d3dfab5f53exif_mem_free  (mem, data);
00981         }
00982 
00983         exif-mem_8c.html#fd6959367336c1459125c43e3f16fec8exif_mem_unref  (mem);
00984 }
00985 
00986 void exif-data_8h.html#fc921000db59e9dc9179a8b9e82b3d4500987  exif-data_8c.html#fc921000db59e9dc9179a8b9e82b3d45exif_data_dump  ( struct__ExifData.htmlExifData  *data)
00988 {
00989         unsigned int i;
00990 
00991         if (!data)
00992                 return;
00993 
00994         for (i = 0; i < exif-ifd_8h.html#012eb589be30809b32b28959abda81e687c94414a3d6e5afbeabd959ff241113EXIF_IFD_COUNT ; i++) {
00995                 if (data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [i] && data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [i]-> struct__ExifContent.html#4265fe1501e719991a7d9f425f50a7bbcount ) {
00996                         printf ("Dumping IFD '%s'...\n",
00997                                 exif-ifd_8c.html#13a16ae4cebfc6d3199b84cb693915cbexif_ifd_get_name  (i));
00998                         exif-content_8c.html#eadac364f4859ebe44d0a249c5a3529bexif_content_dump  (data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [i], 0);
00999                 }
01000         }
01001 
01002         if (data->data) {
01003                 printf ("%i byte(s) thumbnail data available.", data->size);
01004                 if (data->size >= 4) {
01005                         printf ("0x%02x 0x%02x ... 0x%02x 0x%02x\n",
01006                                 data->data[0], data->data[1],
01007                                 data->data[data->size - 2],
01008                                 data->data[data->size - 1]);
01009                 }
01010         }
01011 }
01012 
01013 exif-byte-order_8h.html#de4a9c512c9cd4723485181c5679f1d5ExifByteOrder exif-data_8h.html#6632980f1757aaca6021f389f3c37eb001014  exif-data_8c.html#6632980f1757aaca6021f389f3c37eb0exif_data_get_byte_order  ( struct__ExifData.htmlExifData  *data)
01015 {
01016         if (!data)
01017                 return (0);
01018 
01019         return (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order );
01020 }
01021 
01022 void exif-data_8h.html#9a4e4bdbe9e0ee2cc801fa5ebaa12fac01023  exif-data_8c.html#9a4e4bdbe9e0ee2cc801fa5ebaa12facexif_data_foreach_content  ( struct__ExifData.htmlExifData  *data, exif-data_8h.html#79b22030e037a2532c4f63d8bec03f3aExifDataForeachContentFunc  func,
01024                            void *user_data)
01025 {
01026         unsigned int i;
01027 
01028         if (!data || !func)
01029                 return;
01030 
01031         for (i = 0; i < exif-ifd_8h.html#012eb589be30809b32b28959abda81e687c94414a3d6e5afbeabd959ff241113EXIF_IFD_COUNT ; i++)
01032                 func (data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [i], user_data);
01033 }
01034 
exif-data_8c.html#4ca79eb2812fe8cc89ab43483d9c5b7201035  typedef struct struct__ByteOrderChangeData.html_ByteOrderChangeData  exif-data_8c.html#4ca79eb2812fe8cc89ab43483d9c5b72ByteOrderChangeData ;
struct__ByteOrderChangeData.html01036  struct struct__ByteOrderChangeData.html_ByteOrderChangeData  {
struct__ByteOrderChangeData.html#e888b5a8caa9b9072cdf61b1eba1194d01037          exif-byte-order_8h.html#de4a9c512c9cd4723485181c5679f1d5ExifByteOrder  struct__ByteOrderChangeData.html#e888b5a8caa9b9072cdf61b1eba1194dold , new;
01038 };
01039 
01040 static void exif-data_8c.html#e0c24bc6df407c49c8d845591085d23c01041  exif-data_8c.html#e0c24bc6df407c49c8d845591085d23centry_set_byte_order  ( struct__ExifEntry.htmlExifEntry  *e, void *data)
01042 {
01043         exif-data_8c.html#4ca79eb2812fe8cc89ab43483d9c5b72ByteOrderChangeData  *d = data;
01044 
01045         if (!e)
01046                 return;
01047 
01048         exif-utils_8c.html#a54ca56c1ccaeb730631f1c1e7ce807aexif_array_set_byte_order  (e-> struct__ExifEntry.html#630d2f54097574b308aaba7c693cf2fcformat , e-> struct__ExifEntry.html#0123f00041fe6c5a347d5b230119d5dadata , e-> struct__ExifEntry.html#5d0dc86b91a1ec39ea32ae6b693baf13components , d-> struct__ByteOrderChangeData.html#e888b5a8caa9b9072cdf61b1eba1194dold , d-> struct__ByteOrderChangeData.html#6e5ecfd2c7db71912cbef73b41d375d3new );
01049 }
01050 
01051 static void exif-data_8c.html#1522ad8a63ba31470ee635708267320401052  exif-data_8c.html#1522ad8a63ba31470ee6357082673204content_set_byte_order  ( struct__ExifContent.htmlExifContent  *content, void *data)
01053 {
01054         exif-content_8c.html#7c6940bd0934dac4f79ca3f168984797exif_content_foreach_entry  (content, exif-data_8c.html#e0c24bc6df407c49c8d845591085d23centry_set_byte_order , data);
01055 }
01056 
01057 void exif-data_8h.html#d99ec751622c705fb2bd4d2c4d186bce01058  exif-data_8c.html#d99ec751622c705fb2bd4d2c4d186bceexif_data_set_byte_order  ( struct__ExifData.htmlExifData  *data, exif-byte-order_8h.html#de4a9c512c9cd4723485181c5679f1d5ExifByteOrder  order)
01059 {
01060         exif-data_8c.html#4ca79eb2812fe8cc89ab43483d9c5b72ByteOrderChangeData  d;
01061 
01062         if (!data || (order == data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order ))
01063                 return;
01064 
01065         d. struct__ByteOrderChangeData.html#e888b5a8caa9b9072cdf61b1eba1194dold  = data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order ;
01066         d. struct__ByteOrderChangeData.html#6e5ecfd2c7db71912cbef73b41d375d3new  = order;
01067         exif-data_8c.html#9a4e4bdbe9e0ee2cc801fa5ebaa12facexif_data_foreach_content  (data, exif-data_8c.html#1522ad8a63ba31470ee6357082673204content_set_byte_order , &d);
01068         data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#16e8b2afd245eac65c2bde6f538e9fe7order  = order;
01069         if (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#e6cbc82fdf69415e9377350c577ab5d3md )
01070                 exif-mnote-data-priv_8h.html#97ad703423084ddc95e573fe891905dfexif_mnote_data_set_byte_order  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#e6cbc82fdf69415e9377350c577ab5d3md , order);
01071 }
01072 
01073 void exif-data_8h.html#8c849acb22b25d075a2863fe1cbf3c4201074  exif-data_8c.html#8c849acb22b25d075a2863fe1cbf3c42exif_data_log  ( struct__ExifData.htmlExifData  *data, struct__ExifLog.htmlExifLog  *log)
01075 {
01076         unsigned int i;
01077 
01078         if (!data || !data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv ) 
01079                 return;
01080         exif-log_8c.html#a4f16b2e2aa992cd5d1598fbf68d2fb7exif_log_unref  (data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog );
01081         data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog  = log;
01082         exif-log_8c.html#926f0e50e2afab52db87acfbf76ff878exif_log_ref  (log);
01083 
01084         for (i = 0; i < exif-ifd_8h.html#012eb589be30809b32b28959abda81e687c94414a3d6e5afbeabd959ff241113EXIF_IFD_COUNT ; i++)
01085                 exif-content_8c.html#f6d34cba65d77805a9b51136d440e266exif_content_log  (data-> struct__ExifData.html#30a074ac0cea9f9b49d7c79aac44a214ifd [i], log);
01086 }
01087 
01088 /* Used internally within libexif */ 01089 struct__ExifLog.htmlExifLog  * exif-data_8c.html#0e15b20cd01fc7f94e3e04b6601baf2fexif_data_get_log  ( struct__ExifData.htmlExifData  *);
01090 struct__ExifLog.htmlExifLog  *
exif-data_8c.html#0e15b20cd01fc7f94e3e04b6601baf2f01091  exif-data_8c.html#0e15b20cd01fc7f94e3e04b6601baf2fexif_data_get_log  ( struct__ExifData.htmlExifData  *data)
01092 {
01093         if (!data || !data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv ) 
01094                 return NULL;
01095         return data-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#7e2f37b370568de3d7b18721c04f049clog ;
01096 }
01097 
01098 static struct {
exif-data_8c.html#e44602cc394c1616fa7d66d30a2fe64c01099          exif-data_8h.html#e7b8bb9385ee2311b5e9a22e8ea8a42bExifDataOption  exif-data_8c.html#e44602cc394c1616fa7d66d30a2fe64coption ;
exif-data_8c.html#c9ef026b2193e5a22a4fe38bf420671301100          const char * mnote-canon-entry_8c.html#f7de737402a426cb055e20e44007597dname ;
exif-data_8c.html#531d36b55f567ae3857c86cec73c164a01101          const char * mnote-canon-tag_8c.html#531d36b55f567ae3857c86cec73c164adescription ;
01102 } exif-data_8c.html#e399f9aba8687087905a6ce01ba9e437exif_data_option [] = {
01103         { exif-data_8h.html#e7b8bb9385ee2311b5e9a22e8ea8a42bdcc7d05eafa1b0d0b76b198cca319cb5EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS , i18n_8h.html#3a5ebfb532ab1a97cf24a0c0320b9c58N_ ("Ignore unknown tags"),
01104          i18n_8h.html#3a5ebfb532ab1a97cf24a0c0320b9c58N_ ("Ignore unknown tags when loading EXIF data.")},
01105         { exif-data_8h.html#e7b8bb9385ee2311b5e9a22e8ea8a42b374dabd4abe879f7c7121d29fbd9b4baEXIF_DATA_OPTION_FOLLOW_SPECIFICATION , i18n_8h.html#3a5ebfb532ab1a97cf24a0c0320b9c58N_ ("Follow specification"),
01106          i18n_8h.html#3a5ebfb532ab1a97cf24a0c0320b9c58N_ ("Add, correct and remove entries to get EXIF data that follows " 01107             "the specification.")},
01108         {0, NULL, NULL}
01109 };
01110 
01111 const char *
exif-data_8h.html#d5cba93793148060314e7c4db9e1c85b01112  exif-data_8c.html#5ee43bd09fb961092af0074bfe8d0c64exif_data_option_get_name  ( exif-data_8h.html#e7b8bb9385ee2311b5e9a22e8ea8a42bExifDataOption  o)
01113 {
01114         unsigned int i;
01115 
01116         for (i = 0; exif-data_8c.html#e399f9aba8687087905a6ce01ba9e437exif_data_option [i].name; i++)
01117                 if ( exif-data_8c.html#e399f9aba8687087905a6ce01ba9e437exif_data_option [i]. exif-data_8c.html#e44602cc394c1616fa7d66d30a2fe64coption  == o) 
01118                         break;
01119         return i18n_8h.html#709240620a80c25aca1c4e2576c3cba8_ ( exif-data_8c.html#e399f9aba8687087905a6ce01ba9e437exif_data_option [i]. mnote-canon-entry_8c.html#f7de737402a426cb055e20e44007597dname );
01120 }
01121 
01122 const char *
exif-data_8h.html#37008944167216732fe41b64a41c175901123  exif-data_8c.html#41ab388df001d9678aacdab0a1430a1aexif_data_option_get_description  ( exif-data_8h.html#e7b8bb9385ee2311b5e9a22e8ea8a42bExifDataOption  o)
01124 {
01125         unsigned int i;
01126 
01127         for (i = 0; exif-data_8c.html#e399f9aba8687087905a6ce01ba9e437exif_data_option [i].description; i++)
01128                 if ( exif-data_8c.html#e399f9aba8687087905a6ce01ba9e437exif_data_option [i]. exif-data_8c.html#e44602cc394c1616fa7d66d30a2fe64coption  == o) 
01129                         break;
01130         return i18n_8h.html#709240620a80c25aca1c4e2576c3cba8_ ( exif-data_8c.html#e399f9aba8687087905a6ce01ba9e437exif_data_option [i]. mnote-canon-tag_8c.html#531d36b55f567ae3857c86cec73c164adescription );
01131 }
01132 
01133 void exif-data_8h.html#3bfe76ff2acbf2dee6f7127c3162e11d01134  exif-data_8c.html#9ca00d92d42ff634036d1b1f050ca9a2exif_data_set_option  ( struct__ExifData.htmlExifData  *d, exif-data_8h.html#e7b8bb9385ee2311b5e9a22e8ea8a42bExifDataOption  o)
01135 {
01136         if (!d) 
01137                 return;
01138 
01139         d-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#86ed3cd215c450b712e04760d06c6978options  |= o;
01140 }
01141 
01142 void exif-data_8h.html#e3e140dea09ad475db7259279ab3e1e601143  exif-data_8c.html#f132122edde72a13ce0e59a088a8d121exif_data_unset_option  ( struct__ExifData.htmlExifData  *d, exif-data_8h.html#e7b8bb9385ee2311b5e9a22e8ea8a42bExifDataOption  o)
01144 {
01145         if (!d) 
01146                 return;
01147 
01148         d-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#86ed3cd215c450b712e04760d06c6978options  &= ~o;
01149 }
01150 
01151 static void exif-data_8c.html#4f8a3c671a42fe7bba4eeca85c406b0e01152  exif-content_8c.html#801a4aae84b39eb55c50a47e9f433e36fix_func  ( struct__ExifContent.htmlExifContent  *c, void *data)
01153 {
01154         switch ( exif-content_8c.html#b269f3232148e01ca609757cd7b7173bexif_content_get_ifd  (c)) {
01155         case exif-ifd_8h.html#012eb589be30809b32b28959abda81e6dde8e56fdee7c8874c72c7484e978218EXIF_IFD_1 :
01156                 if (c->parent->data)
01157                         exif-content_8c.html#53f6100698f8bd323501e9c31932766dexif_content_fix  (c);
01158                 else {
01159                         exif-log_8c.html#2252b03f7df6cd3688d6647cd7ba3fccexif_log  (c->parent->priv->log, exif-log_8h.html#d7dbc9f25878759b54247de66204b7f2e8386f9a77a68764087d7f3d692f383eEXIF_LOG_CODE_DEBUG , "exif-data",
01160                                   "No thumbnail but entries on thumbnail. These entries have been " 01161                                   "removed.");
01162                         while (c->count)
01163                                 exif-content_8c.html#42678d16b6477a00d83aebb787d0b03bexif_content_remove_entry  (c, c->entries[c->count - 1]);
01164                 }
01165                 break;
01166         default:
01167                 exif-content_8c.html#53f6100698f8bd323501e9c31932766dexif_content_fix  (c);
01168         }
01169 }
01170 
01171 void exif-data_8h.html#b8a1e6161083c27f1514522f3ecac95101172  exif-data_8c.html#bf4e54a6fa109aeb1e1319d6713e114fexif_data_fix  ( struct__ExifData.htmlExifData  *d)
01173 {
01174         exif-data_8c.html#9a4e4bdbe9e0ee2cc801fa5ebaa12facexif_data_foreach_content  (d, exif-content_8c.html#801a4aae84b39eb55c50a47e9f433e36fix_func , NULL);
01175 }
01176 
01177 void exif-data_8h.html#1c072df3f3ec48b6b4817565c82718a101178  exif-data_8c.html#be8090b43fcdfb5a63d02c45f0a3fbdaexif_data_set_data_type  ( struct__ExifData.htmlExifData  *d, exif-data-type_8h.html#7ce2f6788670b1693c10514810a8cae1ExifDataType  dt)
01179 {
01180         if (!d || !d-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv ) 
01181                 return;
01182 
01183         d-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#a7838bec895b580a546c46d5b3d1c77cdata_type  = dt;
01184 }
01185 
01186 exif-data-type_8h.html#7ce2f6788670b1693c10514810a8cae1ExifDataType exif-data_8h.html#bacd62e55a4af71b058f014e68b1c95b01187  exif-data_8c.html#72ade14fcde3e475fce73a6004b607b6exif_data_get_data_type  ( struct__ExifData.htmlExifData  *d)
01188 {
01189         return (d && d-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv ) ? d-> struct__ExifData.html#0e9032fc8b2f841198624dbcf13e1bf5priv -> struct__ExifDataPrivate.html#a7838bec895b580a546c46d5b3d1c77cdata_type  : exif-data-type_8h.html#7ce2f6788670b1693c10514810a8cae10ccee3347249b67411373054c2e7cfcdEXIF_DATA_TYPE_COUNT ;
01190 }
Generated on Sun Apr 23 01:22:39 2006 for EXIF library (libexif) Internals by 
http://www.doxygen.org/index.htmldoxygen  1.4.6 