[rygel] DescriptionFile: create device elements if they do not exists
- From: Jussi Kukkonen <jussik src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rygel] DescriptionFile: create device elements if they do not exists
- Date: Thu, 27 Jun 2013 12:14:24 +0000 (UTC)
commit 6a481ee70628b8a8a5f3cd78822544cb64651b49
Author: Jussi Kukkonen <jussi kukkonen intel com>
Date: Tue Jun 25 14:41:53 2013 +0300
DescriptionFile: create device elements if they do not exists
set_device_element() may be called with names of elements that do not
exists yet (non-required elements that are empty by default).
Create elements dynamically in set_device_element(). also, set dlna
namespace for X_DLNACAP and remove the X_DLNACAP element if the
contents are empty.
https://bugzilla.gnome.org/show_bug.cgi?id=703044
src/librygel-core/rygel-description-file.vala | 51 +++++++++++++++++++++---
1 files changed, 44 insertions(+), 7 deletions(-)
---
diff --git a/src/librygel-core/rygel-description-file.vala b/src/librygel-core/rygel-description-file.vala
index 797561c..37a6dd8 100644
--- a/src/librygel-core/rygel-description-file.vala
+++ b/src/librygel-core/rygel-description-file.vala
@@ -127,7 +127,6 @@ public class Rygel.DescriptionFile : Object {
*/
public void set_dlna_caps (PluginCapabilities capabilities) {
var flags = new string[0];
- var content = "";
if ((PluginCapabilities.UPLOAD & capabilities) != 0) {
// This means "Supports upload to AnyContainer_DLNA.ORG", but we
@@ -177,10 +176,11 @@ public class Rygel.DescriptionFile : Object {
// Set the flags we found; otherwise remove whatever is in the
// template.
if (flags.length > 0) {
- content = string.joinv (",", flags);
+ var content = string.joinv (",", flags);
+ this.set_device_element ("X_DLNACAP", content, "dlna");
+ } else {
+ this.remove_device_element ("X_DLNACAP");
}
-
- this.set_device_element ("X_DLNACAP", content);
}
@@ -239,19 +239,56 @@ public class Rygel.DescriptionFile : Object {
}
/**
- * Internal helper function to set an element to a new value.
+ * Internal helper function to set an element to a new value,
+ * creating it if needed.
*
* @param element below /root/device to be set.
* @param new_vale is the new content of that element.
*/
- private void set_device_element (string element, string new_value) {
+ private void set_device_element (string element,
+ string new_value,
+ string? ns = null) {
var xml_element = Rygel.XMLUtils.get_element
((Xml.Node *) this.doc.doc,
"root",
"device",
element);
- if (element != null) {
+ if (xml_element == null) {
+ var device_element = Rygel.XMLUtils.get_element
+ ((Xml.Node *) this.doc.doc,
+ "root",
+ "device");
+ if (device_element == null) {
+ warning (_("XML node '%s' not found."), "/root/device");
+
+ return;
+ }
+
+ Xml.Ns *xml_ns = null;
+ if (ns != null) {
+ xml_ns = this.doc.doc.search_ns(device_element, ns);
+ }
+
+ device_element->new_child (xml_ns, element, new_value);
+ } else {
xml_element->set_content (new_value);
}
}
+
+ /**
+ * Internal helper function to remove an element (if it exists).
+ *
+ * @param element below /root/device to be removed.
+ */
+ private void remove_device_element (string element) {
+ var xml_element = Rygel.XMLUtils.get_element
+ ((Xml.Node *) this.doc.doc,
+ "root",
+ "device",
+ element);
+ if (xml_element != null) {
+ xml_element->unlink ();
+ delete xml_element;
+ }
+ }
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]