aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/FSE/Modules/Tango.FSE.Upgrade/ViewModels/ApplicationUpgradeGeneratedViewVM.cs
blob: 53a62404dc5d0a425936f7798cfc035be04ea28f (plain)
pre { line-height: 125%; } td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Transport.Web;

namespace Tango.PPC.Common.Web
{
    public class MachineVersionsRequest : WebRequestMessage
    {

    }
}
/a> 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.BL.Entities;
using Tango.Core.Commands;
using Tango.Core.IO;
using Tango.FSE.BL;
using Tango.FSE.Common;
using Tango.FSE.Common.Navigation;
using Tango.FSE.Common.RemoteUpgrade;
using Tango.FSE.Upgrade.Views;
using static Tango.FSE.Upgrade.ViewModels.ApplicationUpgradeGeneratedViewVM;

namespace Tango.FSE.Upgrade.ViewModels
{
    public class ApplicationUpgradeGeneratedViewVM : RemoteUpgradeViewModel, INavigationObjectReceiver<NavigationObject>
    {
        public class NavigationObject
        {
            public TangoVersion SelectedVersion { get; set; }
            public Machine SelectedMachine { get; set; }
            public bool UpgradeNow { get; set; }
            public TemporaryFile TemporaryTupFile { get; set; }
        }

