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
113
114
115
116
117
118
119
120
121
122
use std::fs::File;
use std::io::{Seek,SeekFrom,Read};
mod lowlevel;
mod rational;
pub use self::rational::*;
mod types;
pub use self::types::*;
mod types_impl;
pub use self::types_impl::*;
mod debug;
mod image;
use self::image::*;
mod ifdformat;
mod tiff;
use self::tiff::*;
mod exifreadable;
mod exifpost;
mod exif;
pub fn parse_buffer(contents: &Vec<u8>) -> ExifResult
{
let mime = detect_type(&contents);
if mime == "" {
return Err(ExifError{
kind: ExifErrorKind::FileTypeUnknown,
extra: "".to_string()});
}
let mut offset = 0 as usize;
let mut size = contents.len() as usize;
if mime == "image/jpeg" {
let (eoffset, esize, err) = find_embedded_tiff_in_jpeg(&contents);
if eoffset == 0 {
return Err(ExifError{
kind: ExifErrorKind::JpegWithoutExif,
extra: err.to_string()});
}
offset = eoffset;
size = esize;
}
match parse_tiff(&contents[offset .. offset + size]) {
Ok(d) => {
let f = ExifData { mime: mime.to_string(), entries: d };
Ok(f)
},
Err(e) => Err(e)
}
}
pub fn read_file(fname: &str, f: &mut File) -> ExifResult
{
match f.seek(SeekFrom::Start(0)) {
Ok(_) => (),
Err(_) => return Err(ExifError{kind: ExifErrorKind::FileSeekError,
extra: fname.to_string()}),
}
let mut contents: Vec<u8> = Vec::new();
match f.read_to_end(&mut contents) {
Ok(_) => parse_buffer(&contents),
Err(_) => Err(ExifError{kind: ExifErrorKind::FileReadError,
extra: fname.to_string()}),
}
}
pub fn parse_file(fname: &str) -> ExifResult
{
let mut f = match File::open(fname) {
Ok(f) => f,
Err(_) => return Err(ExifError{kind: ExifErrorKind::FileOpenError,
extra: fname.to_string()}),
};
return read_file(fname, &mut f);
}