tag: xmp: Fix LocationShown syntax

According to the specification, the LocationShown requires its
struct fields to be inside a Bag type.
This commit is contained in:
Thiago Santos 2011-06-09 00:02:07 -03:00
parent 9e6d3214f8
commit 02580714de

View file

@ -115,7 +115,8 @@ xmp_serialization_data_use_schema (XmpSerializationData * serdata,
typedef enum
{
GstXmpTagTypeSimple = 0,
GstXmpTagTypeNone = 0,
GstXmpTagTypeSimple,
GstXmpTagTypeBag,
GstXmpTagTypeSeq,
GstXmpTagTypeStruct,
@ -136,6 +137,13 @@ struct _XmpTag
const gchar *tag_name;
GstXmpTagType type;
/* some tags must be inside a Bag even
* if they are a single entry. Set it here so we know */
GstXmpTagType supertype;
/* For tags that need a rdf:parseType attribute */
const gchar *parse_type;
/* Used for struct and compound types */
GSList *children;
@ -157,9 +165,9 @@ xmp_tag_get_merge_mode (XmpTag * xmptag)
}
static const gchar *
xmp_tag_get_type_name (XmpTag * xmptag)
xmp_tag_type_get_name (GstXmpTagType tagtype)
{
switch (xmptag->type) {
switch (tagtype) {
case GstXmpTagTypeSeq:
return "rdf:Seq";
case GstXmpTagTypeBag:
@ -251,6 +259,8 @@ gst_xmp_tag_create (const gchar * gst_tag, const gchar * xmp_tag,
xmpinfo->gst_tag = gst_tag;
xmpinfo->tag_name = xmp_tag;
xmpinfo->type = xmp_type;
xmpinfo->supertype = GstXmpTagTypeNone;
xmpinfo->parse_type = NULL;
xmpinfo->serialize = serialization_func;
xmpinfo->deserialize = deserialization_func;
xmpinfo->children = NULL;
@ -1012,6 +1022,8 @@ _init_xmp_tag_map (gpointer user_data)
schema = gst_xmp_schema_new ();
xmpinfo = gst_xmp_tag_create (NULL, "Iptc4xmpExt:LocationShown",
GstXmpTagTypeStruct, NULL, NULL);
xmpinfo->supertype = GstXmpTagTypeBag;
xmpinfo->parse_type = "Resource";
xmpinfo->children = g_slist_prepend (xmpinfo->children,
gst_xmp_tag_create (GST_TAG_GEO_LOCATION_SUBLOCATION,
"LocationDetails:Sublocation", GstXmpTagTypeSimple, NULL, NULL));
@ -1667,10 +1679,29 @@ write_one_tag (const GstTagList * list, XmpTag * xmp_tag, gpointer user_data)
if (use_it) {
if (xmp_tag->tag_name)
string_open_tag (data, xmp_tag->tag_name);
if (xmp_tag->supertype) {
string_open_tag (data, xmp_tag_type_get_name (xmp_tag->supertype));
if (xmp_tag->parse_type) {
g_string_append (data, "<rdf:li rdf:parseType=\"");
g_string_append (data, xmp_tag->parse_type);
g_string_append_c (data, '"');
g_string_append_c (data, '>');
} else {
string_open_tag (data, "rdf:li");
}
}
/* now write it */
for (iter = xmp_tag->children; iter; iter = g_slist_next (iter)) {
write_one_tag (list, iter->data, user_data);
}
if (xmp_tag->supertype) {
string_close_tag (data, "rdf:li");
string_close_tag (data, xmp_tag_type_get_name (xmp_tag->supertype));
}
if (xmp_tag->tag_name)
string_close_tag (data, xmp_tag->tag_name);
}
@ -1703,7 +1734,7 @@ write_one_tag (const GstTagList * list, XmpTag * xmp_tag, gpointer user_data)
} else {
const gchar *typename;
typename = xmp_tag_get_type_name (xmp_tag);
typename = xmp_tag_type_get_name (xmp_tag->type);
string_open_tag (data, typename);
for (i = 0; i < ct; i++) {