using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using NetMonitorUtils; using BlubbFish.Utils; using System.Threading; using System.Runtime.CompilerServices; namespace NetMonitorTray.Controller { public class Tray : OwnController { private static View.Tray tray; private static OpenVpnSetter vpn; private static NetworkSetter network; private static Controller.Window window; private static Thread trayMenuRefresh; /// /// Tray Controller /// public Tray() { vpn = new OpenVpnSetter("vpn.ini", "config.ini"); network = new NetworkSetter("network.ini", "config.ini"); trayMenuRefresh = new Thread(menuRefresh); } /// /// Init! /// override protected void init() { tray = new View.Tray(); window = new Controller.Window(); tray.setWorkingIcon(); try { updateMenu(); } catch(Exception e) { tray.showError(e.Message); tray.Model.connectedStatus = false; } trayMenuRefresh.Start(); } private static void menuRefresh() { while(true) { Thread.Sleep(10 * 60 * 1000); //Wait 10 Minutes updateMenu(); } } [MethodImpl(MethodImplOptions.Synchronized)] private static void updateMenu() { List adapter = tray.Model.getAdapterList(); tray.Model.NetworkSelected = network.getNetwork(adapter); List vpns = tray.Model.getVpnList(); tray.Model.VpnSelected = vpn.getStatus(vpns); checkWorkingIcon(); } private static void checkWorkingIcon() { bool w = false; foreach(KeyValuePair item in tray.Model.VpnSelected) { if(item.Value == "connected") { w = true; } } tray.Model.connectedStatus = w; } /// /// User klickt auf den Eintrag Beenden /// /// /// internal static void Click_Quit(object sender, EventArgs e) { trayMenuRefresh.Abort(); while(trayMenuRefresh.ThreadState != ThreadState.Aborted) { Thread.Sleep(100); } tray.Dispose(); Application.Exit(); } /// /// User klick auf einen Eintrag Service Starten/Stoppen /// /// /// internal static void Click_Vpn(object sender, EventArgs e) { tray.setWorkingIcon(); string[] conf = ((ToolStripMenuItem)sender).Name.Split('|'); switch(tray.Model.VpnSelected[conf[1]]) { case "disconnected": case "unknown": try { vpn.setStart(conf[1]); for(int i = 0; i < 10; i++) { string status = vpn.getStatus(conf[1]); if(status.StartsWith("[connected|")) { tray.Model.VpnSelected[conf[1]] = "connected"; status = status.Substring(0, status.Length - 1).Substring(1); string[] ip = status.Split('|'); tray.setVpn(true, "Verbunden am: " + ip[5] + "\nmit IP: " + ip[1] + "\nConfig: " + conf[1]); break; } System.Threading.Thread.Sleep(3000); } } catch(Exception ex) { tray.showError("Fehler beim starten von Openvpn mit " + conf[1] + ": " + ex.Message); } break; case "connected": try { vpn.setStop(conf[1]); for(int i = 0; i < 10; i++) { string status = vpn.getStatus(conf[1]); if(status == "[disconnected]") { tray.Model.VpnSelected[conf[1]] = "disconnected"; tray.setVpn(false, "Config: " + conf[1]); break; } System.Threading.Thread.Sleep(1000); } } catch(Exception ex) { tray.showError("Fehler beim beenden von Openvpn mit " + conf + ": " + ex.Message); } break; } checkWorkingIcon(); } /// /// User klickt Doppelt auf das TrayIcon /// /// /// internal static void Click_Tray(object sender, EventArgs e) { Click_Open(sender, e); } /// /// User klickt auf den Tray-Ballon /// /// /// internal static void Click_Ballon(object sender, EventArgs e) { Click_Open(sender, e); } /// /// User klickt auf einen Eintrag Netzwerk /// /// /// internal static void Click_Network(object sender, EventArgs e) { tray.setWorkingIcon(); try { string n = ((ToolStripMenuItem)sender).Name; network.setNetwork(n.Split('|')[1]); tray.Model.NetworkSelected[n.Split('|')[0]] = n.Split('|')[1]; } catch(Exception ex) { tray.showError("Fehler beim setzen des Netzwerks: " + ex.Message); } checkWorkingIcon(); } /// /// User klickt auf den Eintrag Öffnen /// /// /// internal static void Click_Open(object sender, EventArgs e) { window.execute(); } } }