1458 lines
55 KiB
C#
1458 lines
55 KiB
C#
using SafeMobileLib.MessageDecoders;
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using System.Drawing.Imaging;
|
|
using System.Net;
|
|
using System.Threading.Tasks;
|
|
using System.Net.NetworkInformation;
|
|
using System.Collections.Specialized;
|
|
using System.Runtime.InteropServices;
|
|
using Newtonsoft.Json.Linq;
|
|
using System.Collections.Generic;
|
|
using Microsoft.Win32;
|
|
using System.Net.Sockets;
|
|
using System.Management.Automation.Runspaces;
|
|
using System.Collections.ObjectModel;
|
|
using System.Management.Automation;
|
|
|
|
namespace SafeMobileLib
|
|
{
|
|
public class Utils
|
|
{
|
|
|
|
public static readonly String MBusUnicodeChar = "***<>";
|
|
|
|
public static bool isConsoleVisible = true;
|
|
public static bool TimeWithMs = false;
|
|
public static readonly String StolenArs = "stolen_ars";
|
|
public static readonly String StolenValidGPS = "stolen_valid_gps";
|
|
public static readonly String StolenNoGPSFix = "stolen_no_gps_fix";
|
|
|
|
public static List<ConsoleType> outputConsoleType = new List<ConsoleType>(){ConsoleType.ALL };
|
|
|
|
private static readonly object locker = new object();
|
|
|
|
/// <summary>
|
|
/// Write a console message with the default console color
|
|
/// which is Gray
|
|
/// </summary>
|
|
/// <param name="str">String which needs to be displayed on the console</param>
|
|
|
|
public static void WriteLine(string str)
|
|
{
|
|
WriteLine(str, ConsoleColor.Gray, ConsoleType.ALL);
|
|
}
|
|
|
|
public static void WriteLine(string str, ConsoleColor color)
|
|
{
|
|
WriteLine(str, color, ConsoleType.ALL);
|
|
}
|
|
|
|
public static void WriteLine(string str, ConsoleType type)
|
|
{
|
|
|
|
WriteLine(str, ConsoleColor.Gray, type);
|
|
}
|
|
|
|
|
|
public static void WriteLine(string str, ConsoleColor color, ConsoleType type)
|
|
{
|
|
// do not display the console message if not required
|
|
if (!outputConsoleType.Contains(ConsoleType.ALL) && !outputConsoleType.Contains(type))
|
|
return;
|
|
|
|
if (isConsoleVisible)
|
|
{
|
|
lock (locker)
|
|
{
|
|
Console.ForegroundColor = ConsoleColor.DarkGray;
|
|
Console.Write(String.Format("[### {0:H:mm:ss" + (TimeWithMs ? ".ffffff" : "") + "} ###] ", DateTime.Now));
|
|
Console.ForegroundColor = color;
|
|
Console.Write(String.Format("{0}\n", str));
|
|
Console.ForegroundColor = ConsoleColor.Gray;
|
|
}
|
|
}
|
|
|
|
if (LOGS.WRITE_LOGS)
|
|
{
|
|
if (color == ConsoleColor.Red)
|
|
LOGS.LOG_Error(str);
|
|
else
|
|
LOGS.LOG(str);
|
|
}
|
|
|
|
}
|
|
|
|
public static void Write(string str, ConsoleType type)
|
|
{
|
|
Write(str, ConsoleColor.Gray, type);
|
|
}
|
|
|
|
public static void Write(string str, ConsoleColor color, ConsoleType type)
|
|
{
|
|
// do not display the console message if not required
|
|
if (!outputConsoleType.Contains(ConsoleType.ALL) && !outputConsoleType.Contains(type))
|
|
return;
|
|
|
|
lock (locker)
|
|
{
|
|
Console.ForegroundColor = color;
|
|
Console.Write(String.Format("{0}", str));
|
|
Console.ForegroundColor = ConsoleColor.Gray;
|
|
}
|
|
|
|
if (LOGS.WRITE_LOGS)
|
|
{
|
|
if (color == ConsoleColor.Red)
|
|
LOGS.LOG_Error(str);
|
|
else
|
|
LOGS.LOG(str);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Write an event log into the system's Event Log
|
|
/// </summary>
|
|
/// <param name="source">Application name which is the source of the event</param>
|
|
/// <param name="content">Content of the event log</param>
|
|
/// <param name="type">Type of the event which needs to be inserted</param>
|
|
/// <param name="eventId">An id of the event to filter better the events</param>
|
|
public static void WriteEventLog(String source, String content, EventLogEntryType type, Int32 eventId)
|
|
{
|
|
try
|
|
{
|
|
if (!EventLog.SourceExists(source))
|
|
EventLog.CreateEventSource(source, "Application");
|
|
|
|
EventLog.WriteEntry(source, content, type, eventId);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Utils.WriteLine("Could not write to event log :" + ex.ToString(), ConsoleColor.Red);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Byte2String(byte[] data, int startIndex, int len)
|
|
{
|
|
string sdata = "";
|
|
int i;
|
|
|
|
if (startIndex > data.Length)
|
|
return "";
|
|
|
|
for (i = startIndex; i < startIndex + len && i < data.Length; i++)
|
|
{
|
|
int ii;
|
|
ii = (int)data[i];
|
|
sdata += "0x" + ii.ToString("X") + " ";
|
|
}
|
|
return sdata;
|
|
}
|
|
|
|
public static String ID2IP(string p_CAI, string p_radioIP)
|
|
{
|
|
uint radioID = Convert.ToUInt32(p_radioIP);
|
|
if (radioID > 255 * 255 * 255)
|
|
throw new Exception("Radio ID out of range");
|
|
|
|
byte c = (byte)(radioID & 0x0000FF);
|
|
byte b = (byte)((radioID & 0x00FF00) >> 8);
|
|
byte a = (byte)((radioID & 0xFF0000) >> 16);
|
|
|
|
String toReturn = "" + p_CAI + "." + a + "." + b + "." + c;
|
|
return toReturn;
|
|
}
|
|
|
|
public static string PrintBytesArray(Byte[] receivedBytes)
|
|
{
|
|
String result = "";
|
|
for (int i = 0; i < receivedBytes.Length; i++)
|
|
{
|
|
result = String.Format("{0}0x{1:X} ", result, receivedBytes[i]);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static byte[] ID2ByteARR(string p_CAI, string p_radioIP)
|
|
{
|
|
byte[] arr = new byte[4];
|
|
uint radioID = Convert.ToUInt32(p_radioIP);
|
|
if (radioID > 255 * 255 * 255)
|
|
throw new Exception("Radio ID out of range");
|
|
|
|
arr[0] = Convert.ToByte(p_CAI);
|
|
arr[3] = (byte)(radioID & 0x0000FF);
|
|
arr[2] = (byte)((radioID & 0x00FF00) >> 8);
|
|
arr[1] = (byte)((radioID & 0xFF0000) >> 16);
|
|
return arr;
|
|
}
|
|
|
|
public static string ConvertBytesToString(Byte[] receivedBytes)
|
|
{
|
|
string response = "";
|
|
for (int i = 0; i < receivedBytes.Length; i++)
|
|
{
|
|
response = String.Format("{0}{1}", response, (char)receivedBytes[i]);
|
|
}
|
|
return response;
|
|
}
|
|
|
|
public static Int32 GetSecondsLocalFromDT(DateTime param)
|
|
{
|
|
System.DateTime datetime = param;
|
|
long nOfSeconds;
|
|
System.DateTime dt70 = new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
|
System.DateTime dttmp1 = new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
|
System.DateTime dttmp2;
|
|
dttmp2 = dttmp1.ToLocalTime();
|
|
TimeSpan span2 = dttmp2 - dttmp1;
|
|
TimeSpan span = datetime - dt70;
|
|
if (System.TimeZone.CurrentTimeZone.IsDaylightSavingTime(param)) nOfSeconds = (long)span.TotalSeconds - (long)span2.TotalSeconds - 3600; //mai scot o ora - 3600
|
|
else nOfSeconds = (long)span.TotalSeconds - (long)span2.TotalSeconds;
|
|
return ((Int32)nOfSeconds);
|
|
}
|
|
|
|
public static Byte[] createLocationMessage(int opCode, string suid, String[] dataString)
|
|
{
|
|
string msg = "";
|
|
msg = "#1." + GetSecondsLocalFromDT(DateTime.Now).ToString() + DateTime.Now.Millisecond.ToString() + "#" + opCode + "#" + suid + "#";
|
|
msg = msg + dataString[0] + "#" + dataString[1] + "#" + dataString[2] + "#" + dataString[3];
|
|
int totalSize = 5 + msg.Length;
|
|
string sizeMsg = String.Format("#{0:000}", totalSize);
|
|
msg = sizeMsg + msg;
|
|
Byte[] toSendMulticast = new Byte[totalSize];
|
|
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
|
|
Byte[] toSendMulticastPartial = encoding.GetBytes(msg);
|
|
for (int i = 0; i < toSendMulticastPartial.Length; i++)
|
|
{
|
|
toSendMulticast[i] = toSendMulticastPartial[i];
|
|
}
|
|
toSendMulticast[totalSize - 1] = 35;//'#'
|
|
return toSendMulticast;
|
|
}
|
|
|
|
public static Byte[] createMulticastMessage(int opCode, string suid, Byte[] dataBytes)
|
|
{
|
|
string partialMsg = "#1." + GetSecondsLocalFromDT(DateTime.Now).ToString() + DateTime.Now.Millisecond.ToString() + "#" + opCode + "#" + suid + "#";
|
|
int totalSize = 4 + partialMsg.Length + dataBytes.Length + 1;//
|
|
string sizeMsg = String.Format("#{0:000}", totalSize);
|
|
partialMsg = sizeMsg + partialMsg;
|
|
Byte[] toSendMulticast = new Byte[totalSize];
|
|
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
|
|
Byte[] toSendMulticastPartial = encoding.GetBytes(partialMsg);
|
|
for (int j = 0; j < toSendMulticastPartial.Length; j++)
|
|
toSendMulticast[j] = toSendMulticastPartial[j];
|
|
|
|
for (int i = 0; i < dataBytes.Length; i++)
|
|
{
|
|
toSendMulticast[partialMsg.Length + i] = dataBytes[i]; //data
|
|
}
|
|
toSendMulticast[totalSize - 1] = 35;//'#'
|
|
return toSendMulticast;
|
|
}
|
|
|
|
|
|
|
|
public static bool isRightToLeft(string message)
|
|
{
|
|
int hasRandALCat = 0;
|
|
|
|
foreach(char c in message)
|
|
{
|
|
if (c >= 0x5BE && c <= 0x10B7F)
|
|
{
|
|
if (c <= 0x85E)
|
|
{
|
|
if (c == 0x5BE) hasRandALCat = 1;
|
|
else if (c == 0x5C0) hasRandALCat = 1;
|
|
else if (c == 0x5C3) hasRandALCat = 1;
|
|
else if (c == 0x5C6) hasRandALCat = 1;
|
|
else if (0x5D0 <= c && c <= 0x5EA) hasRandALCat = 1;
|
|
else if (0x5F0 <= c && c <= 0x5F4) hasRandALCat = 1;
|
|
else if (c == 0x608) hasRandALCat = 1;
|
|
else if (c == 0x60B) hasRandALCat = 1;
|
|
else if (c == 0x60D) hasRandALCat = 1;
|
|
else if (c == 0x61B) hasRandALCat = 1;
|
|
else if (0x61E <= c && c <= 0x64A) hasRandALCat = 1;
|
|
else if (0x66D <= c && c <= 0x66F) hasRandALCat = 1;
|
|
else if (0x671 <= c && c <= 0x6D5) hasRandALCat = 1;
|
|
else if (0x6E5 <= c && c <= 0x6E6) hasRandALCat = 1;
|
|
else if (0x6EE <= c && c <= 0x6EF) hasRandALCat = 1;
|
|
else if (0x6FA <= c && c <= 0x70D) hasRandALCat = 1;
|
|
else if (c == 0x710) hasRandALCat = 1;
|
|
else if (0x712 <= c && c <= 0x72F) hasRandALCat = 1;
|
|
else if (0x74D <= c && c <= 0x7A5) hasRandALCat = 1;
|
|
else if (c == 0x7B1) hasRandALCat = 1;
|
|
else if (0x7C0 <= c && c <= 0x7EA) hasRandALCat = 1;
|
|
else if (0x7F4 <= c && c <= 0x7F5) hasRandALCat = 1;
|
|
else if (c == 0x7FA) hasRandALCat = 1;
|
|
else if (0x800 <= c && c <= 0x815) hasRandALCat = 1;
|
|
else if (c == 0x81A) hasRandALCat = 1;
|
|
else if (c == 0x824) hasRandALCat = 1;
|
|
else if (c == 0x828) hasRandALCat = 1;
|
|
else if (0x830 <= c && c <= 0x83E) hasRandALCat = 1;
|
|
else if (0x840 <= c && c <= 0x858) hasRandALCat = 1;
|
|
else if (c == 0x85E) hasRandALCat = 1;
|
|
}
|
|
else if (c == 0x200F) hasRandALCat = 1;
|
|
else if (c >= 0xFB1D)
|
|
{
|
|
if (c == 0xFB1D) hasRandALCat = 1;
|
|
else if (0xFB1F <= c && c <= 0xFB28) hasRandALCat = 1;
|
|
else if (0xFB2A <= c && c <= 0xFB36) hasRandALCat = 1;
|
|
else if (0xFB38 <= c && c <= 0xFB3C) hasRandALCat = 1;
|
|
else if (c == 0xFB3E) hasRandALCat = 1;
|
|
else if (0xFB40 <= c && c <= 0xFB41) hasRandALCat = 1;
|
|
else if (0xFB43 <= c && c <= 0xFB44) hasRandALCat = 1;
|
|
else if (0xFB46 <= c && c <= 0xFBC1) hasRandALCat = 1;
|
|
else if (0xFBD3 <= c && c <= 0xFD3D) hasRandALCat = 1;
|
|
else if (0xFD50 <= c && c <= 0xFD8F) hasRandALCat = 1;
|
|
else if (0xFD92 <= c && c <= 0xFDC7) hasRandALCat = 1;
|
|
else if (0xFDF0 <= c && c <= 0xFDFC) hasRandALCat = 1;
|
|
else if (0xFE70 <= c && c <= 0xFE74) hasRandALCat = 1;
|
|
else if (0xFE76 <= c && c <= 0xFEFC) hasRandALCat = 1;
|
|
else if (0x10800 <= c && c <= 0x10805) hasRandALCat = 1;
|
|
else if (c == 0x10808) hasRandALCat = 1;
|
|
else if (0x1080A <= c && c <= 0x10835) hasRandALCat = 1;
|
|
else if (0x10837 <= c && c <= 0x10838) hasRandALCat = 1;
|
|
else if (c == 0x1083C) hasRandALCat = 1;
|
|
else if (0x1083F <= c && c <= 0x10855) hasRandALCat = 1;
|
|
else if (0x10857 <= c && c <= 0x1085F) hasRandALCat = 1;
|
|
else if (0x10900 <= c && c <= 0x1091B) hasRandALCat = 1;
|
|
else if (0x10920 <= c && c <= 0x10939) hasRandALCat = 1;
|
|
else if (c == 0x1093F) hasRandALCat = 1;
|
|
else if (c == 0x10A00) hasRandALCat = 1;
|
|
else if (0x10A10 <= c && c <= 0x10A13) hasRandALCat = 1;
|
|
else if (0x10A15 <= c && c <= 0x10A17) hasRandALCat = 1;
|
|
else if (0x10A19 <= c && c <= 0x10A33) hasRandALCat = 1;
|
|
else if (0x10A40 <= c && c <= 0x10A47) hasRandALCat = 1;
|
|
else if (0x10A50 <= c && c <= 0x10A58) hasRandALCat = 1;
|
|
else if (0x10A60 <= c && c <= 0x10A7F) hasRandALCat = 1;
|
|
else if (0x10B00 <= c && c <= 0x10B35) hasRandALCat = 1;
|
|
else if (0x10B40 <= c && c <= 0x10B55) hasRandALCat = 1;
|
|
else if (0x10B58 <= c && c <= 0x10B72) hasRandALCat = 1;
|
|
else if (0x10B78 <= c && c <= 0x10B7F) hasRandALCat = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return hasRandALCat == 1;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Check if the application is already running in order to prevent it from running multiple
|
|
/// </summary>
|
|
public static bool testIfAlreadyRunning()
|
|
{
|
|
Process[] processlist = Process.GetProcesses();
|
|
Process curentP = Process.GetCurrentProcess();
|
|
int count = 0;
|
|
foreach (Process theprocess in processlist)
|
|
{
|
|
if (theprocess.ProcessName.Equals(curentP.ProcessName) && !curentP.ProcessName.Contains("vshost"))
|
|
{
|
|
count++;
|
|
}
|
|
}
|
|
if (count > 1)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private const int SW_SHOW = 5;
|
|
private const int SW_RESTORE = 9;
|
|
private const int SW_SHOWMAXIMIZED = 3;
|
|
private const int SW_SHOWNORMAL = 1;
|
|
|
|
[DllImport("user32.dll")]
|
|
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
|
|
|
|
[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
|
|
public static extern bool SetForegroundWindow(IntPtr hwnd);
|
|
|
|
public static bool testIfAlreadyRunning(bool b)
|
|
{
|
|
Process currentProcess = Process.GetCurrentProcess();
|
|
var runningProcess = (from process in Process.GetProcesses()
|
|
where
|
|
process.Id != currentProcess.Id &&
|
|
process.ProcessName.Equals(
|
|
currentProcess.ProcessName,
|
|
StringComparison.Ordinal)
|
|
select process).FirstOrDefault();
|
|
if (!currentProcess.ProcessName.Contains("vshost"))
|
|
{
|
|
if (runningProcess != null)
|
|
{
|
|
var hWnd = runningProcess.MainWindowHandle;
|
|
// Code to display a window regardless of its current state
|
|
ShowWindow(hWnd, SW_SHOW); // Make the window visible if it was hidden
|
|
ShowWindow(hWnd, SW_RESTORE); // Next, restore it if it was minimized
|
|
SetForegroundWindow(hWnd); // Finally, activate the window
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static int GetDBidFromSUID(string suid)
|
|
{
|
|
int DBid = -1;
|
|
//add data to ht_SUInfo
|
|
lock (SN_Queues.ht_SUInfo.SyncRoot)
|
|
{
|
|
if (SN_Queues.ht_SUInfo != null)
|
|
{
|
|
if (SN_Queues.ht_SUInfo.ContainsKey(suid))
|
|
DBid = ((SUinfo)SN_Queues.ht_SUInfo[suid]).DBid;
|
|
}
|
|
}
|
|
return DBid;
|
|
}
|
|
|
|
public static DateTime UnixTimeStampToDateTime(double unixTimeStamp)
|
|
{
|
|
// Unix timestamp is seconds past epoch
|
|
System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
|
dtDateTime = dtDateTime.AddSeconds(unixTimeStamp);
|
|
return dtDateTime;
|
|
}
|
|
|
|
public static byte[] Convert_text_For_multicast(String Cmd_in)
|
|
{
|
|
String cmdok = Cmd_in;
|
|
Int32 tmp = cmdok.Length + 1;
|
|
tmp += tmp.ToString().Length;
|
|
String TMPcmdok = "#" + tmp.ToString() + cmdok;
|
|
if (tmp != TMPcmdok.Length) cmdok = "#" + TMPcmdok.Length + cmdok;
|
|
else cmdok = TMPcmdok;
|
|
|
|
System.Text.Encoding enc = System.Text.Encoding.ASCII;
|
|
byte[] buf = enc.GetBytes(cmdok);
|
|
return buf;
|
|
}
|
|
|
|
public static byte[] Convert_text_For_multicast(String Cmd_in, out String Cmd_out)
|
|
{
|
|
String cmdok = Cmd_in;
|
|
Int32 tmp = cmdok.Length + 1;
|
|
tmp += tmp.ToString().Length;
|
|
String TMPcmdok = "#" + tmp.ToString() + cmdok;
|
|
if (tmp != TMPcmdok.Length) cmdok = "#" + TMPcmdok.Length + cmdok;
|
|
else cmdok = TMPcmdok;
|
|
Cmd_out = cmdok;
|
|
System.Text.Encoding enc = System.Text.Encoding.ASCII;
|
|
byte[] buf = enc.GetBytes(cmdok);
|
|
return buf;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Class equal with an enum containing a string as a returned value
|
|
/// </summary>
|
|
public sealed class TicketingStatuses
|
|
{
|
|
|
|
private readonly String name;
|
|
private readonly int value;
|
|
private readonly Color color;
|
|
|
|
public static readonly TicketingStatuses ASSIGNED = new TicketingStatuses(1, "Assigned", Color.FromArgb(61, 133, 132));
|
|
public static readonly TicketingStatuses ACCEPTED = new TicketingStatuses(2, "Accepted", Color.FromArgb(61, 113, 113));
|
|
public static readonly TicketingStatuses IN_PROGRESS = new TicketingStatuses(3, "In progress", Color.FromArgb(61, 91, 133));
|
|
public static readonly TicketingStatuses COMPLETED = new TicketingStatuses(4, "Completed", Color.FromArgb(94, 133, 61));
|
|
public static readonly TicketingStatuses REJECTED = new TicketingStatuses(5, "Rejected", Color.FromArgb(169, 61, 71));
|
|
public static readonly TicketingStatuses OVERDUE = new TicketingStatuses(6, "Overdue", Color.FromArgb(178, 159, 61));
|
|
|
|
|
|
private TicketingStatuses(int value, String name, Color color)
|
|
{
|
|
this.name = name;
|
|
this.value = value;
|
|
this.color = color;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return name;
|
|
}
|
|
|
|
|
|
public static Color GetTicketStatusColor(String ticketStatus)
|
|
{
|
|
if (ticketStatus.Equals(ASSIGNED.ToString()))
|
|
return ASSIGNED.color;
|
|
else if (ticketStatus.Equals(ACCEPTED.ToString()))
|
|
return ACCEPTED.color;
|
|
else if (ticketStatus.Equals(IN_PROGRESS.ToString()))
|
|
return IN_PROGRESS.color;
|
|
else if (ticketStatus.Equals(COMPLETED.ToString()))
|
|
return COMPLETED.color;
|
|
else if (ticketStatus.Equals(REJECTED.ToString()))
|
|
return REJECTED.color;
|
|
else if (ticketStatus.Equals(OVERDUE.ToString()))
|
|
return OVERDUE.color;
|
|
|
|
return Color.FromArgb(178, 159, 61);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Resize an image keeping the aspect ratio of the image
|
|
/// </summary>
|
|
/// <param name="image">Image which needs to be resized</param>
|
|
/// <param name="maxWidth">Maximum allowed width for this image</param>
|
|
/// <param name="maxHeight">Maximum allowed height for this image</param>
|
|
/// <returns>The resized image</returns>
|
|
public static Image ScaleImage(Image image, int maxWidth, int maxHeight)
|
|
{
|
|
var ratioX = (double)maxWidth / image.Width;
|
|
var ratioY = (double)maxHeight / image.Height;
|
|
var ratio = Math.Min(ratioX, ratioY);
|
|
|
|
var newWidth = (int)(image.Width * ratio);
|
|
var newHeight = (int)(image.Height * ratio);
|
|
|
|
var newImage = new Bitmap(newWidth, newHeight);
|
|
Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight);
|
|
|
|
return newImage;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Convert a bitmap to a grayscale one. This is done using a ColorMatrix
|
|
/// </summary>
|
|
/// <param name="original">Bitmap which needs to be converted to a
|
|
/// grayscale one</param>
|
|
/// <returns>The converted grayscale image</returns>
|
|
public static Bitmap MakeGrayscale3(Bitmap original, float opacity)
|
|
{
|
|
//create a blank bitmap the same size as original
|
|
Bitmap newBitmap = new Bitmap(original.Width, original.Height);
|
|
|
|
//get a graphics object from the new image
|
|
Graphics g = Graphics.FromImage(newBitmap);
|
|
|
|
//create the grayscale ColorMatrix
|
|
ColorMatrix colorMatrix = new ColorMatrix(
|
|
new float[][]
|
|
{
|
|
new float[] {.3f, .3f, .3f, 0, 0},
|
|
new float[] {.59f, .59f, .59f, 0, 0},
|
|
new float[] {.11f, .11f, .11f, 0, 0},
|
|
new float[] {0, 0, 0, opacity, 0},
|
|
new float[] {0, 0, 0, 0, 1}
|
|
});
|
|
|
|
//create some image attributes
|
|
ImageAttributes attributes = new ImageAttributes();
|
|
|
|
//set the color matrix attribute
|
|
attributes.SetColorMatrix(colorMatrix);
|
|
|
|
//draw the original image on the new image
|
|
//using the grayscale color matrix
|
|
g.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height),
|
|
0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes);
|
|
|
|
//dispose the Graphics object
|
|
g.Dispose();
|
|
return newBitmap;
|
|
}
|
|
|
|
|
|
public static Bitmap MakeTransparent(Bitmap original, float opacity)
|
|
{
|
|
//create a blank bitmap the same size as original
|
|
Bitmap newBitmap = new Bitmap(original.Width, original.Height);
|
|
|
|
//get a graphics object from the new image
|
|
Graphics g = Graphics.FromImage(newBitmap);
|
|
|
|
//create the grayscale ColorMatrix
|
|
ColorMatrix colorMatrix = new ColorMatrix(
|
|
new float[][]
|
|
{
|
|
new float[] {1, 0, 0, 0, 0},
|
|
new float[] {0, 1, 0, 0, 0},
|
|
new float[] {0, 0, 1, 0, 0},
|
|
new float[] {0, 0, 0, opacity, 0},
|
|
new float[] {0, 0, 0, 0, 1}
|
|
});
|
|
|
|
//create some image attributes
|
|
ImageAttributes attributes = new ImageAttributes();
|
|
|
|
//set the color matrix attribute
|
|
attributes.SetColorMatrix(colorMatrix);
|
|
|
|
//draw the original image on the new image
|
|
//using the grayscale color matrix
|
|
g.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height),
|
|
0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes);
|
|
|
|
//dispose the Graphics object
|
|
g.Dispose();
|
|
return newBitmap;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Convert a bitmap to a grayscale one. This is done using a ColorMatrix
|
|
/// </summary>
|
|
/// <param name="original">Bitmap which needs to be converted to a
|
|
/// grayscale one</param>
|
|
/// <returns>The converted grayscale image</returns>
|
|
public static Bitmap ChangeColor(Bitmap original, Color color)
|
|
{
|
|
//create a blank bitmap the same size as original
|
|
Bitmap newBitmap = new Bitmap(original.Width, original.Height);
|
|
|
|
//get a graphics object from the new image
|
|
using (Graphics gr = Graphics.FromImage(newBitmap))
|
|
{
|
|
float r = (float)((1.0 / 256) * color.R);// / 256;
|
|
float g = (float)((1.0 / 256) * color.G);// / 256;
|
|
float b = (float)((1.0 / 256) * color.B);// / 256;
|
|
|
|
// create a color matrix in order to change the color
|
|
float[][] colorMatrixElements = {
|
|
new float[] {1, 0, 0, 0, 0}, // Red scaling [multiply]
|
|
new float[] {0, 1, 0, 0, 0}, // Green scaling [multiply]
|
|
new float[] {0, 0, 1, 0, 0}, // Blue scaling [multiply]
|
|
new float[] {r, g, b, 1, 0}, // this will add values to R,G,B,A
|
|
new float[] {0, 0, 0, 0, 1}}; // three translations of 0.2
|
|
|
|
//create some image attributes
|
|
ImageAttributes attributes = new ImageAttributes();
|
|
|
|
ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
|
|
//set the color matrix attribute
|
|
attributes.SetColorMatrix(
|
|
colorMatrix,
|
|
ColorMatrixFlag.Default,
|
|
ColorAdjustType.Bitmap);
|
|
|
|
//draw the original image on the new image
|
|
//using the grayscale color matrix
|
|
gr.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height),
|
|
0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes);
|
|
|
|
}
|
|
return newBitmap;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Convert a bitmap to a grayscale one. This is done using a ColorMatrix
|
|
/// </summary>
|
|
/// <param name="original">Bitmap which needs to be converted to a
|
|
/// grayscale one</param>
|
|
/// <returns>The converted grayscale image</returns>
|
|
public static Bitmap ChangeColorEmergency(Bitmap original, Color color)
|
|
{
|
|
//create a blank bitmap the same size as original
|
|
Bitmap newBitmap = new Bitmap(original.Width, original.Height);
|
|
|
|
//get a graphics object from the new image
|
|
using (Graphics gr = Graphics.FromImage(newBitmap))
|
|
{
|
|
float r = (float)((1.0 / 256) * color.R);// / 256;
|
|
float g = (float)((1.0 / 256) * color.G);// / 256;
|
|
float b = (float)((1.0 / 256) * color.B);// / 256;
|
|
|
|
// create a color matrix in order to change the color
|
|
float[][] colorMatrixElements = {
|
|
new float[] {1, 0, 0, 0, 0}, // Red scaling [multiply]
|
|
new float[] {0, 1, 0, 0, 0}, // Green scaling [multiply]
|
|
new float[] {0, 0, 1, 0, 0}, // Blue scaling [multiply]
|
|
new float[] {r, g, b, 1, 0}, // this will add values to R,G,B,A
|
|
new float[] {0, 0, 0, 0, 1}}; // three translations of 0.2
|
|
|
|
//create some image attributes
|
|
ImageAttributes attributes = new ImageAttributes();
|
|
|
|
ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
|
|
//set the color matrix attribute
|
|
attributes.SetColorMatrix(
|
|
colorMatrix,
|
|
ColorMatrixFlag.Default,
|
|
ColorAdjustType.Bitmap);
|
|
|
|
//draw the original image on the new image
|
|
//using the grayscale color matrix
|
|
gr.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height),
|
|
0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes);
|
|
|
|
}
|
|
return newBitmap;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Get a text representation for the date time representing
|
|
/// the difference in minutes/hours/days from now
|
|
/// </summary>
|
|
/// <param name="utcTime">DateTime value which needs to be converted</param>
|
|
/// <returns>String 'Ago' representation fot he date</returns>
|
|
public static string GetDateTimeAgo(DateTime time)
|
|
{
|
|
String timeValue = "";
|
|
|
|
if (time.Year < 2000)
|
|
return "never reported fix gps";
|
|
|
|
Int64 secondsDifference = (Int64)((DateTime.Now.Subtract(time)).TotalSeconds);
|
|
if (secondsDifference < 0)
|
|
{
|
|
timeValue = "scheduled";
|
|
}
|
|
else if (secondsDifference < 60)
|
|
timeValue = "less than 1 minute";
|
|
else if (secondsDifference < 3600)
|
|
timeValue = (secondsDifference / 60) + " minute" + ((secondsDifference / 60) > 1 ? "s" : "") + " ago";
|
|
else if (secondsDifference < 7200)
|
|
timeValue = "1 hour ago";
|
|
else if (secondsDifference < 86400)
|
|
{
|
|
timeValue = (secondsDifference / 3600) + " hours ago";
|
|
}
|
|
else
|
|
{
|
|
timeValue = (secondsDifference / 86400) + " days ago";
|
|
}
|
|
|
|
return timeValue;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Verify if an email address is a valid email address, in therm of
|
|
/// well written, with '@' and '.' in the wright place
|
|
/// </summary>
|
|
/// <param name="email">Email which needs to be checked</param>
|
|
/// <returns>True if the email is a valid one, or false otherwise</returns>
|
|
public static bool IsValidEmail(string email)
|
|
{
|
|
bool isEmail = Regex.IsMatch(email, @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase);
|
|
return isEmail;
|
|
}
|
|
|
|
public static Status_for_tab GetStatusFromDisplayString(string status)
|
|
{
|
|
if (status.Trim().Equals("OFF"))
|
|
return Status_for_tab.OFF;
|
|
else if (status.Trim().Equals("ON"))
|
|
return Status_for_tab.ON;
|
|
else if (status.Trim().Equals("GPS ON"))
|
|
return Status_for_tab.GPS_ON;
|
|
else if (status.Trim().Equals("GPS POOR"))
|
|
return Status_for_tab.GPS_POOR;
|
|
else if (status.Trim().Equals("GPS OFF"))
|
|
return Status_for_tab.GPS_OFF;
|
|
else if (status.Trim().Equals("NO GPS FIX"))
|
|
return Status_for_tab.NOGPSFIX;
|
|
else if (status.Trim().Equals("Enabled"))
|
|
return Status_for_tab.ENABLE;
|
|
else if (status.Trim().Equals("Disabled"))
|
|
return Status_for_tab.DISABLE;
|
|
else if (status.Trim().Equals("EMERGENCY"))
|
|
return Status_for_tab.EMERG;
|
|
else if (status.Trim().Equals("MADE OFF"))
|
|
return Status_for_tab.MADEOFF;
|
|
else if (status.Trim().Equals("MADE ON"))
|
|
return Status_for_tab.MADEON;
|
|
else
|
|
{
|
|
Utils.WriteLine("UNKNOWN STATUS: " + status, ConsoleColor.Yellow);
|
|
return Status_for_tab.UNKNOW;
|
|
}
|
|
}
|
|
|
|
public static String GetStatusFromInt(int status)
|
|
{
|
|
String Statusforgrid = "OFF";
|
|
Status_for_tab foo = (Status_for_tab)status;
|
|
switch (foo)
|
|
{
|
|
case Status_for_tab.DISABLE:
|
|
Statusforgrid = "Disabled";
|
|
break;
|
|
case Status_for_tab.ENABLE:
|
|
Statusforgrid = "Enabled";
|
|
break;
|
|
case Status_for_tab.ON:
|
|
Statusforgrid = "ON";
|
|
break;
|
|
case Status_for_tab.OFF:
|
|
Statusforgrid = "OFF";
|
|
break;
|
|
case Status_for_tab.GPS_ON:
|
|
Statusforgrid = "GPS ON";
|
|
break;
|
|
case Status_for_tab.GPS_POOR:
|
|
Statusforgrid = "GPS POOR";
|
|
break;
|
|
case Status_for_tab.GPS_OFF:
|
|
Statusforgrid = "GPS OFF";
|
|
break;
|
|
case Status_for_tab.NOGPSFIX:
|
|
Statusforgrid = "NO GPS FIX";
|
|
break;
|
|
case Status_for_tab.EMERG:
|
|
Statusforgrid = "EMERGENCY";
|
|
break;
|
|
case Status_for_tab.MADEOFF:
|
|
Statusforgrid = "MADE OFF";
|
|
break;
|
|
case Status_for_tab.MADEON:
|
|
Statusforgrid = "MADE ON";
|
|
break;
|
|
}
|
|
return Statusforgrid;
|
|
}
|
|
|
|
|
|
public static string Compute4digitALG(double lat, double lng)
|
|
{
|
|
string ret = "";
|
|
ret = String.Format("{0:0.0000}", lat) + String.Format("{0:0.0000}", lng);
|
|
return ret;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Class equal with an enum containing a string as a returned value
|
|
/// </summary>
|
|
public sealed class Direction
|
|
{
|
|
|
|
private readonly String name;
|
|
private readonly int value;
|
|
|
|
public static readonly Direction E = new Direction(1, "E");
|
|
public static readonly Direction ENE = new Direction(2, "ENE");
|
|
public static readonly Direction NE = new Direction(3, "NE");
|
|
public static readonly Direction NNE = new Direction(4, "NNE");
|
|
public static readonly Direction N = new Direction(5, "N");
|
|
public static readonly Direction NNW = new Direction(6, "NNW");
|
|
public static readonly Direction NW = new Direction(7, "NW");
|
|
public static readonly Direction WNW = new Direction(8, "WNW");
|
|
public static readonly Direction W = new Direction(9, "W");
|
|
public static readonly Direction WSW = new Direction(10, "WSW");
|
|
public static readonly Direction SW = new Direction(11, "SW");
|
|
public static readonly Direction SSW = new Direction(12, "SSW");
|
|
public static readonly Direction S = new Direction(13, "S");
|
|
public static readonly Direction SSE = new Direction(14, "SSE");
|
|
public static readonly Direction SE = new Direction(15, "SE");
|
|
public static readonly Direction ESE = new Direction(16, "ESE");
|
|
public static readonly Direction UNKNOWN = new Direction(17, "UNKNOWN");
|
|
|
|
|
|
private Direction(int value, String name)
|
|
{
|
|
this.name = name;
|
|
this.value = value;
|
|
}
|
|
|
|
public override String ToString()
|
|
{
|
|
return name;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Get the direction from a string representation of it
|
|
/// </summary>
|
|
/// <param name="direction">String containing the direction name</param>
|
|
/// <returns>Direction object </returns>
|
|
public static Direction GetDirection(String direction)
|
|
{
|
|
if (direction.Equals(E.ToString()))
|
|
return E;
|
|
else if (direction.Equals(ENE.ToString()))
|
|
return ENE;
|
|
else if (direction.Equals(NE.ToString()))
|
|
return NE;
|
|
else if (direction.Equals(NNE.ToString()))
|
|
return NNE;
|
|
else if (direction.Equals(N.ToString()))
|
|
return N;
|
|
else if (direction.Equals(NNW.ToString()))
|
|
return NNW;
|
|
else if (direction.Equals(NW.ToString()))
|
|
return NW;
|
|
else if (direction.Equals(WNW.ToString()))
|
|
return WNW;
|
|
else if (direction.Equals(W.ToString()))
|
|
return W;
|
|
else if (direction.Equals(WSW.ToString()))
|
|
return WSW;
|
|
else if (direction.Equals(SW.ToString()))
|
|
return SW;
|
|
else if (direction.Equals(SSW.ToString()))
|
|
return SSW;
|
|
else if (direction.Equals(S.ToString()))
|
|
return S;
|
|
else if (direction.Equals(SSE.ToString()))
|
|
return SSE;
|
|
else if (direction.Equals(SE.ToString()))
|
|
return SE;
|
|
else if (direction.Equals(ESE.ToString()))
|
|
return ESE;
|
|
|
|
return UNKNOWN;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Get the direction of where the unit is heading based on the degree
|
|
/// </summary>
|
|
/// <param name="degree">Direction expressed in degrees</param>
|
|
/// <returns>Direction as a Direction object</returns>
|
|
public static Direction GetDirection(Int32 degree)
|
|
{
|
|
if (((degree >= 0) && (degree < 11.25)) || ((degree > 348.75) && (degree <= 360)))
|
|
return Direction.E;
|
|
else if ((degree >= 11.25) && (degree < 33.75))
|
|
return Direction.ENE;
|
|
else if ((degree >= 33.75) && (degree < 56.25))
|
|
return Direction.NE;
|
|
else if ((degree >= 56.25) && (degree < 78.75))
|
|
return Direction.NNE;
|
|
else if ((degree >= 78.75) && (degree < 101.25))
|
|
return Direction.N;
|
|
else if ((degree >= 101.25) && (degree < 123.75))
|
|
return Direction.NNW;
|
|
else if ((degree >= 123.75) && (degree < 146.25))
|
|
return Direction.NW;
|
|
else if ((degree >= 146.25) && (degree < 168.75))
|
|
return Direction.WNW;
|
|
else if ((degree >= 168.75) && (degree < 191.25))
|
|
return Direction.W;
|
|
else if ((degree >= 191.25) && (degree < 213.75))
|
|
return Direction.WSW;
|
|
else if ((degree >= 213.75) && (degree < 236.25))
|
|
return Direction.SW;
|
|
else if ((degree >= 236.25) && (degree < 258.75))
|
|
return Direction.SSW;
|
|
else if ((degree >= 258.75) && (degree < 281.25))
|
|
return Direction.S;
|
|
else if ((degree >= 281.25) && (degree < 303.75))
|
|
return Direction.SSE;
|
|
else if ((degree >= 303.75) && (degree < 326.25))
|
|
return Direction.SE;
|
|
else if ((degree >= 326.25) && (degree < 348.75))
|
|
return Direction.ESE;
|
|
|
|
return Direction.UNKNOWN;
|
|
}
|
|
|
|
public static String getDayCustomFormat(bool is24hours, bool dayFirst)
|
|
{
|
|
string returnDateType = null;
|
|
returnDateType = is24hours ? (dayFirst ? "dd/MM/yyyy HH:mm" : "MM/dd/yyyy HH:mm") : (dayFirst ? "dd/MM/yyyy hh:mm tt" : "MM/dd/yyyy hh:mm tt");
|
|
return returnDateType;
|
|
}
|
|
|
|
public static void SetAlpha(Bitmap bmp, byte alpha)
|
|
{
|
|
if (bmp == null) throw new ArgumentNullException("bmp");
|
|
|
|
var data = bmp.LockBits(
|
|
new Rectangle(0, 0, bmp.Width, bmp.Height),
|
|
System.Drawing.Imaging.ImageLockMode.ReadWrite,
|
|
System.Drawing.Imaging.PixelFormat.Format32bppArgb);
|
|
|
|
var line = data.Scan0;
|
|
var eof = line + data.Height * data.Stride;
|
|
while (line != eof)
|
|
{
|
|
var pixelAlpha = line + 3;
|
|
var eol = pixelAlpha + data.Width * 4;
|
|
while (pixelAlpha != eol)
|
|
{
|
|
System.Runtime.InteropServices.Marshal.WriteByte(
|
|
pixelAlpha, alpha);
|
|
pixelAlpha += 4;
|
|
}
|
|
line += data.Stride;
|
|
}
|
|
bmp.UnlockBits(data);
|
|
}
|
|
|
|
public static async Task<string> CallWebServerAsync(string address)
|
|
{
|
|
return await Task.Run(() => CallWebServer(address));
|
|
}
|
|
|
|
public static string CallWebServer(string address)
|
|
{
|
|
string ret = "not_available";
|
|
try
|
|
{
|
|
//direct link without credentials
|
|
Uri myUri;
|
|
if (Uri.TryCreate(address, UriKind.RelativeOrAbsolute, out myUri))
|
|
{
|
|
WebClient wc = new WebClient();
|
|
String s = wc.DownloadString(address);
|
|
WriteLine("Web Server Response: " + s, ConsoleColor.Yellow);
|
|
ret = s;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
WriteLine("Web Server not available!!!", ConsoleColor.Red);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
public static async Task<string> GetWebServerAddressAsync()
|
|
{
|
|
return await Task.Run(() => GetWebServerAddress());
|
|
}
|
|
|
|
public static string GetWebServerAddress()
|
|
{
|
|
string ret = "not_available";
|
|
try
|
|
{
|
|
//2. 192.168.226.128
|
|
Utils.WriteLine($"Testing 192.168.226.128...");
|
|
ret = CallWebServer("http://192.168.226.128:41414/status");
|
|
if (ret == "not_available")
|
|
{
|
|
//3. http://linx-server.local
|
|
Utils.WriteLine($"Testing linx-server.local...");
|
|
ret = CallWebServer("http://linx-server.local:41414/status");
|
|
if (ret == "not_available")
|
|
{
|
|
string myIp = UdpMulticast.getPreferedIPAdress().ToString();
|
|
string[] ip = myIp.Split('.');
|
|
string baseIP = $"{ip[0]}.{ip[1]}.{ip[2]}";
|
|
//4. scan lan range :41414/status
|
|
for (int i = 1; i <= 255; i++)
|
|
{
|
|
string req_ip = $"{baseIP}.{i}";
|
|
Utils.WriteLine($"Testing IP {req_ip}...");
|
|
if (!PingHost(req_ip))
|
|
continue;
|
|
string request = $"http://{req_ip}:41414/status";
|
|
ret = CallWebServer(request);
|
|
if (ret != "not_available")
|
|
{
|
|
if (parseResponse(ret))
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
catch
|
|
{
|
|
WriteLine("Web Server not available!!!", ConsoleColor.Red);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
private static bool parseResponse(string response)
|
|
{
|
|
bool ret = false;
|
|
try
|
|
{
|
|
JObject o = JObject.Parse(response);
|
|
string lanIP = o["data"]["network"]["privateIp"].ToString();
|
|
string rtpstart = o["data"]["ports"]["rtpstart"].ToString();
|
|
string rtpend = o["data"]["ports"]["rtpend"].ToString();
|
|
string publicIp = o["data"]["network"]["publicIp"].ToString();
|
|
string sipPort = o["data"]["ports"]["udpbindaddr"].ToString().Split(':')[1];
|
|
ret = true;
|
|
}
|
|
catch { Utils.WriteLine("Error on parse server response!", ConsoleColor.Red); }
|
|
return ret;
|
|
}
|
|
|
|
public static bool PingHost(string nameOrAddress)
|
|
{
|
|
bool pingable = false;
|
|
Ping pinger = new Ping();
|
|
try
|
|
{
|
|
PingReply reply = pinger.Send(nameOrAddress);
|
|
pingable = reply.Status == IPStatus.Success;
|
|
}
|
|
catch (PingException)
|
|
{
|
|
// Discard PingExceptions and return false;
|
|
}
|
|
return pingable;
|
|
}
|
|
|
|
|
|
public static async Task<bool> PostRequestAsync(string url, NameValueCollection data)
|
|
{
|
|
return await Task.Run(() => PostRequest(url, data));
|
|
}
|
|
|
|
public static bool PostRequest(string url, NameValueCollection data)
|
|
{
|
|
Utils.WriteLine($"Post request url: {url}", ConsoleColor.Cyan);
|
|
bool ret = false;
|
|
string retString = "";
|
|
using (var wb = new WebClient())
|
|
{
|
|
var response = wb.UploadValues(url, "POST", data);
|
|
retString = Encoding.ASCII.GetString(response);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Gets the path to SafeMobile foder
|
|
/// </summary>
|
|
/// <param name="regKey"></param>
|
|
/// <param name="appFolder"></param>
|
|
/// <returns></returns>
|
|
public static String GetRegValue(String regKey, String appFolder)
|
|
{
|
|
// Write path to the registry
|
|
string path = "Software\\" + "SafeMobile"
|
|
+ (appFolder.Equals("SafeMobile") ? "" : "\\" + appFolder);
|
|
|
|
RegistryKey key = Registry.CurrentUser.OpenSubKey(path);
|
|
|
|
if (key != null)
|
|
{
|
|
try
|
|
{
|
|
return (String)key.GetValue(regKey);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return String.Empty;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Key is not in HKEY_CURRENT_USER /SOFTWARE /SafeMobile
|
|
// Because of registry virtualization, it may be in HKEY_USERS/ SomeUser / SOFTWARE / ....
|
|
// Check all users key form HKEY_USERS
|
|
foreach (string user in Registry.Users.GetSubKeyNames())
|
|
{
|
|
key = Registry.Users.OpenSubKey(user + "\\" + path);
|
|
if (key != null)
|
|
{
|
|
try
|
|
{
|
|
return (String)key.GetValue(regKey);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return String.Empty;
|
|
}
|
|
}
|
|
|
|
}
|
|
return String.Empty;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
public static string GetIP()
|
|
{
|
|
string localIP;
|
|
try
|
|
{
|
|
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
|
|
{
|
|
socket.Connect("8.8.8.8", 65530);
|
|
IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
|
|
localIP = endPoint.Address.ToString();
|
|
return localIP;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
return "127.0.0.1";
|
|
}
|
|
}
|
|
|
|
public static bool PowershellScript(string scriptText, string resultText)
|
|
{
|
|
// create Powershell runspace
|
|
Runspace runspace = RunspaceFactory.CreateRunspace();
|
|
|
|
// open it
|
|
runspace.Open();
|
|
|
|
// create a pipeline and feed it the script text
|
|
Pipeline pipeline = runspace.CreatePipeline();
|
|
pipeline.Commands.AddScript(scriptText);
|
|
|
|
// add an extra command to transform the script output objects into nicely formatted strings
|
|
// remove this line to get the actual objects that the script returns. For example, the script
|
|
// "Get-Process" returns a collection of System.Diagnostics.Process instances.
|
|
pipeline.Commands.Add("Out-String");
|
|
|
|
// execute the script
|
|
Collection<PSObject> results = pipeline.Invoke();
|
|
|
|
// close the runspace
|
|
runspace.Close();
|
|
|
|
// convert the script result into a single string
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|
foreach (PSObject obj in results)
|
|
{
|
|
stringBuilder.AppendLine(obj.ToString());
|
|
}
|
|
|
|
return stringBuilder.ToString().Trim().Contains(resultText);
|
|
}
|
|
|
|
|
|
public static bool PowershellScript(string scriptText)
|
|
{
|
|
return PowershellScript(scriptText, "True");
|
|
}
|
|
|
|
|
|
public static string enumConvertToString(Enum e)
|
|
{
|
|
string Text = Convert.ToInt32(e).ToString();
|
|
return Text;
|
|
}
|
|
}
|
|
|
|
public class Hyt_cmdMsg
|
|
{
|
|
public string m_suid;
|
|
public int m_cmd;
|
|
public string m_payload;
|
|
}
|
|
|
|
public enum Hyt_cmd
|
|
{
|
|
SET_REPORT_INTERVAL = 0x01,
|
|
SEND_SMS = 0x02,
|
|
SEND_POLL = 0x03
|
|
};
|
|
|
|
public class TallysmanLostLog
|
|
{
|
|
public Int64 RadioID { get; set; }
|
|
public Int64 LogId { get; set; }
|
|
|
|
public TallysmanLostLog()
|
|
{
|
|
RadioID = 0;
|
|
LogId = 0;
|
|
}
|
|
}
|
|
|
|
public class TallysmanMsg
|
|
{
|
|
public Int64 Id { get; set; }
|
|
public String EventType { get; set; }
|
|
public Int64 RadioID { get; set; }
|
|
public Double EventTime { get; set; }
|
|
public Double GPSFixTime { get; set; }
|
|
public Double Speed { get; set; }
|
|
public Double Latitude { get; set; }
|
|
public Double Longitude { get; set; }
|
|
public Double Altitude { get; set; }
|
|
public Double LevelOfConfidence { get; set; }
|
|
public Double Bearing { get; set; }
|
|
public Double HorizontalAccuracy { get; set; }
|
|
public Double VerticalAccuracy { get; set; }
|
|
public Double Odometer { get; set; }
|
|
public Int64 RunTime { get; set; }
|
|
public Int64 IdleTime { get; set; }
|
|
public Int32 VioStatus { get; set; }
|
|
public Int32 VioChanged { get; set; }
|
|
public Double AverageSpeed { get; set; }
|
|
public Int64 WaypointId { get; set; }
|
|
public String FirmwareVersion { get; set; }
|
|
public Double RSSI { get; set; }
|
|
public Int64 VitalId { get; set; }
|
|
public Int64 LogId { get; set; }
|
|
|
|
public TallysmanMsg()
|
|
{
|
|
Id = 0;
|
|
EventType = "BUS_STOP";
|
|
RadioID = 0;
|
|
GPSFixTime = 0;
|
|
EventTime = 0;
|
|
Speed = 0;
|
|
Latitude = 0;
|
|
Longitude = 0;
|
|
Altitude = -1;
|
|
LevelOfConfidence = -1;
|
|
Bearing = -1;
|
|
HorizontalAccuracy = 0;
|
|
VerticalAccuracy = 0;
|
|
Odometer = 0;
|
|
RunTime = 0;
|
|
IdleTime = 0;
|
|
VioStatus = 0;
|
|
VioChanged = 0;
|
|
AverageSpeed = 0;
|
|
WaypointId = 0;
|
|
FirmwareVersion = "";
|
|
RSSI = 0;
|
|
VitalId = 0;
|
|
LogId = 0;
|
|
}
|
|
}
|
|
|
|
|
|
public class ARSmsg
|
|
{
|
|
public string SUID;
|
|
public string status;
|
|
}
|
|
|
|
public enum DebugMSG_Type
|
|
{
|
|
ARS, SMS, CTRL, ALL, POLL, always, DB, GPS, DEV, Email, Debug, Address, CFG, Routes, ALERTS, test, WIRELINE, LE
|
|
}
|
|
|
|
public enum ConsoleType
|
|
{
|
|
ARS,
|
|
SMS,
|
|
CTRL,
|
|
ALL,
|
|
POLL,
|
|
DB,
|
|
GPS,
|
|
CFG,
|
|
WIRELINE,
|
|
LE,
|
|
MB,
|
|
OTHER,
|
|
XNL,
|
|
TELEMETRY,
|
|
SDR
|
|
}
|
|
|
|
public class ConsoleArgs
|
|
{
|
|
public bool isARS = false;
|
|
public bool isSMS = false;
|
|
public bool isCTRL = false;
|
|
public bool isALL = true;
|
|
public bool isPOLL = false;
|
|
public bool isDB = false;
|
|
public bool isGPS = false;
|
|
public bool isCFG = false;
|
|
public bool isWIRELINE = false;
|
|
public bool isLE = false;
|
|
public bool isMB = false;
|
|
|
|
public bool isLog = false;
|
|
|
|
public ConsoleArgs() { }
|
|
|
|
public bool IsArgActive(ConsoleType type)
|
|
{
|
|
if (type == ConsoleType.ALL && isALL)
|
|
return true;
|
|
else if (type == ConsoleType.ALL)
|
|
return false;
|
|
else if (type == ConsoleType.ARS && isARS)
|
|
return true;
|
|
else if (type == ConsoleType.ARS)
|
|
return false;
|
|
else if (type == ConsoleType.SMS && isSMS)
|
|
return true;
|
|
else if (type == ConsoleType.SMS)
|
|
return false;
|
|
else if (type == ConsoleType.CTRL && isCTRL)
|
|
return true;
|
|
else if (type == ConsoleType.CTRL)
|
|
return false;
|
|
else if (type == ConsoleType.POLL && isPOLL)
|
|
return true;
|
|
else if (type == ConsoleType.POLL)
|
|
return false;
|
|
else if (type == ConsoleType.DB && isDB)
|
|
return true;
|
|
else if (type == ConsoleType.DB)
|
|
return false;
|
|
else if (type == ConsoleType.GPS && isGPS)
|
|
return true;
|
|
else if (type == ConsoleType.GPS)
|
|
return false;
|
|
else if (type == ConsoleType.CFG && isCFG)
|
|
return true;
|
|
else if (type == ConsoleType.CFG)
|
|
return false;
|
|
else if (type == ConsoleType.WIRELINE && isWIRELINE)
|
|
return true;
|
|
else if (type == ConsoleType.WIRELINE)
|
|
return false;
|
|
else if (type == ConsoleType.LE && isLE)
|
|
return true;
|
|
else if (type == ConsoleType.LE)
|
|
return false;
|
|
else if (type == ConsoleType.MB && isMB)
|
|
return true;
|
|
else if (type == ConsoleType.MB)
|
|
return false;
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
// Types of events received from the UI and options to open some windows
|
|
public enum EventType { ALERT, CENTER, TEXT, TICKETING, DISPLAY, VOICE }
|
|
|
|
|
|
// Types of alerts that can be set in the alerts tab
|
|
public enum AdminAlerts
|
|
{
|
|
EMERGENCY, LONE_WORKER, EMERGENCY_SOUND, EMERGENCY_POPUP,
|
|
GEOFENCE, LANDMARK, GEOFENCE_SOUND, GEOFENCE_POPUP,
|
|
SPEED, SPEED_SOUND, SPEED_POPUP,
|
|
ALARM_ON_EMAIL, TELEMETRY_SOUND, TELEMETRY_POPUP
|
|
}
|
|
|
|
public enum TelemetryAlerts
|
|
{
|
|
DIGITAL1, DIGITAL2, DIGITAL3, DIGITAL4, DIGITAL5
|
|
}
|
|
|
|
|
|
}
|