SafeDispatch/AppServer/MulticastListener.cs

2491 lines
125 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SafeMobileLib;
using SafeMobileLib.MessageDecoders;
using System.Collections;
using System.Net.Mail;
using System.Windows.Forms;
using System.IO;
using System.ComponentModel;
using System.Diagnostics;
using System.Net.Mime;
using SocketIOComponent;
namespace AppServer
{
public class MulticastListener
{
private string messageBusIP;
private int messageBusPort;
private string seqID;
private Hashtable ht_vRecording;
private Hashtable Privatecall_ACK_Recording;
private VoiceRecording vRecording;
private DBmanager DB;
internal DBuserManager dbuser;
private DBvehiclesManager dbvehs;
internal DBsubsOperationManager dbsubsoperManage;
private DBcallPatchManager dbCallPatch;
#region code for zone
private volatile static ArrayList ZoneList = new ArrayList();
private volatile static ArrayList LandList = new ArrayList();
private volatile static List<User> UserListTMP = new List<User>();
private volatile static ArrayList ImeitoMADEOFFList = new ArrayList();
private volatile static List<Vehicles> VehicleListTMP = new List<Vehicles>();
public volatile static List<UserReportTime> UserReportTimeListTMP = new List<UserReportTime>();
private volatile static List<UnitGpsPos> VehLastPos = new List<UnitGpsPos>();
private volatile static List<Gateway> GatewayListTMP = new List<Gateway>();
public volatile static Hashtable GatewayList = new Hashtable();
public volatile static Hashtable UserList = new Hashtable();
public volatile static Hashtable VehicleList = new Hashtable();
public volatile static Hashtable MobileVehicleList = new Hashtable();
public volatile static Hashtable emailHT = new Hashtable();
private volatile static ArrayList ZoneListTMP = new ArrayList();
private volatile static ArrayList LandListTMP = new ArrayList();
private volatile static Hashtable VehListTMP = new Hashtable();
private volatile static Hashtable VehImeiStatus = new Hashtable();
private volatile static Hashtable EmergencyHash = new Hashtable();
private volatile static ArrayList RadioListIP = new ArrayList();
private volatile Int32 countErrorLoc = 0;
private static System.Threading.Timer tZone;
public static readonly object locker = new object();
#endregion
#region emai stuff
private EmailServerSSL sslServer;
private static System.Threading.Timer tCheckMail;
private static System.Threading.Timer tCheckSMS;
private static System.Threading.Timer tCheckARS;
private static System.Threading.Timer EmergTime;
private static System.Threading.Timer tCheckReportMail;
private static System.Threading.Timer tCheckTickets;
#endregion
#region create a usb3000 decoder object
private USB3000 usb3000 = null;
private MainForm parent;
#endregion
private volatile Boolean ARSoff = false;
public MulticastListener(string messageBusIP, int messageBusPort, MainForm _parent)
{
SM.Debug("Constructor for MulticastListener start on IP " + messageBusIP + ":" + messageBusPort);
this.messageBusIP = messageBusIP;
this.messageBusPort = messageBusPort;
ht_vRecording = new Hashtable();
Privatecall_ACK_Recording = new Hashtable();
// create the udp only if not created
if (MainForm.udp == null)
{
MainForm.udp = new UdpMulticast(messageBusIP, messageBusPort);
MainForm.udp.OnNewDataRecv += new UdpMulticast.newData4Send(udp_OnNewDataRecv);
}
if (Program.cfg.enableEmailService)
{
//email server ini
SM.Debug("Turning on EmailService on " + Program.cfg.emailAddress);
sslServer = new EmailServerSSL(Program.cfg.pop3Server, Program.cfg.pop3Port, Program.cfg.emailAddress, Program.cfg.emailPassword, Program.cfg.popSSLState);
sslServer.setLastEmailTime(Program.cfg.lastEmailTime);
}
else
{
SM.Debug("EmailService is disabled from admin module");
}
backup = new DBbackup(Program.cfg.DB_user, Program.cfg.DB_schema, Program.cfg.DB_IP);
reloadEmergHashes();
SM.Debug("Constructor for MulticastListener end");
parent = _parent;
}
/// <summary>
/// Add a new recording file path
/// </summary>
/// <param name="filePath"></param>
private void OnRecordingFileWritten(string filePath)
{
if (usb3000 != null)
usb3000.AddRecordingInDecodingQueue(filePath);
}
/// <summary>
/// Opens Multicast Connection and start all timers which checks for different things in the DB
/// </summary>
public void Start()
{
firstStartProccesStatus = true;
if (!MainForm.UdpMulticastConnectionStatus)
MainForm.UdpMulticastConnectionStatus = MainForm.udp.StartListen(Program.cfg.LocalIPAddress);
if (!MainForm.UdpMulticastConnectionStatus)
{
FeedbackRadMessageBox.ShowError("Multicast Can't connect to " + messageBusIP + ".Please check your network settings.", "App Server Multicast Error");
try
{
Utils.WriteEventLog(Program.COMPANY, "Multicast Can't connect to " + messageBusIP + ".Please check your network settings.", EventLogEntryType.Information, 3152);
}
catch (Exception exe)
{
SM.Debug("Unable to write log Event ex:" + exe.ToString());
}
//System.Environment.Exit(0);
System.Windows.Forms.Application.Exit();
}
SM.Debug("MulticastListener started!!!!");
//start zone timer... refresh time 5 min
tZone = new System.Threading.Timer(ComputeZones, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 5, 0));
//start email timer... refresh time 1 min
tCheckMail = new System.Threading.Timer(CheckMail, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 1, 0));
//report to email
tCheckReportMail = new System.Threading.Timer(Check4ReportEmail, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 0, 20));
//sms
tCheckSMS = new System.Threading.Timer(Check4SMS, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 1, 0));
//ars
tCheckARS = new System.Threading.Timer(Check4ARS, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 0, 5));
//check for tickets
if (MainForm.Job_ticking_count > 0)
tCheckTickets = new System.Threading.Timer(Check4Tickets, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 0, 21));
}
void udp_OnNewDataRecv(byte[] data, int dataLen)
{
string str = System.Text.Encoding.ASCII.GetString(data, 0, dataLen);
try
{
if (!MainForm.error)
BussMessageParser(data, dataLen);
else
SM.Debug("Message received but no Dongle present");
}
catch (Exception ex)
{
Utils.WriteLine("udp_OnNewDataRecv eror: "+ ex.ToString(), ConsoleColor.Red);
}
}
/// <summary>
/// Parses the information from multicast
/// </summary>
/// <param name="rawData"></param>
/// <param name="actualLen"></param>
/// <returns></returns>
private bool BussMessageParser(byte[] rawData, int actualLen)
{
string data = System.Text.Encoding.ASCII.GetString(rawData, 0, actualLen);
string[] tempArr = data.Split("#".ToCharArray());
if ((tempArr.Length == 0) || (tempArr.Length == 1))
{
SM.Debug("incorect message=" + data);
return false;
}
int messLen = Convert.ToInt32(tempArr[1]);
if (actualLen != messLen)
{
Console.WriteLine("message length({0}) != actual length({1})", messLen, actualLen);
return false;
}
seqID = tempArr[2];
int opCode = Convert.ToInt32(tempArr[3]);
string ip2; string radioID; string test;
int gwID; int radiogwID; int remoteID; int SDuserId;int GroupId;
byte[] buf;string posgresPath; string dirBackup;
switch (opCode)
{
case 101:
SM.Debug("got ALL CALL from SD");
try
{
//ignore call patching signals
if (tempArr.Length > 6)
{
if (tempArr[6] == "1")
break;
}
ip2 = tempArr[5];
string[] dataArr = tempArr[4].Split(".".ToCharArray());
//GW indentifiers
gwID = Convert.ToInt32(dataArr[0]);
radiogwID = Convert.ToInt32(dataArr[1]);
//SD indentifier
SDuserId = Convert.ToInt32(tempArr[5].Split(".".ToCharArray())[2]);
vRecording = new VoiceRecording(ip2, Program.cfg.VoicePort, gwID, radiogwID, SDuserId, null, null, 1, opCode, MainForm.udp, sampleRate, bitdepth);
vRecording.OnRecordingFileWritteen += new VoiceRecording.RecordingFileWritteenDEl(OnRecordingFileWritten);
vRecording.Start();
RemoveVoiceRecordingFromHT(SDuserId);
//add voice recording object to hashtable so that it can be stoped when stop message is received
ht_vRecording.Add(SDuserId, vRecording);
}
catch (Exception ex)
{
SM.Debug("Error on execute 101:" + ex.ToString());
}
break;
case 111:
SM.Debug("got ALL CALL STOP from SD");
try
{
//ignore call patching signals
if (tempArr.Length > 6)
{
if (tempArr[6].Equals("1"))
break;
}
//SD indentifier
SDuserId = Convert.ToInt32(tempArr[5].Split(".".ToCharArray())[2]);
RemoveVoiceRecordingFromHT(SDuserId);
}
catch (Exception ex)
{
SM.Debug("Error on execute 111:" + ex.ToString());
}
break;
case 102:
Utils.WriteLine("got PRIVATE CALL request",ConsoleColor.Green);
try
{
ip2 = tempArr[5];
int subs_imei = Convert.ToInt32(tempArr[4].Split(".".ToCharArray())[2]);//tempArr[4]);
SDuserId = Convert.ToInt32(ip2.Split(".".ToCharArray())[2]);
DBvehiclesManager DBvehP = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
int sc_id = DBvehP.getSCID(subs_imei.ToString());
UnitSysPosition pos = DBvehP.getSystemPosition(sc_id);
vRecording = new VoiceRecording(ip2, Program.cfg.VoicePort, pos.Gw_id, pos.R_gw_id, SDuserId, subs_imei, null, 1, opCode, MainForm.udp,sampleRate, bitdepth);
if (Privatecall_ACK_Recording[seqID] == null)
Privatecall_ACK_Recording.Add(seqID,vRecording);
}
catch (Exception ex)
{
SM.Debug("Error on execute 102:" + ex.ToString());
}
break;
case 122:
Utils.WriteLine("got ACK for private call", ConsoleColor.Green);
if (tempArr[5].Equals("1")) /// private call started
{
if (Privatecall_ACK_Recording.ContainsKey(seqID))
{
vRecording = (VoiceRecording)Privatecall_ACK_Recording[seqID];
vRecording.OnRecordingFileWritteen += new VoiceRecording.RecordingFileWritteenDEl(OnRecordingFileWritten);
vRecording.Start();
int? id = vRecording.dispatcher_id ?? vRecording.subs_imei;
if (id != null)
{
RemoveVoiceRecordingFromHT((int)id);
//add voice recording object to hashtable so that it can be stoped when stop message is received
ht_vRecording.Add(id, vRecording);
}
}
}
else
{
if (Privatecall_ACK_Recording.ContainsKey(seqID))
Privatecall_ACK_Recording.Remove(seqID);
}
break;
case 112:
SM.Debug("got private call stop");
//SD indentifier
try
{
SDuserId = Convert.ToInt32(tempArr[5].Split(".".ToCharArray())[2]);
RemoveVoiceRecordingFromHT(SDuserId);
}
catch (Exception ex)
{
SM.Debug("Error on execute 112:" + ex.ToString());
}
break;
case 103:
SM.Debug("got group call request");
try
{
ip2 = tempArr[5];
string[] dataArr = tempArr[4].Split(".".ToCharArray());
gwID = Convert.ToInt32(dataArr[0]);
radiogwID = Convert.ToInt32(dataArr[1]);
GroupId = Convert.ToInt32(dataArr[2]);
SDuserId = Convert.ToInt32(ip2.Split(".".ToCharArray())[2]);
vRecording = new VoiceRecording(ip2, Program.cfg.VoicePort, gwID, radiogwID, SDuserId, null, GroupId, 1, opCode, MainForm.udp, sampleRate, bitdepth);
vRecording.OnRecordingFileWritteen += new VoiceRecording.RecordingFileWritteenDEl(OnRecordingFileWritten);
vRecording.Start();
//add voice recording object to hashtable so that it can be stoped when stop message is received
RemoveVoiceRecordingFromHT(SDuserId);
ht_vRecording.Add(SDuserId, vRecording);
}
catch (Exception ex)
{
SM.Debug("Error on execute 103:" + ex.ToString());
}
break;
case 113:
SM.Debug("got group call stop");
//SD indentifier
try
{
SDuserId = Convert.ToInt32(tempArr[5].Split(".".ToCharArray())[2]);
RemoveVoiceRecordingFromHT(SDuserId);
}
catch (Exception ex)
{
SM.Debug("Error on execute 113:" + ex.ToString());
}
break;
case 201:
SM.Debug("got call request SD ->SD");
try
{
//ignore call patching signals
if (tempArr.Length > 6)
{
if (tempArr[6].Equals("1"))
break;
}
string ip3 = tempArr[5];
SDuserId = Convert.ToInt32(ip3.Split(".".ToCharArray())[2]);
int subs_imei = Convert.ToInt32(tempArr[4]);
// in this case (SD->SD call)GWid and radioGW id =0 and SUID = userID
vRecording = new VoiceRecording(ip3, Program.cfg.VoicePort, 0, 0, SDuserId, subs_imei, null, 1, opCode, MainForm.udp,sampleRate, bitdepth);
vRecording.OnRecordingFileWritteen += new VoiceRecording.RecordingFileWritteenDEl(OnRecordingFileWritten);
vRecording.Start();
RemoveVoiceRecordingFromHT(SDuserId);
//add voice recording object to hashtable so that it can be stoped when stop message is received
ht_vRecording.Add(SDuserId, vRecording);
}
catch (Exception ex)
{
SM.Debug("Error on execute 201:" + ex.ToString());
}
break;
case (byte)209:
Console.WriteLine("Recieve 209");
//parent.ProcessTick();
if (OnRefreshHashRequest != null)
OnRefreshHashRequest();
else
Utils.WriteLine("MBus has not OnRefreshHashRequest listener", ConsoleColor.Red);
break;
case 211:
SM.Debug("got SD ->SD call stop");
//SD indentifier
try
{
//ignore call patching signals
if (tempArr.Length > 6)
{
if (tempArr[6].Equals("1"))
break;
}
SDuserId = Convert.ToInt32(tempArr[5].Split(".".ToCharArray())[2]);
RemoveVoiceRecordingFromHT(SDuserId);
}
catch (Exception ex)
{
SM.Debug("Error on execute 211:" + ex.ToString());
}
break;
case 125:
SM.Debug("got 125(opcode) from GW");
try
{
// create usb3000 if a voice message arrives, this is equal with
// checking for Voice license in the dongle
if (usb3000 == null)
usb3000 = new USB3000(true, sampleRate, bitdepth);
string identifiers = tempArr[4];
string[] tempIdent = identifiers.Split(".".ToCharArray());
if (tempIdent.Length > 1)
{
gwID = Convert.ToInt32(tempIdent[0]);
radiogwID = Convert.ToInt32(tempIdent[1]);
//remoteID = Convert.ToInt32(tempIdent[2]);
string uniqueIdentif = $"{gwID}.{radiogwID}";
string ip = $"224.10.{tempIdent[0]}.{tempIdent[1]}";
Console.WriteLine("Temp5: " + tempArr[5] + " temp6: " + tempArr[6]);
//got start call message
if (tempArr[5].Equals("1"))
{
int group_cpsid = 0;
int dispatcher_id = 0;
string callType = tempArr[6].ToString();
int subs_imei = Convert.ToInt32(tempIdent[2]);
if (callType.Equals("103")) // group call
group_cpsid = Convert.ToInt32(tempArr[7]);
else if (callType.Equals("101")) // all call
dispatcher_id = Convert.ToInt32(tempArr[7]);
vRecording = new VoiceRecording(ip, Program.cfg.VoicePort, gwID, radiogwID, dispatcher_id, subs_imei, group_cpsid, 0, int.Parse(callType), MainForm.udp, sampleRate, bitdepth);
vRecording.OnRecordingFileWritteen += new VoiceRecording.RecordingFileWritteenDEl(OnRecordingFileWritten);
vRecording.Start();
//add voice recording object to hashtable so that it can be stoped when stop message is received
if (ht_vRecording.ContainsKey(uniqueIdentif))
{
//already in hashtable stop the recording and remove it to make place for the new one
if (((VoiceRecording)ht_vRecording[uniqueIdentif]).IsRecording)
{
((VoiceRecording)ht_vRecording[uniqueIdentif]).Stop();
}
ht_vRecording.Remove(uniqueIdentif);
}
ht_vRecording.Add(uniqueIdentif, vRecording);
}
//got stop call message if rec on stop it
else
{
SM.Debug("Stoping voice recording if it is present in hashtable");
if (ht_vRecording.ContainsKey(uniqueIdentif))
{
if (((VoiceRecording)ht_vRecording[uniqueIdentif]).IsRecording)
{
SM.Debug("Voice recording found in hash table");
((VoiceRecording)ht_vRecording[uniqueIdentif]).Stop();
ht_vRecording.Remove(uniqueIdentif);
}
}
}
}
}
catch (Exception ex)
{
SM.Debug("Error on execute 125:" + ex.ToString());
}
break;
case 162: // Remote monitor
SM.Debug("got 162(opcode) from GW");
try
{
if (Convert.ToInt32(tempArr[5]).Equals(1))
{
string identifiers = tempArr[4];
string[] tempIdent = identifiers.Split(".".ToCharArray());
if (tempIdent.Length > 1)
{
gwID = Convert.ToInt32(tempIdent[0]);
radiogwID = Convert.ToInt32(tempIdent[1]);
remoteID = Convert.ToInt32(tempIdent[2]);
string uniqueIdentif = $"{gwID}.{radiogwID}";
string ip = $"224.10.{tempIdent[0]}.{tempIdent[1]}";
Console.WriteLine("Temp5: " + tempArr[5] + " temp6: " + tempArr[6]);
vRecording = new VoiceRecording(ip, Program.cfg.VoicePort, gwID, radiogwID, 0, remoteID, 0, 0, 162, MainForm.udp, sampleRate, bitdepth);
vRecording.OnRecordingFileWritteen += new VoiceRecording.RecordingFileWritteenDEl(OnRecordingFileWritten);
vRecording.Start();
if (ht_vRecording.ContainsKey(uniqueIdentif))
{
//already in hashtable stop the recording and remove it to make place for the new one
if (((VoiceRecording)ht_vRecording[uniqueIdentif]).IsRecording)
{
((VoiceRecording)ht_vRecording[uniqueIdentif]).Stop();
}
ht_vRecording.Remove(uniqueIdentif);
}
ht_vRecording.Add(uniqueIdentif, vRecording);
}
}
}
catch (Exception ex)
{
SM.Debug("Error on execute 162:" + ex.ToString());
}
break;
case 172:
SM.Debug("got 172(opcode) from GW");
try
{
string identifiers = tempArr[4];
string[] tempIdent = identifiers.Split(".".ToCharArray());
if (tempIdent.Length > 1)
{
gwID = Convert.ToInt32(tempIdent[0]);
radiogwID = Convert.ToInt32(tempIdent[1]);
remoteID = Convert.ToInt32(tempIdent[2]);
string uniqueIdentif = $"{gwID}.{radiogwID}";
if (ht_vRecording.ContainsKey(uniqueIdentif))
{
if (((VoiceRecording)ht_vRecording[uniqueIdentif]).IsRecording)
{
SM.Debug("Voice recording found in hash table");
((VoiceRecording)ht_vRecording[uniqueIdentif]).Stop();
ht_vRecording.Remove(uniqueIdentif);
}
}
}
}
catch (Exception ex)
{
SM.Debug("Error on execute 172:" + ex.ToString());
}
break;
case 104:
SM.Debug("G0t a zone and channel change request ");
break;
case (byte)139:
Utils.WriteLine("MulticastListener-> ARS gateway update" + (tempArr.Length >= 7 ? (" from " + tempArr[6]) : ""));
try
{
int gwID0 = Convert.ToInt32(tempArr[4]);
string radioGWip = tempArr[5];
int radioID0 = Convert.ToInt32(tempArr[6]);
radioID = tempArr[6];
DBvehiclesManager DBveh = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
//assign radio to current GW in DB
DBveh.assignUnit2GW(radioID0, gwID0, radioGWip);
if (MainForm.VehList.ContainsKey(radioID) && MainForm.VehStolen.ContainsKey(radioID) && (int)MainForm.VehStolen[radioID] == 1)
{
// get settings value for Stolen on No GPS Fix Location
string value = MainForm.dbSettings.getSettingValue(0, Utils.StolenArs);
bool stolenARS = false;
bool.TryParse(value, out stolenARS);
// do not disable the unit if stolen is not wanted
if (!stolenARS)
break;
Utils.WriteLine("ARS gateway update received for a stolen vehicle " + radioID, ConsoleColor.Cyan);
try
{
// skip sending enable/disable if the unit is not in the vehicles list
if (!MainForm.VehList.ContainsKey(radioID))
break;
//get unit system position
DBvehiclesManager DBvehInfo = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
int unitSC_ID = ((Vehicle_Data)MainForm.VehList[radioID]).sc_id; //DBvehInfo.getSCID(radioID2);
UnitSysPosition sysPos = DBvehInfo.getSystemPosition(unitSC_ID);
string dest = $"0.0.{radioID}";
if (sysPos != null) dest = $"{sysPos.Gw_id}.{sysPos.R_gw_id}.{radioID}";
Utils.WriteLine("Radio disable was sent on " + sysPos.Gw_id + "." + sysPos.R_gw_id + " gateway", ConsoleColor.Cyan);
//send radio disable to GW
string test2 = "#150#" + dest + "#0#";
MainForm.udp.Send(Utils.Convert_text_For_multicast("#0.0" + test2), Utils.Convert_text_For_multicast("#0.0" + test2).Length);
}
catch (Exception ex)
{
SM.Debug("Error on Stolen for ARS:" + ex.ToString());
throw new ArgumentException("StolenError");
}
}
}
catch (Exception ex)
{
SM.Debug("Error on execute 139:" + ex.ToString());
}
break;
case (byte)130:
SM.Debug("MulticastListener-> got ars " + (tempArr.Length >= 5 ? (" from " + tempArr[4]) : ""));
try
{
radioID = tempArr[4];
string strData = tempArr[5];
if (strData[0] != 'O')//trbo
{
SM.Debug("Received ars from mototrbo");
byte[] forDecodeData = getBytesFromRawData(rawData);
ARSdecoder dec = new ARSdecoder(radioID, forDecodeData, dbsubsoperManage);
ARSoff = dec.isOFF;
}
else//hytera
{
SM.Debug("Received ars from hytera");
dbsubsoperManage.updateSUStatus(radioID.ToString(), ((strData == "ON") ? 1 : 0));
dbsubsoperManage.updateARSStatus(radioID.ToString(), ((strData == "ON") ? 1 : 0));
ARSoff = ((strData == "ON") ? false : true);
}
if (MainForm.VehicleHashStat[radioID] != null)
{
VehicleStatus vehicleStatus = (VehicleStatus)MainForm.VehicleHashStat[radioID];
vehicleStatus.lastArsTime = DateTime.Now;
if (ARSoff)
{
vehicleStatus.curentStatus = Status_for_tab.OFF;
PushStatus(radioID, Status_for_tab.OFF);
}
else
{
vehicleStatus.curentStatus = Status_for_tab.ON;
PushStatus(radioID, Status_for_tab.ON);
}
}
// check for any sms
check4undeliverdSMS(radioID);
}
catch (Exception ex)
{
SM.Debug("Error on execute 130:" + ex.ToString());
}
break;
case (byte)231:
case (byte)131:
string tempLocation = "";
for (int i = 4; i < (tempArr.Length - 1); i++)
tempLocation += (i == 4) ? tempArr[i] : "#" + tempArr[i];
MainForm.LocationQueue.PostItem(tempLocation);
MainForm.CountInsert++;
if (MainForm.AIRTURKEYLIMIT)
{
try
{
if (long.Parse(tempArr[5]) > 1430438400)
{
System.Windows.Forms.Application.Exit();
}
}
catch (Exception ex)
{
SM.Debug("Error on execute 131 AIRTURKEYLIMIT:" + ex.ToString());
}
}
break;
case (byte)157:
Console.WriteLine("Received 157 on multicast");
MainForm.RegistrationAnswer = true;
break;
case (byte)132:
SM.Debug("MulticastListener-> got SMS from GW");
try
{
string seqID3 = tempArr[2];
int radioID3 = Convert.ToInt32(tempArr[4]);
bool hytera = false;
if (tempArr.Length > 6) if (tempArr[6] == "hyt") hytera = true;
byte[] forDecodeData3 = getBytesFromRawData(rawData);
DBsmsManager DB3 = new DBsmsManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
DBTicketingManager DBTicketing = new DBTicketingManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
if (hytera)
{
// detect if the message has unicode characters in it
if (tempArr[5].StartsWith(Utils.MBusUnicodeChar))
{
// remove the unicode header
tempArr[5] = tempArr[5].Replace(Utils.MBusUnicodeChar, "");
tempArr[5] = tempArr[5].DecodeEncodedNonAsciiCharacters();
}
}
SMSdecoder dec3 = new SMSdecoder(radioID3, forDecodeData3, DB3, DBTicketing, seqID3, hytera, tempArr[5]);
if (dec3.delete_ticket_id > -1)
{
DBvehiclesManager DBvehInfo = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
int unitSC_ID = DBvehInfo.getSCID(radioID3.ToString());
UnitSysPosition sysPos = DBvehInfo.getSystemPosition(unitSC_ID);
string message = string.Format("Ticket no. {0} is no longer active!", dec3.delete_ticket_id);
string test1 = "#143#" + sysPos.Gw_id + "." + sysPos.R_gw_id + "." + radioID3 + "#" + message + "#" + 0 + "#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#0.0"+test1), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0"+test1).Length);
}
//send to email if was sms->email type
if (dec3.isEmail)
{
sendMail(dec3.emailAddr, dec3.messBody, radioID3);
}
//send ACK back to GW
test = "";
if (dec3.sqlResp == sqlResponse.done)
test = "#232#1#";
else
test = "#232#0#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#" + seqID3 + test), SafeMobileLib.Utils.Convert_text_For_multicast("#" + seqID3 + test).Length);
if (MainForm.SendPOLLafterSMS)
{
DBvehiclesManager DBvehInfo = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
int unitSC_ID = DBvehInfo.getSCID(radioID3.ToString());
UnitSysPosition sysPos = DBvehInfo.getSystemPosition(unitSC_ID);
string dest = $"0.0.{radioID3}";
if (sysPos != null) dest = $"{sysPos.Gw_id}.{sysPos.R_gw_id}.{radioID3}";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#154#" + dest + "#"), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#154#" + dest + "#").Length);
}
}
catch (Exception ex)
{
SM.Debug("Error on execute 132:" + ex.ToString());
}
break;
case (byte)142:
try
{
string seqID5 = tempArr[2];
string[] seqParts = seqID5.Split(".".ToCharArray());
int sched_timeGMT = 0;
if (tempArr.Length > 6)
sched_timeGMT = Convert.ToInt32(tempArr[6]);
int dispatcherID = -1;
if (tempArr[7] != null && tempArr[7] != "")
dispatcherID = Convert.ToInt32(tempArr[7]);
if (seqParts[0] != "0")
{
// detect if the message has unicode characters in it
if(tempArr[5].StartsWith(Utils.MBusUnicodeChar))
{
// remove the unicode header
tempArr[5] = tempArr[5].Replace(Utils.MBusUnicodeChar, "");
tempArr[5] = tempArr[5].DecodeEncodedNonAsciiCharacters();
}
int radioID5 = Convert.ToInt32((tempArr[4].Split(".".ToCharArray()))[2]);
//add condition for job ticketing
if (tempArr[5].Contains("<JTS>") == true && tempArr[5].Contains("\r\n") == true)
{
//de adaugat si celelalte campuri
string[] message = tempArr[5].Split(new string[] { "\r\n" }, StringSplitOptions.None);
string messageToSend = message[1];
int ticket_id = Convert.ToInt32(message[0].Replace("<JTS>", ""));
Utils.WriteLine($"Got JobTicket request {messageToSend} for unit {radioID5}", ConsoleColor.Cyan);
DBTicketingManager DBT = new DBTicketingManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
DBT.insert_job_ticket_from_sd(radioID5.ToString(), ticket_id, messageToSend, seqID5, sched_timeGMT);
}
else
{
Utils.WriteLine($"Got SMS request {tempArr[5]} for unit {radioID5}", ConsoleColor.Cyan);
DBsmsManager DB5 = new DBsmsManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
DB5.insert_sms_from_sd(radioID5.ToString(), tempArr[5], seqID5, sched_timeGMT, dispatcherID);
}
}
}
catch (Exception ex)
{
Utils.WriteLine("Error on execute 142:" + ex.ToString(), ConsoleColor.Red);
}
break;
case (byte)232:
Utils.WriteLine("Confirmation for Dispatacher ... ignoring");
break;
case (byte)242:
try
{
string seqID51 = tempArr[2];
Utils.WriteLine("MulticastListener-> got SMS ACK from GW");
DBsmsManager DB51 = new DBsmsManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
DB51.update_sms_delivered(seqID51, 2);
//for job tickets
DBTicketingManager DBT = new DBTicketingManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
DBT.update_ticket_delivered(seqID51, 2);
}
catch (Exception ex)
{
Utils.WriteLine("Error on execute 242:" + ex.ToString());
}
break;
//new code for hytera group SMS
case (byte)144:
try
{
string seqID54 = tempArr[2];
string[] seqParts4 = seqID54.Split(".".ToCharArray());
int sched_timeGMT4 = 0;
if (tempArr.Length > 6)
sched_timeGMT4 = Convert.ToInt32(tempArr[6]);
if (seqParts4[0] != "0")
{
Utils.WriteLine("MulticastListener-> got SMS from SD");
int cpsID = Convert.ToInt32((tempArr[4].Split(".".ToCharArray()))[2]);
//if (tempArr[4].StartsWith("0.0"))
//{
DBsmsManager DB5 = new DBsmsManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
DB5.insert_smsgroup_from_sd(cpsID, tempArr[5], seqID54, sched_timeGMT4, 0, "");
//}
}
else
SM.Debug("ERROR=MulticastListener-> got SMS from SD...seqID[0] = 0");
}
catch (Exception ex)
{
SM.Debug("Error on execute 144:" + ex.ToString());
}
break;
case (byte)244:
try
{
string seqID514 = tempArr[2];
SM.Debug("MulticastListener-> got SMS ACK from GW");
DBsmsManager DB514 = new DBsmsManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
DB514.update_sms_delivered(seqID514, 2);
}
catch (Exception ex)
{
SM.Debug("Error on execute 244:" + ex.ToString());
}
break;
//END of new code for hytera group SMS
case (byte)143:
break;
case (byte)153:
break;
case 154:
{
string identifiers = tempArr[4];
string[] dataArr = identifiers.Split(".".ToCharArray());
if (dataArr.Length < 3)
break;
// get gatewy id and radio gateway id
gwID = Convert.ToInt32(dataArr[0]);
radiogwID = Convert.ToInt32(dataArr[1]);
radioID = dataArr[2];
onPollRequestReceivedHandler(seqID, radioID);
break;
}
case (byte)233:
SM.Debug("MulticastListener-> got Telemetry from GW");
try
{
radioID = tempArr[4];
bool hytera = false;
Boolean IhaveData = false;
if (tempArr.Length > 6)
if (tempArr[6] == "hyt")
hytera = true;
byte[] forDecodeData2 = hytera ? new byte[]{Byte.Parse(tempArr[5])} : getBytesFromRawData(rawData);
DBtelemetryManager DBtel = new DBtelemetryManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
TelemetryDecoder decTel = new TelemetryDecoder(radioID, forDecodeData2, DBtel, hytera);
DBvehiclesManager DBvehInfo = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
int unitSC_ID = DBvehInfo.getSCID(radioID.ToString());
UnitSysPosition sysPos = DBvehInfo.getSystemPosition(unitSC_ID);
string dest = $"0.0.{radioID}";
if (sysPos != null) dest = $"{sysPos.Gw_id}.{sysPos.R_gw_id}.{radioID}";
List<TelemetryObj> tList = DBtel.getAllTelemetryObjsByRadioID(radioID);
foreach (TelemetryObj tObj in tList)
{
Console.WriteLine("dectel.DI:" + decTel.DI + " tOBJ:" + tObj.DigitalNr + " tobj:" + tObj.Alarm);
// position 0 from DI corresponds to DigitalNr 1
if (decTel.DI[tObj.DigitalNr-1] == true)
{
SM.Debug("Adding telemetry alarm to DB; digital:" + tObj.DigitalNr);
//add to DB for DI history
IhaveData = true;
//send DI alarm to SD
if (tObj.Alarm)
{
DBtel.AddTelemetryHist(radioID, tObj.Id, 1);
System.Threading.Thread.Sleep(100);
SM.Debug("Sending telemetry alarm to SD; digital:" + tObj.DigitalNr);
test = $"#140#{radioID}#{tObj.Name}#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#0.0" + test), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0"+test).Length);
}
else
{
DBtel.AddTelemetryHist(radioID, tObj.Id, 0);
System.Threading.Thread.Sleep(100);
}
}
}
if (IhaveData)
{
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#154#" + dest + "#"), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#154#" + dest + "#").Length);
}
}
catch (Exception ex)
{
SM.Debug("Error on execute 233:" + ex.ToString());
}
break;
case (byte)152:
SM.Debug("MulticastListener-> got Send reports to email");
String Idx_db = tempArr[4];
String PdfFile = tempArr[5];
String Email = tempArr[6];
sendDailyReportMail(PdfFile, Email);
break;
case (byte)138:
SM.Debug("MulticastListener-> got Emergency alarm from GW");
try
{
string seqID4 = tempArr[2];
string radioID4 = tempArr[4];
int? emergencyType = null;
if (!string.IsNullOrEmpty(tempArr[5]))
emergencyType = Convert.ToInt32(tempArr[5]);
// handle emergency received
onEmergencyReceivedHandler(seqID4, radioID4, emergencyType?? 0, new EmergencyInfo());
}
catch (Exception ex)
{
SM.Debug("Error on execute 138:" + ex.ToString());
}
break;
case 238:
{
SM.Debug("MulticastListener-> got Emergency Ack");
String radioID238 = (tempArr[4].Split(".".ToCharArray()))[2];
onEmergencyAckReceivedHandler("", radioID238);
break;
}
case (byte)250:
SM.Debug("MulticastListener-> got radio enable/disable status from GW");
try
{
string seqID6 = tempArr[2];
string radioID6 = tempArr[4];
int newStatus = Convert.ToInt32(tempArr[5]);
int oldStatus = dbsubsoperManage.getSUenableDisableStatus(radioID6);
if (newStatus == oldStatus || oldStatus == -1)
{
SM.Debug("MulticastListener->radio enable/disable new status = old status ... no action necesary");
}
else
{
if (newStatus == 1) /*enable*/
{
((VehicleStatus)MainForm.VehicleHashStat[radioID6]).curentStatus = Status_for_tab.ENABLE;
PushStatus(radioID6, Status_for_tab.ENABLE);
}
else /*disable*/
{
((VehicleStatus)MainForm.VehicleHashStat[radioID6]).curentStatus = Status_for_tab.DISABLE;
PushStatus(radioID6, Status_for_tab.DISABLE);
}
sqlResponse resp = dbsubsoperManage.updateSUenableDisableStatus(radioID6, newStatus);
if (resp == sqlResponse.done) SM.Debug("MulticastListener->radio enable/disable status changed to " + newStatus.ToString() + " for " + radioID6.ToString());
else SM.Debug("MulticastListener->ERROR !!! radio enable/disable status changed ");
}
}
catch (Exception ex)
{
SM.Debug("Error on execute 250:" + ex.ToString());
}
break;
case (byte)51:
SM.Debug("MulticastListener-> got DB backup request");
try
{
posgresPath = "..\\postgresql\\";
dirBackup = Application.StartupPath + "\\backups";
if (!Directory.Exists(Application.StartupPath + "\\backups"))
Directory.CreateDirectory(Application.StartupPath + "\\backups");
bgWorkerDBbackup = new BackgroundWorker();
bgWorkerDBbackup.DoWork += new DoWorkEventHandler(bgWorkerDBbackup_DoWork);
bgWorkerDBbackup.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorkerDBbackup_RunWorkerCompleted);
object[] param = { dirBackup, posgresPath };
bgWorkerDBbackup.RunWorkerAsync(param);
//send ACK back to SUM
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#71#1#"), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#71#1#").Length);
}
catch (Exception ex)
{
SM.Debug("Error on execute 51:" + ex.ToString());
}
break;
case (byte)52:
SM.Debug("MulticastListener-> got DB restore request");
try
{
string filename = tempArr[4];
posgresPath = "..\\postgresql\\";
dirBackup = Application.StartupPath + "\\backups";
if (!Directory.Exists(Application.StartupPath + "\\backups"))
Directory.CreateDirectory(Application.StartupPath + "\\backups");
string completeFileName = dirBackup + "\\" + filename;
//test if file exist
if (File.Exists(completeFileName))
{
bgWorkerDBrestore = new BackgroundWorker();
bgWorkerDBrestore.DoWork += new DoWorkEventHandler(bgWorkerDBrestore_DoWork);
bgWorkerDBrestore.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorkerDBrestore_RunWorkerCompleted);
object[] param2 = { completeFileName, posgresPath };
bgWorkerDBrestore.RunWorkerAsync(param2);
//send ACK back to SUM
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#72#1#"), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#72#1#").Length);
}
else
{
SM.Debug("DB restored failed !!!" + "File " + completeFileName + " missing!!!");
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#62#0#"), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#62#0#").Length);
}
}
catch (Exception ex)
{
SM.Debug("Error on execute 52:" + ex.ToString());
}
break;
case (byte)53:
SM.Debug("MulticastListener-> got DB backup list request");
try
{
dirBackup = Application.StartupPath + "\\backups";
string files = getAllBackups(dirBackup);
buf = SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#63#" + files + "#");
//send
if (buf.Length < 1024) MainForm.udp.Send(buf, buf.Length);
}
catch (Exception ex)
{
SM.Debug("Error on execute 53:" + ex.ToString());
}
break;
case (byte)208:
try
{
string radioID10 = tempArr[4];
int status = Convert.ToInt32(tempArr[5]);
Utils.WriteLine("Radio " + radioID10 + " is now " + (status == 0 ? "not stolen" : "stolen"),
status == 0 ? ConsoleColor.DarkYellow : ConsoleColor.DarkRed);
DBvehiclesManager DBveh2 = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
// add stolen info about the unit
if (!MainForm.VehStolen.ContainsKey(radioID10))
MainForm.VehStolen.Add(radioID10, status);
sqlResponse resp = DBveh2.setStolenStatus(radioID10, status);
MainForm.VehStolen[radioID10] = status;
}
catch (Exception ex)
{
SM.Debug("Error on execute 208:" + ex.ToString());
}
break;
case(byte)252:
SM.Debug("MulticastListener-> got email from Sierra Wireless Gateway");
try
{
sendMail_SW(tempArr[4], tempArr[5]);
}
catch (Exception ex)
{
SM.Debug("Error on execute 252:" + ex.ToString());
}
break;
case 500:
//receive Gateway ON command
try
{
string seqID4 = tempArr[2];
string key = tempArr[4] + "." + tempArr[5];
if (MainForm.RadioGWHash.ContainsKey(key))
{
if (((RadioGateway)MainForm.RadioGWHash[key]).Alive == false)
{
//send broadcast messages I'm back in business
Utils.WriteLine(string.Format("receive 500 from radio: Gateway {0} is ON", ((RadioGateway)MainForm.RadioGWHash[key]).Name), ConsoleColor.Green);
string test1 = "#501#" + tempArr[4] + "#" + tempArr[5] + "#" + "ON#" + ((RadioGateway)MainForm.RadioGWHash[key]).Name + "#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#" + seqID4 + test1), SafeMobileLib.Utils.Convert_text_For_multicast("#" + seqID4 + test1).Length);
}
((RadioGateway)MainForm.RadioGWHash[key]).Alive = true;
((RadioGateway)MainForm.RadioGWHash[key]).LastUpdate = DateTime.UtcNow;
}
else
Utils.WriteLine("Received 500 but did not treat it", ConsoleColor.DarkRed);
}
catch (Exception ex)
{
SM.Debug("Error on execute 500:" + ex.ToString());
}
break;
case 501:
//send broadcast messages if gateways are alive or not
break;
case 503:
//respond to safedispatch with all gateways status on enter on radioTab
foreach (DictionaryEntry entry in MainForm.RadioGWHash)
{
// send response to sd only for voice gateways
if (((RadioGateway)(entry.Value)).Gw_voice == 1)
{
//send broadcast messages with gateways status
string status = ((RadioGateway)(entry.Value)).Alive ? "ON" : "OFF";
Utils.WriteLine(string.Format("Response for SD request: Gateway {0} is {1}", ((RadioGateway)(entry.Value)).Name, status), status == "ON" ? ConsoleColor.Green : ConsoleColor.Red);
string test1 = "#501#" + ((RadioGateway)(entry.Value)).Gw_id + "#" + ((RadioGateway)(entry.Value)).Id + "#" + status + "#" + ((RadioGateway)(entry.Value)).Name + "#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#" + "0.0" + test1), SafeMobileLib.Utils.Convert_text_For_multicast("#" + "0.0" + test1).Length);
}
}
break;
case 510:
try
{
Patch patch = new Patch()
{
Type = tempArr[4],
IncomingId = tempArr[5],
OutgoingId = tempArr[7]
};
int userid = Convert.ToInt32(tempArr[9]);
dbCallPatch.addPatch(patch,userid);
}
catch (Exception ex)
{
SM.Debug("Error on execute 510:" + ex.ToString());
}
break;
case 511:
try
{
Patch patch = new Patch()
{
Type = tempArr[4],
IncomingId = tempArr[5],
OutgoingId = tempArr[7]
};
dbCallPatch.deletePatch(patch);
}
catch (Exception ex)
{
SM.Debug("Error on execute 511:" + ex.ToString());
}
break;
case 600:
//receive user ON command
try
{
string seqID4 = tempArr[2];
string key = tempArr[4];
if (MainForm.userStateHash.ContainsKey(key))
{
((User)MainForm.userStateHash[key]).Alive = true;
((User)MainForm.userStateHash[key]).LastUpdate = DateTime.UtcNow;
}
else
Utils.WriteLine("Received 600 but did not treat it", ConsoleColor.DarkRed);
}
catch (Exception ex)
{
SM.Debug("Error on execute 600:" + ex.ToString());
}
break;
default:
//SM.Debug("Unknown opcode " + opCode);
break;
}
return true;
}
private void RemoveVoiceRecordingFromHT(int uniqueIdentif)
{
if (ht_vRecording.ContainsKey(uniqueIdentif))
{
VoiceRecording vr = (VoiceRecording)ht_vRecording[uniqueIdentif];
if (vr.IsRecording)
vr.Stop();
ht_vRecording.Remove(uniqueIdentif);
}
}
#region HANDLERS
/// <summary>
/// Handle an emergency received on Multicast or on SocketIO
/// </summary>
/// <param name="seqId">Emergency unique identifier</param>
/// <param name="radioID">Radio ID of the unit which raised the emergency</param>
/// <param name="emergencyType">The type of emergency</param>
/// <param name="emerg">Object containing all other emergency parameters, including the gps position</param>
public void onEmergencyReceivedHandler(String seqId, String radioID, int emergencyType, EmergencyInfo emerg)
{
try
{
DBalarmManager DB4 = new DBalarmManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
Alarm alms = DB4.getAllAlarms(radioID);
if (alms != null)
{
if ((alms.Loneworker != "" || alms.Emergency != "")
&& ((EmergencyHash[radioID] != null)
&& ((DateTime.Now - (DateTime)EmergencyHash[radioID]).TotalSeconds > 10)))
{
Vehicle_Data v_data = (Vehicle_Data)MainForm.VehList[radioID.ToString()];
Alarm alarm = v_data.alm;
if(emerg.UserID != null && !emerg.UserID.Equals("0"))
DB4.Insert_Emerg_Alarm(emerg.UserID, emergencyType, (int)emerg.Speed, emerg.Latitude, emerg.Longitude);
else
DB4.Insert_Emerg_Alarm(radioID, emergencyType);
SM.Debug("MulticastListener->Emergency alarm added to DB");
string message = " " + ((Vehicle_Data)MainForm.VehList[radioID.ToString()]).Name + " Emergency Alarm";
if (alarm.Email != "")
sendAlarmMail(message, alarm.Email);
//send poll request
DBvehiclesManager DBvehInfo = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
int unitSC_ID = DBvehInfo.getSCID(radioID.ToString());
UnitSysPosition sysPos = DBvehInfo.getSystemPosition(unitSC_ID);
string dest = "0.0." + radioID.ToString();
if (sysPos != null) dest = sysPos.Gw_id + "." + sysPos.R_gw_id + "." + radioID.ToString();
String test = "#154#" + dest + "#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#" + seqId + test), SafeMobileLib.Utils.Convert_text_For_multicast("#" + seqId + test).Length);
//send emergency alarm to SD
test = "#134#" + radioID.ToString() + "#" + emergencyType;
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#" + seqId + test), SafeMobileLib.Utils.Convert_text_For_multicast("#" + seqId + test).Length);
((VehicleStatus)MainForm.VehicleHashStat[radioID]).curentStatus = Status_for_tab.EMERG;
((VehicleStatus)MainForm.VehicleHashStat[radioID]).lastArsTime = DateTime.Now;
PushStatus(radioID, Status_for_tab.EMERG);
// update last emergency time in the hastable
if (EmergencyHash[radioID] != null)
EmergencyHash[radioID] = DateTime.Now;
}
else
{
bool hasEmergency = (alms.Loneworker != "" || alms.Emergency != "") && (EmergencyHash[radioID] != null);
SM.Debug($"MulticastListener-> Unit {radioID}" + (!hasEmergency ? " not registered fro emergency alarm" : " timeout between emergencies"));
}
}
else
{
SM.Debug($"MulticastListener-> Unit {radioID}" + " not registered fro emergency alarm");
}
}
catch (Exception ex)
{
Utils.WriteLine(ex.ToString(), ConsoleColor.Red);
}
}
/// <summary>
/// Acknowledge by the dispatcher an emergency raised by a user
/// </summary>
/// <param name="seqId">Unique identifier of the emergency (unused now)</param>
/// <param name="radioID">Radio ID of the unit which raised the emergency</param>
public void onEmergencyAckReceivedHandler(String seqId, String radioID)
{
if (MainForm.VehicleHashStat.ContainsKey(radioID))
{
((VehicleStatus)MainForm.VehicleHashStat[radioID]).curentStatus = Status_for_tab.ON;
PushStatus(radioID, Status_for_tab.ON);
dbsubsoperManage.updateOnlyStatus(radioID, (Int32)Status_for_tab.ON);
Utils.WriteLine("Radio " + radioID + " had its emergency status acked!", ConsoleColor.Green);
}
// raise event if listener regisered
OnEmergencyAckReceived?.Invoke(seqID, radioID);
}
/// <summary>
/// Send a poll request from a Dispatcher to the unit
/// </summary>
/// <param name="seqId">Unique identifier of the poll request</param>
/// <param name="radioID">Radio ID of the unit which needs to report it's position</param>
public void onPollRequestReceivedHandler(String seqId, String radioID)
{
// raise event if listener regisered
OnPollRequestReceived?.Invoke(seqID, radioID);
}
#endregion
#region sms
//check for sms and deliver them
private void check4undeliverdSMS(string radioID)
{
try
{
//SM.Debug("Checking for undelivered SMS");
DBsmsManager DB = new DBsmsManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
List<smsmessage> smss = DB.get_sms_not_delivered(radioID);
Utils.WriteLine("GOT " + smss.Count.ToString() + " undeliverd SMS for radio " + radioID.ToString(), ConsoleColor.White);
DBvehiclesManager dbvehs = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
foreach (smsmessage msg in smss)
{
//send SMS to GW only if this message is not schedule for a later date/time
if (msg.sched_timeGMT < DateTime.Now.ToUniversalTime().DateTo70Format())
{
UnitSysPosition tmpX = dbvehs.getSystemPosition(msg.sc_id_dest);
//string test = "#143#" + tmpX.Gw_id + "." + tmpX.R_gw_id+"."+msg.imei_dest + "#" + msg.mess + "#" + msg.sched_timeGMT + "#";
string test = "#143#" + tmpX.Gw_id + "." + tmpX.R_gw_id + "." + msg.imei_dest + "#" + msg.mess + "#" + msg.sched_timeGMT + "#" + msg.dispatcherID + "#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#" + msg.seq_id + test), SafeMobileLib.Utils.Convert_text_For_multicast("#" + msg.seq_id + test).Length);
}
else
SM.Debug("message will be sent at a later time - schedule: " + msg.sched_timeGMT + " current:" + DateTime.Now.ToUniversalTime().DateTo70Format());
}
}
catch (Exception ex)
{
SM.Debug("Error on check4undeliverdSMS:"+ex.ToString());
}
}
//sms timer check for sched SMS
private void Check4SMS(Object state)
{
//GPS values : OFF = 0, DISABLE = 7, MADEOFF = 9 see enum Status_for_tab in Definitions.cs
try
{
// This method is executed by a thread pool thread
//it checks for schedule SMS only for radios with ars on
Hashtable subsList;
DBsmsManager DBsms = new DBsmsManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
lock (locker)
{
subsList = dbsubsoperManage.getAll_imei_sc_id_status();
}
DBvehiclesManager dbvehs = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
Hashtable SysPosList = dbvehs.getSystemPosition_for_all_scid();
List<smsmessage> smss = DBsms.get_ALL_Units_sms_not_delivered();
string test = "";
String cmdok = "";
var subsBlackList = new List<int> { (int)Status_for_tab.OFF, (int)Status_for_tab.DISABLE, (int)Status_for_tab.MADEOFF };
foreach (smsmessage msg in smss)
{
long sc_id = msg.sc_id_dest;
int status = ((Scid_and_Status)subsList[msg.imei_dest]).Status;
if ((subsList[msg.imei_dest] != null) && !subsBlackList.Contains(status))
{
if (msg.sched_timeGMT < DateTime.Now.ToUniversalTime().DateTo70Format() && SysPosList.ContainsKey(sc_id))
{
if (SysPosList[sc_id]!=null)
test = "#143#" + ((UnitSysPosition)SysPosList[sc_id]).Gw_id + "." + ((UnitSysPosition)SysPosList[sc_id]).R_gw_id + "." + msg.imei_dest + "#" + msg.mess + "#" + msg.sched_timeGMT + "#" + msg.dispatcherID + "#";
else test = "#143#" + "0.0" + "." + msg.imei_dest + "#" + msg.mess + "#" + msg.sched_timeGMT + "#" + msg.dispatcherID + "#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#" + msg.seq_id + test), SafeMobileLib.Utils.Convert_text_For_multicast("#" + msg.seq_id + test).Length);
}
else
SM.Debug("message will be sent at a later time - schedule: " + msg.sched_timeGMT + " current:" + DateTime.Now.ToUniversalTime().DateTo70Format());
}
}
int undeliveredSMS = smss.Count;
smss = DBsms.get_sms_not_delivered_groups();
foreach (smsmessage msg in smss)
{
UnitSysPosition tmpX = dbvehs.getSystemPosition_for_group(msg.imei_dest);
test = "#145#" + tmpX.Gw_id + "." + tmpX.R_gw_id + "." + msg.sc_id_dest + "#" + msg.mess + "#" + msg.sched_timeGMT + "#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#" + msg.seq_id + test), SafeMobileLib.Utils.Convert_text_For_multicast("#" + msg.seq_id + test).Length);
}
Utils.WriteLine($"Undelivered {undeliveredSMS} private messages and {smss.Count} group messages", ConsoleColor.White);
}
catch (Exception ex)
{
SM.Debug("Exception on Check4SMS:"+ex.ToString());
}
}
//job ticketing timer check for sched tickets
private void Check4Tickets(Object state)
{
//Check4ExpiredTickets
List<JobTickets> jtlist = new List<JobTickets>();
string list_of_id_text = "";
try
{
DBTicketingManager DBT = new DBTicketingManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
List<Int32> ExpiredTicketsIdList = DBT.updateTicketExpireDate(DateTo70Format(DateTime.UtcNow));
if(ExpiredTicketsIdList.Count>0)
{
foreach(Int32 id in ExpiredTicketsIdList)
{
list_of_id_text += id + ",";
}
list_of_id_text = list_of_id_text.Substring(0, list_of_id_text.Length - 1);
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#251#" + list_of_id_text + "#"), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#251#" + list_of_id_text + "#").Length);
}
}
catch (Exception ex)
{
SM.Debug("Exception on Check4ExpiredTickets:" + ex.ToString());
}
// Check4ExpiringTickets
var subsBlackList = new List<int> { (int)Status_for_tab.OFF, (int)Status_for_tab.DISABLE, (int)Status_for_tab.MADEOFF };
Hashtable subsList = new Hashtable();
Hashtable SysPosList = new Hashtable();
try
{
lock (locker)
{
subsList = dbsubsoperManage.getAll_imei_sc_id_status();
}
//SM.Debug("Checking for expiring Tickets");
DBTicketingManager DB = new DBTicketingManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
List<JobTickets> tickets = DB.get_All_Expiring_Tickets();
//SM.Debug("GOT " + tickets.Count.ToString() + " expiring tickets");
///copy poastye
DBvehiclesManager dbvehs = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
SysPosList = dbvehs.getSystemPosition_for_all_scid();
foreach (JobTickets ticket in tickets)
{
//if ((subsList[ticket.Imei] != null) && (((Scid_and_Status)subsList[ticket.Imei]).Status == 1))
if ((subsList[ticket.Imei] != null) && !subsBlackList.Contains(((Scid_and_Status)subsList[ticket.Imei]).Status))
{
//int seconds = (int)(ticket.End_time_specified_int - DBmanager.DateTo70Format(DateTime.Now.ToUniversalTime()));
//if (seconds <= 610 && seconds >= 589) -> moved in DBTicketingManager.get_All_Expiring_Tickets()
//{
//message template "You need to finish job no. in 10 minutes!"
string message = string.Format("You need to finish job no.{0}, {1} in 10 minutes!", ticket.Ticket_id, ticket.Name);
string head = "#143#0.0." + ticket.Imei + "#";
if (SysPosList[ticket.sc_id] != null) head = "#143#" + ((UnitSysPosition)SysPosList[ticket.sc_id]).Gw_id + "." + ((UnitSysPosition)SysPosList[ticket.sc_id]).R_gw_id + "." + ticket.Imei + "#";
string test = head + message + "#" + 0 + "#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#" + ticket.seq_id + test), SafeMobileLib.Utils.Convert_text_For_multicast("#" + ticket.seq_id + test).Length);
}
}
}
catch (Exception ex)
{
SM.Debug("Error on check4expiringTickets:" + ex.ToString());
}
try
{
//SM.Debug("Checking for undelivered Tickets");
DBTicketingManager DB = new DBTicketingManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
List<JobTickets> tickets = DB.get_ALL_jobtickets_not_delivered();
//SM.Debug("GOT " + tickets.Count.ToString() + " undeliverd tickets");
foreach (JobTickets ticket in tickets)
{
//if ((subsList[ticket.Imei] != null) && (((Scid_and_Status)subsList[ticket.Imei]).Status == 1))
if ((subsList[ticket.Imei] != null) && !subsBlackList.Contains(((Scid_and_Status)subsList[ticket.Imei]).Status))
{
if (ticket.sched_timegmt < DateTime.Now.ToUniversalTime().DateTo70Format())
{
string head = "#143#0.0." + ticket.Imei + "#";
if (SysPosList[ticket.sc_id] != null) head = "#143#" + ((UnitSysPosition)SysPosList[ticket.sc_id]).Gw_id + "." + ((UnitSysPosition)SysPosList[ticket.sc_id]).R_gw_id + "." + ticket.Imei + "#";
string test = head + ticket.Name + "#" + 0 + "#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#" + ticket.seq_id + test), SafeMobileLib.Utils.Convert_text_For_multicast("#" + ticket.seq_id + test).Length);
}
else
SM.Debug("ticket will be sent at a later time - schedule: " + ticket.sched_timegmt + " current:" + DateTime.Now.ToUniversalTime().DateTo70Format());
}
}
}
catch (Exception ex)
{
SM.Debug("Error on check4undeliverdTickets:" + ex.ToString());
}
}
//ARS timer check
private void Check4ARS(Object state)
{
try
{
// This method is executed by a thread pool thread
//it checks for schedule SMS only for radios with ars on
DBvehiclesManager dbvehs = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
List<ARSstatus> ars_s = dbvehs.Get_ARS_ON_info_GMT();
if (ars_s.Count == 0) return;
foreach (ARSstatus item in ars_s)
{
if (item.ArsInterval > 0)
{
if (DateTime.Now.ToUniversalTime() > item.Timegmt.AddSeconds(item.ArsInterval + 10))// added 10 seconds; marja erroare
{
SM.Debug("Unit:" + item.Imei + " ARS interval expired. Marking unit as OFF");
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#130#" + item.Imei + "#OFF#"), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#130#" + item.Imei + "#OFF#").Length);
}
}
}
}
catch (Exception ex)
{
if(ex.ToString().Contains("No connection could be made because the target machine actively"))
OnDatabaseDown?.Invoke();
else
SM.Debug("Exception on Check4SMS:" + ex.ToString());
}
}
//ARS timer check
private void Check4ReportEmail(Object state)
{
ArrayList ListofMess = new ArrayList();
try
{
MailMessage message = MainForm.ReportEmailQueue.GetItem(100);
while (message != null)
{
ListofMess.Add(message);
message = MainForm.ReportEmailQueue.GetItem(100);
}
if (ListofMess.Count>0)
EmailServerSSL.sendListofEmail(Program.cfg.smtpServer, Program.cfg.smtpPort, Program.cfg.emailAddress, Program.cfg.emailPassword, ListofMess, Program.cfg.smtpSSLState);
foreach (DictionaryEntry entry in MainForm.RadioGWHash)
{
DateTime lastUpdate = ((RadioGateway)(entry.Value)).LastUpdate;
var seconds = (DateTime.UtcNow - lastUpdate).TotalSeconds;
if(seconds >= 20)
{
if (((RadioGateway)(entry.Value)).Alive == true)
{
//send broadcast messages I'm dead
Utils.WriteLine(string.Format("Check Gateway alive: Gateway {0} is OFF", ((RadioGateway)(entry.Value)).Name), ConsoleColor.Red);
if (Program.cfg.gatewayType.Equals("SDR"))
RestartSDRGateway();
string test = "#501#" + ((RadioGateway)(entry.Value)).Gw_id + "#" + ((RadioGateway)(entry.Value)).Id + "#" + "OFF" + "#" + ((RadioGateway)(entry.Value)).Name + "#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#" + "0.0" + test), SafeMobileLib.Utils.Convert_text_For_multicast("#" + "0.0" + test).Length);
((RadioGateway)(entry.Value)).Alive = false;
}
}
}
foreach (DictionaryEntry entry in MainForm.userStateHash)
{
DateTime lastUpdate = ((User)(entry.Value)).LastUpdate;
var seconds = (DateTime.UtcNow - lastUpdate).TotalSeconds;
if (seconds >= 20)
{
if (((User)(entry.Value)).Alive == true)
{
//update database status
Utils.WriteLine($"User {((User)entry.Value).UserName} is OFF", ConsoleColor.Red);
dbuser.SetUserState(((User)entry.Value).Id, false);
((User)(entry.Value)).Alive = false;
}
}
}
}
catch (Exception ex)
{
SM.Debug("Exception on Check4ReportEmails:" + ex.ToString());
}
}
#endregion
private void RestartSDRGateway()
{
try
{
if (MainForm.IsProcessRunning("SDRgateway"))
{
foreach (var process in Process.GetProcessesByName("SDRgateway"))
{
process.Kill();
}
}
System.Diagnostics.Process.Start($@"{SafeMobileLib.Utils.GetRegValue("Path", "SafeMobile")}\Tetra_SDR\SDRgateway.exe");
SafeMobileLib.Utils.WriteLine("Gateway started", ConsoleColor.Yellow);
}
catch (Exception ex)
{
Utils.WriteLine("Could not start Gateway because: " + ex.ToString() + Environment.NewLine + "Path to Gateway = " +
$@"{SafeMobileLib.Utils.GetRegValue("Path", "SafeMobile")}\Tetra_SDR\SDRgateway.exe", ConsoleColor.Red);
}
}
//get bytes from raw data
private byte[] getBytesFromRawData(byte[] rawData)
{
Int32 head = 0;
for (int i = 0; i < (rawData.Length - 1); i++)
if (rawData[i] == 35) head = i;
byte[] forDecodeData3 = new byte[rawData.Length - head - 2];
Int32 j = 0;
for (int i = (head + 1); i < (rawData.Length - 1); i++)
{
forDecodeData3[j] = rawData[i];
j++;
}
return forDecodeData3;
}
#region zones code here
//for zones
bool messageOnScreen = false;
Boolean wehaveChange = false;
Boolean findid = false;
private Boolean firstStartProccesStatus = true;
private volatile Int32 postmp = 0;
private volatile uint nrSecond = 0;
//private ConvertDT convDT = new ConvertDT();
public static void PushStatus(String IMEI,Status_for_tab stat)
{
Utils.WriteLine("Send PushStatus:" + stat+" Imei:"+IMEI,ConsoleColor.Yellow);
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#153#" + IMEI + "#" + (Int32)stat + "#"), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#153#" + IMEI + "#" + (Int32)stat + "#").Length);
}
int sampleRate = 8000;
int bitdepth = 16;
void readZones()
{
// code for zone
DBsettingsManager dbsett = new DBsettingsManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
DBalarmManager dbalm = new DBalarmManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
dbuser = new DBuserManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
DBvehiclesManager dbveh = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
DBgatewaysManager dbgate = new DBgatewaysManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
DBReportingManager dbrep = new DBReportingManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
try
{
Int32.TryParse(dbsett.getSettingValue(0, "sampleRate"), out sampleRate);
Int32.TryParse(dbsett.getSettingValue(0, "bitDepth"), out bitdepth);
MainForm.VehList.Clear();
MainForm.userReportTimeList.Clear();
MainForm.VehStolen.Clear();
//MainForm.VehicleHashStat.Clear();
ImeitoMADEOFFList.Clear();
UserListTMP = dbuser.getAllUsers();
UserList.Clear();
foreach (User obj in UserListTMP) {
if (UserList.ContainsKey(obj.Id))
UserList.Remove(obj.Id);
UserList.Add(obj.Id, obj.UserName);
}
GatewayListTMP = dbgate.getAllGateways();
GatewayList.Clear();
foreach (Gateway obj in GatewayListTMP)
{
if (GatewayList.ContainsKey(obj.Id))
GatewayList.Remove(obj.Id);
GatewayList.Add(obj.Id, (obj.Peer_id > 0));
}
VehicleListTMP = dbveh.getAllVehicles();
VehicleList.Clear();
foreach (Vehicles obj in VehicleListTMP)
{
if (VehicleList.ContainsKey(obj.Imei))
VehicleList.Remove(obj.Imei);
VehicleList.Add(obj.Imei, obj.VehName);
}
//VehicleListMobileTMP = dbveh.getAllMobileVehicles();
foreach (Vehicles obj in VehicleListTMP)
{
if (MobileVehicleList.ContainsKey(obj.Id + ""))
MobileVehicleList.Remove(obj.Id + "");
MobileVehicleList.Add(obj.Id + "", obj.Imei);
}
UserReportTimeListTMP = dbrep.getUserReportTime();
MainForm.userReportTimeList.Clear();
foreach (UserReportTime obj in UserReportTimeListTMP)
{
if (MainForm.userReportTimeList.ContainsKey(obj.UserID))
MainForm.userReportTimeList.Remove(obj.UserID);
MainForm.userReportTimeList.Add(obj.UserID, obj);
}
dbgate.gelAllGatewaysAndRadioGatewaysHT(ref MainForm.RadioGWHash);
dbuser.RefreshUserHT(ref MainForm.userStateHash);
SM.Debug("Step1 ");
try
{
if (MainForm.VehList.Count == 0)
{
VehImeiStatus = dbalm.getImeiLastStatus();
}
foreach (Vehicles obj in VehicleListTMP)
{
if (!MainForm.VehicleHashStat.ContainsKey(obj.Imei))
MainForm.VehicleHashStat.Add(obj.Imei, new VehicleStatus(obj.Gps_poor, obj.Gps_off, obj.Made_off));
else
{
VehicleStatus vehicleStatus = (VehicleStatus)MainForm.VehicleHashStat[obj.Imei];
//prevent reset lastPositionTime & lastArsTime on create new VehicleStatus object
vehicleStatus.gps_poor = obj.Gps_poor;
vehicleStatus.gps_off = obj.Gps_off;
vehicleStatus.made_off = obj.Made_off;
}
}
if (firstStartProccesStatus)
{
DBgatewaysManager dbgateway = new DBgatewaysManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
RadioListIP = dbgateway.get_all_GatewaywithIDandIP();
firstStartProccesStatus = false;
VehLastPos = dbveh.GetLastPos();
//define status now
foreach (UnitGpsPos obj in VehLastPos)
{
//if ((obj.status != 0) && (obj.status != 7) && (obj.status != 8) && (obj.status != 9))
if ((obj.status != (int)Status_for_tab.OFF) && (obj.status != (int)Status_for_tab.DISABLE)
&& (obj.status != (int)Status_for_tab.EMERG) && (obj.status != (int)Status_for_tab.MADEOFF))
{
nrSecond = DateTime.Now.GetSecondsLocalFromDT() - (uint)obj.timeGMT;
//Utils.WriteLine("Nr second:" + nrSecond + " Imei:" + obj.IMEI, ConsoleColor.Green);
if (MainForm.VehicleHashStat[obj.IMEI] != null)
{
VehicleStatus vehicleStatus = (VehicleStatus)MainForm.VehicleHashStat[obj.IMEI];
// save last position time
vehicleStatus.lastPositionTime = ((uint)obj.timeGMT).GetDTLocalFromSeconds();
if (vehicleStatus.made_off <= nrSecond)
{
PushStatus(obj.IMEI, Status_for_tab.MADEOFF);
vehicleStatus.curentStatus = Status_for_tab.MADEOFF;
}
else if (vehicleStatus.gps_off <= nrSecond)
{
PushStatus(obj.IMEI, Status_for_tab.GPS_OFF);
vehicleStatus.curentStatus = Status_for_tab.GPS_OFF;
}
else if (vehicleStatus.gps_poor <= nrSecond)
{
PushStatus(obj.IMEI, Status_for_tab.GPS_POOR);
vehicleStatus.curentStatus = Status_for_tab.GPS_POOR;
}
else
{
if (obj.status == (int)Status_for_tab.GPS_ON)
{
Int64 left = DateTime.Now.GetSecondsLocalFromDT();
Int64 right = (uint)obj.timeGMT;
nrSecond = (uint)Math.Abs(left - right);
if (vehicleStatus.made_off <= nrSecond)
{
ImeitoMADEOFFList.Add(obj.IMEI);
}
}
else if ((obj.status == (int)Status_for_tab.NOGPSFIX) || (obj.status == (int)Status_for_tab.ON))
{
if ((Int64)Math.Abs(vehicleStatus.made_off - nrSecond) * 1000 < Int32.MaxValue)
;
}
vehicleStatus.curentStatus = (Status_for_tab)obj.status;
}
}
}
else
{
if (MainForm.VehicleHashStat[obj.IMEI] != null)
((VehicleStatus)MainForm.VehicleHashStat[obj.IMEI]).curentStatus = (Status_for_tab)obj.status;
}
}
}
}
catch (Exception ex)
{
SM.Debug("Error on putting the status:"+ex.ToString());
try
{
foreach (Vehicles obj in VehicleListTMP)
{
if (!MainForm.VehicleHashStat.Contains(obj.Imei))
MainForm.VehicleHashStat.Add(obj.Imei, new VehicleStatus(obj.Gps_poor, obj.Gps_off, obj.Made_off));
}
foreach (String obj in MainForm.VehicleHashStat.Keys)
((VehicleStatus)MainForm.VehicleHashStat[obj]).curentStatus = Status_for_tab.OFF;
}
catch (Exception exe)
{
SM.Debug("Error on put all the stuff OFF:"+exe.ToString());
}
}
reloadEmergHashes();
// populate vehicles list
if (MainForm.VehList.Count == 0)
{
//old code
Utils.WriteLine("Compute zone first time init Vehlist");
ZoneList = dbalm.get_all_zone();
LandList = dbalm.get_all_landmarks();
Dictionary<Int64, String> usersSpeedUnits = dbuser.getAllUsersSpeedUnit();
MainForm.VehList = dbalm.get_Vehicle_and_zone();
#region DISPLAY ALL UNITS IDs TO CONSOLE
Utils.WriteLine("==================================================================");
Utils.WriteLine($"Received {MainForm.VehList.Count } vehicles", ConsoleColor.Green);
int i = 0;
foreach(Vehicle_Data veh in MainForm.VehList.Cast<DictionaryEntry>().ToList()
.Select(d => d.Value).OrderBy(d => ((Vehicle_Data)d).imei))
{
//Vehicle_Data veh = (pair.Value as Vehicle_Data);
Utils.Write(String.Format("{0,15}", veh.imei + (veh.active ? " [X]" : "[ ]") ), ConsoleType.ALL);
if (i % 5 == 0)
Utils.Write("|\n", ConsoleType.ALL);
i++;
}
Utils.Write("\n", ConsoleType.ALL);
Utils.WriteLine("==================================================================");
#endregion
if ((ZoneList.Count != 0) || (LandList.Count != 0))
{
Utils.WriteLine("Compute zone first time if i have some zones or LANDmarks");
foreach (String obj in MainForm.VehList.Keys)
{
Vehicle_Data vehicle_Data = (Vehicle_Data)MainForm.VehList[obj];
ArrayList tmparr = new ArrayList();
foreach (ZoneClass obj2 in ZoneList)
{
ZoneClass tmp = new ZoneClass(obj2, obj2.id, obj2.arrSc_id);
if (!usersSpeedUnits.ContainsKey(tmp.useridx))
usersSpeedUnits.Add(tmp.useridx, "m");
tmp.speedUnit = usersSpeedUnits[tmp.useridx];
tmparr.Add(tmp);
}
vehicle_Data.zonelist = tmparr;
ArrayList tmparr2 = new ArrayList();
foreach (LandMark obj2 in LandList)
{
LandMark tmp = new LandMark(obj2.name, obj2.lat, obj2.lng, obj2.land_id, obj2.useridx, obj2.callout, obj2.calloutSeverity);
if (!usersSpeedUnits.ContainsKey(tmp.useridx))
usersSpeedUnits.Add(tmp.useridx, "m");
tmp.speedUnit = usersSpeedUnits[tmp.useridx];
tmparr2.Add(tmp);
}
vehicle_Data.landlist = tmparr2;
}
foreach (String obj in MainForm.VehList.Keys)
{
Vehicle_Data vehicle_Data = (Vehicle_Data)MainForm.VehList[obj];
foreach (ZoneClass obj2 in vehicle_Data.zonelist)
obj2.CheckZone(vehicle_Data.lat, vehicle_Data.lng, out postmp);
foreach (LandMark obj2 in vehicle_Data.landlist)
obj2.CheckPosition(vehicle_Data.lat, vehicle_Data.lng);
}
}
}
else
{
//new code made calcation for zone only if something change
Console.WriteLine("Compute zone calculation only something is change");
ZoneListTMP = dbalm.get_all_zone();
LandListTMP = dbalm.get_all_landmarks();
/// condition to recalculate zone
if ((ZoneListTMP.Count != 0) || (LandListTMP.Count != 0))
{
VehListTMP = dbalm.get_Vehicle_and_zone();
// check if zone ID is change
try
{
wehaveChange = false;
foreach (ZoneClass obj in ZoneListTMP)
{
findid = false;
foreach (ZoneClass obj2 in ZoneList)
if (obj.id == obj2.id)
{
findid = true;
break;
}
if (!findid)
{
wehaveChange = true;
break;
}
}
}
catch (Exception ex)
{
SM.Debug("Error compare zone ID"+ex.ToString());
}
// end check zone ID change
if ((VehListTMP.Count != MainForm.VehList.Count) || (ZoneListTMP.Count != ZoneList.Count) || (LandListTMP.Count != LandList.Count) || (wehaveChange))
{
Console.WriteLine("Something is change on Zone or Landmark begin proccess");
foreach (String obj in VehListTMP.Keys)
{
Vehicle_Data vehicle_Data = (Vehicle_Data)VehListTMP[obj];
ArrayList tmparr = new ArrayList();
foreach (ZoneClass obj2 in ZoneListTMP)
{
ZoneClass tmp = new ZoneClass(obj2, obj2.id, obj2.arrSc_id);
tmparr.Add(tmp);
}
vehicle_Data.zonelist = tmparr;
ArrayList tmparr2 = new ArrayList();
foreach (LandMark obj2 in LandListTMP)
{
LandMark tmp = new LandMark(obj2.name, obj2.lat, obj2.lng, obj2.land_id, obj2.useridx, obj2.callout, obj2.calloutSeverity);
tmparr2.Add(tmp);
}
vehicle_Data.landlist = tmparr2;
}
foreach (String obj in VehListTMP.Keys)
{
Vehicle_Data vehicle_Data = (Vehicle_Data)VehListTMP[obj];
foreach (ZoneClass obj2 in vehicle_Data.zonelist)
obj2.CheckZone(vehicle_Data.lat, vehicle_Data.lng, out postmp);
foreach (LandMark obj2 in vehicle_Data.landlist)
obj2.CheckPosition(vehicle_Data.lat, vehicle_Data.lng);
}
//clear all
ZoneList.Clear();
LandList.Clear();
MainForm.VehList.Clear();
// move from TMP used List
foreach (ZoneClass obj in ZoneListTMP)
ZoneList.Add(obj);
foreach (LandMark obj in LandListTMP)
LandList.Add(obj);
foreach (String obj in VehListTMP.Keys)
{
Vehicle_Data tmp = (Vehicle_Data)VehListTMP[obj];
MainForm.VehList.Add(obj, tmp);
}
MainForm.VehListWithGroupDetails.Clear();
List<Vehicles> list = dbvehs.getAllVehicles();
foreach (Vehicles veh in list)
{
// remove old object if still exists
if (MainForm.VehListWithGroupDetails.Contains(veh.Imei))
MainForm.VehListWithGroupDetails.Remove(veh.Imei);
MainForm.VehListWithGroupDetails.Add(veh.Imei, veh);
}
}
}
}
Utils.WriteLine("Before updating status");
foreach (String obj in ImeitoMADEOFFList)
{
PushStatus(obj, Status_for_tab.MADEOFF);
((VehicleStatus)MainForm.VehicleHashStat[obj]).curentStatus = Status_for_tab.MADEOFF;
System.Threading.Thread.Sleep(10);
}
}
catch (Exception ex)
{
Console.WriteLine("Error load zone " + ex.ToString());
//Console.ReadKey(true);
if (!messageOnScreen)
{
messageOnScreen = true;
try
{
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#Application server database connection failed#"), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0#210#3#Application server database connection failed#").Length);
}
catch (Exception ex2)
{
SM.Debug("Error on sending Message to SD that APPServer has problem: " + ex2.ToString());
}
try
{
Utils.WriteEventLog(Program.COMPANY, "AppServer restart imminent due to DB connection failed", EventLogEntryType.Information, 3152);
}
catch (Exception exe)
{
SM.Debug("Unable to write log Event ex:" + exe.ToString());
}
//short initial = FeedbackRadMessageBox.InteractionWaitSeconds;
//FeedbackRadMessageBox.InteractionWaitSeconds = 1;
FeedbackRadMessageBox.ShowError("DB connection failed!!!Please check DB server and restart Application server!!", "App Server Database Error");
//FeedbackRadMessageBox.InteractionWaitSeconds = initial;
Environment.Exit(0);
}
}
}
private void reloadEmergHashes()
{
try
{
DB = new DBmanager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
DB.InitConnection();
//load vehs for stolen test
dbvehs = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
dbsubsoperManage = new DBsubsOperationManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
List<Vehicles> list = dbvehs.getAllVehicles();
MainForm.VehListWithGroupDetails.Clear();
foreach (Vehicles veh in list)
{
// remove old object if still exists
if (MainForm.VehStolen.Contains(veh.Imei))
MainForm.VehStolen.Remove(veh.Imei);
MainForm.VehStolen.Add(veh.Imei, veh.IsStolen);
if (EmergencyHash.Contains(veh.Imei))
EmergencyHash.Remove(veh.Imei);
EmergencyHash.Add(veh.Imei, new DateTime(0));
// remove old object if still exists
if (MainForm.VehListWithGroupDetails.Contains(veh.Imei))
MainForm.VehListWithGroupDetails.Remove(veh.Imei);
MainForm.VehListWithGroupDetails.Add(veh.Imei, veh);
}
dbCallPatch = new DBcallPatchManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
}
catch (Exception ex)
{
SM.Debug(ex.ToString());
}
}
private void sendAlarmMail(string mes, string mailAdr)
{
try
{
MailAddress from = new MailAddress(Program.cfg.emailAddress);
MailAddress to = new MailAddress(mailAdr);
MailMessage message = new MailMessage(from, to);
message.Subject = "Alarm";
message.Body = mes;
EmailServerSSL.sendEmail(Program.cfg.smtpServer, Program.cfg.smtpPort, Program.cfg.emailAddress, Program.cfg.emailPassword, message, Program.cfg.smtpSSLState);
}
catch (Exception ex)
{
Utils.WriteLine("Exception in sendMailAlarm: " + ex.ToString(), ConsoleColor.Red);
//Console.WriteLine(e.ToString());
}
}
public void sendDailyReportMail(String PdfFile, string mailAdr)
{
try
{
MailAddress from = new MailAddress(Program.cfg.emailAddress);
//MailAddress to = new MailAddress(mailAdr);
String[] address = mailAdr.Split(";".ToCharArray());
MailAddress to = new MailAddress(address[0]);
MailMessage message = new MailMessage(from, to);
if (address.Count() > 1)
{
Boolean skipeFirst=true;
foreach (String obj in address)
{
if (skipeFirst) { skipeFirst = false; }
else message.To.Add(new MailAddress(obj));
}
}
message.Subject = "Daily Reports from " + Program.COMPANY + " Dispatch System";
message.Body = "Hello you have attached a PDF file with you Daily Reports from " + Program.COMPANY + " Dispatch System";
// Create the file attachment for this e-mail message.
Attachment data = new Attachment(PdfFile, MediaTypeNames.Application.Octet);
// Add time stamp information for the file.
ContentDisposition disposition = data.ContentDisposition;
disposition.CreationDate = System.IO.File.GetCreationTime(PdfFile);
disposition.ModificationDate = System.IO.File.GetLastWriteTime(PdfFile);
disposition.ReadDate = System.IO.File.GetLastAccessTime(PdfFile);
// Add the file attachment to this e-mail message.
message.Attachments.Add(data);
MainForm.ReportEmailQueue.PostItem(message);
}
catch (Exception ex)
{
SM.Debug("Exception in sendMailReport: "+ex.ToString());
//Console.WriteLine(e.ToString());
}
}
private void ComputeZones(Object state)
{
// This method is executed by a thread pool thread
Console.WriteLine("Computing Zones");
MainForm.ZonesBussy = true;
readZones();
MainForm.ZonesBussy = false;
}
private uint DateTo70Format(DateTime param)
{
long nOfSeconds;
//Console.WriteLine("DateTo70Format param=" + param);
System.DateTime dt70 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
TimeSpan span = param - dt70;
nOfSeconds = (long)span.TotalSeconds;
return ((uint)nOfSeconds);
}
#endregion
#region email
private void CheckMail(Object state)
{
// This method is executed by a thread pool thread
try
{
if (Program.cfg.enableEmailService)
{
SM.Debug(new string[] { "Checking mail at:" + DateTime.Now.ToString(), "For " + Program.cfg.emailAddress.ToString() + " on " + Program.cfg.pop3Server.ToString() });
emailHT = dbsubsoperManage.getAll_imei_sc_id("ByMail");
if (emailHT.Count > 0)
{
SM.Debug("Load " + emailHT.Count + " subscribers emails from DB ...");
}
Int64 latestEmailTime = sslServer.getLastEmailTime();
ArrayList EmailList = sslServer.getEmails();
// update the latest email time if changed
if (latestEmailTime < sslServer.getLastEmailTime())
{
DBemailServiceManager DB = new DBemailServiceManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
DB.SetLastEmailTime(sslServer.getLastEmailTime());
}
DBvehiclesManager dbvehs = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
foreach (EmailtoSMS obj in EmailList)
{
String seqID = "0." + (DateTime.Now.GetSecondsLocalFromDT()) + DateTime.Now.Millisecond.ToString();
SM.Debug(new string[] {"-----START OK----",
"From: " + obj.from,
"ID: " + obj.id,
"Text: " + obj.text});
try
{
// app server idx =0
DBsmsManager DB = new DBsmsManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port);
//bigu code remove # from text and also replace "'"
try
{
obj.text = obj.text.Replace("&#39;", "`");
obj.text = obj.text.Replace("#", " ");
}
catch (Exception ex)
{
SM.Debug("Error on converting email:" + ex.ToString());
}
//end bigu code
if (!obj.is_group) DB.insert_sms_received(obj.id, obj.text, 7, obj.from, seqID);
if (obj.is_sierra)
{
if (emailHT.Contains(obj.from))
{
SM.Debug("Email received <<" + obj.text + ">> from address: " + obj.from);
seqID = "1." + Utils.GetSecondsLocalFromDT(DateTime.Now).ToString() + DateTime.Now.Millisecond.ToString();
string test = "#132#" + ((SW_Subscriber)emailHT[obj.from]).imei + "#" + obj.text + "#hyt#";
String cmdok = "#" + seqID + test; Int32 tmp = cmdok.Length + 1; tmp += tmp.ToString().Length; cmdok = "#" + tmp.ToString() + cmdok;
System.Text.Encoding enc = System.Text.Encoding.ASCII;
byte[] buf = enc.GetBytes(cmdok);
//send to messagebus
MainForm.udp.Send(buf, buf.Length);
SM.Debug("Email thread successfully sent data to message bus");
}
}
}
catch (Exception ex)
{
Utils.WriteLine(ex.ToString(), ConsoleColor.Red);
}
if (obj.text.Length > 140 - 3 - obj.from.Length)
obj.text = obj.text.Remove(140 - 3 - obj.from.Length) + " [" + obj.from + "]";
else
obj.text = obj.text + " [" + obj.from + "]";
//send SMS on message buss
if (!obj.is_sierra)
{
UnitSysPosition tmpX = dbvehs.getSystemPosition(dbvehs.getSCID(obj.id));
string msg = "#143#" + tmpX.Gw_id + "." + tmpX.R_gw_id + "." + obj.id + "#" + obj.text + "#" + (DateTime.Now.GetSecondsLocalFromDT()) + "#";
if (obj.is_group) msg = "#144#" + tmpX.Gw_id + "." + tmpX.R_gw_id + "." + obj.id + "#" + obj.text + "#" + (DateTime.Now.GetSecondsLocalFromDT()) + "#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#0.0" + msg), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0" + msg).Length);
if (obj.is_group)
{
Int32 oldgatewayID = 0;
foreach (RadioGateway obj2 in RadioListIP)
{
if (oldgatewayID != obj2.Gw_id)
{
oldgatewayID = (Int32)obj2.Gw_id;
string msg2 = "#144#" + obj2.Gw_id + "." + obj2.Id + "." + obj.id + "#" + obj.text + "#" + (DateTime.Now.GetSecondsLocalFromDT()) + "#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#1." + (DateTime.Now.GetSecondsLocalFromDT()) + DateTime.Now.Ticks.ToString() + msg2), SafeMobileLib.Utils.Convert_text_For_multicast("#1." + (DateTime.Now.GetSecondsLocalFromDT()) + DateTime.Now.Ticks.ToString() + msg2).Length);
}
}
}
}
}
SM.Debug("Email check done!!!");
}
else
{
SM.Debug("Email disabled");
}
}
catch (Exception ex)
{
SM.Debug("Error on CheckMAil:" + ex.ToString());
}
}
//sms-> email
private void sendMail( string mailAdr, string mailBody, int radioID)
{
if (Program.cfg.enableEmailService)
{
SM.Debug("Sending mail to " + mailAdr + " from radioId " + radioID.ToString());
try
{
MailMessage message = new MailMessage();
message.From = new MailAddress(Program.cfg.emailAddress);
message.To.Add(mailAdr);
message.Subject = "RadioID: " + radioID.ToString() + " Subject:" + (mailBody.Length < 25 ? mailBody : (mailBody.Remove(25) + "..."));
message.Body = "You received a message from radio id " + radioID.ToString() +
"\n------------------------------\n" +
mailBody +
"\n------------------------------\n ";
message.IsBodyHtml = true;
EmailServerSSL.sendEmail(Program.cfg.smtpServer, Program.cfg.smtpPort, Program.cfg.emailAddress, Program.cfg.emailPassword, message, Program.cfg.smtpSSLState);
}
catch (Exception ex)
{
Utils.WriteLine("Exception in sendMail: " + ex.ToString(), ConsoleColor.Red);
}
}
else
{
SM.Debug("email disabled");
}
}
//sms-> email Sierra Wireless
private void sendMail_SW(string mailAdr, string mailBody)
{
SM.Debug("Sending mail to " + mailAdr);
try
{
MailMessage message = new MailMessage();
message.From = new MailAddress(Program.cfg.emailAddress);
message.To.Add(mailAdr);
message.Body = mailBody;
message.IsBodyHtml = true;
EmailServerSSL.sendEmail(Program.cfg.smtpServer, Program.cfg.smtpPort, Program.cfg.emailAddress, Program.cfg.emailPassword, message, Program.cfg.smtpSSLState);
}
catch (Exception ex)
{
Utils.WriteLine("Exception in sendMail Sierra Wireless Gateway: "+ ex.ToString() ,ConsoleColor.Red);
}
}
#endregion
#region DB backup/restore
private DBbackup backup;
private BackgroundWorker bgWorkerDBbackup;
private volatile bool backupDOne = false;
#region bg worker DBbackup events
void bgWorkerDBbackup_DoWork(object sender, DoWorkEventArgs e)
{
object[] param = (object[])e.Argument;
if (backup.performBackupPostgres(param[0].ToString(), param[1].ToString()))
{
Console.WriteLine(" Backup done.");
backupDOne = true;
}
else
{
Console.WriteLine(" Backup failed.");
backupDOne = false;
}
}
void bgWorkerDBbackup_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//send emergency alarm to SD
//send ACK back to GW
string test = (backupDOne == true) ? "#61#1#" : "#61#0#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#0.0" + test), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0" + test).Length);
}
#endregion
private BackgroundWorker bgWorkerDBrestore;
private volatile bool restoreDOne;
#region bg worker DBrestore events
void bgWorkerDBrestore_DoWork(object sender, DoWorkEventArgs e)
{
object[] param = (object[])e.Argument;
if (backup.performRestorePostgres(param[0].ToString(), param[1].ToString()))
{
Console.WriteLine(" restore done.");
restoreDOne = true;
}
else
{
Console.WriteLine(" restore failed.");
restoreDOne = false;
}
}
void bgWorkerDBrestore_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//send emergency alarm to SD
//send ACK back to GW
string test = (restoreDOne == true) ? "#62#1#" : "#252#0#";
MainForm.udp.Send(SafeMobileLib.Utils.Convert_text_For_multicast("#0.0" + test), SafeMobileLib.Utils.Convert_text_For_multicast("#0.0" + test).Length);
}
#endregion
private string getAllBackups(string dirFolder)
{
SM.Debug("Searching for backups in:" + dirFolder);
string ret="";
if (!Directory.Exists(dirFolder)) return "";
DirectoryInfo di = new DirectoryInfo(dirFolder);
di.Refresh();
FileInfo[] fileNames = di.GetFiles("*.tar");
for (int i = 1; i < 35; i++)
{
//get last backups
if((fileNames.Length - i)>=0)
ret += fileNames[fileNames.Length - i].Name + ";";
}
Utils.WriteLine(ret, ConsoleColor.Green);
return ret;
}
#endregion
public delegate void RefreshHashRequest();
public event RefreshHashRequest OnRefreshHashRequest;
public delegate void DatabaseDownDel();
public event DatabaseDownDel OnDatabaseDown;
public delegate void EmergencyAckDelegate(String seqID, String radioID);
public event EmergencyAckDelegate OnEmergencyAckReceived;
public delegate void PollRequestDelegate(String seqID, String radioID);
public event PollRequestDelegate OnPollRequestReceived;
}
}