using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.Commands;
using Tango.Integration.Operation;
using Tango.Integration.Upgrade;
using Tango.MachineStudio.Common.Notifications;
using Tango.SharedUI;
namespace Tango.MachineStudio.UI.ViewModels
{
public class FirmwareUpgradeViewVM : DialogViewVM
{
private IMachineOperator _operator;
private INotificationProvider _notification;
private FileStream _stream;
private FirmwareUpgradeHandler _handler;
public FirmwareUpgradeHandler Handler
{
get { return _handler; }
set { _handler = value; RaisePropertyChangedAuto(); }
}
private String _selectedFile;
public String SelectedFile
{
get { return _selectedFile; }
set { _selectedFile = value; RaisePropertyChangedAuto(); }
}
private int _currentPage;
public int CurrentPage
{
get { return _currentPage; }
set { _currentPage = value; RaisePropertyChangedAuto(); }
}
private String upgradeError;
public String UpgradeError
{
get { return upgradeError; }
set { upgradeError = value; RaisePropertyChangedAuto(); }
}
public RelayCommand SelectCommand { get; set; }
public RelayCommand UpgradeCommand { get; set; }
public RelayCommand AbortCommand { get; set; }
public FirmwareUpgradeViewVM(IMachineOperator machineOperator, INotificationProvider notificationProvider) : base()
{
_notification = notificationProvider;
_operator = machineOperator;
SelectCommand = new RelayCommand(BrowseForFile);
UpgradeCommand = new RelayCommand(StartUpgrade, () => SelectedFile != null);
AbortCommand = new RelayCommand(AbortUpgrade, () => Handler != null && Handler.Status != FirmwareUpgradeStatus.Validating && Handler.Status != FirmwareUpgradeStatus.Activating);
}
private async void BrowseForFile()
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "Select tango firmware package file";
dlg.Filter = "Tango Firmware Package|*.tfp";
if (dlg.ShowDialog().Value)
{
try
{
using (FileStream fs = new FileStream(dlg.FileName, FileMode.Open))
{
var info = await _operator.GetFirmwarePackageInfo(fs);
}
}
catch (Exception ex)
{
LogManager.Log(ex);
_notification.ShowError("The selected package seems to be invalid.");
return;
}
SelectedFile = dlg.FileName;
InvalidateRelayCommands();
}
}
private async void StartUpgrade()
{
CanClose = false;
CurrentPage = 1;
try
{
_stream = new FileStream(SelectedFile, FileMode.Open);
Handler = await _operator.UpgradeFirmware(_stream);
Handler.Progress += (_, e) =>
{
InvokeUI(() =>
{
AbortCommand.RaiseCanExecuteChanged();
});
};
Handler.Completed += (_, __) =>
{
CanClose = true;
_stream.Dispose();
CurrentPage = 2;
};
Handler.Canceled += (_, __) =>
{
CanClose = true;
_stream.Dispose();
CurrentPage = 0;
};
Handler.Failed += (_, ex) =>
{
UpgradeError = ex.FlattenMessage();
CanClose = true;
_stream.Dispose();
CurrentPage = 3;
};
}
catch (Exception ex)
{
CanClose = true;
UpgradeError = ex.FlattenMessage();
CurrentPage = 3;
}
}
private async void AbortUpgrade()
{
CanClose = true;
await Handler.Cancel();
CurrentPage = 0;
}
}
}