diff --git a/samples/taglist.cpp b/samples/taglist.cpp index ad2e5392..7ff6214b 100644 --- a/samples/taglist.cpp +++ b/samples/taglist.cpp @@ -10,60 +10,126 @@ #include -#include #include +#include using namespace Exiv2; int main(int argc, char* argv[]) -try { - int rc = 0; +{ + try { + int rc = 0; - switch (argc) { - case 2: - { - std::string item(argv[1]); + switch (argc) { + case 2: { + std::string item(argv[1]); - if (item == "Exif") { - ExifTags::taglist(std::cout); - break; - } + if (item == "Groups") { + /* + https://cgit.kde.org/digikam.git/tree/core/libs/dmetadata/metaengine_exif.cpp#n1077 + const Exiv2::GroupInfo* gi = Exiv2::ExifTags::groupList(); - if (item == "Iptc") { - IptcDataSets::dataSetList(std::cout); - break; - } + while (gi->tagList_ != 0) + { + // NOTE: See BUG #375809 : MPF tags = exception Exiv2 0.26 - if (ExifTags::isExifGroup(item) || ExifTags::isMakerGroup(item)) { - ExifTags::taglist(std::cout, item); - break; - } + if (QLatin1String(gi->ifdName_) != QLatin1String("Makernote")) + { + Exiv2::TagListFct tl = gi->tagList_; + const Exiv2::TagInfo* ti = tl(); - try { - XmpProperties::printProperties(std::cout, item); - } - catch(const AnyError&) { - rc = 2; + while (ti->tag_ != 0xFFFF) + { + tags << ti; + ++ti; + } + } + + ++gi; + } + */ + const GroupInfo* groupList = ExifTags::groupList(); + int count = 0; + if (groupList) { + while (groupList->tagList_ && count < 10000) { + count++; + std::cout << groupList->groupName_ << std::endl; + groupList++; + } + } + std::cout << "Groups = " << count << std::endl; + break; + } + + if (item == "Exif") { + ExifTags::taglist(std::cout); + break; + } + + if (item == "Iptc") { + IptcDataSets::dataSetList(std::cout); + break; + } + + if (ExifTags::isExifGroup(item) || ExifTags::isMakerGroup(item)) { + ExifTags::taglist(std::cout, item); + break; + } + + try { + XmpProperties::printProperties(std::cout, item); + } catch (const AnyError&) { + rc = 2; + } + + break; + } + case 1: + ExifTags::taglist(std::cout); + break; + + case 3: { + rc = 1; // assume unhappy ending! + std::string item(argv[1]); + std::string name(argv[2]); + + if (item == "--group") { + const GroupInfo* groupList = ExifTags::groupList(); + if (groupList) { + while (groupList->tagList_) { + int count = 0; + if (name == groupList->groupName_) { + const Exiv2::TagInfo* tagInfo = groupList->tagList_(); + while (tagInfo->tag_ != 0xFFFF) { + std::cout << tagInfo->name_ << std::endl; + tagInfo++; + count++; + } + rc = 0; // result is good + std::cout << "Tags = " << count << std::endl; + } + groupList++; + } + } + } + } break; + + default: + rc = 1; + break; } - break; - } - case 1: - ExifTags::taglist(std::cout); - break; - default: - rc = 1; - break; - } - if (rc) { - std::cout << "Usage: " << argv[0] - << " [Exif|Canon|CanonCs|CanonSi|CanonCf|Fujifilm|Minolta|Nikon1|Nikon2|Nikon3|Olympus|Panasonic|Pentax|Sigma|Sony|Iptc" - << "|dc|xmp|xmpRights|xmpMM|xmpBJ|xmpTPg|xmpDM|pdf|photoshop|crs|tiff|exif|aux|iptc]\n" - << "Print Exif tags, MakerNote tags, or Iptc datasets\n"; + if (rc) { + std::cout << "Usage: " << argv[0] + << " [--group " + "name|Groups|Exif|Canon|CanonCs|CanonSi|CanonCf|Fujifilm|Minolta|Nikon1|Nikon2|Nikon3|Olympus|" + "Panasonic|Pentax|Sigma|Sony|Iptc" + << "|dc|xmp|xmpRights|xmpMM|xmpBJ|xmpTPg|xmpDM|pdf|photoshop|crs|tiff|exif|aux|iptc]\n" + << "Print Exif tags, MakerNote tags, or Iptc datasets\n"; + } + return rc; + } catch (AnyError& e) { + std::cout << "Caught Exiv2 exception '" << e << "'\n"; + return 1; } - return rc; -} -catch (AnyError& e) { - std::cout << "Caught Exiv2 exception '" << e << "'\n"; - return 1; }