public ServiceConfig(ServiceDescription desc)
 {
     ServiceUuid = desc.Uuid;
     connected = false;
     wasConnected = false;
     LastDetected = Util.GetTime();
 }
        public void OnServiceRemoved(IDiscoveryProvider provider, ServiceDescription serviceDescription)
        {
            Logger.Current.AddMessage(serviceDescription == null
                ? string.Format("Service removed: {0}", "unknown service")
                : string.Format("Service removed: {0}", serviceDescription.FriendlyName));

            if (serviceDescription != null)
            {
                var device = allDevices[serviceDescription.IpAddress];

                if (device != null)
                {
                    device.RemoveServiceWithId(serviceDescription.ServiceId);

                    if (device.Services.Count == 0)
                    {
                        ConnectableDevice dev;
                        allDevices.TryRemove(serviceDescription.IpAddress,out dev);

                        HandleDeviceLoss(device);
                    }
                    else
                    {
                        HandleDeviceUpdate(device);
                    }
                }
            }
        }
        public void OnServiceAdded(IDiscoveryProvider provider, ServiceDescription serviceDescription)
        {
            Logger.Current.AddMessage(string.Format("Service added: {0}({1})", serviceDescription.FriendlyName, serviceDescription.ServiceId));
            var deviceIsNew = !allDevices.ContainsKey(serviceDescription.IpAddress);

            var device =
                (from d in allDevices where d.Key == serviceDescription.IpAddress select d.Value).FirstOrDefault();

            if (device == null)
            {
                device = new ConnectableDevice(serviceDescription) {IpAddress = serviceDescription.IpAddress};
                allDevices.TryAdd(serviceDescription.IpAddress, device);
                deviceIsNew = true;
            }

            device.LastDetection = Util.GetTime();
            device.LastKnownIpAddress = serviceDescription.IpAddress;
            //  TODO: Implement the currentSSID Property in DiscoveryManager
            //		device.setLastSeenOnWifi(currentSSID);

            AddServiceDescriptionToDevice(serviceDescription, device);

            if (device.Services.Count == 0)
                return; // we get here when a non-LG DLNA TV is found

            if (deviceIsNew)
                HandleDeviceAdd(device);
            else
                HandleDeviceUpdate(device);
        }
        public bool IsNetcast(ServiceDescription description)
        {
            bool isNetcastTv = false;

            var modelName = description.ModelName;
            var modelDescription = description.ModelDescription;

            if (modelName != null && modelName.ToUpper().Equals("LG TV"))
            {
                if (modelDescription != null && !(modelDescription.ToUpper().Contains("WEBOS")))
                {
                    if (description.ServiceId.Equals(NetcastTvService.Id))
                    {
                        isNetcastTv = true;
                    }
                }
            }

            return isNetcastTv;
        }
        public void AddServiceDescriptionToDevice(ServiceDescription desc, ConnectableDevice device)
        {
            Logger.Current.AddMessage(string.Format("Adding service: {0} to device with address {1} and id {2}", desc.ServiceId, device.IpAddress, device.Id));
            var deviceServiceClass = deviceClasses[desc.ServiceId];

            if (deviceServiceClass == null)
                return;

            if (deviceServiceClass == typeof (DlnaService))
            {
                if (desc.LocationXml == null)
                    return;
            }
            else if (deviceServiceClass == typeof (NetcastTvService))
            {
                if (!IsNetcast(desc))
                    return;
            }

            ServiceConfig serviceConfig = null;

            if (connectableDeviceStore != null)
                serviceConfig = connectableDeviceStore.GetServiceConfig(desc);

            if (serviceConfig == null)
                serviceConfig = new ServiceConfig(desc);

            serviceConfig.Listener = this;

            var hasType = false;
            var hasService = false;

            foreach (DeviceService service in device.Services)
            {
                if (!service.ServiceDescription.ServiceId.Equals(desc.ServiceId)) continue;
                hasType = true;
                if (service.ServiceDescription.Uuid.Equals(desc.Uuid))
                {
                    hasService = true;
                }
                break;
            }

            if (hasType)
            {
                if (hasService)
                {
                    device.ServiceDescription = desc;

                    var alreadyAddedService = device.GetServiceByName(desc.ServiceId);

                    if (alreadyAddedService != null)
                        alreadyAddedService.SetServiceDescription(desc);

                    return;
                }

                device.RemoveServiceByName(desc.ServiceId);
            }

            var deviceService = DeviceService.GetService(deviceServiceClass, desc, serviceConfig);

            if (deviceService == null) return;

            deviceService.SetServiceDescription(desc);
            device.AddService(deviceService);

            //    Type deviceServiceClass;

            //    if (IsNetcast(desc))
            //    {
            //        deviceServiceClass = typeof(NetcastTvService);
            //        var m = deviceServiceClass.GetRuntimeMethod("discoveryParameters", new Type[] { });
            //        var result = m.Invoke(null, new object[0]);

            //        if (result == null)
            //            return;

            //        var discoveryParameters = (JsonObject)result;
            //        var serviceId = discoveryParameters.GetNamedString("serviceId");

            //        if (serviceId.Length == 0)
            //            return;

            //        desc.ServiceId = serviceId;
            //    }
            //    else
            //    {
            //        deviceServiceClass = deviceClasses[desc.ServiceId];
            //    }

            //    if (deviceServiceClass == null)
            //        return;

            //    if (typeof(DlnaService) == deviceServiceClass)
            //    {
            //        const string netcast = "netcast";
            //        const string webos = "webos";

            //        var locNet = desc.LocationXml.IndexOf(netcast, StringComparison.Ordinal);
            //        var locWeb = desc.LocationXml.IndexOf(webos, StringComparison.Ordinal);

            //        if (locNet == -1 && locWeb == -1)
            //            return;
            //    }

            //    var serviceConfig = new ServiceConfig(desc) {Listener = this};

            //    var hasType = false;
            //    var hasService = false;

            //    foreach (var service in device.GetServices().Where(service => service.ServiceDescription.ServiceId.Equals(desc.ServiceId)))
            //    {
            //        hasType = true;
            //        if (service.ServiceDescription.Uuid.Equals(desc.Uuid))
            //        {
            //            hasService = true;
            //        }
            //        break;
            //    }

            //    if (hasType)
            //    {
            //        if (hasService)
            //        {
            //            device.SetServiceDescription(desc);

            //            var alreadyAddedService = device.GetServiceByName(desc.ServiceId);

            //            if (alreadyAddedService != null)
            //                alreadyAddedService.ServiceDescription = desc;

            //            return;
            //        }

            //        device.RemoveServiceByName(desc.ServiceId);
            //    }

            //    var deviceService = DeviceService.GetService(deviceServiceClass, desc, serviceConfig);
            //    deviceService.ServiceDescription = desc;
            //    device.AddService(deviceService);
            //}
        }
 public WebOstvService(ServiceDescription serviceDescription, ServiceConfig serviceConfig)
     : base(serviceDescription, serviceConfig)
 {
     AppToAppIdMappings = new Dictionary<String, String>();
     WebAppSessions = new Dictionary<String, WebOsWebAppSession>();
 }
        public override void SetServiceDescription(ServiceDescription serviceDescription)
        {
            base.SetServiceDescription(serviceDescription);

            if (ServiceDescription.Version == null && ServiceDescription.ResponseHeaders != null)
            {
                var serverInfo = serviceDescription.ResponseHeaders["Server"][0];
                var systemOs = serverInfo.Split(' ')[0];
                var versionComponents = systemOs.Split('/');
                var systemVersion = versionComponents[versionComponents.Length - 1];

                ServiceDescription.Version = systemVersion;

                UpdateCapabilities();
            }
        }
        private void NotifyListenersOfLostService(ServiceDescription service)
        {
            var serviceIds = ServiceIdsForFilter(service.ServiceFilter);

            foreach (var serviceId in serviceIds)
            {
                var newService = service.Clone();
                newService.ServiceId = serviceId;

                foreach (var listener in serviceListeners)
                {
                    listener.OnServiceRemoved(this, newService);
                }
            }
        }
        public ServiceDescription Clone()
        {
            var service = new ServiceDescription {Port = Port};

            if (ServiceId != null) service.ServiceId = ServiceId;
            if (IpAddress != null) service.IpAddress = IpAddress;
            if (Uuid != null) service.Uuid = Uuid;
            if (Version != null) service.Version = Version;
            if (FriendlyName != null) service.FriendlyName = FriendlyName;
            if (Manufacturer != null) service.Manufacturer = Manufacturer;
            if (ModelName != null) service.ModelName = ModelName;
            if (ModelNumber != null) service.ModelNumber = ModelNumber;
            if (ModelDescription != null) service.ModelDescription = ModelDescription;
            if (ApplicationUrl != null) service.ApplicationUrl = ApplicationUrl;
            if (LocationXml != null) service.LocationXml = LocationXml;
            if (ResponseHeaders != null) service.ResponseHeaders = ResponseHeaders;
            if (ServiceList != null) service.ServiceList = ServiceList;
            if (ServiceFilter != null) service.ServiceFilter = ServiceFilter;

            return service;
        }
        public ServiceConfig GetServiceConfig(ServiceDescription serviceDescription)
        {
            if (serviceDescription == null) return null;

            var uuidValue = serviceDescription.Uuid;
            if (string.IsNullOrEmpty(uuidValue)) return null;

            var device = GetStoredDevice(uuidValue);

            if (device != null)
            {
                var servicesParam = device.GetNamedObject(ConnectableDevice.KeyServices, null);
                if (servicesParam != null)
                {
                    var service = servicesParam.GetNamedObject(uuidValue, null);
                    if (service != null)
                    {
                        var serviceConfigInfo = service.GetNamedObject(DeviceService.KEY_CONFIG);
                        if (serviceConfigInfo != null)
                            return ServiceConfig.GetConfig(serviceConfigInfo);
                    }
                }
            }
            return null;
        }
