core: Work-around standard issues for XBox
authorJens Georg <mail@jensge.org>
Mon, 23 May 2011 16:46:44 +0000 (18:46 +0200)
committerJens Georg <mail@jensge.org>
Sat, 11 Jun 2011 12:12:01 +0000 (14:12 +0200)
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
src/rygel/rygel-xbox-hacks.vala

index b59c3eb..8ab5233 100644 (file)
@@ -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";
index 227cc70..1493b3a 100644 (file)
@@ -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,