AirScout/AirScout.Aircrafts/PlaneInfoConverter.cs

435 wiersze
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using AirScout.Aircrafts;
using ScoutBase.Core;
namespace AirScout.Aircrafts
{
public class PlaneInfoConverter
{
public PlaneInfoConverter()
{
}
private bool IsHex(string s)
{
bool b;
try
{
b = !s.ToCharArray().Any(c => !"0123456789abcdefABCDEF".Contains(c));
}
catch (Exception ex)
{
b = false;
}
return b;
}
private bool IsInt(string s)
{
bool b;
try
{
b = !s.ToCharArray().Any(c => !"0123456789".Contains(c));
}
catch (Exception ex)
{
b = false;
}
return b;
}
private bool IsDouble(string s)
{
bool b;
try
{
// double should contain only following chars
b = !s.ToCharArray().Any(c => !"+-.,E0123456789".Contains(c));
// double must contain a decimal separator
if (b)
{
b = s.Contains(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
}
}
catch (Exception ex)
{
b = false;
}
return b;
}
private bool IsOct(string s)
{
bool b;
try
{
b = !s.ToCharArray().Any(c => !"01234567".Contains(c));
}
catch (Exception ex)
{
b = false;
}
return b;
}
public DateTime To_UTC(string s)
{
if (String.IsNullOrEmpty(s))
return DateTime.MinValue;
s = s.Replace("\"", String.Empty).Trim();
// UTC must be a 10 character value
if (s.Length < 10)
return DateTime.MinValue;
// try to convert UNIX time first
if (IsInt(s))
{
try
{
// try to convert to UTC timestamp
long l = System.Convert.ToInt64(s);
DateTime timestamp = new System.DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
timestamp = timestamp.AddSeconds(l);
return timestamp;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
}
// check for Standard DateTime notation
try
{
// try to convert to UTC timestamp
DateTime timestamp;
if (DateTime.TryParse(s, out timestamp))
return timestamp;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return DateTime.MinValue;
}
public string To_Hex(string s)
{
if (String.IsNullOrEmpty(s))
return null;
s = s.Replace("\"", String.Empty).ToUpper().Trim();
// Hex must be a 6 character value
if (s.Length != 6)
return null;
if (!IsHex(s))
return null;
try
{
// try to convert to Hex value
long hex = System.Convert.ToInt64(s, 16);
// check boundaries
if ((hex < 0) || (hex > 16777215))
return null;
return s;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return null;
}
public string To_Reg(string s)
{
if (String.IsNullOrEmpty(s))
return null;
s = s.Replace("\"", String.Empty).ToUpper().Trim();
if (s.Length < AircraftData.Database.AircraftRegistrationMinLength + 1)
return null;
if (!s.Contains('-') && !s.StartsWith("N"))
return null;
try
{
// try to find the registration string in aircraft registration database
AircraftRegistrationDesignator reg = AircraftData.Database.AircraftRegistrationFindByReg(s);
if (reg != null)
return s;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return null;
}
public string To_Flight(string s)
{
if (String.IsNullOrEmpty(s))
return null;
s = s.Replace("\"", String.Empty).ToUpper().Trim();
if (s.Length < 3)
return null;
string iata = s.Substring(0, 2);
string flightnumber = s.Substring(2);
if (!IsInt(flightnumber))
return null;
try
{
// try to find the string in IATA airline database
AirlineDesignator airline = AircraftData.Database.AirlineFindByIATA(iata);
if (airline != null)
return s;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return null;
}
public string To_Type(string s, bool checktype = true)
{
if (String.IsNullOrEmpty(s))
return null;
s = s.Replace("\"", String.Empty).ToUpper().Trim();
// check for alphanumeric values only
if (!s.All(char.IsLetterOrDigit))
return null;
if (s.Length < AircraftData.Database.AircraftTypeICAOMinLength)
return null;
try
{
if (!checktype)
return s;
// try to find the string in aircraft registration database
AircraftTypeDesignator type = AircraftData.Database.AircraftTypeFindByICAO(s);
if (type != null)
return s;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return null;
}
public string To_Radar(string s)
{
if (String.IsNullOrEmpty(s))
return null;
s = s.Replace("\"", String.Empty).ToUpper().Trim();
if (s.Length < 3)
return null;
try
{
// Radars will have a letter in first char and "-" as second char
if (Char.IsLetter(s[0]) && (s[1] == '-'))
return s;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return null;
}
public string To_Route(string s)
{
if (String.IsNullOrEmpty(s))
return null;
s = s.Replace("\"", String.Empty).ToUpper().Trim();
// Routes will have a "-" between two IATA airport codes
if (s.Length < 9)
return null;
int index = s.IndexOf('-');
if ((index < 3) || (index > s.Length - 3))
return null;
string from = s.Substring(0, index - 1);
string to = s.Substring(index + 1);
try
{
if (AircraftData.Database.AirportFindByICAO(from) == null)
return null;
if (AircraftData.Database.AirportFindByICAO(to) == null)
return null;
return s;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return null;
}
public string To_Call(string s, bool checkairline = true)
{
if (String.IsNullOrEmpty(s))
return null;
s = s.Replace("\"", String.Empty).ToUpper().Trim();
// check length
if (s.Length < 4)
return null;
if (s.Contains('-'))
return null;
// check for numeric flight number
string icao = s.Substring(0, 3);
try
{
if (!checkairline)
return s;
// try to find the string in aircraft registration database
AirlineDesignator airline = AircraftData.Database.AirlineFindByICAO(icao);
if (airline != null)
return s;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return null;
}
public int To_Squawk(string s)
{
s = s.Replace("\"", String.Empty).ToUpper().Trim();
// check length
if (s.Length != 4)
return int.MinValue;
if (!IsOct(s))
return int.MinValue;
try
{
// check for octal number
// try to convert to Hex value
long oct = System.Convert.ToInt64(s, 8);
// check boundaries
if ((oct >= 0) && (oct <= 4095))
return (int)oct;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return int.MinValue;
}
public double To_Lat(string s)
{
s = s.Replace("\"", String.Empty).Trim();
if (s.Length < 3)
return double.MinValue;
// double Lon must contain a decimal separator
if (s.IndexOf(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator) < 0)
return double.MinValue;
try
{
// try to convert to double
double d = System.Convert.ToDouble(s);
// check bounds
if ((d >= -90.0) && (d <= 90.0))
return d;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return double.MinValue;
}
public double To_Lon(string s)
{
s = s.Replace("\"", String.Empty).Trim();
if (s.Length < 3)
return double.MinValue;
// double Lon must contain a decimal separator
if (s.IndexOf(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator) < 0)
return double.MinValue;
try
{
// try to convert to double
double d = System.Convert.ToDouble(s);
// check bounds
if ((d >= -180.0) && (d <= 180.0))
return d;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return double.MinValue;
}
public int To_Alt(string s)
{
s = s.Replace("\"", String.Empty).Trim();
if (s.Length > 5)
return int.MinValue;
if (!IsInt(s))
return int.MinValue;
try
{
// try to convert to integer
long alt = System.Convert.ToInt64(s);
// check bounds
if ((alt >= 0) && (alt <= 100000))
return (int)alt;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return int.MinValue;
}
public int To_Track(string s)
{
s = s.Replace("\"", String.Empty).Trim();
if (s.Length > 3)
return int.MinValue;
if (!IsInt(s))
return int.MinValue;
try
{
// try to convert to integer
long track = System.Convert.ToInt64(s);
// check bounds
if ((track >= 0) && (track < 360))
return (int)track;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return int.MinValue;
}
public int To_Speed(string s)
{
s = s.Replace("\"", String.Empty).Trim();
if (s.Length > 3)
return int.MinValue;
if (!IsInt(s))
return int.MinValue;
try
{
// try to convert to integer
long speed = System.Convert.ToInt64(s);
// check bounds
if ((speed >= 0) && (speed <= 800))
return (int)speed;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + s);
}
return int.MinValue;
}
}
}