comparison src/exiv2.cc @ 1048:95c418661be8

updated preview loader to work with current svn version of libexiv2
author nadvornik
date Sat, 27 Sep 2008 18:48:32 +0000
parents 448d174454e1
children 338c21c87ff5
comparison
equal deleted inserted replaced
1047:81ec7d977d5f 1048:95c418661be8
607 #if EXIV2_TEST_VERSION(0,17,90) 607 #if EXIV2_TEST_VERSION(0,17,90)
608 608
609 guchar *exif_get_preview(ExifData *exif, guint *data_len) 609 guchar *exif_get_preview(ExifData *exif, guint *data_len)
610 { 610 {
611 if (!exif) return NULL; 611 if (!exif) return NULL;
612 try { 612
613 613 const char* path = exif->image->io().path().c_str();
614 Exiv2::PreviewImageList list(*exif->image); 614 /* given image pathname, first do simple (and fast) file extension test */
615 list.read(); 615 if (!filter_file_class(path, FORMAT_CLASS_RAWIMAGE)) return NULL;
616 616
617 Exiv2::PreviewImageList::iterator pos = list.begin(); 617 try {
618 if (pos != list.end()) 618
619 { 619 Exiv2::PreviewImageLoader loader(*exif->image);
620 Exiv2::DataBuf buf = pos->copy(); 620
621 Exiv2::PreviewPropertiesList list = loader.getPreviewPropertiesList();
622
623 if (!list.empty())
624 {
625 Exiv2::PreviewPropertiesList::iterator pos = --list.end();
626
627 Exiv2::PreviewImage image = loader.getPreviewImage(*pos);
628
629 Exiv2::DataBuf &buf = image.data();
621 std::pair<Exiv2::byte*, long> p = buf.release(); 630 std::pair<Exiv2::byte*, long> p = buf.release();
622 631
623 *data_len = p.second; 632 *data_len = p.second;
624 return p.first; 633 return p.first;
625 } 634 }
626 return NULL; 635 return NULL;
627 } 636 }
628 catch (Exiv2::AnyError& e) { 637 catch (Exiv2::AnyError& e) {
629 std::cout << "Caught Exiv2 exception '" << e << "'\n"; 638 std::cout << "Caught Exiv2 exception '" << e << "'\n";
678 687
679 if (!exif) return NULL; 688 if (!exif) return NULL;
680 const char* path = exif->image->io().path().c_str(); 689 const char* path = exif->image->io().path().c_str();
681 690
682 /* given image pathname, first do simple (and fast) file extension test */ 691 /* given image pathname, first do simple (and fast) file extension test */
683 if (!filter_file_class(path, FORMAT_CLASS_RAWIMAGE)) return 0; 692 if (!filter_file_class(path, FORMAT_CLASS_RAWIMAGE)) return NULL;
684 693
685 try { 694 try {
686 struct stat st; 695 struct stat st;
687 guchar *map_data; 696 guchar *map_data;
688 size_t map_len; 697 size_t map_len;
694 DEBUG_1("%s: offset %lu", path, offset); 703 DEBUG_1("%s: offset %lu", path, offset);
695 704
696 fd = open(path, O_RDONLY); 705 fd = open(path, O_RDONLY);
697 if (fd == -1) 706 if (fd == -1)
698 { 707 {
699 return 0; 708 return NULL;
700 } 709 }
701 710
702 if (fstat(fd, &st) == -1) 711 if (fstat(fd, &st) == -1)
703 { 712 {
704 close(fd); 713 close(fd);
705 return 0; 714 return NULL;
706 } 715 }
707 map_len = st.st_size; 716 map_len = st.st_size;
708 map_data = (guchar *) mmap(0, map_len, PROT_READ, MAP_PRIVATE, fd, 0); 717 map_data = (guchar *) mmap(0, map_len, PROT_READ, MAP_PRIVATE, fd, 0);
709 close(fd); 718 close(fd);
710 if (map_data == MAP_FAILED) 719 if (map_data == MAP_FAILED)
711 { 720 {
712 return 0; 721 return NULL;
713 } 722 }
714 *data_len = map_len - offset; 723 *data_len = map_len - offset;
715 ud = g_new(UnmapData, 1); 724 ud = g_new(UnmapData, 1);
716 ud->ptr = map_data + offset; 725 ud->ptr = map_data + offset;
717 ud->map_data = map_data; 726 ud->map_data = map_data;