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); } }