        private String _tupFileLocation;
        public String TupFileLocation
        {
            get { return _tupFileLocation; }
            set { _tupFileLocation = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private TemporaryFile _temporaryTupFile;
        public TemporaryFile TemporaryTupFile
        {
            get { return _temporaryTupFile; }
            set { _temporaryTupFile = value; InvalidateRelayCommands(); }
        }

        private bool _canUpgradeNow;
        public bool CanUpgradeNow
        {
            get { return _canUpgradeNow; }
            set { _canUpgradeNow = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private String _canUpgradeNowError;
        public String CanUpgradeNowError
        {
            get { return _canUpgradeNowError; }
            set { _canUpgradeNowError = value; RaisePropertyChangedAuto(); }
        }

        private bool _isUpgradeNow;
        public bool IsUpgradeNow
        {
            get { return _isUpgradeNow; }
            set { _isUpgradeNow = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private bool _isUpgradeNowSelected;
        public bool IsUpgradeNowSelected
        {
            get { return _isUpgradeNowSelected; }
            set { _isUpgradeNowSelected = 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(); }
        }

        private RemoteUpgradeHandler _handler;
        public RemoteUpgradeHandler Handler
        {
            get { return _handler; }
            set { _handler = value; RaisePropertyChangedAuto(); }
        }

        private bool _isCompleted;
        public bool IsCompleted
        {
            get { return _isCompleted; }
            set { _isCompleted = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private bool _suppressFirmwareUpgrade;
        public bool SuppressFirmwareUpgrade
        {
            get { return _suppressFirmwareUpgrade; }
            set { _suppressFirmwareUpgrade = value; RaisePropertyChangedAuto(); }
        }


        public RelayCommand StartUpgradeCommand { get; set; }
        public RelayCommand SaveTupFileCommand { get; set; }
        public RelayCommand SelectTupFileLocationCommand { get; set; }

        public ApplicationUpgradeGeneratedViewVM()
        {
            Handler = new RemoteUpgradeHandler("Ready");
            StartUpgradeCommand = new RelayCommand(StartUpgrade, () => CanUpgradeNow && Handler.Status != RemoteUpgradeHandlerStatus.Completed);
            SaveTupFileCommand = new RelayCommand(SaveTupFile, () => TupFileLocation != null);
            SelectTupFileLocationCommand = new RelayCommand(SelectTupFileLocation, () => SelectedVersion != null && SelectedMachine != null);
        }

        public override void OnApplicationStarted()
        {
            base.OnApplicationStarted();
            MachineProvider.MachineConnected += (_, __) => InvalidateCanUpgradeNow();
            MachineProvider.MachineDisconnected += (_, __) => InvalidateCanUpgradeNow();
        }

        private async void SelectTupFileLocation()
        {
            String fileName = $"{SelectedMachine.SerialNumber}_Update_{DateTime.Now.Date.ToFileName()}_v{SelectedVersion.Version}.tup";
            var result = await StorageProvider.SaveFile("Select update package location", "Tango Update Package|*.tup", fileName, ".tup");
            if (result)
            {
                TupFileLocation = result.SelectedItem;
            }
        }

        private void InvalidateCanUpgradeNow()
        {
            CanUpgradeNowError = null;

            //if (!IsUpgradeNowSelected) return;

            if (SelectedMachine == null)
            {
                CanUpgradeNow = false;
                IsUpgradeNowSelected = false;
                CanUpgradeNowError = "Target machine not specified.";
                return;
            }

            if (!MachineProvider.IsConnected)
            {
                CanUpgradeNow = false;
                IsUpgradeNowSelected = false;
                CanUpgradeNowError = "The selected machine is not currently connected.";
                return;
            }

            if (MachineProvider.Machine.Guid != SelectedMachine.Guid)
            {
                CanUpgradeNow = false;
                IsUpgradeNowSelected = false;
                CanUpgradeNowError = "The selected machine is different from the one currently connected.";
                return;
            }

            if (!MachineProvider.ConnectionType.IsRemote())
            {
                CanUpgradeNow = false;
                IsUpgradeNowSelected = false;
                CanUpgradeNowError = "The current machine connection type does not support remote upgrade.";
                return;
            }

            CanUpgradeNow = true;
        }

        private async void StartUpgrade()
        {
            try
            {
                IsFree = false;
                Handler = await RemoteUpgradeManager.PerformRemoteApplicationUpgrade(TemporaryTupFile, !SuppressFirmwareUpgrade);
                await Handler.WaitForCompletion();
                IsCompleted = true;
                await MachineProvider.DisconnectAndWaitForReconnection(TimeSpan.FromSeconds(20), TimeSpan.FromMinutes(1), "The remote machine is now performing final upgrade operations.");
            }
            catch (OperationCanceledException)
            {
                //Aborted...
            }
            catch (AuthorizationException ex)
            {
                await NotificationProvider.ShowError(ex.Message);
            }
            catch (Exception ex)
            {
                LogManager.Log(ex, "Error occurred while executing remote application upgrade.");
            }
            finally
            {
                await TemporaryTupFile.DeleteAsync();
                IsFree = true;
                InvalidateRelayCommands();
            }
        }

        private async void SaveTupFile()
        {
            try
            {
                File.Copy(TemporaryTupFile, TupFileLocation, true);
                TemporaryTupFile.Delete();
                IsCompleted = true;
                await NotificationProvider.ShowSuccess("Application upgrade package saved successfully.");
                await ModularNavigationManager.NavigateBack();
            }
            catch (Exception ex)
            {
                LogManager.Log(ex, "Error copying temporary tup file to selected location.");
                await NotificationProvider.ShowError($"Error occurred while trying to save the application package file.\n{ex.FlattenMessage()}");
            }
        }

        public void OnNavigatedToWithObject(NavigationObject obj)
        {
            SelectedVersion = obj.SelectedVersion;
            SelectedMachine = obj.SelectedMachine;
            IsUpgradeNow = obj.UpgradeNow;
            IsUpgradeNowSelected = IsUpgradeNow;
            TemporaryTupFile = obj.TemporaryTupFile;
            InvalidateCanUpgradeNow();
            InvalidateRelayCommands();
        }

        public override void OnBeforeNavigatedTo()
        {
            base.OnBeforeNavigatedTo();
            Handler = new RemoteUpgradeHandler("Ready");
            IsCompleted = false;
            SelectedVersion = null;
            SelectedMachine = null;
            IsUpgradeNow = false;
            IsUpgradeNowSelected = false;
            TemporaryTupFile = null;
            InvalidateRelayCommands();
        }

        public async override Task<bool> OnNavigateBackRequest()
        {
            if (!IsCompleted)
            {
                var abort = await NotificationProvider.ShowWarningQuestion("Are you sure you want to abort the upgrade operation?");

                if (Handler.Status == RemoteUpgradeHandlerStatus.Started)
                {
                    if (Handler.CanAbort)
                    {
                        Handler.Abort();
                    }
                    else
                    {
                        await NotificationProvider.ShowWarning("Cannot abort the operation at this stage.");
                        return false;
                    }
                }

                return abort;
            }

            return true;
        }
    }
}