1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#![allow(clippy::upper_case_acronyms)]
use std::fs::File;
use std::io::{Read, Seek, SeekFrom};
use std::path::Path;
mod lowlevel;
mod rational;
pub use self::rational::*;
mod types;
pub use self::types::*;
mod types_impl;
pub use self::types_impl::*;
mod image;
use self::image::*;
mod ifdformat;
mod tiff;
use self::tiff::*;
mod exif;
mod exifpost;
mod exifreadable;
pub fn parse_buffer(contents: &[u8]) -> ExifResult {
let (res, warnings) = parse_buffer_quiet(contents);
warnings.into_iter().for_each(|w| eprintln!("{}", w));
res
}
pub fn parse_buffer_quiet(contents: &[u8]) -> (ExifResult, Vec<String>) {
let mime = detect_type(contents);
let mut warnings = vec![];
let (entries, le) = match mime {
FileType::Unknown => return (Err(ExifError::FileTypeUnknown), warnings),
FileType::TIFF => parse_tiff(contents, &mut warnings),
FileType::JPEG => {
match find_embedded_tiff_in_jpeg(contents).and_then(|(offset, size)| {
Ok(parse_tiff(&contents[offset..offset + size], &mut warnings))
}) {
Ok(r) => r,
Err(e) => return (Err(e), warnings)
}
}
};
(
entries.map(|entries| ExifData {
mime: mime.as_str(),
entries,
le
}),
warnings,
)
}
pub fn read_file(f: &mut File) -> ExifResult {
f.seek(SeekFrom::Start(0))?;
let mut contents: Vec<u8> = Vec::new();
f.read_to_end(&mut contents)?;
parse_buffer(&contents)
}
pub fn parse_file<P: AsRef<Path>>(fname: P) -> ExifResult {
read_file(&mut File::open(fname)?)
}