private DOWNLOADFILESTATUS GetUpdateFromURL(string url, string zipfilename, string filename) { AutoDecompressionWebClient cl = new AutoDecompressionWebClient(); DOWNLOADFILESTATUS status = cl.DownloadFileIfNewer(url, zipfilename, true, true, Password); return(status); }
private bool ReadAircraftsFromURL(string url, string filename) { try { AutoDecompressionWebClient cl = new AutoDecompressionWebClient(); DOWNLOADFILESTATUS status = cl.DownloadFileIfNewer(url, filename, true, true, Password); if (((status & DOWNLOADFILESTATUS.ERROR) > 0) && ((status & DOWNLOADFILESTATUS.ERROR) > 0)) { this.ReportProgress(-1, "Error while downloading and extracting " + filename); return(false); } else if (((status & DOWNLOADFILESTATUS.NEWER) > 0) || ((status & DOWNLOADFILESTATUS.NOTNEWER) > 0)) { string json = ""; using (StreamReader sr = new StreamReader(filename)) json = sr.ReadToEnd(); List <AirScout.Aircrafts.AircraftDesignator> ads = AircraftData.Database.AircraftFromJSON(json); // check for invalid entries foreach (AircraftDesignator ad in ads) { if (String.IsNullOrEmpty(ad.Call)) { ad.Call = "[unknown]"; } if (String.IsNullOrEmpty(ad.Reg)) { ad.Reg = "[unknown]"; } if (String.IsNullOrEmpty(ad.TypeCode)) { ad.TypeCode = "[unknown]"; } } // check for empty database if (AircraftData.Database.AircraftCount() == 0) { // do bulk insert AircraftData.Database.AircraftBulkInsert(ads); } else { // do bulk update AircraftData.Database.AircraftBulkInsertOrUpdateIfNewer(ads); } return(true); } } catch (Exception ex) { // Error loading database this.ReportProgress(-1, "[" + url + "]: " + ex.ToString()); } return(false); }
/// <summary> /// Downloads a file from a web resource only if it is newer or not found locally. /// </summary> /// <param name="address">The address of web resource.</param> /// <param name="filename">The filename for local store.</param> /// <param name="allowredirect">Allows redirection of requested source.</param> /// <param name="autounzip">Try to download a zipped version first.</param> /// <returns>A DOWNLOADFILESTATUS object containing status information.</returns> public DOWNLOADFILESTATUS DownloadFileIfNewer(string address, string filename, bool allowredirect, bool autounzip, string password = "") { string downloadaddress; string downloadfilename; DOWNLOADFILESTATUS ds = DOWNLOADFILESTATUS.UNKNOWN; try { // <filename.ext> downloadaddress = address; downloadfilename = filename; ds = DownloadFileFromWebIfNewer(downloadaddress, downloadfilename, allowredirect, autounzip, password); // return here if successful if ((ds == DOWNLOADFILESTATUS.NEWER) || (ds == DOWNLOADFILESTATUS.NOTNEWER)) { return(ds); } // try to download other extensions if (autounzip) { // <filename.zip> downloadaddress = address.Substring(0, address.LastIndexOf(".")) + ".zip"; downloadfilename = filename.Replace(Path.GetExtension(filename), ".zip"); ds = DownloadFileFromWebIfNewer(downloadaddress, downloadfilename, allowredirect, autounzip, password); // return here if successful if ((ds == DOWNLOADFILESTATUS.NEWER) || (ds == DOWNLOADFILESTATUS.NOTNEWER)) { return(ds); } // <filename.ext.zip> downloadaddress = address + ".zip"; downloadfilename = filename + ".zip"; ds = DownloadFileFromWebIfNewer(downloadaddress, downloadfilename, allowredirect, autounzip, password); // return here if successful if ((ds == DOWNLOADFILESTATUS.NEWER) || (ds == DOWNLOADFILESTATUS.NOTNEWER)) { return(ds); } } return(DOWNLOADFILESTATUS.NOTFOUND); } catch (Exception ex) { if (ex is WebException) { Console.WriteLine("[DownloadFileIfNewer] WebException while reading address: " + address + "\n" + "URI of orginal request=" + address + "\n" + "URI of responding server=" + ((WebException)ex).Response.ResponseUri + "\n" + ex.ToString()); } else { Console.WriteLine("[DownloadFileIfNewer] Error while reading address: " + address + "\n" + ex.ToString()); } } return(DOWNLOADFILESTATUS.ERROR); }
private bool ReadLocationsFromURL(string url, string zipfilename, string filename) { try { DOWNLOADFILESTATUS status = GetUpdateFromURL(url, zipfilename, filename); if (((status & DOWNLOADFILESTATUS.ERROR) > 0) && ((status & DOWNLOADFILESTATUS.NOTFOUND) > 0)) { this.ReportProgress(-1, "Error while downloading and extracting " + filename); return(false); } else if (((status & DOWNLOADFILESTATUS.NEWER) > 0) || ((status & DOWNLOADFILESTATUS.NOTNEWER) > 0)) { string json = ""; using (StreamReader sr = new StreamReader(filename)) json = sr.ReadToEnd(); List <LocationDesignator> tmp = StationData.Database.LocationFromJSON(json); List <LocationDesignator> lds = new List <LocationDesignator>(); foreach (LocationDesignator ld in tmp) { // skip locations outsid area of interest if option set if (StartOptions.RestrictToAreaOfInterest && ((ld.Lat < StartOptions.MinLat) || (ld.Lat > StartOptions.MaxLat) || (ld.Lon < StartOptions.MinLon) || (ld.Lon > StartOptions.MaxLon))) { continue; } lds.Add(ld); if (this.CancellationPending) { return(false); } // reduce CPU load Thread.Sleep(1); } // check for empty database if (StationData.Database.LocationCount() == 0) { // do bulk insert StationData.Database.LocationBulkInsert(lds); } else { // do bulk update StationData.Database.LocationBulkInsertOrUpdateIfNewer(lds); } return(true); } } catch (Exception ex) { // Error loading database this.ReportProgress(-1, "[" + url + "]: " + ex.ToString()); } return(false); }
private bool ReadLocationsFromURL(string url, string filename) { try { AutoDecompressionWebClient cl = new AutoDecompressionWebClient(); DOWNLOADFILESTATUS status = cl.DownloadFileIfNewer(url, filename, true, true); if ((status & DOWNLOADFILESTATUS.ERROR) > 0) { Log.WriteMessage("Error while downloading and extracting " + filename, LogLevel.Error); return(false); } else if (((status & DOWNLOADFILESTATUS.NEWER) > 0) || ((status & DOWNLOADFILESTATUS.NOTNEWER) > 0)) { string json = ""; using (StreamReader sr = new StreamReader(filename)) json = sr.ReadToEnd(); List <LocationDesignator> lds = StationData.Database.LocationFromJSON(json); // chek for empty database if (StationData.Database.LocationCount() == 0) { // do bulk insert StationData.Database.LocationBulkInsert(lds); } else { // do update on single elements foreach (LocationDesignator ld in lds) { StationData.Database.LocationInsertOrUpdateIfNewer(ld); // return if cancellation is pending if (bw_DatabaseUpdater.CancellationPending) { return(false); } } } return(true); } } catch (Exception ex) { // Error loading database Log.WriteMessage("[" + url + "]: " + ex.ToString(), LogLevel.Error); } return(false); }
// TRICKY: process a single elevation tile. // does check the database for elevation tile is already inside // returns true + elevation tile to collect tile for bulk insert // return true + null if elevation tile found and updated // returns false + null in case of errors private bool UpdateElevationTileFromURL(string tilename, DateTime lastupdated, ELEVATIONMODEL model, out ElevationTileDesignator tile) { try { // this.ReportProgress((int)DATABASESTATUS.UPDATING, "Processing " + tilename + "..."); DateTime tilelastupdated = ElevationData.Database.ElevationTileFindLastUpdated(new ElevationTileDesignator(tilename.Substring(0, 6).ToUpper()), model); // elevation tile found --> tilelastupdated contains timedstamp // elevation tile not found --> tilelastupdated = DateTime.MinValue TimeSpan diff = lastupdated - tilelastupdated; // check if catalogue tile is newer if (diff.TotalMinutes > 5) { // download elevation zip file and unzip string square = tilename.Substring(0, 4).ToUpper(); string zipfilename = Path.Combine(ElevationData.Database.DefaultDatabaseDirectory(model), square + ".zip"); string zipurl = ElevationData.Database.UpdateURL(model) + "/" + tilename.Substring(0, 2) + "/" + tilename.Substring(0, 4) + ".zip"; string filename = Path.Combine(ElevationData.Database.DefaultDatabaseDirectory(model), tilename); if (!File.Exists(filename)) { this.ReportProgress(0, StartOptions.Name + ": downloading " + Path.GetFileName(zipfilename) + "..."); try { // download zipfile if newer AutoDecompressionWebClient client = new AutoDecompressionWebClient(); DOWNLOADFILESTATUS status = client.DownloadFileIfNewer(zipurl, zipfilename, true, true); } catch (Exception ex) { this.ReportProgress(-1, ex.ToString()); try { // try to delete zip file anyway File.Delete(zipfilename); } catch { } } try { // delete zipfile if cache is disabled if (!StartOptions.FileCacheEnabled) { File.Delete(zipfilename); } } catch (Exception ex) { this.ReportProgress(-1, "Error deleting zipfile [" + zipfilename + "]: " + ex.ToString()); } // new zip file extracted, assuming that the remaining *.loc files are orphans // --> try to delete everything but current square and catalogue // cleanup all *.loc files foreach (string f in Directory.EnumerateFiles(ElevationData.Database.DefaultDatabaseDirectory(model), "*.loc")) { try { if (!f.Contains(square)) { File.Delete(f); } } catch (Exception ex) { this.ReportProgress(-1, "Error deleting locfile [" + f + "]: " + ex.ToString()); } } } // wait at last 60sec for file is being unzipped or throw FileNotFOundException if not // unzip procedure is sometimes returning the results with delay int timeout = 0; while (!File.Exists(filename)) { if (timeout > 600) { throw new FileNotFoundException("Elevation file not found. " + filename); } Thread.Sleep(100); if (this.CancellationPending) { break; } timeout++; } string json = ""; using (StreamReader sr = new StreamReader(File.OpenRead(filename))) { json = sr.ReadToEnd(); } if (!string.IsNullOrEmpty(json)) { JsonSerializerSettings settings = new JsonSerializerSettings(); settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; settings.FloatFormatHandling = FloatFormatHandling.String; settings.Formatting = Newtonsoft.Json.Formatting.Indented; tile = JsonConvert.DeserializeObject <ElevationTileDesignator>(json, settings); // perform a single update if elevation tile was already found in database if (tilelastupdated != DateTime.MinValue) { ElevationData.Database.ElevationTileUpdate(tile, model); tile = null; } // return tile to be collected for bulk insert in main procedure return(true); } File.Delete(filename); } else { // tile found and up to date --> nothing to do tile = null; return(true); } } catch (Exception ex) { this.ReportProgress(-1, ex.ToString() + ": tilename=" + tilename); } tile = null; return(false); }