using Microsoft.Win32; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core.Commands; using Tango.PMR.IO; using Tango.SharedUI; using Google.Protobuf; using Ionic.Zip; using System.Windows; using Tango.PMR.FirmwareUpgrade; namespace Tango.FirmwarePackageGenerator { public class MainWindowVM : ViewModel { private ObservableCollection _versionFiles; public ObservableCollection VersionFiles { get { return _versionFiles; } set { _versionFiles = value; RaisePropertyChangedAuto(); } } public RelayCommand GenerateCommand { get; set; } public MainWindowVM() { VersionFiles = new ObservableCollection(); GenerateCommand = new RelayCommand(Generate); } private void Generate() { SaveFileDialog dlg = new SaveFileDialog(); dlg.Title = "Save Firmware Package File"; dlg.Filter = "Tango Firmware Package|*.tfp"; dlg.DefaultExt = ".tfp"; dlg.FileName = "firmware_package.tfp"; if (dlg.ShowDialog().Value) { try { VersionPackageDescriptor descriptor = new VersionPackageDescriptor(); foreach (var item in VersionFiles) { descriptor.FileDescriptors.Add(new VersionFileDescriptor() { Destination = item.Destination, FileName = item.FileName, Version = item.Version, }); } descriptor.Validate(); using (MemoryStream ms = new MemoryStream()) { descriptor.WriteTo(ms); using (var zip = new ZipFile()) { zip.AddEntry("package.cfg", ms.ToArray()); foreach (var item in VersionFiles) { zip.AddFile(item.Path, "/"); } zip.Save(dlg.FileName); } } //Validate using (ZipFile zip = ZipFile.Read(dlg.FileName)) { var reader = zip.Entries.SingleOrDefault(x => x.FileName == "package.cfg").OpenReader(); var descriptor2 = VersionPackageDescriptor.Parser.ParseFrom(reader); if (descriptor.ToString() != descriptor2.ToString()) { throw new IOException("The generated package does not match the source package."); } } ShowInfo("Package generated successfully."); } catch (Exception ex) { ShowError($"Error while trying to generate the package.\n{ex.Message}"); } } } private void ShowError(String error) { MessageBox.Show(error, "Firmware Package Generator", MessageBoxButton.OK, MessageBoxImage.Error); } private void ShowInfo(String message) { MessageBox.Show(message, "Firmware Package Generator", MessageBoxButton.OK, MessageBoxImage.Information); } } }