#799: Fixed type-determination for nested properties,

XmpBag::read: don't do anything if the string is empty,
      Added Iptc4xmpCore and Iptc4xmpExt as possible prefixes
v0.27.3
Andreas Huggel 14 years ago
parent d542872228
commit 4fda7ac1e0

@ -45,6 +45,7 @@ EXIV2_RCSID("@(#) $Id$")
#include <sstream> #include <sstream>
#include <cstring> #include <cstring>
#include <cstdlib> #include <cstdlib>
#include <cctype>
// ***************************************************************************** // *****************************************************************************
namespace { namespace {
@ -110,10 +111,10 @@ namespace Exiv2 {
{ "http://ns.adobe.com/tiff/1.0/", "tiff", xmpTiffInfo, N_("Exif Schema for TIFF Properties") }, { "http://ns.adobe.com/tiff/1.0/", "tiff", xmpTiffInfo, N_("Exif Schema for TIFF Properties") },
{ "http://ns.adobe.com/exif/1.0/", "exif", xmpExifInfo, N_("Exif schema for Exif-specific Properties") }, { "http://ns.adobe.com/exif/1.0/", "exif", xmpExifInfo, N_("Exif schema for Exif-specific Properties") },
{ "http://ns.adobe.com/exif/1.0/aux/", "aux", xmpAuxInfo, N_("Exif schema for Additional Exif Properties")}, { "http://ns.adobe.com/exif/1.0/aux/", "aux", xmpAuxInfo, N_("Exif schema for Additional Exif Properties")},
{ "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/", "iptc", xmpIptcInfo, N_("IPTC Core schema") }, { "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/", "iptc", xmpIptcInfo, N_("IPTC Core schema") }, // NOTE: 'Iptc4xmpCore' is just too long, so make 'iptc'
// NOTE: 'Iptc4xmpCore' is just too long { "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/", "Iptc4xmpCore", xmpIptcInfo, N_("IPTC Core schema") }, // the default prefix. But provide the official one too.
{ "http://iptc.org/std/Iptc4xmpExt/2008-02-29/", "iptcExt", xmpIptcExtInfo, N_("IPTC Extension schema") }, { "http://iptc.org/std/Iptc4xmpExt/2008-02-29/", "iptcExt", xmpIptcExtInfo, N_("IPTC Extension schema") }, // NOTE: It really should be 'Iptc4xmpExt' but following
// NOTE: It really should be 'Iptc4xmpExt' but following example above { "http://iptc.org/std/Iptc4xmpExt/2008-02-29/", "Iptc4xmpExt", xmpIptcExtInfo, N_("IPTC Extension schema") }, // example above, 'iptcExt' is the default, Iptc4xmpExt works too.
{ "http://ns.useplus.org/ldf/xmp/1.0/", "plus", xmpPlusInfo, N_("PLUS License Data Format schema") }, { "http://ns.useplus.org/ldf/xmp/1.0/", "plus", xmpPlusInfo, N_("PLUS License Data Format schema") },
{ "http://ns.iview-multimedia.com/mediapro/1.0/", "mediapro", xmpMediaProInfo, N_("iView Media Pro schema") }, { "http://ns.iview-multimedia.com/mediapro/1.0/", "mediapro", xmpMediaProInfo, N_("iView Media Pro schema") },
{ "http://ns.microsoft.com/expressionmedia/1.0/", "expressionmedia",xmpExpressionMediaInfo, N_("Expression Media schema") }, { "http://ns.microsoft.com/expressionmedia/1.0/", "expressionmedia",xmpExpressionMediaInfo, N_("Expression Media schema") },
@ -1131,7 +1132,27 @@ namespace Exiv2 {
TypeId XmpProperties::propertyType(const XmpKey& key) TypeId XmpProperties::propertyType(const XmpKey& key)
{ {
const XmpPropertyInfo* pi = propertyInfo(key); const XmpPropertyInfo* pi = 0;
// If the key is that of a nested property, determine the type of the innermost element
std::string k = key.key();
std::string::size_type i = k.find_last_of('/');
if (i != std::string::npos) {
for (; i != std::string::npos && !isalpha(k[i]); ++i) {}
k = k.substr(i);
i = k.find_first_of(':');
if (i != std::string::npos) {
std::string prefix = k.substr(0, i);
std::string property = k.substr(i+1);
/*
std::cout << "Nested key: " << key.key()
<< ", prefix: " << prefix
<< ", property: " << property
<< "\n";
*/
pi = propertyInfo(XmpKey(prefix, property));
}
}
if (!pi) pi = propertyInfo(key);
return pi ? pi->typeId_ : xmpText; return pi ? pi->typeId_ : xmpText;
} }

@ -758,7 +758,7 @@ namespace Exiv2 {
int XmpArrayValue::read(const std::string& buf) int XmpArrayValue::read(const std::string& buf)
{ {
value_.push_back(buf); if (!buf.empty()) value_.push_back(buf);
return 0; return 0;
} }

Loading…
Cancel
Save