~ubuntu-branches/ubuntu/maverick/kdegraphics/maverick-proposed

« back to all changes in this revision

Viewing changes to libs/libkexiv2/libkexiv2/kexiv2xmp.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Thomas
  • Date: 2009-12-02 14:03:43 UTC
  • mfrom: (1.1.35 upstream)
  • Revision ID: james.westby@ubuntu.com-20091202140343-2732gbkj69g89arq
Tags: 4:4.3.80-0ubuntu1
* New upstream beta release:
  - Add build-depend on shared-desktop-ontologies for nepomuk integration
  - Bump .so versions for libkexiv, libkdcraw and libkipi
  - Update various .install files

Show diffs side-by-side

added added

removed removed

Lines of Context:
61
61
{
62
62
#ifdef _XMP_SUPPORT_
63
63
 
64
 
    return !d->xmpMetadata.empty();
 
64
    return !d->xmpMetadata().empty();
65
65
 
66
66
#else
67
67
 
76
76
 
77
77
    try
78
78
    {
79
 
        d->xmpMetadata.clear();
 
79
        d->xmpMetadata().clear();
80
80
        return true;
81
81
    }
82
82
    catch( Exiv2::Error &e )
95
95
 
96
96
    try
97
97
    {
98
 
        if (!d->xmpMetadata.empty())
 
98
        if (!d->xmpMetadata().empty())
99
99
        {
100
100
 
101
101
            std::string xmpPacket;
102
 
            Exiv2::XmpParser::encode(xmpPacket, d->xmpMetadata);
 
102
            Exiv2::XmpParser::encode(xmpPacket, d->xmpMetadata());
103
103
            QByteArray data(xmpPacket.data(), xmpPacket.size());
104
104
            return data;
105
105
        }
128
128
 
129
129
            std::string xmpPacket;
130
130
            xmpPacket.assign(data.data(), data.size());
131
 
            if (Exiv2::XmpParser::decode(d->xmpMetadata, xmpPacket) != 0)
 
131
            if (Exiv2::XmpParser::decode(d->xmpMetadata(), xmpPacket) != 0)
132
132
                return false;
133
133
            else
134
134
                return true;
151
151
{
152
152
#ifdef _XMP_SUPPORT_
153
153
 
154
 
    if (d->xmpMetadata.empty())
 
154
    if (d->xmpMetadata().empty())
155
155
       return MetaDataMap();
156
156
 
157
157
    try
158
158
    {
159
 
        Exiv2::XmpData xmpData = d->xmpMetadata;
 
159
        Exiv2::XmpData xmpData = d->xmpMetadata();
160
160
        xmpData.sortByKey();
161
161
 
162
162
        QString     ifDItemName;
278
278
 
279
279
    try
280
280
    {
281
 
        Exiv2::XmpData xmpData(d->xmpMetadata);
 
281
        Exiv2::XmpData xmpData(d->xmpMetadata());
282
282
        Exiv2::XmpKey key(xmpTagName);
283
283
        Exiv2::XmpData::iterator it = xmpData.findKey(key);
284
284
        if (it != xmpData.end())
317
317
        Exiv2::Value::AutoPtr xmpTxtVal = Exiv2::Value::create(Exiv2::xmpText);
318
318
        xmpTxtVal->read(txt);
319
319
 
320
 
        d->xmpMetadata.add(Exiv2::XmpKey(xmpTagName), xmpTxtVal.get());
 
320
        d->xmpMetadata().add(Exiv2::XmpKey(xmpTagName), xmpTxtVal.get());
321
321
        return true;
322
322
    }
323
323
    catch( Exiv2::Error &e )
336
336
 
337
337
    try
338
338
    {
339
 
        Exiv2::XmpData xmpData = d->xmpMetadata;
 
339
        Exiv2::XmpData xmpData = d->xmpMetadata();
340
340
 
341
341
        for (Exiv2::XmpData::iterator it = xmpData.begin(); it != xmpData.end(); ++it)
342
342
        {
388
388
        {
389
389
            Exiv2::Value::AutoPtr xmpTxtVal = Exiv2::Value::create(Exiv2::langAlt);
390
390
 
391
 
            for (AltLangMap::const_iterator it = values.begin(); it != values.end(); ++it)
 
391
            for (AltLangMap::const_iterator it = values.constBegin(); it != values.constEnd(); ++it)
392
392
            {
393
393
                QString lang = it.key();
394
394
                QString text = it.value();
398
398
            }
399
399
 
400
400
            // ...and add the new one instead.
401
 
            d->xmpMetadata.add(Exiv2::XmpKey(xmpTagName), xmpTxtVal.get());
 
401
            d->xmpMetadata().add(Exiv2::XmpKey(xmpTagName), xmpTxtVal.get());
402
402
        }
403
403
        return true;
404
404
    }
418
418
 
419
419
    try
420
420
    {
421
 
        Exiv2::XmpData xmpData(d->xmpMetadata);
 
421
        Exiv2::XmpData xmpData(d->xmpMetadata());
422
422
        Exiv2::XmpKey key(xmpTagName);
423
423
        for (Exiv2::XmpData::iterator it = xmpData.begin(); it != xmpData.end(); ++it)
424
424
        {
491
491
 
492
492
        xmpTxtVal->read(txt);
493
493
        removeXmpTag(xmpTagName);
494
 
        d->xmpMetadata.add(Exiv2::XmpKey(xmpTagName), xmpTxtVal.get());
 
494
        d->xmpMetadata().add(Exiv2::XmpKey(xmpTagName), xmpTxtVal.get());
495
495
        return true;
496
496
    }
497
497
    catch( Exiv2::Error &e )
510
510
 
511
511
    try
512
512
    {
513
 
        Exiv2::XmpData xmpData(d->xmpMetadata);
 
513
        Exiv2::XmpData xmpData(d->xmpMetadata());
514
514
        Exiv2::XmpKey key(xmpTagName);
515
515
        Exiv2::XmpData::iterator it = xmpData.findKey(key);
516
516
        if (it != xmpData.end())
571
571
                const std::string &txt((*it).toUtf8().constData());
572
572
                xmpTxtSeq->read(txt);
573
573
            }
574
 
            d->xmpMetadata[xmpTagName].setValue(xmpTxtSeq.get());
 
574
            d->xmpMetadata()[xmpTagName].setValue(xmpTxtSeq.get());
575
575
            return true;
576
576
        }
577
577
    }
591
591
 
592
592
    try
593
593
    {
594
 
        Exiv2::XmpData xmpData(d->xmpMetadata);
 
594
        Exiv2::XmpData xmpData(d->xmpMetadata());
595
595
        Exiv2::XmpKey key(xmpTagName);
596
596
        Exiv2::XmpData::iterator it = xmpData.findKey(key);
597
597
        if (it != xmpData.end())
651
651
                const std::string &txt((*it).toUtf8().constData());
652
652
                xmpTxtBag->read(txt);
653
653
            }
654
 
            d->xmpMetadata[xmpTagName].setValue(xmpTxtBag.get());
 
654
            d->xmpMetadata()[xmpTagName].setValue(xmpTxtBag.get());
655
655
            return true;
656
656
        }
657
657
    }
665
665
    return false;
666
666
}
667
667
 
 
668
bool KExiv2::addToXmpTagStringBag(const char *xmpTagName, const QStringList& entriesToAdd,
 
669
                                     bool setProgramName) const
 
670
{
 
671
//#ifdef _XMP_SUPPORT_
 
672
 
 
673
    if (!setProgramId(setProgramName))
 
674
        return false;
 
675
 
 
676
    QStringList oldEntries = getXmpTagStringBag(xmpTagName, false);
 
677
    QStringList newEntries = entriesToAdd;
 
678
 
 
679
    // Create a list of keywords including old one which already exists.
 
680
    for (QStringList::const_iterator it = oldEntries.constBegin(); it != oldEntries.constEnd(); ++it )
 
681
    {
 
682
        if (!newEntries.contains(*it))
 
683
            newEntries.append(*it);
 
684
    }
 
685
 
 
686
    if (setXmpTagStringBag(xmpTagName, newEntries, false))
 
687
        return true;
 
688
 
 
689
//#endif // _XMP_SUPPORT_
 
690
 
 
691
    return false;
 
692
}
 
693
 
 
694
bool KExiv2::removeFromXmpTagStringBag(const char *xmpTagName, const QStringList& entriesToRemove,
 
695
                                          bool setProgramName) const
 
696
{
 
697
//#ifdef _XMP_SUPPORT_
 
698
 
 
699
    if (!setProgramId(setProgramName))
 
700
        return false;
 
701
 
 
702
    QStringList currentEntries = getXmpTagStringBag(xmpTagName, false);
 
703
    QStringList newEntries;
 
704
 
 
705
    // Create a list of current keywords except those that shall be removed
 
706
    for (QStringList::const_iterator it = currentEntries.constBegin(); it != currentEntries.constEnd(); ++it )
 
707
    {
 
708
        if (!entriesToRemove.contains(*it))
 
709
            newEntries.append(*it);
 
710
    }
 
711
 
 
712
    if (setXmpTagStringBag(xmpTagName, newEntries, false))
 
713
        return true;
 
714
 
 
715
//#endif // _XMP_SUPPORT_
 
716
 
 
717
    return false;
 
718
}
 
719
 
668
720
QVariant KExiv2::getXmpTagVariant(const char *xmpTagName, bool rationalAsListOfInts, bool stringEscapeCR) const
669
721
{
670
722
#ifdef _XMP_SUPPORT_
671
723
    try
672
724
    {
673
 
        Exiv2::XmpData xmpData(d->xmpMetadata);
 
725
        Exiv2::XmpData xmpData(d->xmpMetadata());
674
726
        Exiv2::XmpKey key(xmpTagName);
675
727
        Exiv2::XmpData::iterator it = xmpData.findKey(key);
676
728
        if (it != xmpData.end())
771
823
    return QVariant();
772
824
}
773
825
 
774
 
bool KExiv2::registerXmpNameSpace(const QString& uri, const QString& prefix) const
 
826
bool KExiv2::registerXmpNameSpace(const QString& uri, const QString& prefix)
775
827
{
776
828
#ifdef _XMP_SUPPORT_
777
829
 
784
836
    }
785
837
    catch( Exiv2::Error &e )
786
838
    {
787
 
        d->printExiv2ExceptionError("Cannot register a new Xmp namespace using Exiv2 ", e);
 
839
        KExiv2Priv::printExiv2ExceptionError("Cannot register a new Xmp namespace using Exiv2 ", e);
 
840
    }
 
841
 
 
842
#endif // _XMP_SUPPORT_
 
843
 
 
844
    return false;
 
845
}
 
846
 
 
847
bool KExiv2::unregisterXmpNameSpace(const QString& uri)
 
848
{
 
849
#ifdef _XMP_SUPPORT_
 
850
 
 
851
    try
 
852
    {
 
853
        QString ns = uri;
 
854
        if (!uri.endsWith("/")) ns.append("/");
 
855
        Exiv2::XmpProperties::unregisterNs(ns.toAscii().constData());
 
856
        return true;
 
857
    }
 
858
    catch( Exiv2::Error &e )
 
859
    {
 
860
        KExiv2Priv::printExiv2ExceptionError("Cannot unregister a new Xmp namespace using Exiv2 ", e);
788
861
    }
789
862
 
790
863
#endif // _XMP_SUPPORT_
802
875
    try
803
876
    {
804
877
        Exiv2::XmpKey xmpKey(xmpTagName);
805
 
        Exiv2::XmpData::iterator it = d->xmpMetadata.findKey(xmpKey);
806
 
        if (it != d->xmpMetadata.end())
 
878
        Exiv2::XmpData::iterator it = d->xmpMetadata().findKey(xmpKey);
 
879
        if (it != d->xmpMetadata().end())
807
880
        {
808
 
            d->xmpMetadata.erase(it);
 
881
            d->xmpMetadata().erase(it);
809
882
            return true;
810
883
        }
811
884
    }
826
899
 
827
900
bool KExiv2::setXmpKeywords(const QStringList& newKeywords, bool setProgramName) const
828
901
{
829
 
#ifdef _XMP_SUPPORT_
830
 
 
831
 
    if (!setProgramId(setProgramName))
832
 
        return false;
833
 
 
834
 
    QStringList oldkeys = getXmpKeywords();
835
 
    QStringList newkeys = newKeywords;
836
 
 
837
 
    // Create a list of keywords including old one which already exists.
838
 
    for (QStringList::const_iterator it = oldkeys.constBegin(); it != oldkeys.constEnd(); ++it )
839
 
    {
840
 
        if (!newkeys.contains(*it))
841
 
            newkeys.append(*it);
842
 
    }
843
 
 
844
 
    if (setXmpTagStringBag("Xmp.dc.subject", newkeys, false))
845
 
        return true;
846
 
 
847
 
#endif // _XMP_SUPPORT_
848
 
 
849
 
    return false;
 
902
    return addToXmpTagStringBag("Xmp.dc.subject", newKeywords, setProgramName);
 
903
}
 
904
 
 
905
bool KExiv2::removeXmpKeywords(const QStringList& keywordsToRemove, bool setProgramName)
 
906
{
 
907
    return removeFromXmpTagStringBag("Xmp.dc.subject", keywordsToRemove, setProgramName);
850
908
}
851
909
 
852
910
QStringList KExiv2::getXmpSubCategories() const
856
914
 
857
915
bool KExiv2::setXmpSubCategories(const QStringList& newSubCategories, bool setProgramName) const
858
916
{
859
 
#ifdef _XMP_SUPPORT_
860
 
 
861
 
    if (!setProgramId(setProgramName))
862
 
        return false;
863
 
 
864
 
    const QStringList oldSubCat = getXmpSubCategories();
865
 
    QStringList newSubCat = newSubCategories;
866
 
 
867
 
    // Create a list of sub-categories including old one which already exists.
868
 
    for (QStringList::const_iterator it = oldSubCat.constBegin(); it != oldSubCat.constEnd(); ++it )
869
 
    {
870
 
        if (!newSubCat.contains(*it))
871
 
            newSubCat.append(*it);
872
 
    }
873
 
 
874
 
    if (setXmpTagStringBag("Xmp.photoshop.SupplementalCategories", newSubCat, false))
875
 
        return true;
876
 
 
877
 
#endif // _XMP_SUPPORT_
878
 
 
879
 
    return false;
 
917
    return addToXmpTagStringBag("Xmp.photoshop.SupplementalCategories", newSubCategories, setProgramName);
 
918
}
 
919
 
 
920
bool KExiv2::removeXmpSubCategories(const QStringList& subCategoriesToRemove, bool setProgramName)
 
921
{
 
922
    return removeFromXmpTagStringBag("Xmp.photoshop.SupplementalCategories", subCategoriesToRemove, setProgramName);
880
923
}
881
924
 
882
925
QStringList KExiv2::getXmpSubjects() const
886
929
 
887
930
bool KExiv2::setXmpSubjects(const QStringList& newSubjects, bool setProgramName) const
888
931
{
889
 
#ifdef _XMP_SUPPORT_
890
 
 
891
 
    if (!setProgramId(setProgramName))
892
 
        return false;
893
 
 
894
 
    QStringList oldSubjectCodes = getXmpSubjects();
895
 
    QStringList newSubjectCodes = newSubjects;
896
 
 
897
 
    // Create a list of sub-categories including old one which already exists.
898
 
    for (QStringList::const_iterator it = oldSubjectCodes.constBegin(); it != oldSubjectCodes.constEnd(); ++it )
899
 
    {
900
 
        if (!newSubjectCodes.contains(*it))
901
 
            newSubjectCodes.append(*it);
902
 
    }
903
 
 
904
 
    if (setXmpTagStringBag("Xmp.iptc.SubjectCode", newSubjectCodes, false))
905
 
        return true;
906
 
 
907
 
#endif // _XMP_SUPPORT_
908
 
 
909
 
    return false;
 
932
    return addToXmpTagStringBag("Xmp.iptc.SubjectCode", newSubjects, setProgramName);
 
933
}
 
934
 
 
935
bool KExiv2::removeXmpSubjects(const QStringList& subjectsToRemove, bool setProgramName)
 
936
{
 
937
    return removeFromXmpTagStringBag("Xmp.iptc.SubjectCode", subjectsToRemove, setProgramName);
 
938
}
 
939
 
 
940
KExiv2::TagsMap KExiv2::getXmpTagsList() const
 
941
{
 
942
    try
 
943
    {
 
944
        TagsMap tagsMap;
 
945
        d->getXMPTagsListFromPrefix("dc",             tagsMap);
 
946
        d->getXMPTagsListFromPrefix("digiKam",        tagsMap);
 
947
        d->getXMPTagsListFromPrefix("xmp",            tagsMap);
 
948
        d->getXMPTagsListFromPrefix("xmpRights",      tagsMap);
 
949
        d->getXMPTagsListFromPrefix("xmpMM",          tagsMap);
 
950
        d->getXMPTagsListFromPrefix("xmpBJ",          tagsMap);
 
951
        d->getXMPTagsListFromPrefix("xmpTPg",         tagsMap);
 
952
        d->getXMPTagsListFromPrefix("xmpDM",          tagsMap);
 
953
        d->getXMPTagsListFromPrefix("MicrosoftPhoto", tagsMap);
 
954
        d->getXMPTagsListFromPrefix("pdf",            tagsMap);
 
955
        d->getXMPTagsListFromPrefix("photoshop",      tagsMap);
 
956
        d->getXMPTagsListFromPrefix("crs",            tagsMap);
 
957
        d->getXMPTagsListFromPrefix("tiff",           tagsMap);
 
958
        d->getXMPTagsListFromPrefix("exif",           tagsMap);
 
959
        d->getXMPTagsListFromPrefix("aux",            tagsMap);
 
960
        d->getXMPTagsListFromPrefix("iptc",           tagsMap);
 
961
 
 
962
#if (EXIV2_TEST_VERSION(0,19,0))
 
963
        d->getXMPTagsListFromPrefix("iptcExt",        tagsMap);
 
964
        d->getXMPTagsListFromPrefix("plus",           tagsMap);
 
965
#endif
 
966
        return tagsMap;
 
967
    }
 
968
    catch( Exiv2::Error &e )
 
969
    {
 
970
        d->printExiv2ExceptionError("Cannot get Xmp Tags list using Exiv2 ", e);
 
971
    }
 
972
 
 
973
    return TagsMap();
910
974
}
911
975
 
912
976
}  // NameSpace KExiv2Iface