annotate src/exiv2.cc @ 276:4f526d436873

Implement secure rc file saving. First data is written to a temporary file, then if nothing was wrong, this file is renamed to the final name. This way the risk of corrupted rc file is greatly reduced. The code is borrowed from ELinks (http://elinks.cz).
author zas_
date Tue, 08 Apr 2008 21:55:58 +0000
parents c7021159079d
children 9995c5fb202a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
1
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
2 #ifdef HAVE_CONFIG_H
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
3 # include "config.h"
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
4 #endif
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
5
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
6 #ifdef HAVE_EXIV2
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
7
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
8 #include <exiv2/image.hpp>
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
9 #include <exiv2/exif.hpp>
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
10 #include <iostream>
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
11
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
12 // EXIV2_TEST_VERSION is defined in Exiv2 0.15 and newer.
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
13 #ifndef EXIV2_TEST_VERSION
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
14 # define EXIV2_TEST_VERSION(major,minor,patch) \
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
15 ( EXIV2_VERSION >= EXIV2_MAKE_VERSION(major,minor,patch) )
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
16 #endif
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
17
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
18
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
19 #include <sys/types.h>
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
20 #include <sys/stat.h>
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
21 #include <unistd.h>
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
22 #include <fcntl.h>
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
23 #include <sys/mman.h>
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
24
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
25 #include <exiv2/tiffparser.hpp>
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
26 #include <exiv2/tiffcomposite.hpp>
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
27 #include <exiv2/tiffvisitor.hpp>
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
28 #include <exiv2/tiffimage.hpp>
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
29 #include <exiv2/cr2image.hpp>
191
19df9953a5d1 crw preview support with exiv2
nadvornik
parents: 188
diff changeset
30 #include <exiv2/crwimage.hpp>
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
31 #if EXIV2_TEST_VERSION(0,16,0)
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
32 #include <exiv2/orfimage.hpp>
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
33 #endif
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
34 #if EXIV2_TEST_VERSION(0,13,0)
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
35 #include <exiv2/rafimage.hpp>
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
36 #endif
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
37 #include <exiv2/futils.hpp>
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
38
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
39
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
40
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
41 extern "C" {
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
42 #include <glib.h>
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
43 #include "gqview.h"
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
44 #include "exif.h"
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 201
diff changeset
45 #include "filelist.h"
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
46
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
47 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
48
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
49 struct _ExifData
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
50 {
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
51 Exiv2::Image::AutoPtr image;
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
52 Exiv2::Image::AutoPtr sidecar;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
53 Exiv2::ExifData::const_iterator exifIter; /* for exif_get_next_item */
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
54 Exiv2::IptcData::const_iterator iptcIter; /* for exif_get_next_item */
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
55 #if EXIV2_TEST_VERSION(0,16,0)
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
56 Exiv2::XmpData::const_iterator xmpIter; /* for exif_get_next_item */
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
57 #endif
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
58 bool have_sidecar;
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
59
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
60
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
61 _ExifData(gchar *path, gchar *sidecar_path, gint parse_color_profile)
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
62 {
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
63 have_sidecar = false;
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
64 image = Exiv2::ImageFactory::open(path);
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
65 // g_assert (image.get() != 0);
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
66 image->readMetadata();
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
67
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
68 #if EXIV2_TEST_VERSION(0,16,0)
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
69 printf("xmp count %d\n", image->xmpData().count());
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
70 if (sidecar_path && image->xmpData().empty())
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
71 {
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
72 sidecar = Exiv2::ImageFactory::open(sidecar_path);
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
73 sidecar->readMetadata();
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
74 have_sidecar = sidecar->good();
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
75 printf("sidecar xmp count %d\n", sidecar->xmpData().count());
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
76 }
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
77
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
78 #endif
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
79 }
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
80
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
81 void writeMetadata()
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
82 {
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
83 if (have_sidecar) sidecar->writeMetadata();
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
84 image->writeMetadata();
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
85 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
86
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
87 Exiv2::ExifData &exifData ()
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
88 {
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
89 return image->exifData();
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
90 }
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
91
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
92 Exiv2::IptcData &iptcData ()
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
93 {
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
94 return image->iptcData();
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
95 }
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
96
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
97 #if EXIV2_TEST_VERSION(0,16,0)
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
98 Exiv2::XmpData &xmpData ()
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
99 {
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
100 return have_sidecar ? sidecar->xmpData() : image->xmpData();
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
101 }
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
102 #endif
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
103
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
104 };
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
105
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
106 extern "C" {
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
107
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
108 ExifData *exif_read(gchar *path, gchar *sidecar_path, gint parse_color_profile)
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
109 {
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 201
diff changeset
110 if (debug) printf("exif read %s, sidecar: %s\n", path, sidecar_path ? sidecar_path : "-");
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
111 try {
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
112 return new ExifData(path, sidecar_path, parse_color_profile);
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
113 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
114 catch (Exiv2::AnyError& e) {
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
115 std::cout << "Caught Exiv2 exception '" << e << "'\n";
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
116 return NULL;
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
117 }
179
37004d5a584a and first version that actually shows some exif data (see advanced view)
nadvornik
parents: 178
diff changeset
118
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
119 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
120
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
121 int exif_write(ExifData *exif)
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
122 {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
123 try {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
124 exif->writeMetadata();
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
125 return 1;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
126 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
127 catch (Exiv2::AnyError& e) {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
128 std::cout << "Caught Exiv2 exception '" << e << "'\n";
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
129 return 0;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
130 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
131
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
132 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
133
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
134
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
135 void exif_free(ExifData *exif)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
136 {
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 180
diff changeset
137
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 180
diff changeset
138 delete exif;
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
139 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
140
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
141 ExifItem *exif_get_item(ExifData *exif, const gchar *key)
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
142 {
183
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
143 try {
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
144 Exiv2::Metadatum *item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
145 try {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
146 Exiv2::ExifKey ekey(key);
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
147 Exiv2::ExifData::iterator pos = exif->exifData().findKey(ekey);
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
148 if (pos == exif->exifData().end()) return NULL;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
149 item = &*pos;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
150 }
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
151 catch (Exiv2::AnyError& e) {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
152 try {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
153 Exiv2::IptcKey ekey(key);
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
154 Exiv2::IptcData::iterator pos = exif->iptcData().findKey(ekey);
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
155 if (pos == exif->iptcData().end()) return NULL;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
156 item = &*pos;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
157 }
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
158 catch (Exiv2::AnyError& e) {
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
159 #if EXIV2_TEST_VERSION(0,16,0)
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
160 Exiv2::XmpKey ekey(key);
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
161 Exiv2::XmpData::iterator pos = exif->xmpData().findKey(ekey);
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
162 if (pos == exif->xmpData().end()) return NULL;
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
163 item = &*pos;
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
164 #endif
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
165 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
166 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
167 return (ExifItem *)item;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
168 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
169 catch (Exiv2::AnyError& e) {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
170 std::cout << "Caught Exiv2 exception '" << e << "'\n";
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
171 return NULL;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
172 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
173 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
174
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
175 ExifItem *exif_add_item(ExifData *exif, const gchar *key)
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
176 {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
177 try {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
178 Exiv2::Metadatum *item;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
179 try {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
180 Exiv2::ExifKey ekey(key);
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
181 exif->exifData().add(ekey, NULL);
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
182 Exiv2::ExifData::iterator pos = exif->exifData().end(); // a hack, there should be a better way to get the currently added item
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
183 pos--;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
184 item = &*pos;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
185 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
186 catch (Exiv2::AnyError& e) {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
187 try {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
188 Exiv2::IptcKey ekey(key);
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
189 exif->iptcData().add(ekey, NULL);
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
190 Exiv2::IptcData::iterator pos = exif->iptcData().end();
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
191 pos--;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
192 item = &*pos;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
193 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
194 catch (Exiv2::AnyError& e) {
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
195 #if EXIV2_TEST_VERSION(0,16,0)
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
196 Exiv2::XmpKey ekey(key);
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
197 exif->xmpData().add(ekey, NULL);
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
198 Exiv2::XmpData::iterator pos = exif->xmpData().end();
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
199 pos--;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
200 item = &*pos;
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
201 #endif
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
202 }
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
203 }
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
204 return (ExifItem *)item;
183
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
205 }
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
206 catch (Exiv2::AnyError& e) {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
207 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
208 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
209 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
210 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
211
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
212
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
213 ExifItem *exif_get_first_item(ExifData *exif)
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
214 {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
215 try {
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
216 exif->exifIter = exif->exifData().begin();
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
217 exif->iptcIter = exif->iptcData().begin();
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
218 #if EXIV2_TEST_VERSION(0,16,0)
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
219 exif->xmpIter = exif->xmpData().begin();
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
220 #endif
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
221 if (exif->exifIter != exif->exifData().end())
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
222 {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
223 const Exiv2::Metadatum *item = &*exif->exifIter;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
224 exif->exifIter++;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
225 return (ExifItem *)item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
226 }
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
227 if (exif->iptcIter != exif->iptcData().end())
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
228 {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
229 const Exiv2::Metadatum *item = &*exif->iptcIter;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
230 exif->iptcIter++;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
231 return (ExifItem *)item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
232 }
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
233 #if EXIV2_TEST_VERSION(0,16,0)
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
234 if (exif->xmpIter != exif->xmpData().end())
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
235 {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
236 const Exiv2::Metadatum *item = &*exif->xmpIter;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
237 exif->xmpIter++;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
238 return (ExifItem *)item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
239 }
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
240 #endif
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
241 return NULL;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
242
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
243 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
244 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
245 std::cout << "Caught Exiv2 exception '" << e << "'\n";
183
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
246 return NULL;
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
247 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
248 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
249
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
250 ExifItem *exif_get_next_item(ExifData *exif)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
251 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
252 try {
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
253 if (exif->exifIter != exif->exifData().end())
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
254 {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
255 const Exiv2::Metadatum *item = &*exif->exifIter;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
256 exif->exifIter++;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
257 return (ExifItem *)item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
258 }
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
259 if (exif->iptcIter != exif->iptcData().end())
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
260 {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
261 const Exiv2::Metadatum *item = &*exif->iptcIter;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
262 exif->iptcIter++;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
263 return (ExifItem *)item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
264 }
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
265 #if EXIV2_TEST_VERSION(0,16,0)
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
266 if (exif->xmpIter != exif->xmpData().end())
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
267 {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
268 const Exiv2::Metadatum *item = &*exif->xmpIter;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
269 exif->xmpIter++;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
270 return (ExifItem *)item;
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
271 }
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
272 #endif
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
273 return NULL;
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
274 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
275 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
276 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
277 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
278 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
279 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
280
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
281 char *exif_item_get_tag_name(ExifItem *item)
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
282 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
283 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
284 if (!item) return NULL;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
285 return g_strdup(((Exiv2::Metadatum *)item)->key().c_str());
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
286 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
287 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
288 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
289 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
290 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
291 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
292
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
293 guint exif_item_get_tag_id(ExifItem *item)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
294 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
295 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
296 if (!item) return 0;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
297 return ((Exiv2::Metadatum *)item)->tag();
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
298 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
299 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
300 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
301 return 0;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
302 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
303 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
304
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
305 guint exif_item_get_elements(ExifItem *item)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
306 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
307 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
308 if (!item) return 0;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
309 return ((Exiv2::Metadatum *)item)->count();
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
310 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
311 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
312 std::cout << "Caught Exiv2 exception '" << e << "'\n";
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
313 return 0;
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
314 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
315 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
316
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
317 char *exif_item_get_data(ExifItem *item, guint *data_len)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
318 {
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
319 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
320
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 180
diff changeset
321 char *exif_item_get_description(ExifItem *item)
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
322 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
323 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
324 if (!item) return NULL;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
325 return g_strdup(((Exiv2::Metadatum *)item)->tagLabel().c_str());
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
326 }
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
327 catch (std::exception& e) {
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
328 // std::cout << "Caught Exiv2 exception '" << e << "'\n";
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
329 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
330 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
331 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
332
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
333 /*
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
334 invalidTypeId, unsignedByte, asciiString, unsignedShort,
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
335 unsignedLong, unsignedRational, signedByte, undefined,
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
336 signedShort, signedLong, signedRational, string,
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
337 date, time, comment, directory,
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
338 xmpText, xmpAlt, xmpBag, xmpSeq,
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
339 langAlt, lastTypeId
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
340 */
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
341
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
342 static guint format_id_trans_tbl [] = {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
343 EXIF_FORMAT_UNKNOWN,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
344 EXIF_FORMAT_BYTE_UNSIGNED,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
345 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
346 EXIF_FORMAT_SHORT_UNSIGNED,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
347 EXIF_FORMAT_LONG_UNSIGNED,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
348 EXIF_FORMAT_RATIONAL_UNSIGNED,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
349 EXIF_FORMAT_BYTE,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
350 EXIF_FORMAT_UNDEFINED,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
351 EXIF_FORMAT_SHORT,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
352 EXIF_FORMAT_LONG,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
353 EXIF_FORMAT_RATIONAL,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
354 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
355 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
356 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
357 EXIF_FORMAT_UNDEFINED,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
358 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
359 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
360 EXIF_FORMAT_STRING,
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
361 EXIF_FORMAT_STRING
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
362 };
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
363
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
364
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
365
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
366 guint exif_item_get_format_id(ExifItem *item)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
367 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
368 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
369 if (!item) return EXIF_FORMAT_UNKNOWN;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
370 guint id = ((Exiv2::Metadatum *)item)->typeId();
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
371 if (id >= (sizeof(format_id_trans_tbl) / sizeof(format_id_trans_tbl[0])) ) return EXIF_FORMAT_UNKNOWN;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
372 return format_id_trans_tbl[id];
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
373 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
374 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
375 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
376 return EXIF_FORMAT_UNKNOWN;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
377 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
378 }
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
379
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
380 const char *exif_item_get_format_name(ExifItem *item, gint brief)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
381 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
382 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
383 if (!item) return NULL;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
384 return ((Exiv2::Metadatum *)item)->typeName();
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
385 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
386 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
387 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
388 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
389 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
390 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
391
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
392
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
393 gchar *exif_item_get_data_as_text(ExifItem *item)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
394 {
183
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
395 try {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
396 if (!item) return NULL;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
397 // std::stringstream str; // does not work with Exiv2::Metadatum because operator<< is not virtual
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
398 // str << *((Exiv2::Metadatum *)item);
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
399 // return g_strdup(str.str().c_str());
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
400 return g_strdup(((Exiv2::Metadatum *)item)->toString().c_str());
183
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
401 }
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
402 catch (Exiv2::AnyError& e) {
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
403 return NULL;
3962c9d3d6fd more exiv2 fixes
nadvornik
parents: 182
diff changeset
404 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
405 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
406
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
407 gchar *exif_item_get_string(ExifItem *item, int idx)
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
408 {
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
409 try {
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
410 if (!item) return NULL;
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
411 Exiv2::Metadatum *em = (Exiv2::Metadatum *)item;
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
412 #if EXIV2_TEST_VERSION(0,16,0)
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
413 std::string str = em->toString(idx);
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
414 #else
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
415 std::string str = em->toString(); // FIXME
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
416 #endif
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
417 if (idx == 0 && str == "") str = em->toString();
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
418 if (str.length() > 5 && str.substr(0, 5) == "lang=")
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
419 {
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
420 std::string::size_type pos = str.find_first_of(' ');
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
421 if (pos != std::string::npos) str = str.substr(pos+1);
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
422 }
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
423
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
424 return g_strdup(str.c_str());
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
425 }
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
426 catch (Exiv2::AnyError& e) {
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
427 return NULL;
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
428 }
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
429 }
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
430
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
431
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
432 gint exif_item_get_integer(ExifItem *item, gint *value)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
433 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
434 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
435 if (!item) return 0;
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
436 *value = ((Exiv2::Metadatum *)item)->toLong();
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
437 return 1;
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
438 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
439 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
440 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
441 return 0;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
442 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
443 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
444
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
445 ExifRational *exif_item_get_rational(ExifItem *item, gint *sign)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
446 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
447 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
448 if (!item) return NULL;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 184
diff changeset
449 Exiv2::Rational v = ((Exiv2::Metadatum *)item)->toRational();
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
450 static ExifRational ret;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
451 ret.num = v.first;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
452 ret.den = v.second;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
453 return &ret;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
454 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
455 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
456 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
457 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
458 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
459 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
460
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 180
diff changeset
461 const gchar *exif_get_tag_description_by_key(const gchar *key)
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
462 {
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
463 try {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
464 Exiv2::ExifKey ekey(key);
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
465 return Exiv2::ExifTags::tagLabel(ekey.tag(), ekey.ifdId ());
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
466 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
467 catch (Exiv2::AnyError& e) {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
468 std::cout << "Caught Exiv2 exception '" << e << "'\n";
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
469 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 183
diff changeset
470 }
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
471 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
472
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
473 int exif_item_set_string(ExifItem *item, const char *str)
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
474 {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
475 try {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
476 if (!item) return 0;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
477 ((Exiv2::Metadatum *)item)->setValue(std::string(str));
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
478 return 1;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
479 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
480 catch (Exiv2::AnyError& e) {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
481 return 0;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
482 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
483 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
484
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
485 int exif_item_delete(ExifData *exif, ExifItem *item)
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
486 {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
487 try {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
488 if (!item) return 0;
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
489 for (Exiv2::ExifData::iterator i = exif->exifData().begin(); i != exif->exifData().end(); ++i) {
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
490 if (((Exiv2::Metadatum *)item) == &*i) {
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
491 i = exif->exifData().erase(i);
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
492 return 1;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
493 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
494 }
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
495 for (Exiv2::IptcData::iterator i = exif->iptcData().begin(); i != exif->iptcData().end(); ++i) {
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
496 if (((Exiv2::Metadatum *)item) == &*i) {
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
497 i = exif->iptcData().erase(i);
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
498 return 1;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
499 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
500 }
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
501 #if EXIV2_TEST_VERSION(0,16,0)
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
502 for (Exiv2::XmpData::iterator i = exif->xmpData().begin(); i != exif->xmpData().end(); ++i) {
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
503 if (((Exiv2::Metadatum *)item) == &*i) {
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
504 i = exif->xmpData().erase(i);
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
505 return 1;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
506 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
507 }
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
508 #endif
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
509 return 0;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
510 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
511 catch (Exiv2::AnyError& e) {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
512 return 0;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
513 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
514 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
515
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 186
diff changeset
516
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
517
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
518 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
519
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
520 /* This is a dirty hack to support raw file preview, bassed on
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
521 tiffparse.cpp from Exiv2 examples */
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
522
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
523 class RawFile {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
524 public:
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
525
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
526 RawFile(int fd);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
527 ~RawFile();
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
528
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
529 const Exiv2::Value *find(uint16_t tag, uint16_t group);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
530
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
531 unsigned long preview_offset();
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
532
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
533 private:
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
534 int type;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
535 Exiv2::TiffComponent::AutoPtr rootDir;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
536 Exiv2::byte *map_data;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
537 size_t map_len;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
538 unsigned long offset;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
539 };
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
540
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
541 using namespace Exiv2;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
542
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
543 RawFile::RawFile(int fd) : map_data(NULL), map_len(0), offset(0)
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
544 {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
545 struct stat st;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
546 if (fstat(fd, &st) == -1)
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
547 {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
548 throw Error(14);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
549 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
550 map_len = st.st_size;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
551 map_data = (Exiv2::byte *) mmap(0, map_len, PROT_READ, MAP_PRIVATE, fd, 0);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
552 if (map_data == MAP_FAILED)
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
553 {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
554 throw Error(14);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
555 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
556 type = Exiv2::ImageFactory::getType(map_data, map_len);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
557
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
558 #if EXIV2_TEST_VERSION(0,16,0)
201
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
559 TiffHeaderBase *tiffHeader = NULL;
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
560 #else
201
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
561 TiffHeade2 *tiffHeader = NULL;
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
562 #endif
201
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
563 Cr2Header *cr2Header = NULL;
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
564
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
565 switch (type) {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
566 case Exiv2::ImageType::tiff:
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
567 tiffHeader = new TiffHeade2();
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
568 break;
201
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
569 case Exiv2::ImageType::cr2:
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
570 cr2Header = new Cr2Header();
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
571 break;
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
572 #if EXIV2_TEST_VERSION(0,16,0)
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
573 case Exiv2::ImageType::orf:
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
574 tiffHeader = new OrfHeader();
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
575 break;
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
576 #endif
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
577 #if EXIV2_TEST_VERSION(0,13,0)
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
578 case Exiv2::ImageType::raf:
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
579 if (map_len < 84 + 4) throw Error(14);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
580 offset = getULong(map_data + 84, bigEndian);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
581 return;
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
582 #endif
191
19df9953a5d1 crw preview support with exiv2
nadvornik
parents: 188
diff changeset
583 case Exiv2::ImageType::crw:
19df9953a5d1 crw preview support with exiv2
nadvornik
parents: 188
diff changeset
584 {
19df9953a5d1 crw preview support with exiv2
nadvornik
parents: 188
diff changeset
585 // Parse the image, starting with a CIFF header component
19df9953a5d1 crw preview support with exiv2
nadvornik
parents: 188
diff changeset
586 Exiv2::CiffHeader::AutoPtr parseTree(new Exiv2::CiffHeader);
19df9953a5d1 crw preview support with exiv2
nadvornik
parents: 188
diff changeset
587 parseTree->read(map_data, map_len);
19df9953a5d1 crw preview support with exiv2
nadvornik
parents: 188
diff changeset
588 CiffComponent *entry = parseTree->findComponent(0x2007, 0);
19df9953a5d1 crw preview support with exiv2
nadvornik
parents: 188
diff changeset
589 if (entry) offset = entry->pData() - map_data;
19df9953a5d1 crw preview support with exiv2
nadvornik
parents: 188
diff changeset
590 return;
19df9953a5d1 crw preview support with exiv2
nadvornik
parents: 188
diff changeset
591 }
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
592
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
593 default:
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
594 throw Error(3, "RAW");
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
595 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
596
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
597 // process tiff-like formats
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
598
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
599 TiffCompFactoryFct createFct = TiffCreator::create;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
600
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
601 rootDir = createFct(Tag::root, Group::none);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
602 if (0 == rootDir.get()) {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
603 throw Error(1, "No root element defined in TIFF structure");
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
604 }
201
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
605
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
606 if (tiffHeader)
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
607 {
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
608 if (!tiffHeader->read(map_data, map_len)) throw Error(3, "TIFF");
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
609 #if EXIV2_TEST_VERSION(0,16,0)
201
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
610 rootDir->setStart(map_data + tiffHeader->offset());
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
611 #else
201
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
612 rootDir->setStart(map_data + tiffHeader->ifdOffset());
200
1a38eef1129a exiv2 version checks
nadvornik
parents: 194
diff changeset
613 #endif
201
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
614 }
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
615
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
616 if (cr2Header)
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
617 {
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
618 rootDir->setStart(map_data + cr2Header->offset());
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
619 }
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
620
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
621 TiffRwState::AutoPtr state(new TiffRwState(tiffHeader ? tiffHeader->byteOrder() : littleEndian, 0, createFct));
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
622
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
623 TiffReader reader(map_data,
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
624 map_len,
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
625 rootDir.get(),
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
626 state);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
627
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
628 rootDir->accept(reader);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
629
201
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
630 if (tiffHeader)
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
631 delete tiffHeader;
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
632 if (cr2Header)
0ca12db715b7 improved support for older exiv2 versions
nadvornik
parents: 200
diff changeset
633 delete cr2Header;
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
634 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
635
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
636 RawFile::~RawFile()
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
637 {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
638 if (map_data && munmap(map_data, map_len) == -1)
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
639 {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
640 printf("Failed to unmap file \n");
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
641 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
642 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
643
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
644 const Value * RawFile::find(uint16_t tag, uint16_t group)
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
645 {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
646 TiffFinder finder(tag, group);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
647 rootDir->accept(finder);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
648 TiffEntryBase* te = dynamic_cast<TiffEntryBase*>(finder.result());
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
649 if (te)
194
889cfa008789 raw related fixes
nadvornik
parents: 191
diff changeset
650 {
889cfa008789 raw related fixes
nadvornik
parents: 191
diff changeset
651 if (debug) printf("(tag: %04x %04x) ", tag, group);
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
652 return te->pValue();
194
889cfa008789 raw related fixes
nadvornik
parents: 191
diff changeset
653 }
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
654 else
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
655 return NULL;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
656 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
657
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
658 unsigned long RawFile::preview_offset()
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
659 {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
660 const Value *val;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
661 if (offset) return offset;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
662
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
663 if (type == Exiv2::ImageType::cr2)
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
664 {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
665 val = find(0x111, Group::ifd0);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
666 if (val) return val->toLong();
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
667
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
668 return 0;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
669 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
670
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
671 val = find(0x201, Group::sub0_0);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
672 if (val) return val->toLong();
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
673
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
674 val = find(0x201, Group::ifd0);
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
675 if (val) return val->toLong();
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
676
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
677 val = find(0x201, Group::ignr); // for PEF files, originally it was probably ifd2
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
678 if (val) return val->toLong();
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
679
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
680 val = find(0x111, Group::sub0_1); // dng
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
681 if (val) return val->toLong();
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
682
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
683 return 0;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
684 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
685
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
686
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
687 extern "C" gint format_raw_img_exif_offsets_fd(int fd, const gchar *path,
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
688 unsigned char *header_data, const guint header_len,
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
689 guint *image_offset, guint *exif_offset)
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
690 {
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
691 int success;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
692 unsigned long offset;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
693
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
694 /* given image pathname, first do simple (and fast) file extension test */
212
c7021159079d differentiate among normal image, raw image and metadata
nadvornik
parents: 201
diff changeset
695 if (!filter_file_class(path, FORMAT_CLASS_RAWIMAGE)) return 0;
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
696
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
697 try {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
698 RawFile rf(fd);
194
889cfa008789 raw related fixes
nadvornik
parents: 191
diff changeset
699 if (debug) printf("%s: offset ", path);
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
700 offset = rf.preview_offset();
194
889cfa008789 raw related fixes
nadvornik
parents: 191
diff changeset
701 if (debug) printf("%d\n", offset);
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
702 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
703 catch (Exiv2::AnyError& e) {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
704 std::cout << "Caught Exiv2 exception '" << e << "'\n";
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
705 return 0;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
706 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
707
194
889cfa008789 raw related fixes
nadvornik
parents: 191
diff changeset
708 if (image_offset && offset > 0)
186
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
709 {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
710 *image_offset = offset;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
711 if (lseek(fd, *image_offset, SEEK_SET) != *image_offset)
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
712 {
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
713 printf("Failed to seek to embedded image\n");
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
714
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
715 *image_offset = 0;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
716 if (*exif_offset) *exif_offset = 0;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
717 success = FALSE;
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
718 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
719 }
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
720
bd3fc1aa7fe9 a hack to read raw previews with exiv2 0.16, however it should be fixed
nadvornik
parents: 185
diff changeset
721 return offset > 0;
178
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
722 }
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
723
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
724
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
725 #endif
9dc8bc9b2bb9 first exiv2 support that does not crash immediately
nadvornik
parents:
diff changeset
726 /* HAVE_EXIV2 */