Update to gupnp-av-0.12.4
[profile/ivi/GUPnP-AV.git] / libgupnp-av / gupnp-didl-lite-writer.c
index bd57138..558eb47 100644 (file)
@@ -49,8 +49,11 @@ struct _GUPnPDIDLLiteWriterPrivate {
         xmlNs       *upnp_ns;
         xmlNs       *dc_ns;
         xmlNs       *dlna_ns;
+        xmlNs       *pv_ns;
 
         char        *language;
+
+        gboolean    dlna_attr_present;
 };
 
 enum {
@@ -206,6 +209,19 @@ filter_attributes (xmlNode             *node,
 }
 
 static void
+check_dlna_attr (xmlNode             *node,
+                 GUPnPDIDLLiteWriter *writer)
+{
+        xmlAttr *attr;
+
+        /* check if dlna prefix is present for a node */
+        for (attr = node->properties; attr != NULL; attr = attr->next) {
+                if (attr->ns && g_strcmp0 (attr->ns->prefix, "dlna") == 0)
+                        writer->priv->dlna_attr_present = TRUE;
+        }
+}
+
+static void
 filter_node (xmlNode             *node,
              GList               *allowed,
              GUPnPDIDLLiteWriter *writer,
@@ -220,10 +236,14 @@ filter_node (xmlNode             *node,
         if (!tags_only)
                 filter_attributes (node, allowed);
 
+        // Check if dlna namespace attribute is present
+        if (!writer->priv->dlna_attr_present)
+                check_dlna_attr (node, writer);
+
         if (strcmp ((const char *) node->name, "container") == 0) {
-            is_container = TRUE;
-            container_class = xml_util_get_child_element_content (node,
-                                                                  "class");
+                is_container = TRUE;
+                container_class = xml_util_get_child_element_content (node,
+                                                                      "class");
         }
 
         forbidden = NULL;
@@ -278,8 +298,13 @@ apply_filter (GUPnPDIDLLiteWriter *writer,
         g_return_if_fail (GUPNP_IS_DIDL_LITE_WRITER (writer));
         g_return_if_fail (filter != NULL);
 
-        if (filter[0] == '*')
+        if (filter[0] == '*') {
+                /* Create DLNA namespace as we include anything anyway */
+                xmlNewNs (writer->priv->xml_node,
+                          writer->priv->dlna_ns->href,
+                          writer->priv->dlna_ns->prefix);
                 return;         /* Wildcard */
+        }
 
         tokens = g_strsplit (filter, ",", -1);
         g_return_if_fail (tokens != NULL);
@@ -292,6 +317,12 @@ apply_filter (GUPnPDIDLLiteWriter *writer,
              node = node->next)
                 filter_node (node, allowed, writer, tags_only);
 
+        if (writer->priv->dlna_attr_present) {
+                xmlNewNs (writer->priv->xml_node,
+                          writer->priv->dlna_ns->href,
+                          writer->priv->dlna_ns->prefix);
+        }
+
         g_list_free (allowed);
         g_strfreev (tokens);
 }
@@ -378,11 +409,19 @@ gupnp_didl_lite_writer_constructed (GObject *object)
                                   "urn:schemas-upnp-org:metadata-1-0/upnp/",
                                   (unsigned char *)
                                   GUPNP_DIDL_LITE_WRITER_NAMESPACE_UPNP);
-        priv->dlna_ns = xmlNewNs (priv->xml_node,
+        /* Not adding dlna namespace declaration to any node yet.
+           Add the namespace to Didl-Lite element only if any of the child
+           nodes have dlna namespace prefix attributes */
+        priv->dlna_ns = xmlNewNs (NULL,
                                   (unsigned char *)
                                   "urn:schemas-dlna-org:metadata-1-0/",
                                   (unsigned char *)
                                   GUPNP_DIDL_LITE_WRITER_NAMESPACE_DLNA);
+        priv->pv_ns = xmlNewNs (priv->xml_node,
+                                 (unsigned char *)
+                                 "http://www.pv.com/pvns/",
+                                 (unsigned char *)
+                                 GUPNP_DIDL_LITE_WRITER_NAMESPACE_PV);
         xmlNewNs (priv->xml_node,
                   (unsigned char *)
                   "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/",
@@ -393,6 +432,8 @@ gupnp_didl_lite_writer_constructed (GObject *object)
                             (unsigned char *) "lang",
                             (unsigned char *) priv->language);
 
+        priv->dlna_attr_present = FALSE;
+
         object_class = G_OBJECT_CLASS (gupnp_didl_lite_writer_parent_class);
         if (object_class->constructed != NULL)
                 object_class->constructed (object);
@@ -485,7 +526,10 @@ gupnp_didl_lite_writer_class_init (GUPnPDIDLLiteWriterClass *klass)
 
 /**
  * gupnp_didl_lite_writer_new:
- * @language: (allow-none):The language the DIDL-Lite fragment is in, or NULL
+ * @language: (allow-none):The language the DIDL-Lite fragment is in, or %NULL
+ *
+ * Note: @language should always be set to %NULL, DLNA does not support the
+ * language parameter.
  *
  * Return value: A new #GUPnPDIDLLiteWriter object.
  **/
@@ -522,7 +566,8 @@ gupnp_didl_lite_writer_add_item (GUPnPDIDLLiteWriter *writer)
                                                       writer->priv->xml_doc,
                                                       writer->priv->upnp_ns,
                                                       writer->priv->dc_ns,
-                                                      writer->priv->dlna_ns);
+                                                      writer->priv->dlna_ns,
+                                                      writer->priv->pv_ns);
         return GUPNP_DIDL_LITE_ITEM (object);
 }
 
@@ -559,7 +604,8 @@ gupnp_didl_lite_writer_add_container_child_item
                                                       writer->priv->xml_doc,
                                                       writer->priv->upnp_ns,
                                                       writer->priv->dc_ns,
-                                                      writer->priv->dlna_ns);
+                                                      writer->priv->dlna_ns,
+                                                      writer->priv->pv_ns);
         return GUPNP_DIDL_LITE_ITEM (object);
 }
 
@@ -588,7 +634,8 @@ gupnp_didl_lite_writer_add_container (GUPnPDIDLLiteWriter *writer)
                                                       writer->priv->xml_doc,
                                                       writer->priv->upnp_ns,
                                                       writer->priv->dc_ns,
-                                                      writer->priv->dlna_ns);
+                                                      writer->priv->dlna_ns,
+                                                      writer->priv->pv_ns);
         return GUPNP_DIDL_LITE_CONTAINER (object);
 }