using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Tango.BL.Entities; using Tango.Core.Commands; using Tango.FSE.BL; using Tango.FSE.Common; using Tango.FSE.Common.Navigation; using Tango.FSE.Common.RemoteUpgrade; using Tango.FSE.Upgrade.Views; namespace Tango.FSE.Upgrade.ViewModels { public class ApplicationUpgradeViewVM : RemoteUpgradeViewModel, INavigationObjectReceiver { public enum ApplicationUpgradeMode { ConnectedMachine, OtherMachine } public class NavigationObject { public ApplicationUpgradeMode ApplicationUpgradeMode { get; set; } public Machine SelectedMachine { get; set; } } private ApplicationUpgradeMode _upgradeMode; public ApplicationUpgradeMode UpgradeMode { get { return _upgradeMode; } set { _upgradeMode = value; RaisePropertyChangedAuto(); } } private List _tangoVersions; public List TangoVersions { get { return _tangoVersions; } set { _tangoVersions = value; RaisePropertyChangedAuto(); } } private TangoVersion _selectedVersion; public TangoVersion SelectedVersion { get { return _selectedVersion; } set { _selectedVersion = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); } } private Machine _selectedMachine; public Machine SelectedMachine { get { return _selectedMachine; } set { _selectedMachine = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); } } private RemoteUpgradeHandler _handler; public RemoteUpgradeHandler Handler { get { return _handler; } set { _handler = value; RaisePropertyChangedAuto(); } } public RelayCommand GeneratePackageCommand { get; set; } public ApplicationUpgradeViewVM() { GeneratePackageCommand = new RelayCommand(GeneratePackage, () => SelectedVersion != null && SelectedMachine != null); } private async void GeneratePackage() { try { IsFree = false; if (MachineProvider.IsPPCAvailable) { var machine = await Services.MachinesService.GetMachine(MachineProvider.Machine.SerialNumber); if (machine.VersionTag != SelectedVersion.Tag) { IsFree = true; await NotificationProvider.ShowError($"The selected machine cannot be updated to version '{SelectedVersion.VersionAndTag}'.\nPlease modify the machine version tag first."); return; } } var temporaryTupFile = TemporaryManager.CreateImaginaryFile(".tup"); Handler = await RemoteUpgradeManager.CreateTupFile(SelectedVersion, SelectedMachine.SerialNumber, temporaryTupFile); await Handler.WaitForCompletion(); await ModularNavigationManager.NavigateTo(Navigation.RemoteUpgradeView.ApplicationUpgradeGeneratedView, new ApplicationUpgradeGeneratedViewVM.NavigationObject() { SelectedVersion = SelectedVersion, UpgradeNow = UpgradeMode == ApplicationUpgradeMode.ConnectedMachine, SelectedMachine = SelectedMachine, TemporaryTupFile = temporaryTupFile }, false); } catch (OperationCanceledException) { //Aborted... } catch (AuthorizationException ex) { await NotificationProvider.ShowError(ex.Message); } catch (Exception ex) { LogManager.Log(ex, "Error generating remote upgrade package."); } finally { IsFree = true; } } public async override void OnNavigatedTo() { base.OnNavigatedTo(); if (TangoVersions == null) { try { TangoVersions = (await Services.TangoVersionsService.GetAllTangoVersions()).Take(10).ToList(); SelectedVersion = TangoVersions.FirstOrDefault(); } catch (Exception ex) { LogManager.Log(ex, "Error retrieving tango versions."); await NotificationProvider.ShowError($"Error retrieving Tango versions.\n{ex.FlattenMessage()}"); } } } public async override Task OnNavigateBackRequest() { if (!IsFree) { var abort = await NotificationProvider.ShowWarningQuestion("Are you sure you want to abort the upgrade operation?"); if (abort) { if (Handler.CanAbort) { Handler.Abort(); } else { await NotificationProvider.ShowError("Cannot abort the operation at the this stage."); return false; } } return abort; } return true; } public void OnNavigatedToWithObject(NavigationObject obj) { SelectedMachine = obj.SelectedMachine; UpgradeMode = obj.ApplicationUpgradeMode; } public override void OnBeforeNavigatedTo() { base.OnBeforeNavigatedTo(); Handler = new RemoteUpgradeHandler("Ready"); SelectedMachine = null; UpgradeMode = ApplicationUpgradeMode.OtherMachine; InvalidateRelayCommands(); } } }