예제 #1
0
        internal static CpDevice ConnectDevice(DeviceConnection connection, DeviceDescriptor deviceDescriptor, DataTypeResolverDlgt dataTypeResolver)
        {
            lock (connection.CPData.SyncObj)
            {
                string type;
                int    version;
                if (!deviceDescriptor.GetTypeAndVersion(out type, out version))
                {
                    throw new ArgumentException(string.Format("Invalid device type/version URN '{0}'", deviceDescriptor.TypeVersion_URN));
                }
                CpDevice result = new CpDevice(connection, type, version, deviceDescriptor.DeviceUUID);

                foreach (DeviceDescriptor childDevice in deviceDescriptor.ChildDevices)
                {
                    result.AddEmbeddedDevice(ConnectDevice(connection, childDevice, dataTypeResolver));
                }
                IDictionary <string, ServiceDescriptor> serviceDescriptors;
                if (deviceDescriptor.RootDescriptor.ServiceDescriptors.TryGetValue(deviceDescriptor.DeviceUUID, out serviceDescriptors))
                {
                    foreach (ServiceDescriptor serviceDescriptor in serviceDescriptors.Values)
                    {
                        if (serviceDescriptor.State == ServiceDescriptorState.Ready)
                        {
                            result.AddService(CpService.ConnectService(connection, result, serviceDescriptor, dataTypeResolver));
                        }
                        else
                        {
                            UPnPConfiguration.LOGGER.Warn("CpDevice.ConnectDevice: Unable to connect to service '{0}' (type '{1}', version '{2}') - the service descriptor was not initialized properly",
                                                          serviceDescriptor.ServiceId, serviceDescriptor.ServiceType, serviceDescriptor.ServiceTypeVersion);
                        }
                    }
                }
                return(result);
            }
        }