comparison src/exiv2.cc @ 200:1a38eef1129a

exiv2 version checks
author nadvornik
date Mon, 24 Mar 2008 14:03:46 +0000
parents 889cfa008789
children 0ca12db715b7
comparison
equal deleted inserted replaced
199:80d0701de0f9 200:1a38eef1129a
6 #ifdef HAVE_EXIV2 6 #ifdef HAVE_EXIV2
7 7
8 #include <exiv2/image.hpp> 8 #include <exiv2/image.hpp>
9 #include <exiv2/exif.hpp> 9 #include <exiv2/exif.hpp>
10 #include <iostream> 10 #include <iostream>
11
12 // EXIV2_TEST_VERSION is defined in Exiv2 0.15 and newer.
13 #ifndef EXIV2_TEST_VERSION
14 # define EXIV2_TEST_VERSION(major,minor,patch) \
15 ( EXIV2_VERSION >= EXIV2_MAKE_VERSION(major,minor,patch) )
16 #endif
17
11 18
12 #include <sys/types.h> 19 #include <sys/types.h>
13 #include <sys/stat.h> 20 #include <sys/stat.h>
14 #include <unistd.h> 21 #include <unistd.h>
15 #include <fcntl.h> 22 #include <fcntl.h>
19 #include <exiv2/tiffcomposite.hpp> 26 #include <exiv2/tiffcomposite.hpp>
20 #include <exiv2/tiffvisitor.hpp> 27 #include <exiv2/tiffvisitor.hpp>
21 #include <exiv2/tiffimage.hpp> 28 #include <exiv2/tiffimage.hpp>
22 #include <exiv2/cr2image.hpp> 29 #include <exiv2/cr2image.hpp>
23 #include <exiv2/crwimage.hpp> 30 #include <exiv2/crwimage.hpp>
31 #if EXIV2_TEST_VERSION(0,16,0)
24 #include <exiv2/orfimage.hpp> 32 #include <exiv2/orfimage.hpp>
33 #endif
34 #if EXIV2_TEST_VERSION(0,13,0)
25 #include <exiv2/rafimage.hpp> 35 #include <exiv2/rafimage.hpp>
36 #endif
26 #include <exiv2/futils.hpp> 37 #include <exiv2/futils.hpp>
27 38
28 39
29 40
30 extern "C" { 41 extern "C" {
38 { 49 {
39 Exiv2::Image::AutoPtr image; 50 Exiv2::Image::AutoPtr image;
40 Exiv2::Image::AutoPtr sidecar; 51 Exiv2::Image::AutoPtr sidecar;
41 Exiv2::ExifData::const_iterator exifIter; /* for exif_get_next_item */ 52 Exiv2::ExifData::const_iterator exifIter; /* for exif_get_next_item */
42 Exiv2::IptcData::const_iterator iptcIter; /* for exif_get_next_item */ 53 Exiv2::IptcData::const_iterator iptcIter; /* for exif_get_next_item */
54 #if EXIV2_TEST_VERSION(0,16,0)
43 Exiv2::XmpData::const_iterator xmpIter; /* for exif_get_next_item */ 55 Exiv2::XmpData::const_iterator xmpIter; /* for exif_get_next_item */
56 #endif
44 bool have_sidecar; 57 bool have_sidecar;
45 58
46 59
47 _ExifData(gchar *path, gchar *sidecar_path, gint parse_color_profile) 60 _ExifData(gchar *path, gchar *sidecar_path, gint parse_color_profile)
48 { 61 {
49 have_sidecar = false; 62 have_sidecar = false;
50 image = Exiv2::ImageFactory::open(path); 63 image = Exiv2::ImageFactory::open(path);
51 // g_assert (image.get() != 0); 64 // g_assert (image.get() != 0);
52 image->readMetadata(); 65 image->readMetadata();
53 66
67 #if EXIV2_TEST_VERSION(0,16,0)
54 printf("xmp count %d\n", image->xmpData().count()); 68 printf("xmp count %d\n", image->xmpData().count());
55 if (sidecar_path && image->xmpData().empty()) 69 if (sidecar_path && image->xmpData().empty())
56 { 70 {
57 sidecar = Exiv2::ImageFactory::open(sidecar_path); 71 sidecar = Exiv2::ImageFactory::open(sidecar_path);
58 sidecar->readMetadata(); 72 sidecar->readMetadata();
59 have_sidecar = sidecar->good(); 73 have_sidecar = sidecar->good();
60 printf("sidecar xmp count %d\n", sidecar->xmpData().count()); 74 printf("sidecar xmp count %d\n", sidecar->xmpData().count());
61 } 75 }
62 76
77 #endif
63 } 78 }
64 79
65 void writeMetadata() 80 void writeMetadata()
66 { 81 {
67 if (have_sidecar) sidecar->writeMetadata(); 82 if (have_sidecar) sidecar->writeMetadata();
76 Exiv2::IptcData &iptcData () 91 Exiv2::IptcData &iptcData ()
77 { 92 {
78 return image->iptcData(); 93 return image->iptcData();
79 } 94 }
80 95
96 #if EXIV2_TEST_VERSION(0,16,0)
81 Exiv2::XmpData &xmpData () 97 Exiv2::XmpData &xmpData ()
82 { 98 {
83 return have_sidecar ? sidecar->xmpData() : image->xmpData(); 99 return have_sidecar ? sidecar->xmpData() : image->xmpData();
84 } 100 }
85 101 #endif
86 102
87 }; 103 };
88 104
89 extern "C" { 105 extern "C" {
90 106
137 Exiv2::IptcData::iterator pos = exif->iptcData().findKey(ekey); 153 Exiv2::IptcData::iterator pos = exif->iptcData().findKey(ekey);
138 if (pos == exif->iptcData().end()) return NULL; 154 if (pos == exif->iptcData().end()) return NULL;
139 item = &*pos; 155 item = &*pos;
140 } 156 }
141 catch (Exiv2::AnyError& e) { 157 catch (Exiv2::AnyError& e) {
158 #if EXIV2_TEST_VERSION(0,16,0)
142 Exiv2::XmpKey ekey(key); 159 Exiv2::XmpKey ekey(key);
143 Exiv2::XmpData::iterator pos = exif->xmpData().findKey(ekey); 160 Exiv2::XmpData::iterator pos = exif->xmpData().findKey(ekey);
144 if (pos == exif->xmpData().end()) return NULL; 161 if (pos == exif->xmpData().end()) return NULL;
145 item = &*pos; 162 item = &*pos;
163 #endif
146 } 164 }
147 } 165 }
148 return (ExifItem *)item; 166 return (ExifItem *)item;
149 } 167 }
150 catch (Exiv2::AnyError& e) { 168 catch (Exiv2::AnyError& e) {
171 Exiv2::IptcData::iterator pos = exif->iptcData().end(); 189 Exiv2::IptcData::iterator pos = exif->iptcData().end();
172 pos--; 190 pos--;
173 item = &*pos; 191 item = &*pos;
174 } 192 }
175 catch (Exiv2::AnyError& e) { 193 catch (Exiv2::AnyError& e) {
194 #if EXIV2_TEST_VERSION(0,16,0)
176 Exiv2::XmpKey ekey(key); 195 Exiv2::XmpKey ekey(key);
177 exif->xmpData().add(ekey, NULL); 196 exif->xmpData().add(ekey, NULL);
178 Exiv2::XmpData::iterator pos = exif->xmpData().end(); 197 Exiv2::XmpData::iterator pos = exif->xmpData().end();
179 pos--; 198 pos--;
180 item = &*pos; 199 item = &*pos;
200 #endif
181 } 201 }
182 } 202 }
183 return (ExifItem *)item; 203 return (ExifItem *)item;
184 } 204 }
185 catch (Exiv2::AnyError& e) { 205 catch (Exiv2::AnyError& e) {
192 ExifItem *exif_get_first_item(ExifData *exif) 212 ExifItem *exif_get_first_item(ExifData *exif)
193 { 213 {
194 try { 214 try {
195 exif->exifIter = exif->exifData().begin(); 215 exif->exifIter = exif->exifData().begin();
196 exif->iptcIter = exif->iptcData().begin(); 216 exif->iptcIter = exif->iptcData().begin();
217 #if EXIV2_TEST_VERSION(0,16,0)
197 exif->xmpIter = exif->xmpData().begin(); 218 exif->xmpIter = exif->xmpData().begin();
219 #endif
198 if (exif->exifIter != exif->exifData().end()) 220 if (exif->exifIter != exif->exifData().end())
199 { 221 {
200 const Exiv2::Metadatum *item = &*exif->exifIter; 222 const Exiv2::Metadatum *item = &*exif->exifIter;
201 exif->exifIter++; 223 exif->exifIter++;
202 return (ExifItem *)item; 224 return (ExifItem *)item;
205 { 227 {
206 const Exiv2::Metadatum *item = &*exif->iptcIter; 228 const Exiv2::Metadatum *item = &*exif->iptcIter;
207 exif->iptcIter++; 229 exif->iptcIter++;
208 return (ExifItem *)item; 230 return (ExifItem *)item;
209 } 231 }
232 #if EXIV2_TEST_VERSION(0,16,0)
210 if (exif->xmpIter != exif->xmpData().end()) 233 if (exif->xmpIter != exif->xmpData().end())
211 { 234 {
212 const Exiv2::Metadatum *item = &*exif->xmpIter; 235 const Exiv2::Metadatum *item = &*exif->xmpIter;
213 exif->xmpIter++; 236 exif->xmpIter++;
214 return (ExifItem *)item; 237 return (ExifItem *)item;
215 } 238 }
239 #endif
216 return NULL; 240 return NULL;
217 241
218 } 242 }
219 catch (Exiv2::AnyError& e) { 243 catch (Exiv2::AnyError& e) {
220 std::cout << "Caught Exiv2 exception '" << e << "'\n"; 244 std::cout << "Caught Exiv2 exception '" << e << "'\n";
235 { 259 {
236 const Exiv2::Metadatum *item = &*exif->iptcIter; 260 const Exiv2::Metadatum *item = &*exif->iptcIter;
237 exif->iptcIter++; 261 exif->iptcIter++;
238 return (ExifItem *)item; 262 return (ExifItem *)item;
239 } 263 }
264 #if EXIV2_TEST_VERSION(0,16,0)
240 if (exif->xmpIter != exif->xmpData().end()) 265 if (exif->xmpIter != exif->xmpData().end())
241 { 266 {
242 const Exiv2::Metadatum *item = &*exif->xmpIter; 267 const Exiv2::Metadatum *item = &*exif->xmpIter;
243 exif->xmpIter++; 268 exif->xmpIter++;
244 return (ExifItem *)item; 269 return (ExifItem *)item;
245 } 270 }
271 #endif
246 return NULL; 272 return NULL;
247 } 273 }
248 catch (Exiv2::AnyError& e) { 274 catch (Exiv2::AnyError& e) {
249 std::cout << "Caught Exiv2 exception '" << e << "'\n"; 275 std::cout << "Caught Exiv2 exception '" << e << "'\n";
250 return NULL; 276 return NULL;
380 gchar *exif_item_get_string(ExifItem *item, int idx) 406 gchar *exif_item_get_string(ExifItem *item, int idx)
381 { 407 {
382 try { 408 try {
383 if (!item) return NULL; 409 if (!item) return NULL;
384 Exiv2::Metadatum *em = (Exiv2::Metadatum *)item; 410 Exiv2::Metadatum *em = (Exiv2::Metadatum *)item;
411 #if EXIV2_TEST_VERSION(0,16,0)
385 std::string str = em->toString(idx); 412 std::string str = em->toString(idx);
413 #else
414 std::string str = em->toString(); // FIXME
415 #endif
386 if (idx == 0 && str == "") str = em->toString(); 416 if (idx == 0 && str == "") str = em->toString();
387 if (str.length() > 5 && str.substr(0, 5) == "lang=") 417 if (str.length() > 5 && str.substr(0, 5) == "lang=")
388 { 418 {
389 std::string::size_type pos = str.find_first_of(' '); 419 std::string::size_type pos = str.find_first_of(' ');
390 if (pos != std::string::npos) str = str.substr(pos+1); 420 if (pos != std::string::npos) str = str.substr(pos+1);
465 if (((Exiv2::Metadatum *)item) == &*i) { 495 if (((Exiv2::Metadatum *)item) == &*i) {
466 i = exif->iptcData().erase(i); 496 i = exif->iptcData().erase(i);
467 return 1; 497 return 1;
468 } 498 }
469 } 499 }
500 #if EXIV2_TEST_VERSION(0,16,0)
470 for (Exiv2::XmpData::iterator i = exif->xmpData().begin(); i != exif->xmpData().end(); ++i) { 501 for (Exiv2::XmpData::iterator i = exif->xmpData().begin(); i != exif->xmpData().end(); ++i) {
471 if (((Exiv2::Metadatum *)item) == &*i) { 502 if (((Exiv2::Metadatum *)item) == &*i) {
472 i = exif->xmpData().erase(i); 503 i = exif->xmpData().erase(i);
473 return 1; 504 return 1;
474 } 505 }
475 } 506 }
476 507 #endif
477 return 0; 508 return 0;
478 } 509 }
479 catch (Exiv2::AnyError& e) { 510 catch (Exiv2::AnyError& e) {
480 return 0; 511 return 0;
481 } 512 }
521 { 552 {
522 throw Error(14); 553 throw Error(14);
523 } 554 }
524 type = Exiv2::ImageFactory::getType(map_data, map_len); 555 type = Exiv2::ImageFactory::getType(map_data, map_len);
525 556
557 #if EXIV2_TEST_VERSION(0,16,0)
526 TiffHeaderBase *tiffHeader; 558 TiffHeaderBase *tiffHeader;
559 #else
560 TiffHeade2 *tiffHeader;
561 #endif
527 switch (type) { 562 switch (type) {
528 case Exiv2::ImageType::tiff: 563 case Exiv2::ImageType::tiff:
529 tiffHeader = new TiffHeade2(); 564 tiffHeader = new TiffHeade2();
530 break; 565 break;
566 #if EXIV2_TEST_VERSION(0,16,0)
567
531 case Exiv2::ImageType::cr2: 568 case Exiv2::ImageType::cr2:
532 tiffHeader = new Cr2Header(); 569 tiffHeader = new Cr2Header();
533 break; 570 break;
534 case Exiv2::ImageType::orf: 571 case Exiv2::ImageType::orf:
535 tiffHeader = new OrfHeader(); 572 tiffHeader = new OrfHeader();
536 break; 573 break;
574 #endif
575 #if EXIV2_TEST_VERSION(0,13,0)
537 case Exiv2::ImageType::raf: 576 case Exiv2::ImageType::raf:
538 if (map_len < 84 + 4) throw Error(14); 577 if (map_len < 84 + 4) throw Error(14);
539 offset = getULong(map_data + 84, bigEndian); 578 offset = getULong(map_data + 84, bigEndian);
540 return; 579 return;
580 #endif
541 case Exiv2::ImageType::crw: 581 case Exiv2::ImageType::crw:
542 { 582 {
543 // Parse the image, starting with a CIFF header component 583 // Parse the image, starting with a CIFF header component
544 Exiv2::CiffHeader::AutoPtr parseTree(new Exiv2::CiffHeader); 584 Exiv2::CiffHeader::AutoPtr parseTree(new Exiv2::CiffHeader);
545 parseTree->read(map_data, map_len); 585 parseTree->read(map_data, map_len);
559 599
560 rootDir = createFct(Tag::root, Group::none); 600 rootDir = createFct(Tag::root, Group::none);
561 if (0 == rootDir.get()) { 601 if (0 == rootDir.get()) {
562 throw Error(1, "No root element defined in TIFF structure"); 602 throw Error(1, "No root element defined in TIFF structure");
563 } 603 }
604 #if EXIV2_TEST_VERSION(0,16,0)
564 rootDir->setStart(map_data + tiffHeader->offset()); 605 rootDir->setStart(map_data + tiffHeader->offset());
565 606 #else
607 rootDir->setStart(map_data + tiffHeader->ifdOffset());
608 #endif
566 TiffRwState::AutoPtr state( 609 TiffRwState::AutoPtr state(
567 new TiffRwState(tiffHeader->byteOrder(), 0, createFct)); 610 new TiffRwState(tiffHeader->byteOrder(), 0, createFct));
568 611
569 TiffReader reader(map_data, 612 TiffReader reader(map_data,
570 map_len, 613 map_len,