[rygel] core: Work-around standard issues for XBox



commit 1e8db8b3a2b043c6a65fbbf51559a363f8414b31
Author: Jens Georg <mail jensge org>
Date:   Mon May 23 18:46:44 2011 +0200

    core: Work-around standard issues for XBox
    
    The MediaReceiverRegistrar uses an illegal character in the domain
    name which makes UPnP tests fail. The XBox doesn't work without the
    ".", so we put the dash to make the UPnP test happy and replace it
    with a dot when the XBox requests our service description.
    
    Fixes (partially) UPnP CTT tests UDA-1.1.1, UDA-1.1.2, UDA-1.1.3
    and UDA-1.1.4.

 src/rygel/rygel-media-receiver-registrar.vala |    7 +++++-
 src/rygel/rygel-xbox-hacks.vala               |   30 ++++++++++++------------
 2 files changed, 21 insertions(+), 16 deletions(-)
---
diff --git a/src/rygel/rygel-media-receiver-registrar.vala b/src/rygel/rygel-media-receiver-registrar.vala
index b59c3eb..8ab5233 100644
--- a/src/rygel/rygel-media-receiver-registrar.vala
+++ b/src/rygel/rygel-media-receiver-registrar.vala
@@ -27,8 +27,13 @@ using GUPnP;
  */
 internal class Rygel.MediaReceiverRegistrar: Service {
     public const string UPNP_ID =
-                    "urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar";
+                    "urn:microsoft-com:serviceId:X_MS_MediaReceiverRegistrar";
+    // UPnP requires that points replaced by hyphens in domain names
     public const string UPNP_TYPE =
+                    "urn:microsoft-com:service:X_MS_MediaReceiverRegistrar:1";
+    // The XBox however doesn't like that so we replace it in the service
+    // description later
+    public const string COMPAT_TYPE =
                     "urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1";
     public const string DESCRIPTION_PATH =
                     "xml/X_MS_MediaReceiverRegistrar1.xml";
diff --git a/src/rygel/rygel-xbox-hacks.vala b/src/rygel/rygel-xbox-hacks.vala
index 227cc70..1493b3a 100644
--- a/src/rygel/rygel-xbox-hacks.vala
+++ b/src/rygel/rygel-xbox-hacks.vala
@@ -165,38 +165,38 @@ internal class Rygel.XBoxHacks : GLib.Object {
         assert (element != null);
         element->add_content (FRIENDLY_NAME_POSTFIX);
 
-        element = this.find_cds_type_node (doc);
-        assert (element != null);
-        element->set_content (ContentDirectory.UPNP_TYPE_V1);
+        this.modify_service_list (doc);
     }
 
-    private Xml.Node * find_cds_type_node (Xml.Node *doc_node) {
+    private void modify_service_list (Xml.Node *doc_node) {
         Xml.Node *element = XMLUtils.get_element (doc_node,
                                                   "root",
                                                   "device",
                                                   "serviceList");
         assert (element != null && element->children != null);
 
-        Xml.Node *cds_type_node = null;
-
         for (var service_node = element->children;
              service_node != null;
              service_node = service_node->next) {
             for (var type_node = service_node->children;
                  type_node != null;
                  type_node = type_node->next) {
-                if (type_node->name == "serviceType" &&
-                    type_node->get_content () == ContentDirectory.UPNP_TYPE) {
-                    cds_type_node = type_node;
+                if (type_node->name == "serviceType") {
+                    switch (type_node->get_content ()) {
+                        case ContentDirectory.UPNP_TYPE:
+                            type_node->set_content
+                                        (ContentDirectory.UPNP_TYPE_V1);
+                            break;
+                        case MediaReceiverRegistrar.UPNP_TYPE:
+                            type_node->set_content
+                                        (MediaReceiverRegistrar.COMPAT_TYPE);
+                            break;
+                        default:
+                            break;
+                    }
                 }
             }
-
-            if (cds_type_node != null) {
-                break;
-            }
         }
-
-        return cds_type_node;
     }
 
     private void save_modified_desc (XMLDoc doc,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]