예제 #1
0
        private DOWNLOADFILESTATUS GetUpdateFromURL(string url, string zipfilename, string filename)
        {
            AutoDecompressionWebClient cl     = new AutoDecompressionWebClient();
            DOWNLOADFILESTATUS         status = cl.DownloadFileIfNewer(url, zipfilename, true, true, Password);

            return(status);
        }
예제 #2
0
 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);
 }
예제 #3
0
        /// <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);
        }
예제 #4
0
 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);
 }
예제 #5
0
 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);
 }
예제 #6
0
 // 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);
 }