Ejemplo n.º 11
0
 public DlnaService(ServiceDescription serviceDescription, ServiceConfig serviceConfig, string controlUrl)
     : base(serviceDescription, serviceConfig)
 {
     this.controlUrl = controlUrl;
 }
Ejemplo n.º 12
0
 public DlnaService(ServiceDescription serviceDescription, ServiceConfig serviceConfig)
     : base(serviceDescription, serviceConfig)
 {
     UpdateControlUrl(serviceDescription);
     httpServer = new DlnaHttpServer();
 }
Ejemplo n.º 13
0
        private void UpdateControlUrl(ServiceDescription serviceDescriptionParam)
        {
            var serviceList = serviceDescriptionParam.ServiceList;

            if (serviceList == null) return;
            foreach (Discovery.Provider.ssdp.Service service in serviceList)
            {
                if (!service.BaseUrl.EndsWith("/"))
                {
                    service.BaseUrl += "/";
                }

                if (service.ServiceType.Contains(AV_TRANSPORT))
                {
                    avTransportUrl = MakeControlUrl(service.BaseUrl, service.ControlUrl);
                }
                else if ((service.ServiceType.Contains(RENDERING_CONTROL)) && !(service.ServiceType.Contains(GROUP_RENDERING_CONTROL)))
                {
                    renderingControlUrl = MakeControlUrl(service.BaseUrl, service.ControlUrl);
                }
                else if ((service.ServiceType.Contains(CONNECTION_MANAGER)))
                {
                    connectionControlUrl = MakeControlUrl(service.BaseUrl, service.ControlUrl);
                }
            }
        }
