int header_check_tiff_le_new(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new) { const char raf_fp[15]={0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xf0, 0x0d, 0x00, 0x01}; const char *potential_error=NULL; const TIFFHeader *header=(const TIFFHeader *)buffer; if((uint32_t)le32(header->tiff_diroff) < sizeof(TIFFHeader)) return 0; /* Avoid a false positiv with some RAF files */ if(file_recovery->file_stat!=NULL && file_recovery->file_stat->file_hint==&file_hint_raf && memcmp(buffer, raf_fp, 15)==0) { header_ignored(file_recovery_new); return 0; } if(file_recovery->file_stat!=NULL && file_recovery->file_stat->file_hint==&file_hint_jpg) { if(header_ignored_adv(file_recovery, file_recovery_new)==0) return 0; } reset_file_recovery(file_recovery_new); file_recovery_new->extension="tif"; /* Canon RAW */ if(buffer[8]=='C' && buffer[9]=='R' && buffer[10]==2) file_recovery_new->extension="cr2"; else if(find_tag_from_tiff_header_le(header, buffer_size, TIFFTAG_DNGVERSION, &potential_error)!=NULL) { /* Adobe Digital Negative, ie. NIKON D50 */ file_recovery_new->extension="dng"; } else { const char *tag_make; tag_make=find_tag_from_tiff_header_le(header, buffer_size, TIFFTAG_MAKE, &potential_error); if(tag_make!=NULL && tag_make >= (const char *)buffer && tag_make < (const char *)buffer + buffer_size - 5) { /* TODO * sr2 if Sony::FileFormat begins by 1 * arw otherwise */ if(memcmp(tag_make, "SONY", 5)==0) file_recovery_new->extension="sr2"; else if(strncmp(tag_make, "SONY ",5)==0) file_recovery_new->extension="arw"; else if(memcmp(tag_make, "NIKON CORPORATION", 18)==0) file_recovery_new->extension="nef"; } } file_recovery_new->time=get_date_from_tiff_header(header, buffer_size); file_recovery_new->file_check=&file_check_tiff; return 1; }
const char *find_tag_from_tiff_header(const TIFFHeader *tiff, const unsigned int tiff_size, const unsigned int tag, const char **potential_error) { if(tiff->tiff_magic==TIFF_BIGENDIAN) return find_tag_from_tiff_header_be(tiff, tiff_size, tag, potential_error); else if(tiff->tiff_magic==TIFF_LITTLEENDIAN) return find_tag_from_tiff_header_le(tiff, tiff_size, tag, potential_error); return NULL; }