using NAudio.Wave; using NFCSharp; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; using System.Media; using System.Threading; using System.Net; using Newtonsoft.Json; //20190807 - kill all timers when going to settings - maanie //20190808 - run update function in a separate thread - maanie namespace MagusEvents { /// /// Interaction logic for Scan.xaml /// public partial class Scan : Page { DispatcherTimer Timer = new DispatcherTimer(); SoundPlayer OK_Mplayer = new System.Media.SoundPlayer(); SoundPlayer No_Mplayer = new System.Media.SoundPlayer(); DispatcherTimer UpdateImage = new DispatcherTimer(); DispatcherTimer UpdateCheck = new DispatcherTimer(); public Frame main; public Frame Header; Database DATA = new Database(); Webservices online = new Webservices(); //bool nfcBusy = false; private int nfcBusy = 0; int AID; public int BUSY = 0; private string currentDirectory; string IMAGE = ""; public Scan() { InitializeComponent(); AID = DATA.GetAccreditationID(); string path = @"c:\temp_acc\"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } Events Eventsprofile = DATA.GetEvent(AID.ToString()); if (Eventsprofile.Logo != "") { IMAGE = Eventsprofile.Logo; ProfileImage.Source = Base64StringToBitmap(IMAGE); } else { IMAGE = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBw8ODg4PDhEQDQ4PDw0QDQ8ODQ8PDQ0PFREWFhYRExMYHSggGBolGxUTITEhJSkrLi4uFx8zODMsNygtLisBCgoKDg0NFQ8PFSsZFRkrLTcrKy0rKys3Ny0tNzcrKzctLSsrKysrKysrKysrKysrKysrKysrKysrKysrKysrK//AABEIAOEA4QMBIgACEQEDEQH/xAAaAAEAAwEBAQAAAAAAAAAAAAAAAwQFAQIH/8QAMRABAAECBAQFAgUFAQAAAAAAAAECEQMEITESMlFxQWGBkbEiwUJScqHRgpLh8PEF/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAER/9oADAMBAAIRAxEAPwD7UAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhzGZpo0nWqdqY3UsTHxKt54Y6U6e8pq40aq4jeYjvMI5zWH+aP3lm8EdL99XqIjomri/Gcw/zR7T/D3Tj0TtVT7s0mmOhpjWGTTM08szT2nT2WsLOTGlf90feF1MXAjW0xrEioAAAAAAAAAAAAAAAAAAIM1j8Eaa1Tyx907Lrr46pqnx0p8oS1Y8RG8zrM7z1ehxloAAAB0cAT5bG4Jt+Gd/LzX2UvZPEvTad6fhZWbE4DSAAAAAAAAAAAAAAAAK+erthzEb1Wp91Fb/8AQ2o7zP7KrNajgCKAAAAAAJ8pVauPPRA94fNT3j5IjTAbZAAAAAAAAAAAAAAAAVM/+DvV8Qqref2p7z8KjNajgCKAAAAAAPeHzU94+XhJhc1PeAaQDbAAAAAAAAAAAAAAAACrn+Wn9X2lTXM/y0/q+0qbNagAigAAAAACTB5qe8I0mDzU94EaQDbIAAAAAAAAAAAAAAACvno+iJ6VRP2UmljUcVNUdY07sxmtQARQAAAAABLlovXT3RLWSp1mekERcAbZAAAAAAAAAAAAAAAAGfmaOGqek6x2aCvnKL038afhKsUQGWgAAAAABpZajhpjrOsqWXo4qo6by0VjNAGkAAAAAAAAAAAAAAAACYAGZi0cNUx7dnhfzeFxReN4+OiixWo4AKAAOiXLYXFV5Rv/AAIs5TDtTed5+E4NsgAAAAAAAAAAAAAAAAI8bHpo5pt5bz7AkFCvO1TyRaOtW/pCCviq5qpq8r6eyauNCvNYdO9UX6RrKliV01TemJiPOLPEUxG0WdTVxwBFAAFvBzOHTFtaeszGk+qo6I06MSmrlmJ7TD1ZkTTH/N0tGPXTtPFHSrX911MaQrYedpnmiaJ96fdYib6xq0joAAAAAAAAAAPNdcUxeqYiPMHpHjY1NEfVNukeM+iri52Z0w4tH5p39IVuHW86zPjOspq4mxM3XVy/RT1/FP8ACGKIjXees6y6Mq6OAoAAAAAAAA64AO4dU08s28vCfRwEXMLORtX9M9fw/wCFqGU9YWJVRyzp+WdpXTGmIMLNU1aT9NXSdp7SnaZAAAAHKqoiLzNojxl4x8aKIvPpHjLOxK6q5vX6UxtCWrIsY2dmdMOP6qvtCrVF5vVM1T5+Ho9OM2qACgAAAAAAAAAAAAAAAAAEveHjV07TeOlWvtPg8ANDBzNNWnLV0nx7T4pmTKzl81MWiqbx4T08pWVnF0OKOse40jKqrmueKfHljpA4MNgAAAAAAAAAAAAAAAAAAAAAAAAAFv8AbgABcuAFy4AXLgBcuAFy4AXLgBcuAFy4AXLgBcuAFy4AXLgBcuAFy4AXAX4dBQAQAAAAAAAAAAAAAAAAAAAAAAAAAAf/2Q=="; ProfileImage.Source = Base64StringToBitmap(IMAGE); } Scanning.Focus(); InitializeComponent(); Timer = new DispatcherTimer(); Timer.Interval = TimeSpan.FromSeconds(10); Timer.Tick += new EventHandler(reset); //20190716 - this has been moved to the "Download Data" button - maanie //20190711 - added back updating of image and details - maanie //20190802 - added flag to work offline - maanie string WorkMode = (string) App.Current.Properties["WorkMode"]; if (WorkMode == "ON") { UpdateImage = new DispatcherTimer(); UpdateImage.Interval = TimeSpan.FromSeconds(120); //120 UpdateImage.Tick += new EventHandler(Download_Image); UpdateImage.Start(); UpdateCheck = new DispatcherTimer(); UpdateCheck.Interval = TimeSpan.FromSeconds(240); //240 UpdateCheck.Tick += new EventHandler(Download_UpdateAsync); UpdateCheck.Start(); WorkModeMessage.Content = "You are working online"; WorkModeMessage.Foreground = Brushes.Green; } else { WorkModeMessage.Content = "You are working offline"; WorkModeMessage.Foreground = Brushes.Red; } currentDirectory = System.IO.Directory.GetCurrentDirectory(); OK_Mplayer.SoundLocation = currentDirectory + "\\images\\ok.wav"; OK_Mplayer.Load(); No_Mplayer.SoundLocation = currentDirectory + "\\images\\Bazz.wav"; No_Mplayer.Load(); // Load the .wav file. /*if (!NFCHandler.IsInitialized) { NFCHandler.Init(); startpulling(); } else { startpulling(); }*/ } Thread thread_Update; private void Download_UpdateAsync(object sender, EventArgs e) { try { bool is_online = online.CheckForInternetConnection(); if (is_online == true) { if (DownloadingImg == 0) { //20190808 - run update function in a separate thread - maanie thread_Update = new Thread(() => { Webservices Service = new Webservices(); Service.CheckUpdates(); }); thread_Update.Start(); } } } catch //(Exception error) { thread_Update.Abort(); //MessageBox.Show(error.ToString()); } } //------------------------------NFC SCANNOR-------------------------------------- // GET NEW UPDATES Thread thread_Image; Thread thread; Thread thread_new; public int Busy_downloading = 0; public int DownloadingImg = 0; private void Download_Image(object sender, EventArgs e) { try { bool is_online = online.CheckForInternetConnection(); if (is_online == true) { Console.WriteLine("Download .."); Person PersonDb = new Person(); Person profile = PersonDb.GetImagesUpdates(); if (DownloadingImg == 0 && profile.AAID > 0) { if (AID > 0) { DownloadingImg = 1; thread_Image = new Thread(() => { using (var client = new WebClient()) { string url = "https://footprintapp.net/api/accreditation/getimages/ac/" + AID + "/id/" + profile.AAID; client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadPicProgressChanged); client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DownloadPicFileCompleted); client.DownloadStringAsync(new Uri(url)); } }); thread_Image.Start(); } } else { UpdateImage.Stop(); } } } catch //(Exception error) { thread_Image.Abort(); //MessageBox.Show(error.ToString()); } } private void DownloadPicFileCompleted(object sender, DownloadStringCompletedEventArgs e) { Dispatcher.BeginInvoke(new Action(delegate { try { string htmldoc = e.Result; string Web_Data = Convert.ToString(htmldoc); Web_Data = Web_Data.Replace("'", "\'"); var JsonObjects = JsonConvert.DeserializeObject(Web_Data); Database SQL = new Database(); int i = 0; foreach (var Services in JsonObjects) { if (Services.User_pic != "NULL") { string path = @"c:\temp_acc\" + Services.AAID + ".txt"; //Console.WriteLine("Saving .."+ path); try { string IMG = Services.User_pic.ToString(); System.IO.File.WriteAllText(path, IMG); } catch { } } string sql = "UPDATE Persons SET " + " User_pic = '1' " + " WHERE AAID = '" + Services.AAID + "'; "; Console.WriteLine("Saving .." + sql); bool updated = SQL.ExecuteData(sql); i++; } } catch { } })); DownloadingImg = 0; thread_Image.Abort(); } private void DownloadPicProgressChanged(object sender, DownloadProgressChangedEventArgs e) { } private void startpulling() { if (!NFCHandler.IsInitialized) return; if (NFCHandler.Readers.Count() > 0) { NFCHandler.Readers[0].TagFound += Snapscan; NFCHandler.Readers[0].StartPolling(); } } private void Snapscan(NFCTag Tag) { if (Tag != null) { BUSY = 1; string code = ""; if (nfcBusy == 0) { code = Tag.UID.ToString(); if (code.Length == 11) { this.Dispatcher.Invoke(() => { nfcBusy = 1; Timer.Stop(); UserProfile(code, 1); }); } } } } private void reset(object sender, EventArgs e) { Console.WriteLine("REST:"); Timer.Stop(); Scan Page = new Scan(); main.Content = Page; Page.main = main; Page.Header = Header; } private void GoToSettings(object sender, MouseButtonEventArgs e) { Timer.Stop(); //20190807 - kill all timers when going to settings - maanie UpdateImage.Stop(); UpdateCheck.Stop(); Setup Page = new Setup(); main.Content = Page; Page.main = main; Page.Header = Header; } private string Barcode = string.Empty; //TO DO use a StringBuilder instead Stopwatch sw = new Stopwatch(); DispatcherTimer ST = new DispatcherTimer(); bool busy_scanning = false; private void ScanninAcc(object sender, KeyEventArgs e) { try { Timer.Stop(); Barcode = Scanning.Text; if (e.Key == Key.Tab || e.Key == Key.Return) { ST = new DispatcherTimer(); ST.Tick += new EventHandler(Scaning); ST.Start(); Scanning.Text = ""; } } catch { } } private void Scaning(object sender, EventArgs e) { try { if (busy_scanning == false) { Timer.Stop(); busy_scanning = true; ST.Stop(); Scanning.Focus(); /*Profile Page = new Profile(); main.Content = Page; Page.main = main; Page.barcode = Barcode; Page.UserProfile();*/ UserProfile(Barcode); Console.WriteLine(Barcode); Barcode = ""; busy_scanning = false; } else { Barcode = ""; } } catch { } } public void UserProfile(string Bar_code, int nfc = 0) { Timer.Start(); this.Dispatcher.Invoke(() => { if (AID > 0 && Barcode != "") { // Default.Visibility = Visibility.Hidden; try { Person ProfleDb = new Person(); Person Profile; if (nfc == 1) { Profile = ProfleDb.GetByNFC(Bar_code, AID); } else { Profile = ProfleDb.GetRow(Bar_code, AID); } int Active = 0; if (Profile.AASID > 0) { foundData.Visibility = Visibility.Visible; NotfoundData.Visibility = Visibility.Hidden; try { string path = @"c:\temp_acc\" + Profile.AAID + ".txt"; if (File.Exists(path)) { string img = System.IO.File.ReadAllText(path); string[] imgPlit = img.Split(','); ProfileImage.Source = Base64StringToBitmap(imgPlit[1]); ; } else { ProfileImage.Source = Base64StringToBitmap(IMAGE); } } catch { } FullName.Text = Profile.FirstName + " " + Profile.Surname; CompanyName.Text = Profile.organisation; CategoryName.Text = Profile.Category; Role_Name.Text = Profile.Role; if (Profile.RoleColor != "") { Role_Name_color.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString(Profile.RoleColor)); } else { Role_Name_color.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#00981E")); } int AllAccess = 0; string ZONES = Profile.aZones; string newstr = ZONES.Replace("\"", ""); string newstr1 = newstr.Replace("[", ""); string newstr2 = newstr1.Replace("]", ""); bool FULLACCESS = newstr2.Contains("312"); string TIME_Split = DateTime.Now.ToString("HHmm"); int TIME_int = Convert.ToInt32(TIME_Split); Zones ActivezonesDb = new Zones(); List ActiveZones = new List(); int CountLocked = DATA.GetLockedCount(AID.ToString()); if (CountLocked > 0) { ActiveZones = ActivezonesDb.GetActiveByArrayLocked(newstr2, AID.ToString()); } else { ActiveZones = ActivezonesDb.GetActiveByArray(newstr2, AID.ToString()); } if (FULLACCESS == true) { AllAccess = 1; ActiveZones = ActivezonesDb.GetActiveByArray(newstr2, AID.ToString()); } List ActiveZonesNew = new List(); foreach (Zones row in ActiveZones) { Console.WriteLine("Zone Number:" + row.Number); string FromTime = row.FromTime; string ToTime = row.ToTime; string FromTime_Spling = FromTime.Replace(":", ""); string ToTime_Spling = ToTime.Replace(":", ""); int FromTime_int = Convert.ToInt32(FromTime_Spling); int ToTime_int = Convert.ToInt32(ToTime_Spling); if (FromTime_int == 0 && ToTime_int == 0) { ActiveZonesNew.Add(row); } else { if (TIME_int >= FromTime_int && TIME_int <= ToTime_int) { ActiveZonesNew.Add(row); } } } string base64 = ""; foreach (Zones row in ActiveZonesNew) { Active = 1; if (row.ZTID == 24) { AllAccess = 1; base64 = row.Icon; } } pycons.Children.Clear(); ResetZones(); if (AllAccess == 1) { Active = 1; AllAccessWrapa.Visibility = Visibility.Visible; ResetZonesIcons(base64); } else { getZones(newstr2); } //check if he has all access } else { foundData.Visibility = Visibility.Hidden; NotfoundData.Visibility = Visibility.Visible; FullName.Text = "Invalid"; CompanyName.Text = "N/A"; CategoryName.Text = "N/A"; Role_Name.Text = "N/A"; ProfileImage.Source = Base64StringToBitmap(IMAGE); } if (Active == 1) { Allowed(); string file = @"c:\temp_acc\scan.txt"; string report = System.IO.File.ReadAllText(file); string date = DateTime.Now.ToString("yyyy-MM-dd"); string TIME_Split = DateTime.Now.ToString("HHmm"); string newReport = report + Profile.AASID + "|" + date + "|" + TIME_Split + "|" + Profile.FirstName + " " + Profile.Surname + "|1|0|;"; System.IO.File.WriteAllText(file, newReport); ScanningWrapa.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#00981E")); ScanningText.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#ffffff")); ScanningText.Text = "GRANTED"; } else { NotAllowed(); string file = @"c:\temp_acc\scan.txt"; string report = System.IO.File.ReadAllText(file); string date = DateTime.Now.ToString("yyyy-MM-dd"); string TIME_Split = DateTime.Now.ToString("HHmm"); string newReport = report + Profile.AASID + "|" + date + "|" + TIME_Split + "|" + Profile.FirstName + ";"; System.IO.File.WriteAllText(file, newReport); ScanningWrapa.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#BF360C")); ScanningText.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#ffffff")); ScanningText.Text = "DENIED"; } } catch (Exception error) { MessageBox.Show(error.ToString()); } nfcBusy = 0; } }); } private void ResetZonesIcons(string base64 = "") { try { pycons.Children.Clear(); int i = 0; while (i < 4) { Border B = new Border(); B.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#6193AF")); B.Height = 120; B.Width = 120; B.Margin = new Thickness(0, 0, 15, 0); if (base64 != "" && i == 0) { ImageBrush ib = new ImageBrush(); ib.ImageSource = Base64StringToBitmap(base64); ib.Stretch = Stretch.UniformToFill; B.Background = ib; Image_0.CornerRadius = new CornerRadius(15); } else { B.CornerRadius = new CornerRadius(120); } pycons.Children.Add(B); i++; } } catch { } } private void ResetZones() { try { AllAccessWrapa.Visibility = Visibility.Hidden; ZonesWrapa.Children.Clear(); int r = 0; int index = 0; while (r < 3) { StackPanel zSTK = new StackPanel(); zSTK.HorizontalAlignment = HorizontalAlignment.Left; zSTK.Orientation = Orientation.Horizontal; int c = 0; while (c < 5) { Border border = new Border(); border.Height = 120; border.Width = 120; border.Margin = new Thickness(0, 15, 15, 0); border.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#6193AF")); ; zSTK.Children.Add(border); c++; index++; } ZonesWrapa.Children.Add(zSTK); r++; } } catch { } } private void getZones(string Zones) { try { AllAccessWrapa.Visibility = Visibility.Hidden; Zones DB = new Zones(); List ZonesObjects = DB.GetByArray(Zones, 0); ZonesWrapa.Children.Clear(); int r = 0; int index = 0; while (r < 3) { StackPanel zSTK = new StackPanel(); zSTK.HorizontalAlignment = HorizontalAlignment.Left; zSTK.Orientation = Orientation.Horizontal; List ICONS = new List(); int c = 0; while (c < 5) { Border border = new Border(); border.Height = 120; border.Width = 120; border.Margin = new Thickness(0, 15, 15, 0); if (index < ZonesObjects.Count) { if (ZonesObjects[index].Hidden == 1) { if (ZonesObjects[index].Icon != "") { border.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#6193AF")); ICONS.Add(ZonesObjects[index].Icon); } } else { border.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#fff")); ; TextBlock Txt = new TextBlock(); Txt.HorizontalAlignment = HorizontalAlignment.Center; Txt.TextWrapping = TextWrapping.Wrap; Txt.Text = ZonesObjects[index].Number.ToString(); Txt.VerticalAlignment = VerticalAlignment.Center; Txt.TextAlignment = TextAlignment.Center; Txt.FontSize = 60; Txt.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#505050")); Txt.FontWeight = FontWeights.Bold; Txt.FontFamily = new FontFamily("Segoe UI Semibold"); border.Child = Txt; } } else { border.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#6193AF")); } zSTK.Children.Add(border); c++; index++; } //ADD ICONS int j = 0; foreach (string icon in ICONS) { AddZonesIcons(icon); j++; } ZonesWrapa.Children.Add(zSTK); r++; } } catch { } } private void AddZonesIcons(string base64 = "") { try { Border B = new Border(); B.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#6193AF")); B.Height = 120; B.Width = 120; B.Margin = new Thickness(0, 0, 15, 0); if (base64 != "") { ImageBrush ib = new ImageBrush(); ib.ImageSource = Base64StringToBitmap(base64); ib.Stretch = Stretch.UniformToFill; B.Background = ib; B.CornerRadius = new CornerRadius(15); } else { B.CornerRadius = new CornerRadius(120); } pycons.Children.Add(B); } catch { } } private void NotAllowed() { try { this.Dispatcher.Invoke(() => { No_Mplayer.Play(); }); //Scanning.Text = string.Empty; //Scanning.Focus(); } catch { } } private void playSound_OK() { try { SystemSounds.Beep.Play(); } catch (Exception e) { MessageBox.Show(e.ToString()); } } private void playSound_No() { try { No_Mplayer.PlaySync(); } catch (Exception e) { MessageBox.Show(e.ToString()); } } private void Allowed() { try { this.Dispatcher.Invoke(() => { SystemSounds.Asterisk.Play(); //OK_Mplayer.Play(); }); } catch { } } public static BitmapImage Base64StringToBitmap(string base64String) { var imgBytes = Convert.FromBase64String(base64String); BitmapImage bitmapImage = new BitmapImage(); MemoryStream ms = new MemoryStream(imgBytes); bitmapImage.BeginInit(); bitmapImage.StreamSource = ms; bitmapImage.EndInit(); return bitmapImage; } } }