Ejemplo n.º 14
0
        public override void SetServiceDescription(ServiceDescription serviceDescriptionParam)
        {
            base.SetServiceDescription(serviceDescriptionParam);

            UpdateControlUrl(serviceDescriptionParam);
        }
        private void NotifyListenersOfNewService(ServiceDescription service)
        {
            var serviceIds = ServiceIdsForFilter(service.ServiceFilter);
            ServiceDescription newService = null;

            foreach (var serviceId in serviceIds)
            {
                var _newService = service.Clone();

                _newService.ServiceId = serviceId;

                //if (newService == null)
                //    newService = _newService;

                foreach (var listener in serviceListeners)
                {
                    listener.OnServiceAdded(this, _newService);
                }
            }
        }
        public override void SetServiceDescription(ServiceDescription serviceDescription)
        {
            base.SetServiceDescription(serviceDescription);

            if (serviceDescription.Port != 8080)
                serviceDescription.Port = 8080;
        }
        public NetcastTvService(ServiceDescription serviceDescription, ServiceConfig serviceConfig)
            : base(serviceDescription, serviceConfig)
        {
            dlnaService = new DlnaService(serviceDescription, serviceConfig);

            if (serviceDescription != null && serviceDescription.Port != 8080)
                serviceDescription.Port = 8080;

            applications = new List<AppInfo>();
            subscriptions = new List<IServiceSubscription>();

            keyboardstring = new StringBuilder();

            httpClient = new HttpClient();
            inputPickerSession = null;
        }
        private void HandleDatagramPacket(ParsedDatagram pd)
        {
            if (pd == null || pd.DataPacket.Length == 0)
                return;

            var serviceFilter = pd.Data[pd.PacketType.Equals(SSDP.SlNotify) ? SSDP.Nt : SSDP.St];

            if (serviceFilter == null || SSDP.SlMsearch.Equals(pd.PacketType) || !IsSearchingForFilter(serviceFilter))
                return;

            var usnKey = pd.Data[SSDP.Usn];

            if (string.IsNullOrEmpty(usnKey))
                return;

            var m = uuidReg.Match(usnKey);

            if (!m.Success)
                return;

            var uuid = m.Value;

            if (pd.Data.ContainsKey(SSDP.Nts) && SSDP.NtsByebye.Equals(pd.Data[SSDP.Nts]))
            {
                var service = foundServices[uuid];

                if (service != null)
                {
                    ServiceDescription fsrv;
                    foundServices.TryRemove(uuid, out fsrv);
                    NotifyListenersOfLostService(service);
                }
            }
            else
            {
                var location = pd.Data[SSDP.Location];

                if (string.IsNullOrEmpty(location))
                    return;

                var foundService = foundServices.ContainsKey(uuid) ? foundServices[uuid] : null;
                var discoverdService = discoveredServices.ContainsKey(uuid) ? discoveredServices[uuid] : null;

                var isNew = foundService == null && discoverdService == null;

                if (isNew)
                {
                    foundService = new ServiceDescription { Uuid = uuid, ServiceFilter = serviceFilter };

                    Logger.Current.AddMessage("SSDPDiscoveryProvider reported new service found: id: " + foundService.Uuid);
                    var u = new Uri(location);
                    foundService.IpAddress = u.DnsSafeHost;//pd.dp.IpAddress.getHostAddress();
                    foundService.Port = 3000;

                    if (!discoveredServices.ContainsKey(uuid))
                        discoveredServices.TryAdd(uuid, foundService);

                    GetLocationData(location, uuid, serviceFilter);
                    //Logger.Current.AddMessage("SSDPDiscoveryProvider reported new service found: id: " + foundService.ServiceId + " id :" + foundService.Uuid);
                }

                if (foundService != null)
                    foundService.LastDetection = DateTime.Now.Ticks;
            }
        }