Files
BeWoPlaner/BeWoLauncher/Logic/Controller/ProcessController.cs
rene 4fbfdbaf2c Unit Tests erstellt
Informationen ausgelagert
Kleines Spy/Test Programm erstellt
Mehr Exceptions/InvalidUpdateFileRequestException.cs
Launcher Host in Download Server geändert
Download Server macht zusätzlich Abfrage an den Hauptserver
Download geht jetzt stückweise von statten
2022-12-28 16:36:59 +01:00

163 lines
5.7 KiB
C#

using BeWoLauncher.Logic.Utils;
using BeWoLauncher.ServiceProxy;
using BS.SharedLauncher.Information;
using System;
using System.Diagnostics;
using System.IO;
using System.IO.Pipes;
using System.Threading;
using System.Windows;
using System.Windows.Threading;
namespace BeWoLauncher.Logic.Controller
{
public static class ProcessController
{
private static Process PlanerProcess { get; set; }
public static Application Current => Application.Current;
public static LauncherApp CurrentLauncher => Current as LauncherApp;
private static bool PlanerRunning
{
get
{
if (PlanerProcess is null)
return false;
PlanerProcess.Refresh();
return !PlanerProcess.HasExited;
}
}
internal static void CheckForOtherInstance()
{
string procName = Process.GetCurrentProcess().ProcessName;
Process[] processes = Process.GetProcessesByName(procName);
if (processes.Length > 1)
{
MessageBox.Show("BeWo Prozess läuft bereits");
StartLauncherShutdown();
}
Process[] processes2 = Process.GetProcessesByName("BeWoPlaner");
if (processes2.Length > 0)
{
MessageBox.Show("BeWo Prozess läuft bereits");
StartLauncherShutdown();
}
}
internal static void StartLauncher()
{
CheckForOtherInstance();
// Update Server Adresses
//ConnectionInformation.DownloadServerAddress = ConnectionInformation.DownloadServerAddressExact.ToString();
//ConnectionInformation.CoreServerAddress = ConnectionInformation.CoreServerAddress.ToString();
LauncherServiceFacade.UpdateServerAddresses(SessionInformation.Connection.DownloadServerAddressExact, SessionInformation.Connection.CoreServerAddressExact);
}
internal static void StartLauncherShutdown()
{
Current.Shutdown();
}
internal static void StartPlanerProcess()
{
// based on https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-use-anonymous-pipes-for-local-interprocess-communication?redirectedfrom=MSDN
PlanerProcess = new Process();
PlanerProcess.StartInfo.FileName = LauncherPaths.GetPlanerExePath();
PlanerProcess.EnableRaisingEvents = true;
PlanerProcess.Exited += PlanerProcess_Exit;
using (AnonymousPipeServerStream pipeServer = new AnonymousPipeServerStream(PipeDirection.Out, HandleInheritability.Inheritable))
{
PlanerProcess.StartInfo.Arguments = pipeServer.GetClientHandleAsString();
PlanerProcess.StartInfo.UseShellExecute = false;
PlanerProcess.StartInfo.CreateNoWindow = false;
PlanerProcess.StartInfo.RedirectStandardOutput = true;
PlanerProcess.OutputDataReceived += MessageFromPlanerClient;
PlanerProcess.Start();
DownloadLogger.Post2($"Launcher Start: {PlanerProcess.StartInfo.FileName}");
PlanerProcess.BeginOutputReadLine();
pipeServer.DisposeLocalCopyOfClientHandle();
try
{
using (StreamWriter sw = new StreamWriter(pipeServer))
{
var signal = new string[] { "C-137", "C-131" };
sw.AutoFlush = true;
SendInfo(sw, signal[0], pipeServer);
SessionInformation.Connection.ToList().ForEach(info => SendInfo(sw, info, pipeServer));
SessionInformation.Login.ToList().ForEach(info => SendInfo(sw, info, pipeServer));
SessionInformation.Session.ToList().ForEach(info => SendInfo(sw, info, pipeServer));
SendInfo(sw, signal[1], pipeServer);
}
}
catch (IOException ex)
{
}
}
}
internal static void SendInfo(StreamWriter sw, string info, AnonymousPipeServerStream pipe)
{
sw.WriteLine(info);
pipe.WaitForPipeDrain();
}
internal static void KillPlanerProcess()
{
foreach (var process in Process.GetProcesses())
{
if (process.ProcessName.Contains("BeWoPlaner"))
{
process.Kill();
}
}
}
internal static void PlanerProcess_Exit(object sender, EventArgs e)
{
// ExitCode Übersicht:
// 100 - Nutzer hat Logout in Core gedrückt
// 0 - Nutzer hat Fenster geschlossen
// 1 - Proess über TaskManager gekillt
if (PlanerProcess.ExitCode == 100)
{
CurrentLauncher.Dispatcher.BeginInvoke(DispatcherPriority.Render, (Action)delegate
{
Thread.Sleep(500);
ViewController.RestartView();
});
return;
}
CurrentLauncher.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)StartLauncherShutdown);
}
private static void MessageFromPlanerClient(object sender, DataReceivedEventArgs args)
{
var data = args.Data;
if (data == "GUI geladen")
{
ViewController.CurrentWindow.Dispatcher.BeginInvoke(DispatcherPriority.Render, (Action)(() => ViewController.CurrentWindow.Hide()));
}
}
}
}