aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Stubs/ViewModelLocator.cs
blob: 5034a4d906bfb7121f5a3de0bf5a36dd29a291f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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.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<ApplicationUpgradeViewVM.NavigationObject>
    {
        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<TangoVersion> _tangoVersions;
        public List<TangoVersion> 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;

                var temporaryTupFile = TemporaryManager.CreateImaginaryFile(".tup");

                Handler = await RemoteUpgradeManager.CreateTupFile(SelectedVersion, SelectedMachine.SerialNumber, temporaryTupFile);
                await Handler.WaitForCompletion();

                await ModularNavigationManager.NavigateTo<ApplicationUpgradeGeneratedViewVM.NavigationObject>(Navigation.RemoteUpgradeView.ApplicationUpgradeGeneratedView, new ApplicationUpgradeGeneratedViewVM.NavigationObject()
                {
                    SelectedVersion = SelectedVersion,
                    UpgradeNow = UpgradeMode == ApplicationUpgradeMode.ConnectedMachine,
                    SelectedMachine = SelectedMachine,
                    TemporaryTupFile = temporaryTupFile
                }, false);
            }
            catch (OperationCanceledException)
            {
                //Aborted...
            }
            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<bool> 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();
        }
    }
}