public FavoriteLocation(StationLocation station)
 {
     this.Station = station;
     this.Name = station.Name;
     this.City = station.City;
     this.Address = station.Address;
     this.Coordinate = new GeoCoordinate(station.Latitude, station.Longitude);
     this.FavoriteType = Model.FavoriteType.Station;
 }
        public override IObservable<StationAndAvailability> GetAvailability2(StationLocation station, bool forceUpdate = false)
        {
            if (!forceUpdate)
            {
                var availability = GetAvailabilityFromCache(station);
                if (availability.Availability != null)
                    return Observable.Return<StationAndAvailability>(availability);
            }

            return DownloadStationsWithAvailability(station.City)
                .Select(sl => sl.Where(sa => sa.Station.Number == station.Number).FirstOrDefault());
        }
        public override IObservable<StationAndAvailability> GetAvailability2(StationLocation station, bool forceUpdate = false)
        {
            if (!forceUpdate)
            {
                var availability = GetAvailabilityFromCache(station);
                if (availability.Availability != null)
                    return Observable.Return<StationAndAvailability>(availability);
            }

            return DownloadUrl.GetAsync<AzureService.StationInfo>(GetStationDetailsUri(station.City, station.Number.ToString()), AzureServiceCredentials.AuthHeaders)
                .Retry(1)
                .ObserveOn(ThreadPoolScheduler.Instance)
                .Select(s =>
                {
                    var sa = new StationAndAvailability(station, s.GetAvailability());
                    UpdateAvailabilityCacheItem(sa);
                    return sa;
                });
        }
        public override IObservable<StationAndAvailability> GetAvailability2(StationLocation station, bool forceUpdate = false)
        {
            if (!forceUpdate)
            {
                var availability = GetAvailabilityFromCache(station);
                if (availability.Availability != null)
                    return Observable.Return<StationAndAvailability>(availability);
            }

            switch (station.City)
            {
                case "antwerpen":
                    var urlData = string.Format("idStation={0}&s_id_idioma=en", station.Number);
                    return DownloadUrl.PostAsync(StationInfoUrl(station.City), urlData, station)
                        .Retry(1)
                        .ObserveOn(ThreadPoolScheduler.Instance)
                        .Select(s =>
                        {
                            var availability = LoadAvailabilityFromHTML(s.Object);
                            availability.Open = station.Open;
                            availability.Connected = true;
                            var sa = new StationAndAvailability(station, availability);
                            UpdateAvailabilityCacheItem(sa);
                            return sa;
                        });

                case "stockholm":
                    return DownloadUrl.GetAsync(string.Format(StationInfoUrl(station.City), station.Number))
                        .Retry(1)
                        .ObserveOn(ThreadPoolScheduler.Instance)
                        .Select(s =>
                        {
                            var availability = LoadAvailabilityFromHTML2(s);
                            availability.Open = station.Open;
                            availability.Connected = true;
                            var sa = new StationAndAvailability(station, availability);
                            UpdateAvailabilityCacheItem(sa);
                            return sa;
                        });

                default:
                    return base.GetAvailability2(station, forceUpdate);
            }
        }
 protected StationAndAvailability GetAvailabilityFromCache(StationLocation station)
 {
     StationAndAvailability result = new StationAndAvailability(station, null);
     CachedAvailability availability = null;
     lock (AvailabilityCache)
     {
         if (AvailabilityCache.TryGetValue(station.City + station.Number.ToString(), out availability) && !availability.IsOutdated(MaxCacheAge))
             result.Availability = availability.Availability;
     }
     return result;
 }
 public bool IsAvailabilityValid(StationLocation station)
 {
     CachedAvailability availability;
     lock (AvailabilityCache)
     {
         return (AvailabilityCache.TryGetValue(station.City + station.Number.ToString(), out availability) && !availability.IsOutdated(MaxCacheAge));
     }
 }
 public virtual IObservable<StationAndAvailability> GetAvailability2(StationLocation station, bool forceUpdate = false)
 {
     return null;
 }
 public virtual IObservable<StationAvailability> GetAvailability(StationLocation station, bool forceUpdate = false)
 {
     return GetAvailability2(station, forceUpdate)
         .Select(a => a != null ? a.Availability : null);
 }
 public City GetCityForStation(StationLocation station)
 {
     City result = null;
     if (station != null)
     {
         result = City;
         if (result == null || result.Provider == null || !string.Equals(station.City, result.UrlCityName))
             result = BikeServiceProvider.FindByCityName(station.City);
     }
     return result;
 }
 public override IObservable<StationAndAvailability> GetAvailability2(StationLocation station, bool forceUpdate = false)
 {
     var city = FindCity(station.City);
     return city.Provider.GetAvailability2(station, forceUpdate);
 }
 public IObservable<StationAvailability> GetAvailability(StationLocation station, bool forceUpdate = false)
 {
     City scity = null;
     if (!GetCityForStation(station, out scity))
     {
         // maybe notify/log the error
         return Observable.Empty<StationAvailability>();
     }
     else
         return scity.Provider
             .GetAvailability(station, forceUpdate)
             .Do(a =>
             {
                 if (a != null)
                     station.Open = a.Open;
             });
 }
 public bool IsAvailabilityValid(StationLocation station)
 {
     City scity = null;
     if (!GetCityForStation(station, out scity))
     {
         // maybe notify/log the error
         return false;
     }
     else
         return scity.Provider.IsAvailabilityValid(station);
 }
 public bool GetCityForStation(StationLocation station, out City scity)
 {
     scity = GetCityForStation(station);
     return scity != null;
 }
        private static List<StationAndAvailability> LoadStationsFromHTML(string stationsStr, string cityName)
        {
            if (string.IsNullOrWhiteSpace(stationsStr))
                return null;
            List<StationAndAvailability> stations = new List<StationAndAvailability>();

            const string CDataStr = @"""data"":""[{";
            const string CDataEndStr = @"}]"",""";
            var dataStart = stationsStr.IndexOf(CDataStr);
            if (dataStart > 0)
            {
                dataStart += CDataStr.Length - 2;
                var dataEnd = stationsStr.IndexOf(CDataEndStr, dataStart);
                if (dataEnd > 0)
                {
                    stationsStr = stationsStr.Substring(dataStart, dataEnd - dataStart + 2);
                }
            }

            stationsStr = Regex.Unescape(stationsStr);
            List<BicingAvailability> availabilityList = stationsStr.FromJson<List<BicingAvailability>>();
            foreach (var item in availabilityList)
            {
                if (string.IsNullOrEmpty(item.AddressStreet1))
                    continue;

                var station = new StationLocation();
                station.Name = item.StationName;
                station.Number = item.StationID;
                station.Latitude = item.AddressGmapsLatitude;
                station.Longitude = item.AddressGmapsLongitude;
                station.Open = item.StationStatusCode == "OPN";
                station.Address = item.AddressStreet1;
                station.City = cityName;
                if (!string.IsNullOrEmpty(item.AddressNumber))
                    station.Address += " " + item.AddressNumber;

                var availability = new StationAvailability();
                availability.Available = item.StationAvailableBikes;
                availability.Free = item.StationFreeSlot;
                availability.Total = availability.Available + availability.Free;
                availability.Open = station.Open;

                stations.Add(new StationAndAvailability(station, availability));
            }
            return stations;
        }
 public StationAndAvailability(StationLocation station, StationAvailability availability)
 {
     this.Station = station;
     this.Availability = availability;
 }
 public LocationState(StationLocation location)
 {
     this.Location = location;
 }
 public IObservable<StationAndAvailability> GetAvailability2(StationLocation station)
 {
     City scity = null;
     if (!GetCityForStation(station, out scity))
     {
         // maybe notify/log the error
         return Observable.Empty<StationAndAvailability>();
     }
     else
         return scity.Provider
             .GetAvailability2(station)
             .Do(a =>
             {
                 if (a != null && a.Availability != null)
                     station.Open = a.Availability.Open;
             });
 }