AirScout/AirScout.Aircrafts/PlaneInfoChecker.cs

222 wiersze
6.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AirScout.Core;
namespace AirScout.Aircrafts
{
public static class PlaneInfoChecker
{
public static bool Check_Hex(string hex)
{
if (String.IsNullOrEmpty(hex))
return false;
hex = hex.Replace("\"", String.Empty).ToUpper().Trim();
// Hex must be a 6 character value
if (hex.Length != 6)
return false;
if (hex.ToCharArray().Any(c => !"0123456789ABCDEF".Contains(c)))
return false;
try
{
// try to convert to Hex value
long h = System.Convert.ToInt64(hex, 16);
// check boundaries
if ((h < 0) || (h > 16777215))
return false;
}
catch (Exception ex)
{
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message + ": " + hex);
return false;
}
return true;
}
public static bool Check_Call(string call)
{
if (String.IsNullOrEmpty(call))
return false;
if (String.IsNullOrWhiteSpace(call))
return false;
if (call.Contains("[unknown]"))
return false;
call = call.Replace("\"", String.Empty).ToUpper().Trim();
// check length
if (call.Length < 4)
return false;
if (call.Contains('-'))
return false;
string airline = "";
// Type B callsign?
if (char.IsNumber(call[2]))
{
airline = call.Substring(0, 2);
if (AircraftData.Database.AirlineFindByIATA(airline) == null)
return false;
}
// Type C callsign
if (!Char.IsLetter(call[0]) || !char.IsLetter(call[1]))
return false;
airline = call.Substring(0, 3);
if (AircraftData.Database.AirlineFindByICAO(airline) == null)
return false;
return true;
}
public static bool Check_Reg(string reg)
{
if (String.IsNullOrEmpty(reg))
return false;
if (String.IsNullOrWhiteSpace(reg))
return false;
if (reg.Contains("[unknown]"))
return false;
reg = reg.Replace("\"", String.Empty).ToUpper().Trim();
if (reg.Length < AircraftData.Database.AircraftRegistrationMinLength + 1)
return false;
if (!reg.Contains('-') && !reg.StartsWith("N") && !reg.StartsWith("H"))
return false;
return true;
}
public static bool Check_Lat(double lat)
{
if (double.IsNaN(lat))
return false;
if (lat < -90)
return false;
if (lat > 90)
return false;
return true;
}
public static bool Check_Lon(double lon)
{
if (double.IsNaN(lon))
return false;
if (lon < -180)
return false;
if (lon > 180)
return false;
return true;
}
public static bool Check_Alt(double alt)
{
if (double.IsNaN(alt))
return false;
if (alt < 0)
return false;
if (alt > 100000.0)
return false;
return true;
}
public static bool Check_Track(double track)
{
if (double.IsNaN(track))
return false;
if (track < 0)
return false;
if (track >= 360)
return false;
return true;
}
public static bool Check_Speed(double speed)
{
if (double.IsNaN(speed))
return false;
if (speed < 0)
return false;
if (speed > 800)
return false;
return true;
}
public static bool Check_Type(string type)
{
if (String.IsNullOrEmpty(type))
return false;
if (String.IsNullOrWhiteSpace(type))
return false;
if (type.Contains("[unknown]"))
return false;
type = type.Replace("\"", String.Empty).ToUpper().Trim();
// check for alphanumeric values only
if (!type.All(char.IsLetterOrDigit))
return false;
if (type.Length < AircraftData.Database.AircraftTypeICAOMinLength)
return false;
return true;
}
public static bool Check_Manufacturer(string manufacturer)
{
if (String.IsNullOrEmpty(manufacturer))
return false;
return true;
}
public static bool Check_Model(string model)
{
if (String.IsNullOrEmpty(model))
return false;
return true;
}
public static bool Check_Airport(string airport)
{
if (String.IsNullOrEmpty(airport))
return false;
return true;
}
public static bool Check(PlaneInfo info)
{
// checks a PlaneInfo object
// returns TRUE if contains all mandantory data
// get a plane info converter for plausiblity check
PlaneInfoConverter C = new PlaneInfoConverter();
// check hex
if (String.IsNullOrEmpty(C.To_Hex(info.Hex)))
return false;
// check call
if (String.IsNullOrEmpty(C.To_Call(info.Call, false)))
return false;
if (info.Time == null)
return false;
if (info.Time == DateTime.MinValue)
return false;
if (info.Time == DateTime.MaxValue)
return false;
if (info.Lat > 90)
return false;
if (info.Lat < -90)
return false;
if (info.Lon > 180)
return false;
if (info.Lon < -180)
return false;
if (info.Alt < 0)
return false;
if (info.Alt > 100000)
return false;
if (info.Track > 360)
return false;
if (info.Track < 0)
return false;
if (info.Speed < 0)
return false;
if (info.Speed > 5000)
return false;
return true;
}
}
}