[SCM] exiv2 packaging branch, master, updated. debian/0.25-3.1-3734-gdcbc29a
Maximiliano Curia
maxy at moszumanska.debian.org
Thu Jul 13 17:39:13 UTC 2017
Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=2e3672d
The following commit has been merged in the master branch:
commit 2e3672d211e4cf8f83216a6c2e15aafee8058070
Author: Andreas Huggel <ahuggel at gmx.net>
Date: Thu Jan 24 14:32:18 2008 +0000
#539: Make registration of namespaces actually work (Vladimir Nadvornik, S M Ryan)
---
doc/cmdxmp.txt | 5 +++-
samples/xmpsample.cpp | 4 +++
src/actions.cpp | 2 +-
src/exiv2.cpp | 6 +++++
src/properties.cpp | 60 ++++++++++++++++++++++++++++++++++++--------
src/properties.hpp | 26 ++++++++++++++++---
src/xmp.cpp | 16 +++++++++++-
src/xmp.hpp | 9 ++++++-
test/data/cmdxmp.txt | 5 +++-
test/data/xmpparser-test.out | 10 +++++---
10 files changed, 122 insertions(+), 21 deletions(-)
diff --git a/doc/cmdxmp.txt b/doc/cmdxmp.txt
index 75bfa98..313f8ac 100644
--- a/doc/cmdxmp.txt
+++ b/doc/cmdxmp.txt
@@ -54,6 +54,9 @@ set Xmp.tiff.ImageDescription lang=de-DE TIFF Bildbeschreibung
# Register a namespace which Exiv2 doesn't know yet with a prefix.
reg ns myNamespace/
+# Add a property in the new custom namespace.
+set Xmp.ns.myProperty myValue
+
# There are no built-in Exiv2 value types for structures, qualifiers and
# nested types. However, these can be added by using an XmpText value and a
# path as the key.
@@ -65,7 +68,7 @@ set Xmp.xmpDM.videoFrameSize/stDim:unit inch
# Add an element with a qualifier (using the namespace registered earlier)
set Xmp.dc.publisher James Bond
-set Xmp.dc.publisher/?ns:role secret agent
+set Xmp.dc.publisher[1]/?ns:role secret agent
# Add a qualifer to an array element of Xmp.dc.creator (added above)
set Xmp.dc.creator[2]/?ns:role programmer
diff --git a/samples/xmpsample.cpp b/samples/xmpsample.cpp
index 279f67f..b8416dc 100644
--- a/samples/xmpsample.cpp
+++ b/samples/xmpsample.cpp
@@ -76,6 +76,10 @@ try {
Exiv2::XmpProperties::registerNs("myNamespace/", "ns");
// -------------------------------------------------------------------------
+ // Add a property in the new custom namespace.
+ xmpData["Xmp.ns.myProperty"] = "myValue";
+
+ // -------------------------------------------------------------------------
// There are no specialized values for structures, qualifiers and nested
// types. However, these can be added by using an XmpTextValue and a path as
// the key.
diff --git a/src/actions.cpp b/src/actions.cpp
index dc95f52..2a9fd03 100644
--- a/src/actions.cpp
+++ b/src/actions.cpp
@@ -1413,7 +1413,7 @@ namespace Action {
std::cout << _("Reg ") << modifyCmd.key_ << "=\""
<< modifyCmd.value_ << "\"" << std::endl;
}
- Exiv2::XmpProperties::registerNs(modifyCmd.value_, modifyCmd.key_);
+ // Registration has been done immediately after parsing the command.
}
Modify::AutoPtr Modify::clone() const
diff --git a/src/exiv2.cpp b/src/exiv2.cpp
index 6ded62f..1ea76e5 100644
--- a/src/exiv2.cpp
+++ b/src/exiv2.cpp
@@ -1015,6 +1015,12 @@ namespace {
modifyCmd.explicitType_ = explicitType;
modifyCmd.value_ = value;
+ if (cmdId == reg) {
+ // Registration needs to be done immediately as the new namespaces are
+ // looked up during parsing of subsequent lines (to validate XMP keys).
+ Exiv2::XmpProperties::registerNs(modifyCmd.value_, modifyCmd.key_);
+ }
+
return true;
} // parseLine
diff --git a/src/properties.cpp b/src/properties.cpp
index 169ee04..f09eb78 100644
--- a/src/properties.cpp
+++ b/src/properties.cpp
@@ -43,6 +43,8 @@ EXIV2_RCSID("@(#) $Id$")
#include <iostream>
#include <iomanip>
#include <sstream>
+#include <cstring>
+#include <cstdlib>
// *****************************************************************************
// class member definitions
@@ -812,16 +814,57 @@ namespace Exiv2 {
XmpProperties::NsRegistry XmpProperties::nsRegistry_;
+ const XmpNsInfo* XmpProperties::lookupNsRegistry(const XmpNsInfo::Prefix& prefix)
+ {
+ for (NsRegistry::const_iterator i = nsRegistry_.begin();
+ i != nsRegistry_.end(); ++i) {
+ if (i->second == prefix) return &(i->second);
+ }
+ return 0;
+ }
+
void XmpProperties::registerNs(const std::string& ns,
const std::string& prefix)
{
std::string ns2 = ns;
if ( ns2.substr(ns2.size() - 1, 1) != "/"
&& ns2.substr(ns2.size() - 1, 1) != "#") ns2 += "/";
- nsRegistry_[ns2] = prefix;
+ // Allocated memory is freed when the namespace is unregistered.
+ // Using malloc/free for better system compatibility in case
+ // users don't unregister their namespaces explicitely.
+ XmpNsInfo xn;
+ char* c = static_cast<char*>(std::malloc(ns2.size() + 1));
+ std::strcpy(c, ns2.c_str());
+ xn.ns_ = c;
+ c = static_cast<char*>(std::malloc(prefix.size() + 1));
+ std::strcpy(c, prefix.c_str());
+ xn.prefix_ = c;
+ xn.xmpPropertyInfo_ = 0;
+ xn.desc_ = "";
+ nsRegistry_[ns2] = xn;
XmpParser::registerNs(ns2, prefix);
}
+ void XmpProperties::unregisterNs(const std::string& ns)
+ {
+ NsRegistry::iterator i = nsRegistry_.find(ns);
+ if (i != nsRegistry_.end()) {
+ XmpParser::unregisterNs(ns);
+ std::free(const_cast<char*>(i->second.prefix_));
+ std::free(const_cast<char*>(i->second.ns_));
+ nsRegistry_.erase(i);
+ }
+ }
+
+ void XmpProperties::unregisterNs()
+ {
+ NsRegistry::iterator i = nsRegistry_.begin();
+ while (i != nsRegistry_.end()) {
+ NsRegistry::iterator kill = i++;
+ unregisterNs(kill->first);
+ }
+ }
+
std::string XmpProperties::prefix(const std::string& ns)
{
std::string ns2 = ns;
@@ -829,7 +872,7 @@ namespace Exiv2 {
NsRegistry::const_iterator i = nsRegistry_.find(ns2);
std::string p;
if (i != nsRegistry_.end()) {
- p = i->second;
+ p = i->second.prefix_;
}
else {
const XmpNsInfo* xn = find(xmpNsInfo, XmpNsInfo::Ns(ns2));
@@ -840,13 +883,8 @@ namespace Exiv2 {
std::string XmpProperties::ns(const std::string& prefix)
{
- std::string n;
- for (NsRegistry::const_iterator i = nsRegistry_.begin();
- i != nsRegistry_.end(); ++i) {
- if (i->second == prefix) {
- return i->first;
- }
- }
+ const XmpNsInfo* xn = lookupNsRegistry(XmpNsInfo::Prefix(prefix));
+ if (xn != 0) return xn->ns_;
return nsInfo(prefix)->ns_;
}
@@ -894,7 +932,9 @@ namespace Exiv2 {
const XmpNsInfo* XmpProperties::nsInfo(const std::string& prefix)
{
- const XmpNsInfo* xn = find(xmpNsInfo, XmpNsInfo::Prefix(prefix));
+ const XmpNsInfo::Prefix pf(prefix);
+ const XmpNsInfo* xn = lookupNsRegistry(pf);
+ if (!xn) xn = find(xmpNsInfo, pf);
if (!xn) throw Error(35, prefix);
return xn;
}
diff --git a/src/properties.hpp b/src/properties.hpp
index 7a10252..36ffd2c 100644
--- a/src/properties.hpp
+++ b/src/properties.hpp
@@ -181,13 +181,33 @@ namespace Exiv2 {
@brief Register namespace \em ns with preferred prefix \em prefix.
If the namespace is a known or previously registered namespace, the
- prefix is overwritten. This also invalidates XMP keys generated with
- the previous prefix.
+ prefix is overwritten.
+
+ @note This invalidates XMP keys generated with the previous prefix.
*/
static void registerNs(const std::string& ns, const std::string& prefix);
+ /*!
+ @brief Unregister a custom namespace \em ns.
+
+ The function only has an effect if there is a namespace \em ns
+ registered earlier, it does not unregister built-in namespaces.
+
+ @note This invalidates XMP keys generated in this namespace.
+ */
+ static void unregisterNs(const std::string& ns);
+ /*!
+ @brief Unregister all custom namespaces.
+
+ The function only unregisters namespaces registered earlier, it does not
+ unregister built-in namespaces.
+
+ @note This invalidates XMP keys generated in any custom namespace.
+ */
+ static void unregisterNs();
private:
- typedef std::map<std::string, std::string> NsRegistry;
+ typedef std::map<std::string, XmpNsInfo> NsRegistry;
+ static const XmpNsInfo* lookupNsRegistry(const XmpNsInfo::Prefix& prefix);
static NsRegistry nsRegistry_;
}; // class XmpProperties
diff --git a/src/xmp.cpp b/src/xmp.cpp
index 8fec92b..96ec88a 100644
--- a/src/xmp.cpp
+++ b/src/xmp.cpp
@@ -371,6 +371,7 @@ namespace Exiv2 {
void XmpParser::terminate()
{
+ XmpProperties::unregisterNs();
if (initialized_) {
#ifdef EXV_HAVE_XMP_TOOLKIT
SXMPMeta::Terminate();
@@ -394,7 +395,20 @@ namespace Exiv2 {
initialize();
return true;
#endif
- } // XmpParser::registerNs
+ } // XmpParser::registerNs
+
+ void XmpParser::unregisterNs(const std::string& ns)
+ {
+#ifdef EXV_HAVE_XMP_TOOLKIT
+ try {
+// Throws XMP Toolkit error 8: Unimplemented method XMPMeta::DeleteNamespace
+// SXMPMeta::DeleteNamespace(ns.c_str());
+ }
+ catch (const XMP_Error& e) {
+ throw Error(40, e.GetID(), e.GetErrMsg());
+ }
+#endif
+ } // XmpParser::unregisterNs
#ifdef EXV_HAVE_XMP_TOOLKIT
int XmpParser::decode( XmpData& xmpData,
diff --git a/src/xmp.hpp b/src/xmp.hpp
index b01a94c..0cbc630 100644
--- a/src/xmp.hpp
+++ b/src/xmp.hpp
@@ -257,6 +257,7 @@ namespace Exiv2 {
*/
class XmpParser {
friend void XmpProperties::registerNs(const std::string&, const std::string&);
+ friend void XmpProperties::unregisterNs(const std::string&);
public:
/*!
@brief Decode XMP metadata from an XMP packet \em xmpPacket into
@@ -299,7 +300,7 @@ namespace Exiv2 {
*/
static bool initialize();
/*!
- @brief Terminate the XMP Toolkit.
+ @brief Terminate the XMP Toolkit and unregister custom namespaces.
Call this method when the XmpParser is no longer needed to
allow the XMP Toolkit to cleanly shutdown.
@@ -316,6 +317,12 @@ namespace Exiv2 {
*/
static bool registerNs(const std::string& ns,
const std::string& prefix);
+ /*!
+ @brief Delete a namespace from the XMP Toolkit.
+
+ XmpProperties::unregisterNs calls this to synchronize namespaces.
+ */
+ static void unregisterNs(const std::string& ns);
// DATA
static bool initialized_; //! Indicates if the XMP Toolkit has been initialized
diff --git a/test/data/cmdxmp.txt b/test/data/cmdxmp.txt
index 75bfa98..313f8ac 100644
--- a/test/data/cmdxmp.txt
+++ b/test/data/cmdxmp.txt
@@ -54,6 +54,9 @@ set Xmp.tiff.ImageDescription lang=de-DE TIFF Bildbeschreibung
# Register a namespace which Exiv2 doesn't know yet with a prefix.
reg ns myNamespace/
+# Add a property in the new custom namespace.
+set Xmp.ns.myProperty myValue
+
# There are no built-in Exiv2 value types for structures, qualifiers and
# nested types. However, these can be added by using an XmpText value and a
# path as the key.
@@ -65,7 +68,7 @@ set Xmp.xmpDM.videoFrameSize/stDim:unit inch
# Add an element with a qualifier (using the namespace registered earlier)
set Xmp.dc.publisher James Bond
-set Xmp.dc.publisher/?ns:role secret agent
+set Xmp.dc.publisher[1]/?ns:role secret agent
# Add a qualifer to an array element of Xmp.dc.creator (added above)
set Xmp.dc.creator[2]/?ns:role programmer
diff --git a/test/data/xmpparser-test.out b/test/data/xmpparser-test.out
index c22762f..d9f128c 100644
--- a/test/data/xmpparser-test.out
+++ b/test/data/xmpparser-test.out
@@ -293,6 +293,7 @@ Xmp.dc.format XmpText 10 image/jpeg
Xmp.dc.creator XmpSeq 3 1) The first creator, 2) The second creator, 3) And another one
Xmp.dc.description LangAlt 2 lang="x-default" Hello, World, lang="de-DE" Hallo, Welt
Xmp.tiff.ImageDescription LangAlt 2 lang="x-default" TIFF image description, lang="de-DE" TIFF Bildbeschreibung
+Xmp.ns.myProperty XmpText 7 myValue
Xmp.xmpDM.videoFrameSize/stDim:w XmpText 2 16
Xmp.xmpDM.videoFrameSize/stDim:h XmpText 1 9
Xmp.xmpDM.videoFrameSize/stDim:unit XmpText 4 inch
@@ -323,7 +324,8 @@ Xmp.xmpBJ.JobRef[2]/stJob:role XmpText 8 Best man
dc:five="256"
dc:six="false"
dc:seven="Seven"
- dc:format="image/jpeg">
+ dc:format="image/jpeg"
+ ns:myProperty="myValue">
<dc:subject>
<rdf:Bag>
<rdf:li>Palmtree</rdf:li>
@@ -427,11 +429,12 @@ Set Xmp.dc.description "Hello, World" (LangAlt)
Set Xmp.tiff.ImageDescription "TIFF image description" (LangAlt)
Set Xmp.tiff.ImageDescription "lang=de-DE TIFF Bildbeschreibung" (LangAlt)
Reg ns="myNamespace/"
+Set Xmp.ns.myProperty "myValue" (XmpText)
Set Xmp.xmpDM.videoFrameSize/stDim:w "16" (XmpText)
Set Xmp.xmpDM.videoFrameSize/stDim:h "9" (XmpText)
Set Xmp.xmpDM.videoFrameSize/stDim:unit "inch" (XmpText)
Set Xmp.dc.publisher "James Bond" (XmpBag)
-Set Xmp.dc.publisher/?ns:role "secret agent" (XmpText)
+Set Xmp.dc.publisher[1]/?ns:role "secret agent" (XmpText)
Set Xmp.dc.creator[2]/?ns:role "programmer" (XmpText)
Set Xmp.xmpBJ.JobRef "type=Bag" (XmpText)
Set Xmp.xmpBJ.JobRef[1]/stJob:name "Birthday party" (XmpText)
@@ -457,8 +460,9 @@ Xmp.dc.creator[2]/?ns:role XmpText 10 programmer
Xmp.dc.creator[3] XmpText 18 3) And another one
Xmp.dc.description LangAlt 2 lang="x-default" Hello, World, lang="de-DE" Hallo, Welt
Xmp.dc.publisher XmpText 0 type="Bag"
-Xmp.dc.publisher/?ns:role XmpText 12 secret agent
Xmp.dc.publisher[1] XmpText 10 James Bond
+Xmp.dc.publisher[1]/?ns:role XmpText 12 secret agent
+Xmp.ns.myProperty XmpText 7 myValue
Xmp.tiff.ImageDescription LangAlt 2 lang="x-default" TIFF image description, lang="de-DE" TIFF Bildbeschreibung
Xmp.xmpDM.videoFrameSize XmpText 0 type="Struct"
Xmp.xmpDM.videoFrameSize/stDim:w XmpText 2 16
--
exiv2 packaging
More information about the pkg-kde-commits
mailing list