  
    
main.htmlMain Page     
classes.htmlData Structures     
files.htmlFiles     
dirs.htmlDirectories   
  
    
files.htmlFile List     
globals.htmlGlobals   
dir_3c4fde49625df9344590fff295c7c38d.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#fa99ec4acc4ecb2dc3c2d05da15d0e3f00041  #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#6a73d744a065090aa9e890b8547304e900048  #define JPEG_MARKER_SOI  0xd8 00049 #undef JPEG_MARKER_APP0 exif-data_8c.html#3eb6e3444f79d449058145a01872f4b300050  #define JPEG_MARKER_APP0 0xe0 00051 #undef JPEG_MARKER_APP1 exif-data_8c.html#05c1aea46cae41a712e35830a2ca28b800052  #define JPEG_MARKER_APP1 0xe1 00053 exif-data_8c.html#7107bf174abd5f9994053ef9ae84044a00054  static const unsigned char exif-data_8c.html#7107bf174abd5f9994053ef9ae84044aExifHeader [] = {0x45, 0x78, 0x69, 0x66, 0x00, 0x00};
00055 
struct__ExifDataPrivate.html00056  struct struct__ExifDataPrivate.html_ExifDataPrivate 00057 {
struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c500058          exif-byte-order_8h.html#f966227d69ff74eea7ecd69ca645155bExifByteOrder  struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order ;
00059 
struct__ExifDataPrivate.html#e282eaad62e448a29d1fcaabd418fc9d00060          struct__ExifMnoteData.htmlExifMnoteData  * struct__ExifDataPrivate.html#e282eaad62e448a29d1fcaabd418fc9dmd ;
00061 
struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549c00062          struct__ExifLog.htmlExifLog  * struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog ;
struct__ExifDataPrivate.html#83a309c082c6c65eb9f2e42865df23d400063          struct__ExifMem.htmlExifMem  * struct__ExifDataPrivate.html#83a309c082c6c65eb9f2e42865df23d4mem ;
00064 
struct__ExifDataPrivate.html#ff67f5a96636c8057acbbd097f8ddf2600065          unsigned int struct__ExifDataPrivate.html#ff67f5a96636c8057acbbd097f8ddf26ref_count ;
00066 
00067         /* Temporarily used while loading data */ struct__ExifDataPrivate.html#2cd5a43e3712407b5d8deecf74cdc43600068          unsigned int struct__ExifDataPrivate.html#2cd5a43e3712407b5d8deecf74cdc436offset_mnote ;
00069 
struct__ExifDataPrivate.html#0563f18994a859c3f7df9e9de3d9150400070          exif-data_8h.html#324f86ac1d053b37aaee45d2cfbda96dExifDataOption  struct__ExifDataPrivate.html#0563f18994a859c3f7df9e9de3d91504options ;
struct__ExifDataPrivate.html#0358c8918feb6899a7ebc18f629aea5900071          exif-data-type_8h.html#b7d01513ff048ac5d8ae50a3e0235ce8ExifDataType  struct__ExifDataPrivate.html#0358c8918feb6899a7ebc18f629aea59data_type ;
00072 };
00073 
00074 static void *
exif-data_8c.html#77cbef422b7a511d6405285ad9e0015200075  exif-data_8c.html#77cbef422b7a511d6405285ad9e00152exif_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#e8c09cfbcb95e435c4c4b7ec3bbd79e4exif_mem_alloc  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#83a309c082c6c65eb9f2e42865df23d4mem , i);
00083         if (d) 
00084                 return d;
00085 
00086         exif-log_8h.html#4221b964f5ee550f6166126b263d3b2fEXIF_LOG_NO_MEMORY  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , "ExifData", i);
00087         return NULL;
00088 }
00089 
00090 struct__ExifMnoteData.htmlExifMnoteData  *
exif-data_8h.html#b210404856ec1e04e0a17f13ab78c9c600091  exif-data_8c.html#81091d71b36b90611e996106680d478fexif_data_get_mnote_data  ( struct__ExifData.htmlExifData  *d)
00092 {
00093         return (d && d-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv ) ? d-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#e282eaad62e448a29d1fcaabd418fc9dmd  : NULL;
00094 }
00095 
00096 struct__ExifData.htmlExifData  *
exif-data_8h.html#1b1570fbbb15d525a0dfde8db7c8b50000097  exif-data_8c.html#1b1570fbbb15d525a0dfde8db7c8b500exif_data_new  (void)
00098 {
00099         struct__ExifMem.htmlExifMem  *mem = exif-mem_8c.html#cd2926c29b470c9d43f84567a84d5acbexif_mem_new_default  ();
00100         struct__ExifData.htmlExifData  *d = exif-data_8c.html#bd793f6c516c5b92dd3b1bbd9e7f5ac6exif_data_new_mem  (mem);
00101 
00102         exif-mem_8c.html#66744e0987af08c443df247ce55f7d87exif_mem_unref  (mem);
00103 
00104         return d;
00105 }
00106 
00107 struct__ExifData.htmlExifData  *
exif-data_8h.html#e0236d550b49c78505b82105da905b9400108  exif-data_8c.html#bd793f6c516c5b92dd3b1bbd9e7f5ac6exif_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#e8c09cfbcb95e435c4c4b7ec3bbd79e4exif_mem_alloc  (mem, sizeof ( struct__ExifData.htmlExifData ));
00117         if (!data) 
00118                 return (NULL);
00119         data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv  = exif-mem_8c.html#e8c09cfbcb95e435c4c4b7ec3bbd79e4exif_mem_alloc  (mem, sizeof ( struct__ExifDataPrivate.htmlExifDataPrivate ));
00120         if (!data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv ) { 
00121                 exif-mem_8c.html#43190b81b4b4bdb4ffb89bfb612051b1exif_mem_free  (mem, data); 
00122                 return (NULL); 
00123         }
00124         data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#ff67f5a96636c8057acbbd097f8ddf26ref_count  = 1;
00125 
00126         data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#83a309c082c6c65eb9f2e42865df23d4mem  = mem;
00127         exif-mem_8c.html#f28c61972f529be46907956e0b3e7a60exif_mem_ref  (mem);
00128 
00129         for (i = 0; i < exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf523aef6c6dfc79dbd02383ed6719f9ecca5EXIF_IFD_COUNT ; i++) {
00130                 data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [i] = exif-content_8c.html#8a359560f5985ec0a74a28871675d902exif_content_new_mem  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#83a309c082c6c65eb9f2e42865df23d4mem );
00131                 if (!data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [i]) {
00132                         exif-data_8c.html#2d2f8fee30176bd6460d51d33d080674exif_data_free  (data);
00133                         return (NULL);
00134                 }
00135                 data->ifd[i]->parent = data;
00136         }
00137 
00138         /* Default options */ 00139         exif-data_8c.html#f3fd819c29391da3b444cc347b86a3d4exif_data_set_option  (data, exif-data_8h.html#324f86ac1d053b37aaee45d2cfbda96d37a62c4c36dfb4d533338062a4040deeEXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS );
00140         exif-data_8c.html#f3fd819c29391da3b444cc347b86a3d4exif_data_set_option  (data, exif-data_8h.html#324f86ac1d053b37aaee45d2cfbda96de8470cc4acd5755528f7ff36ba168023EXIF_DATA_OPTION_FOLLOW_SPECIFICATION );
00141 
00142         /* Default data type: none */ 00143         exif-data_8c.html#be6f9020e02df0d550545b50ddcafe24exif_data_set_data_type  (data, exif-data-type_8h.html#b7d01513ff048ac5d8ae50a3e0235ce89faf820efce6698ebcbdef3386643506EXIF_DATA_TYPE_COUNT );
00144 
00145         return (data);
00146 }
00147 
00148 struct__ExifData.htmlExifData  *
exif-data_8h.html#66a30ece3bdb6cfd8f2692df27ea2b8700149  exif-data_8c.html#66a30ece3bdb6cfd8f2692df27ea2b87exif_data_new_from_data  (const unsigned char *data, unsigned int exif-format_8c.html#ac71ffe03c84523594a575b2062849c3size )
00150 {
00151         struct__ExifData.htmlExifData  *edata;
00152 
00153         edata = exif-data_8c.html#1b1570fbbb15d525a0dfde8db7c8b500exif_data_new  ();
00154         exif-data_8c.html#458a24e25e2ae746968bea89a21227a0exif_data_load_data  (edata, data, size);
00155         return (edata);
00156 }
00157 
00158 static int exif-data_8c.html#bf9859cd2ae8c4c67f927e633d9a5bce00159  exif-data_8c.html#bf9859cd2ae8c4c67f927e633d9a5bceexif_data_load_data_entry  ( struct__ExifData.htmlExifData  *data, struct__ExifEntry.htmlExifEntry  *entry,
00160                            const unsigned char *d,
00161                            unsigned int exif-format_8c.html#ac71ffe03c84523594a575b2062849c3size , unsigned int offset)
00162 {
00163         unsigned int s, doff;
00164 
00165         entry-> struct__ExifEntry.html#a03a4dc9fa98c8bbc447c19a4d0536e9tag         = exif-utils_8c.html#4b4acf537a8c6b9405e7b53be868e4d7exif_get_short  (d + offset + 0, data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order );
00166         entry-> struct__ExifEntry.html#6129f19697eff3ab581e0a8455d9fbaeformat      = exif-utils_8c.html#4b4acf537a8c6b9405e7b53be868e4d7exif_get_short  (d + offset + 2, data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order );
00167         entry-> struct__ExifEntry.html#4d1cd87a5c3f43b3d14b087a44582c06components  = exif-utils_8c.html#4ad94614630897766dd0a5c9bc2a59bfexif_get_long   (d + offset + 4, data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order );
00168 
00169         exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_LOG_CODE_DEBUG , "ExifData",
00170                   "Loading entry 0x%x ('%s')...", entry-> struct__ExifEntry.html#a03a4dc9fa98c8bbc447c19a4d0536e9tag ,
00171                   exif-tag_8c.html#09dab484396dbcd277161df07aa09cf1exif_tag_get_name  (entry-> struct__ExifEntry.html#a03a4dc9fa98c8bbc447c19a4d0536e9tag ));
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#924038efe0cd8ebade8f44619dd794f3exif_format_get_size  (entry-> struct__ExifEntry.html#6129f19697eff3ab581e0a8455d9fbaeformat ) * entry-> struct__ExifEntry.html#4d1cd87a5c3f43b3d14b087a44582c06components ;
00178         if (!s)
00179                 return 0;
00180         if (s > 4)
00181                 doff = exif-utils_8c.html#4ad94614630897766dd0a5c9bc2a59bfexif_get_long  (d + offset + 8, data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order );
00182         else 00183                 doff = offset + 8;
00184 
00185         /* Sanity check */ 00186         if (size < doff + s)
00187                 return 0;
00188 
00189         entry-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data  = exif-data_8c.html#77cbef422b7a511d6405285ad9e00152exif_data_alloc  (data, s);
00190         if (entry-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data ) {
00191                 entry-> struct__ExifEntry.html#fee38ed13748497cc838b3c746ff8559size  = s;
00192                 memcpy (entry-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data , d + doff, s);
00193         }
00194 
00195         /* If this is the MakerNote, remember the offset */ 00196         if (entry-> struct__ExifEntry.html#a03a4dc9fa98c8bbc447c19a4d0536e9tag  == exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f41cdc77556a9f54139ff8860212e2ca716EXIF_TAG_MAKER_NOTE ) {
00197                 if (entry-> struct__ExifEntry.html#fee38ed13748497cc838b3c746ff8559size  > 6) exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog ,
00198                                                exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_LOG_CODE_DEBUG , "ExifData",
00199                                                "MakerNote found (%02x %02x %02x %02x " 00200                                                "%02x %02x %02x...).",
00201                                                entry-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data [0], entry-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data [1], entry-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data [2],
00202                                                entry-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data [3], entry-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data [4], entry-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data [5],
00203                                                entry-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data [6]);
00204                 data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#2cd5a43e3712407b5d8deecf74cdc436offset_mnote  = doff;
00205         }
00206         return 1;
00207 }
00208 
00209 static void exif-data_8c.html#88e57798676ccd2df6243dd8b7a4d33c00210  exif-data_8c.html#88e57798676ccd2df6243dd8b7a4d33cexif_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#c78f8625a4ee6fc2b2e8b281c2059869priv ) 
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#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 6 + offset + 0,
00224                         data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order , ( exif-utils_8h.html#398536727127a9bc2206ffbdacaafaadExifShort ) e-> struct__ExifEntry.html#a03a4dc9fa98c8bbc447c19a4d0536e9tag );
00225         exif-utils_8c.html#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 6 + offset + 2,
00226                         data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order , ( exif-utils_8h.html#398536727127a9bc2206ffbdacaafaadExifShort ) e-> struct__ExifEntry.html#6129f19697eff3ab581e0a8455d9fbaeformat );
00227 
00228 #ifndef EXIF_DONT_CHANGE_MAKER_NOTE 00229         /* If this is the maker note tag, update it. */ 00230         if ((e-> struct__ExifEntry.html#a03a4dc9fa98c8bbc447c19a4d0536e9tag  == exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f41cdc77556a9f54139ff8860212e2ca716EXIF_TAG_MAKER_NOTE ) && data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#e282eaad62e448a29d1fcaabd418fc9dmd ) {
00231                 exif-mem_8c.html#43190b81b4b4bdb4ffb89bfb612051b1exif_mem_free  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#83a309c082c6c65eb9f2e42865df23d4mem , e-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data );
00232                 e-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data  = NULL;
00233                 e-> struct__ExifEntry.html#fee38ed13748497cc838b3c746ff8559size  = 0;
00234                 exif-mnote-data-priv_8h.html#17548c880619140855af60b037a8c730exif_mnote_data_set_offset  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#e282eaad62e448a29d1fcaabd418fc9dmd , *ds - 6);
00235                 exif-mnote-data_8c.html#704500ea880e6727d8b4a98ff38c0a25exif_mnote_data_save  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#e282eaad62e448a29d1fcaabd418fc9dmd , &e-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data , &e-> struct__ExifEntry.html#fee38ed13748497cc838b3c746ff8559size );
00236                 e-> struct__ExifEntry.html#4d1cd87a5c3f43b3d14b087a44582c06components  = e-> struct__ExifEntry.html#fee38ed13748497cc838b3c746ff8559size ;
00237         }
00238 #endif 00239 00240         exif-utils_8c.html#c90147d0cc97bec7a577bf9576191bf8exif_set_long   (*d + 6 + offset + 4,
00241                         data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order , e-> struct__ExifEntry.html#4d1cd87a5c3f43b3d14b087a44582c06components );
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#924038efe0cd8ebade8f44619dd794f3exif_format_get_size  (e-> struct__ExifEntry.html#6129f19697eff3ab581e0a8455d9fbaeformat ) * e-> struct__ExifEntry.html#4d1cd87a5c3f43b3d14b087a44582c06components ;
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#3dcfe6794d82e79e92da5e2c62484b17exif_mem_realloc  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#83a309c082c6c65eb9f2e42865df23d4mem , *d, *ds);
00260                 if (!*d) {
00261                         exif-log_8h.html#4221b964f5ee550f6166126b263d3b2fEXIF_LOG_NO_MEMORY  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , "ExifData", *ds);
00262                         return;
00263                 }
00264                 exif-utils_8c.html#c90147d0cc97bec7a577bf9576191bf8exif_set_long  (*d + 6 + offset + 8, data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order , 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#7fd255a932578e60a5fbaac47d4362d4data , s);
00273         if (s < 4) 
00274                 memset (*d + 6 + doff + s, 0, (4 - s));
00275 }
00276 
00277 static void exif-data_8c.html#22c517779fcd5099426d04da584546e200278  exif-data_8c.html#22c517779fcd5099426d04da584546e2exif_data_load_data_thumbnail  ( struct__ExifData.htmlExifData  *data, const unsigned char *d,
00279                                unsigned int ds, exif-utils_8h.html#34c5d7765ab2e6dec8308c5127a10afaExifLong  offset, exif-utils_8h.html#34c5d7765ab2e6dec8308c5127a10afaExifLong  exif-format_8c.html#ac71ffe03c84523594a575b2062849c3size )
00280 {
00281         if (ds < offset + size) {
00282                 exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_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#6adaa7f443903d8fc2d2b232c67bf660data ) 
00288                 exif-mem_8c.html#43190b81b4b4bdb4ffb89bfb612051b1exif_mem_free  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#83a309c082c6c65eb9f2e42865df23d4mem , data-> struct__ExifData.html#6adaa7f443903d8fc2d2b232c67bf660data );
00289         data-> struct__ExifData.html#83a9d29c7769854ea86dd48979f8b21bsize  = size;
00290         data-> struct__ExifData.html#6adaa7f443903d8fc2d2b232c67bf660data  = exif-data_8c.html#77cbef422b7a511d6405285ad9e00152exif_data_alloc  (data, data-> struct__ExifData.html#83a9d29c7769854ea86dd48979f8b21bsize );
00291         if (!data-> struct__ExifData.html#6adaa7f443903d8fc2d2b232c67bf660data ) 
00292                 return;
00293         memcpy (data-> struct__ExifData.html#6adaa7f443903d8fc2d2b232c67bf660data , d + offset, data-> struct__ExifData.html#83a9d29c7769854ea86dd48979f8b21bsize );
00294 }
00295 
00296 #undef CHECK_REC exif-data_8c.html#2f8e517f6ebe2b3e08fb71f4849429ce00297  #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#9e8738e124156174a65499815ead53f000315  exif-data_8c.html#9e8738e124156174a65499815ead53f0exif_data_load_data_content  ( struct__ExifData.htmlExifData  *data, exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf523ExifIfd  exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd ,
00316                              const unsigned char *d,
00317                              unsigned int ds, unsigned int offset, unsigned int recursion_depth)
00318 {
00319         exif-utils_8h.html#34c5d7765ab2e6dec8308c5127a10afaExifLong  o, thumbnail_offset = 0, thumbnail_length = 0;
00320         exif-utils_8h.html#398536727127a9bc2206ffbdacaafaadExifShort  n;
00321         struct__ExifEntry.htmlExifEntry  *entry;
00322         unsigned int i;
00323         exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f41ExifTag  mnote-canon-tag_8c.html#f81b5c697b6608b9a512a4bf55f025e8tag ;
00324 
00325         if (!data || !data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv ) 
00326                 return;
00327         if ((ifd < 0) || (ifd >= exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf523aef6c6dfc79dbd02383ed6719f9ecca5EXIF_IFD_COUNT )) 
00328                 return;
00329 
00330         if (recursion_depth > 150) {
00331                 exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae265284901c6bc122ed1de41cc8fb08b6ccc8EXIF_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#4b4acf537a8c6b9405e7b53be868e4d7exif_get_short  (d + offset, data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order );
00340         exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_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#4b4acf537a8c6b9405e7b53be868e4d7exif_get_short  (d + offset + 12 * i, data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order );
00351                 switch (tag) {
00352                 case exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f411e8e6e6bbfc4375dd89268a13ad8df54EXIF_TAG_EXIF_IFD_POINTER :
00353                 case exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f414343185115b29fb4425cc3bcf755c856EXIF_TAG_GPS_INFO_IFD_POINTER :
00354                 case exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f415e4a3b1608aeb41767ed69d19108bf86EXIF_TAG_INTEROPERABILITY_IFD_POINTER :
00355                 case exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f41798f800ba9d484b0314454230a2af04dEXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH :
00356                 case exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f416ac1833cc0c9832356eae2b908238a11EXIF_TAG_JPEG_INTERCHANGE_FORMAT :
00357                         o = exif-utils_8c.html#4ad94614630897766dd0a5c9bc2a59bfexif_get_long  (d + offset + 12 * i + 8,
00358                                            data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order );
00359                         switch (tag) {
00360                         case exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f411e8e6e6bbfc4375dd89268a13ad8df54EXIF_TAG_EXIF_IFD_POINTER :
00361                                 exif-data_8c.html#2f8e517f6ebe2b3e08fb71f4849429ceCHECK_REC  ( exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5239dce0091318fd65e7c05f1b39fa9a177EXIF_IFD_EXIF );
00362                                 exif-data_8c.html#9e8738e124156174a65499815ead53f0exif_data_load_data_content  (data, EXIF_IFD_EXIF, d, ds, o, recursion_depth + 1);
00363                                 break;
00364                         case exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f414343185115b29fb4425cc3bcf755c856EXIF_TAG_GPS_INFO_IFD_POINTER :
00365                                 exif-data_8c.html#2f8e517f6ebe2b3e08fb71f4849429ceCHECK_REC  ( exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5230ef0053cc0238dfea6770310ec478270EXIF_IFD_GPS );
00366                                 exif-data_8c.html#9e8738e124156174a65499815ead53f0exif_data_load_data_content  (data, exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5230ef0053cc0238dfea6770310ec478270EXIF_IFD_GPS , d, ds, o, recursion_depth + 1);
00367                                 break;
00368                         case exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f415e4a3b1608aeb41767ed69d19108bf86EXIF_TAG_INTEROPERABILITY_IFD_POINTER :
00369                                 exif-data_8c.html#2f8e517f6ebe2b3e08fb71f4849429ceCHECK_REC  ( exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf52387105b7ad04d314b1f8fc8478874cc29EXIF_IFD_INTEROPERABILITY );
00370                                 exif-data_8c.html#9e8738e124156174a65499815ead53f0exif_data_load_data_content  (data, exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf52387105b7ad04d314b1f8fc8478874cc29EXIF_IFD_INTEROPERABILITY , d, ds, o, recursion_depth + 1);
00371                                 break;
00372                         case exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f416ac1833cc0c9832356eae2b908238a11EXIF_TAG_JPEG_INTERCHANGE_FORMAT :
00373                                 thumbnail_offset = o;
00374                                 if (thumbnail_offset && thumbnail_length)
00375                                         exif-data_8c.html#22c517779fcd5099426d04da584546e2exif_data_load_data_thumbnail  (data, d,
00376                                                                        ds, thumbnail_offset,
00377                                                                        thumbnail_length);
00378                                 break;
00379                         case exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f41798f800ba9d484b0314454230a2af04dEXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH :
00380                                 thumbnail_length = o;
00381                                 if (thumbnail_offset && thumbnail_length)
00382                                         exif-data_8c.html#22c517779fcd5099426d04da584546e2exif_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#82b5a88d44d27d432afb5a1db74268b0exif_tag_get_name_in_ifd  ( mnote-canon-tag_8c.html#f81b5c697b6608b9a512a4bf55f025e8tag , exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd )) {
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#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data->priv->log, exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_LOG_CODE_DEBUG , "ExifData",
00405                                                   "Skipping empty entry at position %i in '%s'.", i, 
00406                                                   exif-ifd_8c.html#57651cc68698f037cd9fb8f9d3a021a2exif_ifd_get_name  ( exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd ));
00407                                         break;
00408                                 }
00409                                 exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data->priv->log, exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_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#57651cc68698f037cd9fb8f9d3a021a2exif_ifd_get_name  ( exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd ));
00413                                 if (data->priv->options & exif-data_8h.html#324f86ac1d053b37aaee45d2cfbda96d37a62c4c36dfb4d533338062a4040deeEXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS )
00414                                         break;
00415                         }
00416                         entry = exif-entry_8c.html#67580bc5b16e6f2793f9a5e580569a7bexif_entry_new_mem  (data->priv->mem);
00417                         if ( exif-data_8c.html#bf9859cd2ae8c4c67f927e633d9a5bceexif_data_load_data_entry  (data, entry, d, ds,
00418                                                    offset + 12 * i))
00419                                 exif-content_8c.html#89876388ea2f732f8c8cd2c8ef199908exif_content_add_entry  (data->ifd[ exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd ], entry);
00420                         exif-entry_8c.html#82d5d923121488d847d341727cdd2ef4exif_entry_unref  (entry);
00421                         break;
00422                 }
00423         }
00424 }
00425 
00426 static int exif-data_8c.html#0b662825b4c76063b1ba549bf1259a6d00427  exif-data_8c.html#0b662825b4c76063b1ba549bf1259a6dcmp_func  (const unsigned char *p1, const unsigned char *p2, exif-byte-order_8h.html#f966227d69ff74eea7ecd69ca645155bExifByteOrder  o)
00428 {
00429         exif-utils_8h.html#398536727127a9bc2206ffbdacaafaadExifShort  tag1 = exif-utils_8c.html#4b4acf537a8c6b9405e7b53be868e4d7exif_get_short  (p1, o);
00430         exif-utils_8h.html#398536727127a9bc2206ffbdacaafaadExifShort  tag2 = exif-utils_8c.html#4b4acf537a8c6b9405e7b53be868e4d7exif_get_short  (p2, o);
00431 
00432         return (tag1 < tag2) ? -1 : (tag1 > tag2) ? 1 : 0;
00433 }
00434 
00435 static int exif-data_8c.html#bf711bc683af4b46370d8e22e3e102d100436  exif-data_8c.html#bf711bc683af4b46370d8e22e3e102d1cmp_func_intel  (const void *elem1, const void *elem2)
00437 {
00438         return exif-data_8c.html#0b662825b4c76063b1ba549bf1259a6dcmp_func  ((const unsigned char *) elem1,
00439                          (const unsigned char *) elem2, exif-byte-order_8h.html#f966227d69ff74eea7ecd69ca645155b851fef40a65a105b066115210a6b40b9EXIF_BYTE_ORDER_INTEL );
00440 }
00441 
00442 static int exif-data_8c.html#e10308432fc54768805c6ae0ad0ebf9c00443  exif-data_8c.html#e10308432fc54768805c6ae0ad0ebf9ccmp_func_motorola  (const void *elem1, const void *elem2)
00444 {
00445         return exif-data_8c.html#0b662825b4c76063b1ba549bf1259a6dcmp_func  ((const unsigned char *) elem1,
00446                          (const unsigned char *) elem2, exif-byte-order_8h.html#f966227d69ff74eea7ecd69ca645155bd71d87054b55fd62b0eed2c2c5e879b1EXIF_BYTE_ORDER_MOTOROLA );
00447 }
00448 
00449 static void exif-data_8c.html#d1aed9b7d36e7cd97d6ead35de49160300450  exif-data_8c.html#d1aed9b7d36e7cd97d6ead35de491603exif_data_save_data_content  ( struct__ExifData.htmlExifData  *data, struct__ExifContent.htmlExifContent  * exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd ,
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#7d1ed13ce50db58b739185faa1faf523ExifIfd  i;
00456 
00457         if (!data || !data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv  || ! exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd  || !d || !ds) 
00458                 return;
00459 
00460         for (i = 0; i < exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf523aef6c6dfc79dbd02383ed6719f9ecca5EXIF_IFD_COUNT ; i++)
00461                 if ( exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd  == data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [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#7d1ed13ce50db58b739185faa1faf523dba1cc10dacaad97ca9ba61d391e218cEXIF_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#93efef6710d8b867b743ed0a152d5293ifd [ exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5239dce0091318fd65e7c05f1b39fa9a177EXIF_IFD_EXIF ]->count ||
00477                     data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [ exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf52387105b7ad04d314b1f8fc8478874cc29EXIF_IFD_INTEROPERABILITY ]->count)
00478                         n_ptr++;
00479 
00480                 /* The pointer to IFD_GPS is in IFD_0. */ 00481                 if (data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [ exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5230ef0053cc0238dfea6770310ec478270EXIF_IFD_GPS ]->count)
00482                         n_ptr++;
00483 
00484                 break;
00485         case exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5239ecbe6f6d48d2d5702aab804e3196409EXIF_IFD_1 :
00486                 if (data-> struct__ExifData.html#83a9d29c7769854ea86dd48979f8b21bsize )
00487                         n_thumb = 2;
00488                 break;
00489         case exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5239dce0091318fd65e7c05f1b39fa9a177EXIF_IFD_EXIF :
00490                 if (data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [ exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf52387105b7ad04d314b1f8fc8478874cc29EXIF_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#557f08b1d90e26e072167911210c9eb1ifd ->count + n_ptr + n_thumb) * 12 + 4);
00501         *d = exif-mem_8c.html#3dcfe6794d82e79e92da5e2c62484b17exif_mem_realloc  (data->priv->mem, *d, *ds);
00502         if (!*d) {
00503                 exif-log_8h.html#4221b964f5ee550f6166126b263d3b2fEXIF_LOG_NO_MEMORY  (data->priv->log, "ExifData", *ds);
00504                 return;
00505         }
00506 
00507         /* Save the number of entries */ 00508         exif-utils_8c.html#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 6 + offset, data->priv->order,
00509                         ( exif-utils_8h.html#398536727127a9bc2206ffbdacaafaadExifShort ) ( exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd ->count + n_ptr + n_thumb));
00510         offset += 2;
00511 
00512         /* Save each entry */ 00513         exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data->priv->log, exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_LOG_CODE_DEBUG , "ExifData",
00514                   "Saving %i entries (IFD '%s', offset: %i)...",
00515                   exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd ->count, exif-ifd_8c.html#57651cc68698f037cd9fb8f9d3a021a2exif_ifd_get_name  (i), offset);
00516         for (j = 0; j < exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd ->count; j++)
00517                 exif-data_8c.html#88e57798676ccd2df6243dd8b7a4d33cexif_data_save_data_entry  (data, exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd ->entries[j], d, ds, offset + 12 * j);
00518 
00519         offset += 12 * exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd ->count;
00520 
00521         /* Now save special entries. */ 00522         switch (i) {
00523         case exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf523dba1cc10dacaad97ca9ba61d391e218cEXIF_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#7d1ed13ce50db58b739185faa1faf5239dce0091318fd65e7c05f1b39fa9a177EXIF_IFD_EXIF ]->count ||
00532                     data->ifd[ exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf52387105b7ad04d314b1f8fc8478874cc29EXIF_IFD_INTEROPERABILITY ]->count) {
00533                         exif-utils_8c.html#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 6 + offset + 0, data->priv->order,
00534                                         exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f411e8e6e6bbfc4375dd89268a13ad8df54EXIF_TAG_EXIF_IFD_POINTER );
00535                         exif-utils_8c.html#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 6 + offset + 2, data->priv->order,
00536                                         exif-format_8h.html#761152047d73b4a9fcdc4e2051b817d25611dcd2fcdcaf91f25412bece8485b6EXIF_FORMAT_LONG );
00537                         exif-utils_8c.html#c90147d0cc97bec7a577bf9576191bf8exif_set_long   (*d + 6 + offset + 4, data->priv->order,
00538                                         1);
00539                         exif-utils_8c.html#c90147d0cc97bec7a577bf9576191bf8exif_set_long   (*d + 6 + offset + 8, data->priv->order,
00540                                         *ds - 6);
00541                         exif-data_8c.html#d1aed9b7d36e7cd97d6ead35de491603exif_data_save_data_content  (data,
00542                                                      data->ifd[ exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5239dce0091318fd65e7c05f1b39fa9a177EXIF_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#7d1ed13ce50db58b739185faa1faf5230ef0053cc0238dfea6770310ec478270EXIF_IFD_GPS ]->count) {
00548                         exif-utils_8c.html#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 6 + offset + 0, data->priv->order,
00549                                         exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f414343185115b29fb4425cc3bcf755c856EXIF_TAG_GPS_INFO_IFD_POINTER );
00550                         exif-utils_8c.html#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 6 + offset + 2, data->priv->order,
00551                                         exif-format_8h.html#761152047d73b4a9fcdc4e2051b817d25611dcd2fcdcaf91f25412bece8485b6EXIF_FORMAT_LONG );
00552                         exif-utils_8c.html#c90147d0cc97bec7a577bf9576191bf8exif_set_long   (*d + 6 + offset + 4, data->priv->order,
00553                                         1);
00554                         exif-utils_8c.html#c90147d0cc97bec7a577bf9576191bf8exif_set_long   (*d + 6 + offset + 8, data->priv->order,
00555                                         *ds - 6);
00556                         exif-data_8c.html#d1aed9b7d36e7cd97d6ead35de491603exif_data_save_data_content  (data,
00557                                                      data->ifd[ exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5230ef0053cc0238dfea6770310ec478270EXIF_IFD_GPS ], d, ds, *ds - 6);
00558                         offset += 12;
00559                 }
00560 
00561                 break;
00562         case exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5239dce0091318fd65e7c05f1b39fa9a177EXIF_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#7d1ed13ce50db58b739185faa1faf52387105b7ad04d314b1f8fc8478874cc29EXIF_IFD_INTEROPERABILITY ]->count) {
00569                         exif-utils_8c.html#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 6 + offset + 0, data->priv->order,
00570                                         exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f415e4a3b1608aeb41767ed69d19108bf86EXIF_TAG_INTEROPERABILITY_IFD_POINTER );
00571                         exif-utils_8c.html#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 6 + offset + 2, data->priv->order,
00572                                         exif-format_8h.html#761152047d73b4a9fcdc4e2051b817d25611dcd2fcdcaf91f25412bece8485b6EXIF_FORMAT_LONG );
00573                         exif-utils_8c.html#c90147d0cc97bec7a577bf9576191bf8exif_set_long   (*d + 6 + offset + 4, data->priv->order,
00574                                         1);
00575                         exif-utils_8c.html#c90147d0cc97bec7a577bf9576191bf8exif_set_long   (*d + 6 + offset + 8, data->priv->order,
00576                                         *ds - 6);
00577                         exif-data_8c.html#d1aed9b7d36e7cd97d6ead35de491603exif_data_save_data_content  (data,
00578                                                      data->ifd[ exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf52387105b7ad04d314b1f8fc8478874cc29EXIF_IFD_INTEROPERABILITY ], d, ds,
00579                                                      *ds - 6);
00580                         offset += 12;
00581                 }
00582 
00583                 break;
00584         case exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5239ecbe6f6d48d2d5702aab804e3196409EXIF_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#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 6 + offset + 0, data->priv->order,
00594                                         exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f416ac1833cc0c9832356eae2b908238a11EXIF_TAG_JPEG_INTERCHANGE_FORMAT );
00595                         exif-utils_8c.html#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 6 + offset + 2, data->priv->order,
00596                                         exif-format_8h.html#761152047d73b4a9fcdc4e2051b817d25611dcd2fcdcaf91f25412bece8485b6EXIF_FORMAT_LONG );
00597                         exif-utils_8c.html#c90147d0cc97bec7a577bf9576191bf8exif_set_long   (*d + 6 + offset + 4, data->priv->order,
00598                                         1);
00599                         exif-utils_8c.html#c90147d0cc97bec7a577bf9576191bf8exif_set_long   (*d + 6 + offset + 8, data->priv->order,
00600                                         *ds - 6);
00601                         *ds += data->size;
00602                         *d = exif-mem_8c.html#3dcfe6794d82e79e92da5e2c62484b17exif_mem_realloc  (data->priv->mem, *d, *ds);
00603                         if (!*d) {
00604                                 exif-log_8h.html#4221b964f5ee550f6166126b263d3b2fEXIF_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#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 6 + offset + 0, data->priv->order,
00613                                         exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f41798f800ba9d484b0314454230a2af04dEXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH );
00614                         exif-utils_8c.html#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 6 + offset + 2, data->priv->order,
00615                                         exif-format_8h.html#761152047d73b4a9fcdc4e2051b817d25611dcd2fcdcaf91f25412bece8485b6EXIF_FORMAT_LONG );
00616                         exif-utils_8c.html#c90147d0cc97bec7a577bf9576191bf8exif_set_long   (*d + 6 + offset + 4, data->priv->order,
00617                                         1);
00618                         exif-utils_8c.html#c90147d0cc97bec7a577bf9576191bf8exif_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#557f08b1d90e26e072167911210c9eb1ifd ->count + n_ptr + n_thumb) * 12,
00630                ( exif-ifd_8c.html#557f08b1d90e26e072167911210c9eb1ifd ->count + n_ptr + n_thumb), 12,
00631                (data->priv->order == exif-byte-order_8h.html#f966227d69ff74eea7ecd69ca645155b851fef40a65a105b066115210a6b40b9EXIF_BYTE_ORDER_INTEL ) ? exif-data_8c.html#bf711bc683af4b46370d8e22e3e102d1cmp_func_intel  : exif-data_8c.html#e10308432fc54768805c6ae0ad0ebf9ccmp_func_motorola );
00632 
00633         /* Correctly terminate the directory */ 00634         if (i == exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf523dba1cc10dacaad97ca9ba61d391e218cEXIF_IFD_0  && (data->ifd[ exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5239ecbe6f6d48d2d5702aab804e3196409EXIF_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#c90147d0cc97bec7a577bf9576191bf8exif_set_long  (*d + 6 + offset, data->priv->order, *ds - 6);
00642                 exif-data_8c.html#d1aed9b7d36e7cd97d6ead35de491603exif_data_save_data_content  (data, data->ifd[ exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5239ecbe6f6d48d2d5702aab804e3196409EXIF_IFD_1 ], d, ds,
00643                                              *ds - 6);
00644         } else 00645                 exif-utils_8c.html#c90147d0cc97bec7a577bf9576191bf8exif_set_long  (*d + 6 + offset, data->priv->order, 0);
00646 }
00647 
exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc300648  typedef enum {
00649         exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc34b999b90490168443cc790cbbee2ba13EXIF_DATA_TYPE_MAKER_NOTE_NONE           = 0,
00650         exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc30882f5c1f65e09539df9e424e1e5e06fEXIF_DATA_TYPE_MAKER_NOTE_CANON          = 1,
00651         exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc32ffad36a69023ea1230715b9b107424bEXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS        = 2,
00652         exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc3ebc93ce3fc57d10f523d2622dd42e7edEXIF_DATA_TYPE_MAKER_NOTE_PENTAX         = 3
00653 } exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc3ExifDataTypeMakerNote ;
00654 
00655 static exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc3ExifDataTypeMakerNote exif-data_8c.html#7cb0b0cf643202ccedaa6ba58b97ad5300656  exif-data_8c.html#7cb0b0cf643202ccedaa6ba58b97ad53exif_data_get_type_maker_note  ( struct__ExifData.htmlExifData  *d)
00657 {
00658         struct__ExifEntry.htmlExifEntry  *e, *em;
00659         char mnote-canon-entry_8c.html#c3cc58975ec017f769b62d6e100e4d06value [1024];
00660 
00661         if (!d) 
00662                 return exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc34b999b90490168443cc790cbbee2ba13EXIF_DATA_TYPE_MAKER_NOTE_NONE ;
00663         
00664         e = exif-data_8h.html#984540c607eb7cfce58cf34e7374ab47exif_data_get_entry  (d, exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f41cdc77556a9f54139ff8860212e2ca716EXIF_TAG_MAKER_NOTE );
00665         if (!e) 
00666                 return exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc34b999b90490168443cc790cbbee2ba13EXIF_DATA_TYPE_MAKER_NOTE_NONE ;
00667 
00668         /* Olympus & Nikon */ 00669         if ((e-> struct__ExifEntry.html#fee38ed13748497cc838b3c746ff8559size  >= 5) && (!memcmp (e-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data , "OLYMP", 5) ||
00670                                !memcmp (e-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data , "Nikon", 5)))
00671                 return exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc32ffad36a69023ea1230715b9b107424bEXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS ;
00672 
00673         em = exif-data_8h.html#984540c607eb7cfce58cf34e7374ab47exif_data_get_entry  (d, exif-tag_8h.html#1a0ded93d47585f6889eb546915d0f418dfd0c0564458e57a44425977e610bc5EXIF_TAG_MAKE );
00674         if (!em) 
00675                 return exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc34b999b90490168443cc790cbbee2ba13EXIF_DATA_TYPE_MAKER_NOTE_NONE ;
00676 
00677         /* Canon */ 00678         if (!strcmp ( exif-entry_8c.html#fda0f9d242fd7db960778502414c9885exif_entry_get_value  (em, value, sizeof (value)), "Canon"))
00679                 return exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc30882f5c1f65e09539df9e424e1e5e06fEXIF_DATA_TYPE_MAKER_NOTE_CANON ;
00680 
00681         /* Pentax & some variant of Nikon */ 00682         if ((e-> struct__ExifEntry.html#fee38ed13748497cc838b3c746ff8559size  >= 2) && (e-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data [0] == 0x00) && (e-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data [1] == 0x1b)) {
00683                 if (!strncasecmp (
00684                             exif-entry_8c.html#fda0f9d242fd7db960778502414c9885exif_entry_get_value  (em, value, sizeof(value)),
00685                             "Nikon", 5))
00686                         return exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc32ffad36a69023ea1230715b9b107424bEXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS ;
00687                 else 00688                         return exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc3ebc93ce3fc57d10f523d2622dd42e7edEXIF_DATA_TYPE_MAKER_NOTE_PENTAX ;
00689         }
00690 
00691         return exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc34b999b90490168443cc790cbbee2ba13EXIF_DATA_TYPE_MAKER_NOTE_NONE ;
00692 }
00693 
exif-data_8c.html#0ffaa1dd09ea02f027a1f672b0dddeee00694  #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#e3ca622e7c30ea30eca06de3a120d84f00699  exif-data_8c.html#458a24e25e2ae746968bea89a21227a0exif_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#34c5d7765ab2e6dec8308c5127a10afaExifLong  offset;
00704         exif-utils_8h.html#398536727127a9bc2206ffbdacaafaadExifShort  n;
00705         const unsigned char *d = d_orig;
00706         unsigned int ds = ds_orig, len;
00707 
00708         if (!data || !data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv  || !d || !ds) 
00709                 return;
00710 
00711         exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_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#0ffaa1dd09ea02f027a1f672b0dddeeeLOG_TOO_SMALL ;
00720                 return;
00721         }
00722         if (!memcmp (d, exif-data_8c.html#7107bf174abd5f9994053ef9ae84044aExifHeader , 6)) {
00723                 exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_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#6a73d744a065090aa9e890b8547304e9JPEG_MARKER_SOI ) {
00734                                 d++;
00735                                 ds--;
00736                                 continue;
00737                         }
00738 
00739                         /* JPEG_MARKER_APP0 */ 00740                         if (d[0] == exif-data_8c.html#3eb6e3444f79d449058145a01872f4b3JPEG_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#05c1aea46cae41a712e35830a2ca28b8JPEG_MARKER_APP1 )
00753                                 break;
00754 
00755                         /* Unknown marker or data. Give up. */ 00756                         exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae265284901c6bc122ed1de41cc8fb08b6ccc8EXIF_LOG_CODE_CORRUPT_DATA ,
00757                                   "ExifData", i18n_8h.html#32a3cf3d9dd914f5aeeca5423c157934_ ("EXIF marker not found."));
00758                         return;
00759                 }
00760                 d++;
00761                 ds--;
00762                 if (ds < 2) {
00763                         exif-data_8c.html#0ffaa1dd09ea02f027a1f672b0dddeeeLOG_TOO_SMALL ;
00764                         return;
00765                 }
00766                 len = (d[0] << 8) | d[1];
00767                 exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_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#0ffaa1dd09ea02f027a1f672b0dddeeeLOG_TOO_SMALL ;
00780                 return;
00781         }
00782         if (memcmp (d, exif-data_8c.html#7107bf174abd5f9994053ef9ae84044aExifHeader , 6)) {
00783                 exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae265284901c6bc122ed1de41cc8fb08b6ccc8EXIF_LOG_CODE_CORRUPT_DATA ,
00784                           "ExifData", i18n_8h.html#32a3cf3d9dd914f5aeeca5423c157934_ ("EXIF header not found."));
00785                 return;
00786         }
00787 
00788         exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_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#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order  = exif-byte-order_8h.html#f966227d69ff74eea7ecd69ca645155b851fef40a65a105b066115210a6b40b9EXIF_BYTE_ORDER_INTEL ;
00796         else if (!memcmp (d + 6, "MM", 2))
00797                 data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order  = exif-byte-order_8h.html#f966227d69ff74eea7ecd69ca645155bd71d87054b55fd62b0eed2c2c5e879b1EXIF_BYTE_ORDER_MOTOROLA ;
00798         else {
00799                 exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae265284901c6bc122ed1de41cc8fb08b6ccc8EXIF_LOG_CODE_CORRUPT_DATA ,
00800                           "ExifData", i18n_8h.html#32a3cf3d9dd914f5aeeca5423c157934_ ("Unknown encoding."));
00801                 return;
00802         }
00803 
00804         /* Fixed value */ 00805         if ( exif-utils_8c.html#4b4acf537a8c6b9405e7b53be868e4d7exif_get_short  (d + 8, data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order ) != 0x002a)
00806                 return;
00807 
00808         /* IFD 0 offset */ 00809         offset = exif-utils_8c.html#4ad94614630897766dd0a5c9bc2a59bfexif_get_long  (d + 10, data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order );
00810         exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_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#9e8738e124156174a65499815ead53f0exif_data_load_data_content  (data, exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf523dba1cc10dacaad97ca9ba61d391e218cEXIF_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#4b4acf537a8c6b9405e7b53be868e4d7exif_get_short  (d + 6 + offset, data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order );
00821         if (offset + 6 + 2 + 12 * n + 4 > ds) {
00822                 return;
00823         }
00824         offset = exif-utils_8c.html#4ad94614630897766dd0a5c9bc2a59bfexif_get_long  (d + 6 + offset + 2 + 12 * n, data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order );
00825         if (offset) {
00826                 exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_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#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae265284901c6bc122ed1de41cc8fb08b6ccc8EXIF_LOG_CODE_CORRUPT_DATA ,
00832                                   "ExifData", "Bogus offset.");
00833                         return;
00834                 }
00835 
00836                 exif-data_8c.html#9e8738e124156174a65499815ead53f0exif_data_load_data_content  (data, exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5239ecbe6f6d48d2d5702aab804e3196409EXIF_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#7cb0b0cf643202ccedaa6ba58b97ad53exif_data_get_type_maker_note  (data)) {
00846         case exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc32ffad36a69023ea1230715b9b107424bEXIF_DATA_TYPE_MAKER_NOTE_OLYMPUS :
00847                 data->priv->md = exif-mnote-data-olympus_8c.html#5bc7c7fe506ea2d06188872d2e2ee716exif_mnote_data_olympus_new  (data->priv->mem);
00848                 break;
00849         case exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc3ebc93ce3fc57d10f523d2622dd42e7edEXIF_DATA_TYPE_MAKER_NOTE_PENTAX :
00850                 data->priv->md = exif-mnote-data-pentax_8c.html#0e2c726228df26028291868165509812exif_mnote_data_pentax_new  (data->priv->mem);
00851                 break;
00852         case exif-data_8c.html#3ce317ab69b584e44cd3ab8bb15bacc30882f5c1f65e09539df9e424e1e5e06fEXIF_DATA_TYPE_MAKER_NOTE_CANON :
00853                 data->priv->md = exif-mnote-data-canon_8c.html#d958d3beb1e204937a24c2b63addfb45exif_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#f117ac759e75a7145d53847dfa8b4892exif_mnote_data_log  (data->priv->md, data->priv->log);
00864                 exif-mnote-data-priv_8h.html#1b67aad2ff49340ac3f0f15b3a726ce3exif_mnote_data_set_byte_order  (data->priv->md,
00865                                                 data->priv->order);
00866                 exif-mnote-data-priv_8h.html#17548c880619140855af60b037a8c730exif_mnote_data_set_offset  (data->priv->md,
00867                                             data->priv->offset_mnote);
00868                 exif-mnote-data_8c.html#263d51ca6b59fecb34199113b033f63fexif_mnote_data_load  (data->priv->md, d, ds);
00869         }
00870 
00871         if (data->priv->options & exif-data_8h.html#324f86ac1d053b37aaee45d2cfbda96de8470cc4acd5755528f7ff36ba168023EXIF_DATA_OPTION_FOLLOW_SPECIFICATION )
00872                 exif-data_8c.html#9146930a0b3ef89375790e19e1bc55b2exif_data_fix  (data);
00873 }
00874 
00875 void exif-data_8h.html#0391cfc9bfcc436061af55c5aec7bccb00876  exif-data_8c.html#c5700820c7d7e2a199a9170ed3833591exif_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#77cbef422b7a511d6405285ad9e00152exif_data_alloc  (data, *ds);
00884         if (!*d) 
00885                 return;
00886         memcpy (*d, exif-data_8c.html#7107bf174abd5f9994053ef9ae84044aExifHeader , 6);
00887 
00888         /* Order (offset 6) */ 00889         if (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order  == exif-byte-order_8h.html#f966227d69ff74eea7ecd69ca645155b851fef40a65a105b066115210a6b40b9EXIF_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#d905d16e26b4052a1db34dbebdc37341exif_set_short  (*d + 8, data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order , 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#c90147d0cc97bec7a577bf9576191bf8exif_set_long  (*d + 10, data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order , 8);
00905 
00906         /* Now save IFD 0. IFD 1 will be saved automatically. */ 00907         exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_LOG_CODE_DEBUG , "ExifData",
00908                   "Saving IFDs...");
00909         exif-data_8c.html#d1aed9b7d36e7cd97d6ead35de491603exif_data_save_data_content  (data, data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [ exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf523dba1cc10dacaad97ca9ba61d391e218cEXIF_IFD_0 ], d, ds,
00910                                      *ds - 6);
00911         exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog , exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_LOG_CODE_DEBUG , "ExifData",
00912                   "Saved %i byte(s) EXIF data.", *ds);
00913 }
00914 
00915 struct__ExifData.htmlExifData  *
exif-data_8h.html#c3c2d86223d3b219bad7ab2d28d8b8d200916  exif-data_8c.html#c3c2d86223d3b219bad7ab2d28d8b8d2exif_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#2d4278edbd89b5af3e5a4fe29b5e085cexif_loader_new  ();
00922         exif-loader_8c.html#e178bf9ee41fb78fdef1b29ec573901cexif_loader_write_file  (loader, path);
00923         edata = exif-loader_8c.html#be54111cdaf5b0559a20e1e76c31a86cexif_loader_get_data  (loader);
00924         exif-loader_8c.html#7f4e3dfa0df969ac8c232327840ca105exif_loader_unref  (loader);
00925 
00926         return (edata);
00927 }
00928 
00929 void exif-data_8h.html#41f2b9713a153809c3a19cc7007ef4e100930  exif-data_8c.html#41f2b9713a153809c3a19cc7007ef4e1exif_data_ref  ( struct__ExifData.htmlExifData  *data)
00931 {
00932         if (!data)
00933                 return;
00934 
00935         data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#ff67f5a96636c8057acbbd097f8ddf26ref_count ++;
00936 }
00937 
00938 void exif-data_8h.html#2a48cbedffbb7b2fcd74407fe68f09f600939  exif-data_8c.html#2a48cbedffbb7b2fcd74407fe68f09f6exif_data_unref  ( struct__ExifData.htmlExifData  *data)
00940 {
00941         if (!data) 
00942                 return;
00943 
00944         data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#ff67f5a96636c8057acbbd097f8ddf26ref_count --;
00945         if (!data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#ff67f5a96636c8057acbbd097f8ddf26ref_count ) 
00946                 exif-data_8c.html#2d2f8fee30176bd6460d51d33d080674exif_data_free  (data);
00947 }
00948 
00949 void exif-data_8h.html#2d2f8fee30176bd6460d51d33d08067400950  exif-data_8c.html#2d2f8fee30176bd6460d51d33d080674exif_data_free  ( struct__ExifData.htmlExifData  *data)
00951 {
00952         unsigned int i;
00953         struct__ExifMem.htmlExifMem  *mem = (data && data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv ) ? data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#83a309c082c6c65eb9f2e42865df23d4mem  : NULL;
00954 
00955         if (!data) 
00956                 return;
00957 
00958         for (i = 0; i < exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf523aef6c6dfc79dbd02383ed6719f9ecca5EXIF_IFD_COUNT ; i++) {
00959                 if (data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [i]) {
00960                         exif-content_8c.html#5e72c0f223d5d1aa33b34f388a5c9d37exif_content_unref  (data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [i]);
00961                         data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [i] = NULL;
00962                 }
00963         }
00964 
00965         if (data->data) {
00966                 exif-mem_8c.html#43190b81b4b4bdb4ffb89bfb612051b1exif_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#7a9b738a7429197d68c80ffedac7d8fbexif_log_unref  (data->priv->log);
00973                         data->priv->log = NULL;
00974                 }
00975                 if (data->priv->md) {
00976                         exif-mnote-data_8c.html#f910e5c862e5aba351b84b2142d98192exif_mnote_data_unref  (data->priv->md);
00977                         data->priv->md = NULL;
00978                 }
00979                 exif-mem_8c.html#43190b81b4b4bdb4ffb89bfb612051b1exif_mem_free  (mem, data->priv);
00980                 exif-mem_8c.html#43190b81b4b4bdb4ffb89bfb612051b1exif_mem_free  (mem, data);
00981         }
00982 
00983         exif-mem_8c.html#66744e0987af08c443df247ce55f7d87exif_mem_unref  (mem);
00984 }
00985 
00986 void exif-data_8h.html#bbb8951da3fd646776ee4d8685b6116200987  exif-data_8c.html#bbb8951da3fd646776ee4d8685b61162exif_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#7d1ed13ce50db58b739185faa1faf523aef6c6dfc79dbd02383ed6719f9ecca5EXIF_IFD_COUNT ; i++) {
00995                 if (data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [i] && data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [i]-> struct__ExifContent.html#83e0ab89fd53da23fec28563450b7c02count ) {
00996                         printf ("Dumping IFD '%s'...\n",
00997                                 exif-ifd_8c.html#57651cc68698f037cd9fb8f9d3a021a2exif_ifd_get_name  (i));
00998                         exif-content_8c.html#941c3522a39280f44329eaf364645620exif_content_dump  (data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [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#f966227d69ff74eea7ecd69ca645155bExifByteOrder exif-data_8h.html#2d8d50e6a9c19d28fe8192ef7cc5277701014  exif-data_8c.html#2d8d50e6a9c19d28fe8192ef7cc52777exif_data_get_byte_order  ( struct__ExifData.htmlExifData  *data)
01015 {
01016         if (!data)
01017                 return (0);
01018 
01019         return (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order );
01020 }
01021 
01022 void exif-data_8h.html#d3b39ab4a3117ca9fd7d9a1126b5d87901023  exif-data_8c.html#d3b39ab4a3117ca9fd7d9a1126b5d879exif_data_foreach_content  ( struct__ExifData.htmlExifData  *data, exif-data_8h.html#59abd1064b2757668fc33518d554af72ExifDataForeachContentFunc  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#7d1ed13ce50db58b739185faa1faf523aef6c6dfc79dbd02383ed6719f9ecca5EXIF_IFD_COUNT ; i++)
01032                 func (data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [i], user_data);
01033 }
01034 
exif-data_8c.html#34b1e587d76b2335d135d80452900b9801035  typedef struct struct__ByteOrderChangeData.html_ByteOrderChangeData  exif-data_8c.html#34b1e587d76b2335d135d80452900b98ByteOrderChangeData ;
struct__ByteOrderChangeData.html01036  struct struct__ByteOrderChangeData.html_ByteOrderChangeData  {
struct__ByteOrderChangeData.html#d2a7931fc5ee73960b0ec53ddab591b201037          exif-byte-order_8h.html#f966227d69ff74eea7ecd69ca645155bExifByteOrder  struct__ByteOrderChangeData.html#d2a7931fc5ee73960b0ec53ddab591b2old , new;
01038 };
01039 
01040 static void exif-data_8c.html#94ca6e374374d20636e7f72a3605345c01041  exif-data_8c.html#94ca6e374374d20636e7f72a3605345centry_set_byte_order  ( struct__ExifEntry.htmlExifEntry  *e, void *data)
01042 {
01043         exif-data_8c.html#34b1e587d76b2335d135d80452900b98ByteOrderChangeData  *d = data;
01044 
01045         if (!e)
01046                 return;
01047 
01048         exif-utils_8c.html#54ef3b86ffeb643e9c4434b85ccf2992exif_array_set_byte_order  (e-> struct__ExifEntry.html#6129f19697eff3ab581e0a8455d9fbaeformat , e-> struct__ExifEntry.html#7fd255a932578e60a5fbaac47d4362d4data , e-> struct__ExifEntry.html#4d1cd87a5c3f43b3d14b087a44582c06components , d-> struct__ByteOrderChangeData.html#d2a7931fc5ee73960b0ec53ddab591b2old , d-> struct__ByteOrderChangeData.html#db93742048c742f50047c7ca09cf629enew );
01049 }
01050 
01051 static void exif-data_8c.html#581ba94d90b37a4bbda154101162dd9001052  exif-data_8c.html#581ba94d90b37a4bbda154101162dd90content_set_byte_order  ( struct__ExifContent.htmlExifContent  *content, void *data)
01053 {
01054         exif-content_8c.html#f7372b1342146e73a9d5b671c717a730exif_content_foreach_entry  (content, exif-data_8c.html#94ca6e374374d20636e7f72a3605345centry_set_byte_order , data);
01055 }
01056 
01057 void exif-data_8h.html#0cb36f43b46dabad15aca7378eefe75a01058  exif-data_8c.html#0cb36f43b46dabad15aca7378eefe75aexif_data_set_byte_order  ( struct__ExifData.htmlExifData  *data, exif-byte-order_8h.html#f966227d69ff74eea7ecd69ca645155bExifByteOrder  order)
01059 {
01060         exif-data_8c.html#34b1e587d76b2335d135d80452900b98ByteOrderChangeData  d;
01061 
01062         if (!data || (order == data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order ))
01063                 return;
01064 
01065         d. struct__ByteOrderChangeData.html#d2a7931fc5ee73960b0ec53ddab591b2old  = data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order ;
01066         d. struct__ByteOrderChangeData.html#db93742048c742f50047c7ca09cf629enew  = order;
01067         exif-data_8c.html#d3b39ab4a3117ca9fd7d9a1126b5d879exif_data_foreach_content  (data, exif-data_8c.html#581ba94d90b37a4bbda154101162dd90content_set_byte_order , &d);
01068         data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#fcf5a131164746945d31f8fc6e93a9c5order  = order;
01069         if (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#e282eaad62e448a29d1fcaabd418fc9dmd )
01070                 exif-mnote-data-priv_8h.html#1b67aad2ff49340ac3f0f15b3a726ce3exif_mnote_data_set_byte_order  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#e282eaad62e448a29d1fcaabd418fc9dmd , order);
01071 }
01072 
01073 void exif-data_8h.html#f0d9d41ffeb6cd98906cd5ba5819c5ef01074  exif-data_8c.html#f0d9d41ffeb6cd98906cd5ba5819c5efexif_data_log  ( struct__ExifData.htmlExifData  *data, struct__ExifLog.htmlExifLog  *log)
01075 {
01076         unsigned int i;
01077 
01078         if (!data || !data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv ) 
01079                 return;
01080         exif-log_8c.html#7a9b738a7429197d68c80ffedac7d8fbexif_log_unref  (data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog );
01081         data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog  = log;
01082         exif-log_8c.html#afd7e5d40ca73440976a3b684bfa1059exif_log_ref  (log);
01083 
01084         for (i = 0; i < exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf523aef6c6dfc79dbd02383ed6719f9ecca5EXIF_IFD_COUNT ; i++)
01085                 exif-content_8c.html#cdc250f9237c430642c2c71ba022070aexif_content_log  (data-> struct__ExifData.html#93efef6710d8b867b743ed0a152d5293ifd [i], log);
01086 }
01087 
01088 /* Used internally within libexif */ 01089 struct__ExifLog.htmlExifLog  * exif-data_8c.html#9403ed4fde8ef603e9db173eb122efafexif_data_get_log  ( struct__ExifData.htmlExifData  *);
01090 struct__ExifLog.htmlExifLog  *
exif-data_8c.html#9403ed4fde8ef603e9db173eb122efaf01091  exif-data_8c.html#9403ed4fde8ef603e9db173eb122efafexif_data_get_log  ( struct__ExifData.htmlExifData  *data)
01092 {
01093         if (!data || !data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv ) 
01094                 return NULL;
01095         return data-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#d094e7df48439e9a6acb6a3ae229549clog ;
01096 }
01097 
01098 static struct {
exif-data_8c.html#d9ba2d4ed921a854d7a9ec4dd4ee087c01099          exif-data_8h.html#324f86ac1d053b37aaee45d2cfbda96dExifDataOption  exif-data_8c.html#d9ba2d4ed921a854d7a9ec4dd4ee087coption ;
exif-data_8c.html#8f8f80d37794cde9472343e4487ba3eb01100          const char * mnote-canon-entry_8c.html#5ac083a645d964373f022d03df4849c8name ;
exif-data_8c.html#68344fa88cf4e86b5079fd69a5c22d5701101          const char * mnote-canon-tag_8c.html#68344fa88cf4e86b5079fd69a5c22d57description ;
01102 } exif-data_8c.html#de905a2d5d94d0b6064856a587ec2b09exif_data_option [] = {
01103         { exif-data_8h.html#324f86ac1d053b37aaee45d2cfbda96d37a62c4c36dfb4d533338062a4040deeEXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS , i18n_8h.html#75278405e7f034d2b1af80bfd94675feN_ ("Ignore unknown tags"),
01104          i18n_8h.html#75278405e7f034d2b1af80bfd94675feN_ ("Ignore unknown tags when loading EXIF data.")},
01105         { exif-data_8h.html#324f86ac1d053b37aaee45d2cfbda96de8470cc4acd5755528f7ff36ba168023EXIF_DATA_OPTION_FOLLOW_SPECIFICATION , i18n_8h.html#75278405e7f034d2b1af80bfd94675feN_ ("Follow specification"),
01106          i18n_8h.html#75278405e7f034d2b1af80bfd94675feN_ ("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#7d3a79f408b23055ee2f7a4ce1f6540901112  exif-data_8c.html#2d755968b904ced3c4ce541ed7b8d109exif_data_option_get_name  ( exif-data_8h.html#324f86ac1d053b37aaee45d2cfbda96dExifDataOption  o)
01113 {
01114         unsigned int i;
01115 
01116         for (i = 0; exif-data_8c.html#de905a2d5d94d0b6064856a587ec2b09exif_data_option [i].name; i++)
01117                 if ( exif-data_8c.html#de905a2d5d94d0b6064856a587ec2b09exif_data_option [i]. exif-data_8c.html#d9ba2d4ed921a854d7a9ec4dd4ee087coption  == o) 
01118                         break;
01119         return i18n_8h.html#32a3cf3d9dd914f5aeeca5423c157934_ ( exif-data_8c.html#de905a2d5d94d0b6064856a587ec2b09exif_data_option [i]. mnote-canon-entry_8c.html#5ac083a645d964373f022d03df4849c8name );
01120 }
01121 
01122 const char *
exif-data_8h.html#d85329eabf9766519eb9733f2c89712501123  exif-data_8c.html#4b2240643a70ea66e4f24ac709086802exif_data_option_get_description  ( exif-data_8h.html#324f86ac1d053b37aaee45d2cfbda96dExifDataOption  o)
01124 {
01125         unsigned int i;
01126 
01127         for (i = 0; exif-data_8c.html#de905a2d5d94d0b6064856a587ec2b09exif_data_option [i].description; i++)
01128                 if ( exif-data_8c.html#de905a2d5d94d0b6064856a587ec2b09exif_data_option [i]. exif-data_8c.html#d9ba2d4ed921a854d7a9ec4dd4ee087coption  == o) 
01129                         break;
01130         return i18n_8h.html#32a3cf3d9dd914f5aeeca5423c157934_ ( exif-data_8c.html#de905a2d5d94d0b6064856a587ec2b09exif_data_option [i]. mnote-canon-tag_8c.html#68344fa88cf4e86b5079fd69a5c22d57description );
01131 }
01132 
01133 void exif-data_8h.html#b5787b026e0c0dc27117c67723d7367301134  exif-data_8c.html#f3fd819c29391da3b444cc347b86a3d4exif_data_set_option  ( struct__ExifData.htmlExifData  *d, exif-data_8h.html#324f86ac1d053b37aaee45d2cfbda96dExifDataOption  o)
01135 {
01136         if (!d) 
01137                 return;
01138 
01139         d-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#0563f18994a859c3f7df9e9de3d91504options  |= o;
01140 }
01141 
01142 void exif-data_8h.html#712622a0919f9d6203923c39a19a14d401143  exif-data_8c.html#be62de8c8f5a24f8847e65ca3a098da8exif_data_unset_option  ( struct__ExifData.htmlExifData  *d, exif-data_8h.html#324f86ac1d053b37aaee45d2cfbda96dExifDataOption  o)
01144 {
01145         if (!d) 
01146                 return;
01147 
01148         d-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#0563f18994a859c3f7df9e9de3d91504options  &= ~o;
01149 }
01150 
01151 static void exif-data_8c.html#c80feba703ee270b384ef7739c28f8f001152  exif-content_8c.html#01413ca11ba6f2f10a0c4fbdd1ef5226fix_func  ( struct__ExifContent.htmlExifContent  *c, void *data)
01153 {
01154         switch ( exif-content_8c.html#102270386bc7fdc7296e243967f1a2f4exif_content_get_ifd  (c)) {
01155         case exif-ifd_8h.html#7d1ed13ce50db58b739185faa1faf5239ecbe6f6d48d2d5702aab804e3196409EXIF_IFD_1 :
01156                 if (c->parent->data)
01157                         exif-content_8c.html#16c54e0f88067820efd37cd3088a9c70exif_content_fix  (c);
01158                 else {
01159                         exif-log_8c.html#025d4a5d96544913ea6f6ebbec69cb68exif_log  (c->parent->priv->log, exif-log_8h.html#36f42667fb0481f099dbc0628dae2652e8772b1ad05481f996ae4ab831f22860EXIF_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#04f76832f82ea29ce05cd7c4e51932b1exif_content_remove_entry  (c, c->entries[c->count - 1]);
01164                 }
01165                 break;
01166         default:
01167                 exif-content_8c.html#16c54e0f88067820efd37cd3088a9c70exif_content_fix  (c);
01168         }
01169 }
01170 
01171 void exif-data_8h.html#4614bcffc44ae3c6976114af153b1fec01172  exif-data_8c.html#9146930a0b3ef89375790e19e1bc55b2exif_data_fix  ( struct__ExifData.htmlExifData  *d)
01173 {
01174         exif-data_8c.html#d3b39ab4a3117ca9fd7d9a1126b5d879exif_data_foreach_content  (d, exif-content_8c.html#01413ca11ba6f2f10a0c4fbdd1ef5226fix_func , NULL);
01175 }
01176 
01177 void exif-data_8h.html#835efb695270ddfe40014ed47f3d5eaf01178  exif-data_8c.html#be6f9020e02df0d550545b50ddcafe24exif_data_set_data_type  ( struct__ExifData.htmlExifData  *d, exif-data-type_8h.html#b7d01513ff048ac5d8ae50a3e0235ce8ExifDataType  dt)
01179 {
01180         if (!d || !d-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv ) 
01181                 return;
01182 
01183         d-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#0358c8918feb6899a7ebc18f629aea59data_type  = dt;
01184 }
01185 
01186 exif-data-type_8h.html#b7d01513ff048ac5d8ae50a3e0235ce8ExifDataType exif-data_8h.html#d673c17faeb54d6591ebe1660e39baec01187  exif-data_8c.html#4fb5dada09c9fdcab3eb7fe7e840ec84exif_data_get_data_type  ( struct__ExifData.htmlExifData  *d)
01188 {
01189         return (d && d-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv ) ? d-> struct__ExifData.html#c78f8625a4ee6fc2b2e8b281c2059869priv -> struct__ExifDataPrivate.html#0358c8918feb6899a7ebc18f629aea59data_type  : exif-data-type_8h.html#b7d01513ff048ac5d8ae50a3e0235ce89faf820efce6698ebcbdef3386643506EXIF_DATA_TYPE_COUNT ;
01190 }
Generated on Sun Apr 23 02:19:18 2006 for EXIF library (libexif) Internals by 
http://www.doxygen.org/index.htmldoxygen  1.4.6 