private void RecievedEDDNData(object sender, EDDN.EDDNRecievedArgs e)
{
String[] DataRows = new String[0];
String nameAndVersion = String.Empty;
String name = String.Empty;
String uploaderID = String.Empty;
Boolean SimpleEDDNCheck = false;
List<String> importData = new List<String>();
enSchema ownSchema;
enSchema dataSchema;
bool isTrusty = false;
try
{
if (m_lDBCon.getIniValue<Boolean>("EDDN", "SpoolEDDNToFile", false.ToString(), false))
{
if (m_EDDNSpooler == null)
{
if (!File.Exists(Program.GetDataPath(@"Logs\EddnOutput.txt")))
m_EDDNSpooler = File.CreateText(Program.GetDataPath(@"Logs\EddnOutput.txt"));
else
m_EDDNSpooler = File.AppendText(Program.GetDataPath(@"Logs\EddnOutput.txt"));
}
m_EDDNSpooler.WriteLine(e.RawData);
}
ownSchema = m_lDBCon.getIniValue<enSchema>(IBE.EDDN.EDDNView.DB_GROUPNAME, "Schema", "Real", false);
switch (e.InfoType)
{
case EDDN.EDDNRecievedArgs.enMessageInfo.Commodity_v1_Recieved:
UpdateStatisticDataMsg(enMessageTypes.Commodity_V1);
//Debug.Print("recieved commodity message ignored");
UpdateRawData(String.Format("{0}\r\n(from {2})\r\n{1}", e.Message, e.RawData, e.Adress));
break;
case EDDN.EDDNRecievedArgs.enMessageInfo.Commodity_v2_Recieved:
UpdateStatisticDataMsg(enMessageTypes.Commodity_V2);
//Debug.Print("recieved commodity message ignored");
UpdateRawData(String.Format("{0}\r\n(from {2})\r\n{1}", e.Message, e.RawData, e.Adress));
break;
case EDDN.EDDNRecievedArgs.enMessageInfo.Commodity_v3_Recieved:
JObject dataJObject = (JObject)e.Data;
if(m_DuplicateRelayFilter.DataAccepted(dataJObject.SelectToken("header.uploaderID").ToString(), dataJObject.SelectToken("message.systemName") + "|" + dataJObject.SelectToken("message.stationName"),
dataJObject.SelectToken("message.commodities").Count().ToString(), (DateTime)dataJObject.SelectToken("message.timestamp")))
{
UpdateStatisticDataMsg(enMessageTypes.Commodity_V3);
UpdateRawData(String.Format("{0}\r\n(from {2})\r\n{1}", e.Message, e.RawData, e.Adress));
// process only if it's the correct schema
dataSchema = dataJObject.SelectToken("$schemaRef").Contains("/test") ? enSchema.Test : enSchema.Real;
if (ownSchema == dataSchema)
{
//Debug.Print("handle v3 message");
// Don't import our own uploads...
if (dataJObject.SelectToken("header.uploaderID").ToString() != UserIdentification())
{
DataRows = ConvertCommodityV3_To_CSVRows(dataJObject);
nameAndVersion = String.Format("{0} / {1}", dataJObject.SelectToken("header.softwareName"), dataJObject.SelectToken("header.softwareVersion"));
name = String.Format("{0}", dataJObject.SelectToken("header.softwareName"));
uploaderID = dataJObject.SelectToken("header.uploaderID").ToString();
if(name == "ED-IBE (API)")
Debug.Print("handle v3 ^recieved : " + name);
}
//else
//Debug.Print("handle v3 rejected (it's our own message)");
}
//else
//Debug.Print("handle v3 rejected (wrong schema)");
}
//else
//Debug.Print("handle v3 rejected (double recieved)");
break;
case EDDN.EDDNRecievedArgs.enMessageInfo.Outfitting_v1_Recieved:
UpdateStatisticDataMsg(enMessageTypes.Outfitting_V1);
//UpdateRawData("recieved outfitting message ignored (coming feature)");
//Debug.Print("recieved outfitting message ignored");
UpdateRawData(String.Format("{0}\r\n(from {2})\r\n{1}", e.Message, e.RawData, e.Adress));
break;
case EDDN.EDDNRecievedArgs.enMessageInfo.Outfitting_v2_Recieved:
UpdateStatisticDataMsg(enMessageTypes.Outfitting_V2);
//UpdateRawData("recieved outfitting message ignored (coming feature)");
//Debug.Print("recieved outfitting message ignored");
UpdateRawData(String.Format("{0}\r\n(from {2})\r\n{1}", e.Message, e.RawData, e.Adress));
break;
case EDDN.EDDNRecievedArgs.enMessageInfo.Shipyard_v1_Recieved:
UpdateStatisticDataMsg(enMessageTypes.Shipyard_V1);
//UpdateRawData("recieved shipyard message ignored (coming feature)");
//Debug.Print("recieved shipyard message ignored");
break;
case EDDN.EDDNRecievedArgs.enMessageInfo.Shipyard_v2_Recieved:
UpdateStatisticDataMsg(enMessageTypes.Shipyard_V2);
//UpdateRawData("recieved shipyard message ignored (coming feature)");
//Debug.Print("recieved shipyard message ignored");
break;
case EDDN.EDDNRecievedArgs.enMessageInfo.UnknownData:
UpdateStatisticDataMsg(enMessageTypes.unknown);
UpdateRawData(String.Format("{0}\r\n(from {2})\r\n{1}", e.Message, e.RawData, e.Adress));
UpdateRawData("Recieved a unknown EDDN message:" + Environment.NewLine + e.Message + Environment.NewLine + e.RawData);
//Debug.Print("handle unkown message");
break;
case EDDN.EDDNRecievedArgs.enMessageInfo.ParseError:
UpdateRawData(String.Format("{0}\r\n(from {2})\r\n{1}", e.Message, e.RawData, e.Adress));
Debug.Print("handle error message");
UpdateRawData("Error while processing recieved EDDN data:" + Environment.NewLine + e.Message + Environment.NewLine + e.RawData);
break;
}
if (DataRows != null && DataRows.GetUpperBound(0) >= 0)
{
isTrusty = (Program.Data.BaseData.tbtrustedsenders.Rows.Find(name) != null);
UpdateStatisticData(DataRows.GetUpperBound(0) + 1, nameAndVersion, e.Adress, uploaderID);
foreach (String DataRow in DataRows)
{
if(m_DuplicateFilter.DataAccepted(DataRow))
{
// data is plausible ?
if (isTrusty || (!Program.PlausibiltyCheck.CheckPricePlausibility(new string[] { DataRow }, SimpleEDDNCheck)))
{
// import is wanted ?
if (m_lDBCon.getIniValue<Boolean>("EDDN", "ImportEDDN", false.ToString(), false))
{
// collect importable data
Debug.Print("import :" + DataRow);
importData.Add(DataRow);
}
}
else
{
Debug.Print("implausible :" + DataRow);
// data is implausible
string InfoString = string.Format("IMPLAUSIBLE DATA : \"{2}\" from {0}/ID=[{1}]", nameAndVersion, uploaderID, DataRow);
UpdateRejectedData(InfoString);
if (m_lDBCon.getIniValue<Boolean>("EDDN", "SpoolImplausibleToFile", false.ToString(), false))
{
FileStream LogFileStream = null;
string FileName = Program.GetDataPath(@"Logs\EddnImplausibleOutput.txt");
if (File.Exists(FileName))
LogFileStream = File.Open(FileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
else
LogFileStream = File.Create(FileName);
LogFileStream.Write(System.Text.Encoding.Default.GetBytes(InfoString + "\n"), 0, System.Text.Encoding.Default.GetByteCount(InfoString + "\n"));
LogFileStream.Close();
}
}
}
}
// have we collected importable data -> then import now
if (importData.Count() > 0)
{
Program.Data.ImportPricesFromCSVStrings(importData.ToArray(), SQL.EliteDBIO.enImportBehaviour.OnlyNewer, (isTrusty ? SQL.EliteDBIO.enDataSource.fromEDDN_T : SQL.EliteDBIO.enDataSource.fromEDDN));
DataChangedEvent.Raise(this, new DataChangedEventArgs(enDataTypes.DataImported));
}
}
}
catch (Exception ex)
{
UpdateRawData("Error while processing recieved EDDN data:" + Environment.NewLine + ex.GetBaseException().Message + Environment.NewLine + ex.StackTrace);
}
}