From 2fe707abce023813d234b57b097a731174fd4a26 Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Tue, 20 Feb 2018 15:08:22 +0200 Subject: Implemented module popping! --- .../Tango.MachineStudio.Common/IStudioModule.cs | 5 +++++ .../Tango.MachineStudio.Common/StudioModuleBase.cs | 13 ++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) (limited to 'Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common') diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/IStudioModule.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/IStudioModule.cs index 7718c0a7a..ad454556e 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/IStudioModule.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/IStudioModule.cs @@ -35,6 +35,11 @@ namespace Tango.MachineStudio.Common /// FrameworkElement MainView { get; } + /// + /// Gets or sets a value indicating whether this module is shown under a new window. + /// + bool InNewWindow { get; set; } + /// /// Gets the permission required to see and load this module. /// diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioModuleBase.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioModuleBase.cs index 5c594ab70..158661309 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioModuleBase.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioModuleBase.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Media.Imaging; +using Tango.Core; using Tango.Integration.Observables; namespace Tango.MachineStudio.Common @@ -13,7 +14,7 @@ namespace Tango.MachineStudio.Common /// Represents a base class for studio modules. /// /// - public abstract class StudioModuleBase : IStudioModule + public abstract class StudioModuleBase : ExtendedObject, IStudioModule { private bool _isInitialized; private bool _isLoaded; @@ -79,6 +80,16 @@ namespace Tango.MachineStudio.Common } } + private bool _inNewWindow; + /// + /// Gets or sets a value indicating whether this module is shown under a new window. + /// + public bool InNewWindow + { + get { return _inNewWindow; } + set { _inNewWindow = value; RaisePropertyChangedAuto(); } + } + /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// -- cgit v1.3.1 From 956f9ea033553136ebf199fff30f288dc26fbeb0 Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Wed, 21 Feb 2018 20:21:57 +0200 Subject: Working on machine studio update center.. --- Software/DB/Tango.mdf | Bin 75497472 -> 75497472 bytes Software/DB/Tango_log.ldf | Bin 8388608 -> 8388608 bytes Software/Graphics/new-version.png | Bin 0 -> 1932 bytes Software/Graphics/update.png | Bin 0 -> 5289 bytes .../Navigation/NavigationView.cs | 1 + .../StudioApplication/IStudioApplicationManager.cs | 5 + .../Tango.MachineStudio.Common.csproj | 7 + .../Update/CheckForUpdatesRequest.cs | 22 +++ .../Update/CheckForUpdatesResponse.cs | 31 ++++ .../Update/IMachineStudioUpdateService.cs | 17 ++ .../Update/UpdateServiceHelper.cs | 29 ++++ .../Tango.MachineStudio.UI/App.config | 4 +- .../Tango.MachineStudio.UI/Images/new-version.png | Bin 0 -> 1932 bytes .../Tango.MachineStudio.UI/Images/update.png | Bin 0 -> 5289 bytes .../Tango.MachineStudio.UI/MainWindow.xaml | 3 + .../DefaultStudioApplicationManager.cs | 11 ++ .../Tango.MachineStudio.UI.csproj | 15 ++ .../Tango.MachineStudio.UI/ViewModelLocator.cs | 9 + .../ViewModels/LoadingViewVM.cs | 6 +- .../ViewModels/MainViewVM.cs | 32 ++++ .../ViewModels/UpdateViewVM.cs | 175 +++++++++++++++++++ .../Tango.MachineStudio.UI/Views/LoadingView.xaml | 4 + .../Tango.MachineStudio.UI/Views/MainView.xaml | 4 +- .../Tango.MachineStudio.UI/Views/UpdateView.xaml | 188 +++++++++++++++++++++ .../Views/UpdateView.xaml.cs | 42 +++++ .../MachineStudioUpdateService.svc | 1 + .../MachineStudioUpdateService.svc.cs | 62 +++++++ .../Properties/AssemblyInfo.cs | 36 ++++ .../Tango.MachineStudio.UpdateService.csproj | 142 ++++++++++++++++ .../Web.Debug.config | 30 ++++ .../Web.Release.config | 31 ++++ .../Tango.MachineStudio.UpdateService/Web.config | 55 ++++++ .../packages.config | 4 + .../RealTimeGraphEx/RealTimeGraphEx.csproj | 5 +- .../Tango.DAL.Remote/DB/MACHINE_STUDIO_VERSIONS.cs | 27 +++ .../Tango.DAL.Remote/DB/RemoteADO.Context.cs | 1 + .../Tango.DAL.Remote/DB/RemoteADO.edmx | 73 ++++++++ .../Tango.DAL.Remote/DB/RemoteADO.edmx.diagram | 112 ++++++------ Software/Visual_Studio/Tango.DAL.Remote/DB/USER.cs | 3 + .../Tango.DAL.Remote/Tango.DAL.Remote.csproj | 3 + .../Observables/Entities/MachineStudioVersion.cs | 126 ++++++++++++++ .../Tango.Integration/Observables/Entities/User.cs | 21 +++ .../Observables/ObservablesContext.cs | 15 +- .../ObservablesEntitiesAdapterExtension.cs | 38 +++++ .../Tango.Integration/Tango.Integration.csproj | 1 + .../Visual_Studio/Tango.PMR/Common/MessageType.cs | 87 +++++++--- Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj | 4 +- .../MachineStudioSettings/MachineStudio.cs | 6 + .../Visual_Studio/Tango.Video/Tango.Video.csproj | 8 +- Software/Visual_Studio/Tango.sln | 33 ++++ 50 files changed, 1436 insertions(+), 93 deletions(-) create mode 100644 Software/Graphics/new-version.png create mode 100644 Software/Graphics/update.png create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesRequest.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesResponse.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/IMachineStudioUpdateService.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UpdateServiceHelper.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/new-version.png create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/update.png create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/UpdateView.xaml create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/UpdateView.xaml.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/MachineStudioUpdateService.svc create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/MachineStudioUpdateService.svc.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Properties/AssemblyInfo.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Tango.MachineStudio.UpdateService.csproj create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Web.Debug.config create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Web.Release.config create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Web.config create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/packages.config create mode 100644 Software/Visual_Studio/Tango.DAL.Remote/DB/MACHINE_STUDIO_VERSIONS.cs create mode 100644 Software/Visual_Studio/Tango.Integration/Observables/Entities/MachineStudioVersion.cs (limited to 'Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common') diff --git a/Software/DB/Tango.mdf b/Software/DB/Tango.mdf index 139bd1108..736485c47 100644 Binary files a/Software/DB/Tango.mdf and b/Software/DB/Tango.mdf differ diff --git a/Software/DB/Tango_log.ldf b/Software/DB/Tango_log.ldf index a9b0c5cc9..02e398280 100644 Binary files a/Software/DB/Tango_log.ldf and b/Software/DB/Tango_log.ldf differ diff --git a/Software/Graphics/new-version.png b/Software/Graphics/new-version.png new file mode 100644 index 000000000..eab60ef03 Binary files /dev/null and b/Software/Graphics/new-version.png differ diff --git a/Software/Graphics/update.png b/Software/Graphics/update.png new file mode 100644 index 000000000..a82777414 Binary files /dev/null and b/Software/Graphics/update.png differ diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/NavigationView.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/NavigationView.cs index db0f0471f..7e324c996 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/NavigationView.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Navigation/NavigationView.cs @@ -15,5 +15,6 @@ namespace Tango.MachineStudio.Common.Navigation MainView, LoginView, ShutdownView, + UpdateView, } } diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IStudioApplicationManager.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IStudioApplicationManager.cs index c67c34044..9a5f39a96 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IStudioApplicationManager.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/StudioApplication/IStudioApplicationManager.cs @@ -48,5 +48,10 @@ namespace Tango.MachineStudio.Common.StudioApplication /// Name of the module. /// The arguments. void RequestModule(String moduleName, Object args); + + /// + /// Gets the machine studio application version. + /// + String Version { get; } } } diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj index cd4fc1aeb..a363ffc44 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj @@ -54,6 +54,8 @@ + + ..\..\packages\MahApps.Metro.1.5.0\lib\net45\System.Windows.Interactivity.dll @@ -96,6 +98,10 @@ + + + + @@ -218,5 +224,6 @@ Tango.Video + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesRequest.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesRequest.cs new file mode 100644 index 000000000..f76e714a2 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesRequest.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.MachineStudio.Common.Update +{ + [DataContract] + public class CheckForUpdatesRequest + { + [DataMember] + public String Email { get; set; } + + [DataMember] + public String Password { get; set; } + + [DataMember] + public String Version { get; set; } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesResponse.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesResponse.cs new file mode 100644 index 000000000..440e162a3 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesResponse.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.MachineStudio.Common.Update +{ + [DataContract] + public class CheckForUpdatesResponse + { + [DataMember] + public bool IsUpdateAvailable { get; set; } + + [DataMember] + public String Version { get; set; } + + [DataMember] + public String FtpHost { get; set; } + + [DataMember] + public String FilePath { get; set; } + + [DataMember] + public String UserName { get; set; } + + [DataMember] + public String Password { get; set; } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/IMachineStudioUpdateService.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/IMachineStudioUpdateService.cs new file mode 100644 index 000000000..7b7269d23 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/IMachineStudioUpdateService.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.ServiceModel; +using System.Text; +using Tango.MachineStudio.Common.Update; + +namespace Tango.MachineStudio.Common.Update +{ + [ServiceContract] + public interface IMachineStudioUpdateService + { + [OperationContract] + CheckForUpdatesResponse CheckForUpdates(CheckForUpdatesRequest request); + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UpdateServiceHelper.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UpdateServiceHelper.cs new file mode 100644 index 000000000..87b974b99 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UpdateServiceHelper.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.ServiceModel; +using System.Text; +using System.Threading.Tasks; +using Tango.Settings; + +namespace Tango.MachineStudio.Common.Update +{ + public static class UpdateServiceHelper + { + public static ChannelFactory GetUpdateServiceChannel() + { + BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None); + binding.ReceiveTimeout = TimeSpan.FromSeconds(20); + binding.SendTimeout = TimeSpan.FromSeconds(20); + binding.MaxBufferPoolSize = 6553600; + binding.MaxBufferSize = 6553600; + binding.MaxReceivedMessageSize = 6553600; + binding.ReaderQuotas.MaxDepth = 6553600; + binding.ReaderQuotas.MaxStringContentLength = 6553600; + binding.ReaderQuotas.MaxArrayLength = 6553600; + binding.ReaderQuotas.MaxBytesPerRead = 6553600; + + return new ChannelFactory(binding, SettingsManager.Default.MachineStudio.UpdateServiceAddress); + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.config b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.config index 9d1c60022..0bd51a469 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.config +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.config @@ -6,8 +6,10 @@ + + - + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/new-version.png b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/new-version.png new file mode 100644 index 000000000..eab60ef03 Binary files /dev/null and b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/new-version.png differ diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/update.png b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/update.png new file mode 100644 index 000000000..a82777414 Binary files /dev/null and b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Images/update.png differ diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml index e0f0b1f4f..63b2b3f6a 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/MainWindow.xaml @@ -31,6 +31,9 @@ + + + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs index ee1724435..9538c59af 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/StudioApplication/DefaultStudioApplicationManager.cs @@ -111,6 +111,17 @@ namespace Tango.MachineStudio.UI.StudioApplication get { return ConnectedMachine != null; } } + /// + /// Gets the machine studio application version. + /// + public string Version + { + get + { + return typeof(DefaultStudioApplicationManager).Assembly.GetName().Version.ToString(); + } + } + /// /// Shutdown the application. /// diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj index 7c8600594..0ad97907b 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj @@ -110,6 +110,7 @@ ..\..\packages\System.Reactive.Windows.Threading.3.1.1\lib\net45\System.Reactive.Windows.Threading.dll + @@ -153,6 +154,7 @@ + LoadingView.xaml @@ -174,6 +176,9 @@ ShutdownView.xaml + + UpdateView.xaml + ExceptionWindow.xaml @@ -236,6 +241,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -365,6 +374,12 @@ + + + + + + $(TargetDir)linkgen.exe -s "$(TargetPath)" -d "$(TargetDir)Utilities\Machine Studio.lnk" diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs index 1907074c0..330bcd6eb 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModelLocator.cs @@ -71,6 +71,7 @@ namespace Tango.MachineStudio.UI SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); + SimpleIoc.Default.Register(); //Register View (Supervising Controller Pattern). if (!ViewModelBase.IsInDesignModeStatic) @@ -127,5 +128,13 @@ namespace Tango.MachineStudio.UI return ServiceLocator.Current.GetInstance(); } } + + public UpdateViewVM UpdateViewVM + { + get + { + return ServiceLocator.Current.GetInstance(); + } + } } } \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs index 7ea7c6fa9..9acf26afd 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/LoadingViewVM.cs @@ -10,6 +10,7 @@ using Tango.Logging; using Tango.MachineStudio.Common.Modules; using Tango.MachineStudio.Common.Navigation; using Tango.MachineStudio.Common.Notifications; +using Tango.MachineStudio.Common.StudioApplication; using Tango.SharedUI; namespace Tango.MachineStudio.UI.ViewModels @@ -24,14 +25,17 @@ namespace Tango.MachineStudio.UI.ViewModels private INavigationManager _navigationManager; private IStudioModuleLoader _studioModuleLoader; + public IStudioApplicationManager ApplicationManager { get; set; } + /// /// Initializes a new instance of the class. /// /// The navigation manager. /// The studio module loader. /// The notification provider. - public LoadingViewVM(INavigationManager navigationManager, IStudioModuleLoader studioModuleLoader, INotificationProvider notificationProvider) + public LoadingViewVM(IStudioApplicationManager applicationManager, INavigationManager navigationManager, IStudioModuleLoader studioModuleLoader, INotificationProvider notificationProvider) { + ApplicationManager = applicationManager; _navigationManager = navigationManager; _studioModuleLoader = studioModuleLoader; _notificationProvider = notificationProvider; diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs index da73e8eae..acd9e7925 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/MainViewVM.cs @@ -99,6 +99,16 @@ namespace Tango.MachineStudio.UI.ViewModels /// public RelayCommand SignoutCommand { get; set; } + /// + /// Gets or sets the exit command. + /// + public RelayCommand ExitCommand { get; set; } + + /// + /// Gets or sets the update center command. + /// + public RelayCommand UpdateCenterCommand { get; set; } + private IAuthenticationProvider _authenticationProvider; /// /// Gets or sets the authentication provider. @@ -169,6 +179,8 @@ namespace Tango.MachineStudio.UI.ViewModels SignoutCommand = new RelayCommand(SignOut); DisconnectCommand = new RelayCommand(DisconnectFromMachine, (x) => ApplicationManager.IsMachineConnected && !_isDisconnecting); OpenModuleInWindowCommand = new RelayCommand(OpenModuleInWindow); + ExitCommand = new RelayCommand(ExitApplication); + UpdateCenterCommand = new RelayCommand(NavigateToUpdateCenter); } /// @@ -315,6 +327,10 @@ namespace Tango.MachineStudio.UI.ViewModels base.OnViewAttached(); } + /// + /// Opens the module in a new window. + /// + /// The module. private void OpenModuleInWindow(IStudioModule module) { if (module == null) return; @@ -351,5 +367,21 @@ namespace Tango.MachineStudio.UI.ViewModels _notificationProvider.ShowError("Error popping out module " + module.Name); } } + + /// + /// Navigates to update center. + /// + private void NavigateToUpdateCenter() + { + _navigation.NavigateTo(NavigationView.UpdateView); + } + + /// + /// Exits the application. + /// + private void ExitApplication() + { + _applicationManager.ShutDown(); + } } } diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs new file mode 100644 index 000000000..014aecdb6 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Tango.Core.Commands; +using Tango.MachineStudio.Common.Authentication; +using Tango.MachineStudio.Common.Navigation; +using Tango.MachineStudio.Common.Notifications; +using Tango.MachineStudio.Common.StudioApplication; +using Tango.MachineStudio.Common.Update; +using Tango.SharedUI; + +namespace Tango.MachineStudio.UI.ViewModels +{ + public enum UpdateStatus + { + None, + CheckingForUpdate, + UpToDate, + UpdateAvailable, + Downloading, + Updating, + UpdateCompleted, + Error, + } + + public class UpdateViewVM : ViewModel + { + private INotificationProvider _notification; + private INavigationManager _navigation; + private IStudioApplicationManager _application; + private IAuthenticationProvider _authentication; + + private UpdateStatus _status; + public UpdateStatus Status + { + get { return _status; } + set { _status = value; RaisePropertyChangedAuto(); } + } + + private String _latestVersion; + public String LatestVersion + { + get { return _latestVersion; } + set { _latestVersion = value; RaisePropertyChangedAuto(); } + } + + private double _downloadProgress; + + public double DownloadProgress + { + get { return _downloadProgress; } + set { _downloadProgress = value; RaisePropertyChangedAuto(); } + } + + private double _updateProgress; + + public double UpdateProgress + { + get { return _updateProgress; } + set { _updateProgress = value; RaisePropertyChangedAuto(); } + } + + public RelayCommand UpdateCommand { get; set; } + + public RelayCommand BackCommand { get; set; } + + public RelayCommand RestartCommand { get; set; } + + public RelayCommand TryAgainCommand { get; set; } + + public UpdateViewVM(INotificationProvider notification, IAuthenticationProvider authentication, INavigationManager navigation, IStudioApplicationManager application) + { + _notification = notification; + _navigation = navigation; + _application = application; + _authentication = authentication; + + LatestVersion = "1.0.0.2"; + Status = UpdateStatus.CheckingForUpdate; + UpdateCommand = new RelayCommand(StartUpdate, () => Status == UpdateStatus.UpdateAvailable); + BackCommand = new RelayCommand(BackToApplication, () => Status != UpdateStatus.Updating); + RestartCommand = new RelayCommand(RestartApplication, () => Status == UpdateStatus.UpdateCompleted); + TryAgainCommand = new RelayCommand(TryAgain, () => Status == UpdateStatus.CheckingForUpdate); + } + + public void OnNavigatedInto() + { + CheckForUpdates(); + } + + private void CheckForUpdates() + { + Status = UpdateStatus.CheckingForUpdate; + + Task.Factory.StartNew(() => + { + var service = UpdateServiceHelper.GetUpdateServiceChannel(); + var client = service.CreateChannel(); + + CheckForUpdatesResponse response = client.CheckForUpdates(new CheckForUpdatesRequest() + { + Email = _authentication.CurrentUser.Email, + Password = _authentication.CurrentUser.Password, + Version = _application.Version, + }); + + var a = response; + + Thread.Sleep(5000); + Status = UpdateStatus.UpdateAvailable; + }); + } + + private void BackToApplication() + { + if (Status == UpdateStatus.Downloading) + { + if (!_notification.ShowQuestion("This will abort all update operations. Are you sure?")) + { + return; + } + } + + _navigation.NavigateTo(NavigationView.MainView); + Status = UpdateStatus.None; + } + + private void StartUpdate() + { + DownloadProgress = 0; + UpdateProgress = 0; + + Status = UpdateStatus.Downloading; + + Task.Factory.StartNew(() => + { + for (int i = 0; i < 100; i++) + { + DownloadProgress++; + Thread.Sleep(30); + } + + Status = UpdateStatus.Updating; + + for (int i = 0; i < 100; i++) + { + UpdateProgress++; + Thread.Sleep(30); + } + + Status = UpdateStatus.UpdateCompleted; + }); + } + + private void TryAgain() + { + CheckForUpdates(); + } + + private void RestartApplication() + { + _application.ShutDown(); + } + + protected override void RaisePropertyChangedAuto([CallerMemberName] string caller = null) + { + base.RaisePropertyChangedAuto(caller); + InvalidateRelayCommands(); + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoadingView.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoadingView.xaml index 2478c1155..aaf4accd4 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoadingView.xaml +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/LoadingView.xaml @@ -13,6 +13,10 @@ Machine Studio + + v + + Twine Solutions diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml index 9a2cc37a4..355bdc1fd 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/MainView.xaml @@ -126,7 +126,9 @@ + + + + + + + + + + + + + + + + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/UpdateView.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/UpdateView.xaml.cs new file mode 100644 index 000000000..75b74f65d --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Views/UpdateView.xaml.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using Tango.MachineStudio.UI.ViewModels; +using static Tango.SharedUI.Controls.MultiTransitionControl; + +namespace Tango.MachineStudio.UI.Views +{ + /// + /// Interaction logic for UpdateView.xaml + /// + public partial class UpdateView : UserControl, ITransitionView + { + private UpdateViewVM _vm; + + public UpdateView() + { + InitializeComponent(); + + this.Loaded += (x, y) => + { + _vm = DataContext as UpdateViewVM; + }; + } + + public void OnTransitionCompleted() + { + _vm.OnNavigatedInto(); + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/MachineStudioUpdateService.svc b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/MachineStudioUpdateService.svc new file mode 100644 index 000000000..bad3e4fcd --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/MachineStudioUpdateService.svc @@ -0,0 +1 @@ +<%@ ServiceHost Language="C#" Debug="true" Service="Tango.MachineStudio.UpdateService.MachineStudioUpdateService" CodeBehind="MachineStudioUpdateService.svc.cs" %> \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/MachineStudioUpdateService.svc.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/MachineStudioUpdateService.svc.cs new file mode 100644 index 000000000..4cfea1b8a --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/MachineStudioUpdateService.svc.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Runtime.Serialization; +using System.ServiceModel; +using System.ServiceModel.Web; +using System.Text; +using Tango.Integration.Observables; +using Tango.Logging; +using Tango.MachineStudio.Common.Update; + +namespace Tango.MachineStudio.UpdateService +{ + public class MachineStudioUpdateService : IMachineStudioUpdateService + { + public CheckForUpdatesResponse CheckForUpdates(CheckForUpdatesRequest request) + { + LogManager.Log("Request received..."); + + try + { + CheckForUpdatesResponse response = new CheckForUpdatesResponse(); + + using (ObservablesContext db = ObservablesContext.CreateDefaultForWeb()) + { + db.Configuration.LazyLoadingEnabled = false; + + var user = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == request.Password); + + if (user != null) + { + var latestVersion = db.MachineStudioVersions.FirstOrDefault(); + Version currentVersionNumber = Version.Parse(request.Version); + + if (latestVersion != null && Version.Parse(latestVersion.Version) > currentVersionNumber) + { + response.IsUpdateAvailable = true; + + response.FtpHost = ConfigurationManager.AppSettings["FtpHost"].ToString(); + response.UserName = ConfigurationManager.AppSettings["UserName"].ToString(); + response.Password = ConfigurationManager.AppSettings["Password"].ToString(); + response.FilePath = latestVersion.FtpFilePath; + response.Version = latestVersion.Version; + } + } + else + { + throw new FaultException("Invalid user credentials."); + } + } + + return response; + } + catch (Exception ex) + { + LogManager.Log(ex); + throw new FaultException(ex.ToString()); + } + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Properties/AssemblyInfo.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..6b9387721 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Tango.MachineStudio.UpdateService")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Tango.MachineStudio.UpdateService")] +[assembly: AssemblyCopyright("Copyright © 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("cc6d62e9-c300-42f3-b452-79966e902b10")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Tango.MachineStudio.UpdateService.csproj b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Tango.MachineStudio.UpdateService.csproj new file mode 100644 index 000000000..c9400b2d1 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Tango.MachineStudio.UpdateService.csproj @@ -0,0 +1,142 @@ + + + + Debug + AnyCPU + + + 2.0 + {CC6D62E9-C300-42F3-B452-79966E902B10} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + Tango.MachineStudio.UpdateService + Tango.MachineStudio.UpdateService + v4.6 + True + true + true + + + + + + + + true + full + false + ..\..\Build\Debug\Web\Machine Studio Update Service\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + ..\..\packages\EntityFramework.6.0.0\lib\net45\EntityFramework.dll + + + ..\..\packages\EntityFramework.6.0.0\lib\net45\EntityFramework.SqlServer.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + MachineStudioUpdateService.svc + + + + + + + + + + + Web.config + + + Web.config + + + + + {a34ee0f0-649d-41c8-8489-b6f1cc6924ee} + Tango.Core + + + {4206ac58-3b57-4699-8835-90bf6db01a61} + Tango.Integration + + + {bc932dbd-7cdb-488c-99e4-f02cf441f55e} + Tango.Logging + + + {cb0b0aa2-bb24-4bca-a720-45e397684e12} + Tango.MachineStudio.Common + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + True + True + 65206 + / + http://localhost:53044/ + False + False + + + False + + + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Web.Debug.config b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Web.Debug.config new file mode 100644 index 000000000..fae9cfefa --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Web.Debug.config @@ -0,0 +1,30 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Web.Release.config b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Web.Release.config new file mode 100644 index 000000000..da6e960b8 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Web.Release.config @@ -0,0 +1,31 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Web.config b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Web.config new file mode 100644 index 000000000..b0d2452f0 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/Web.config @@ -0,0 +1,55 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/packages.config b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/packages.config new file mode 100644 index 000000000..9256e1591 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/SideChains/RealTimeGraphEx/RealTimeGraphEx.csproj b/Software/Visual_Studio/SideChains/RealTimeGraphEx/RealTimeGraphEx.csproj index dd332943a..cc8eda5a4 100644 --- a/Software/Visual_Studio/SideChains/RealTimeGraphEx/RealTimeGraphEx.csproj +++ b/Software/Visual_Studio/SideChains/RealTimeGraphEx/RealTimeGraphEx.csproj @@ -34,11 +34,12 @@ pdbonly - true + false bin\Release\ - TRACE + TRACE;WPF prompt 4 + true diff --git a/Software/Visual_Studio/Tango.DAL.Remote/DB/MACHINE_STUDIO_VERSIONS.cs b/Software/Visual_Studio/Tango.DAL.Remote/DB/MACHINE_STUDIO_VERSIONS.cs new file mode 100644 index 000000000..9d0fa2365 --- /dev/null +++ b/Software/Visual_Studio/Tango.DAL.Remote/DB/MACHINE_STUDIO_VERSIONS.cs @@ -0,0 +1,27 @@ +//------------------------------------------------------------------------------ +// +// This code was generated from a template. +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Tango.DAL.Remote.DB +{ + using System; + using System.Collections.Generic; + + public partial class MACHINE_STUDIO_VERSIONS + { + public int ID { get; set; } + public string GUID { get; set; } + public System.DateTime LAST_UPDATED { get; set; } + public string VERSION { get; set; } + public string FTP_FILE_PATH { get; set; } + public string COMMENTS { get; set; } + public string USER_GUID { get; set; } + + public virtual USER USER { get; set; } + } +} diff --git a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.Context.cs b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.Context.cs index ebec02eab..660f660b3 100644 --- a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.Context.cs +++ b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.Context.cs @@ -54,6 +54,7 @@ namespace Tango.DAL.Remote.DB public virtual DbSet LINEAR_MASS_DENSITY_UNITS { get; set; } public virtual DbSet LIQUID_TYPES { get; set; } public virtual DbSet LIQUID_TYPES_RMLS { get; set; } + public virtual DbSet MACHINE_STUDIO_VERSIONS { get; set; } public virtual DbSet MACHINE_VERSIONS { get; set; } public virtual DbSet MACHINES { get; set; } public virtual DbSet MACHINES_CONFIGURATIONS { get; set; } diff --git a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx index 3f935c70f..a711bbd9e 100644 --- a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx +++ b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx @@ -391,6 +391,18 @@ + + + + + + + + + + + + @@ -1078,6 +1090,18 @@ + + + + + + + + + + + + @@ -1460,6 +1484,7 @@ + @@ -1602,6 +1627,10 @@ + + + + @@ -1749,6 +1778,7 @@ + @@ -1939,6 +1969,10 @@ + + + + @@ -2451,6 +2485,19 @@ + + + + + + + + + + + + + @@ -2804,6 +2851,7 @@ + @@ -3341,6 +3389,18 @@ + + + + + + + + + + + + @@ -3964,6 +4024,19 @@ + + + + + + + + + + + + + diff --git a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx.diagram b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx.diagram index b2b732414..96cebcca5 100644 --- a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx.diagram +++ b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx.diagram @@ -5,61 +5,62 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -101,6 +102,7 @@ + diff --git a/Software/Visual_Studio/Tango.DAL.Remote/DB/USER.cs b/Software/Visual_Studio/Tango.DAL.Remote/DB/USER.cs index e7cfb212f..28dc2a2b8 100644 --- a/Software/Visual_Studio/Tango.DAL.Remote/DB/USER.cs +++ b/Software/Visual_Studio/Tango.DAL.Remote/DB/USER.cs @@ -18,6 +18,7 @@ namespace Tango.DAL.Remote.DB public USER() { this.JOBS = new HashSet(); + this.MACHINE_STUDIO_VERSIONS = new HashSet(); this.MACHINES_EVENTS = new HashSet(); this.USERS_ROLES = new HashSet(); } @@ -37,6 +38,8 @@ namespace Tango.DAL.Remote.DB [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection JOBS { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] + public virtual ICollection MACHINE_STUDIO_VERSIONS { get; set; } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection MACHINES_EVENTS { get; set; } public virtual ORGANIZATION ORGANIZATION { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] diff --git a/Software/Visual_Studio/Tango.DAL.Remote/Tango.DAL.Remote.csproj b/Software/Visual_Studio/Tango.DAL.Remote/Tango.DAL.Remote.csproj index 58ed81525..561cf44ff 100644 --- a/Software/Visual_Studio/Tango.DAL.Remote/Tango.DAL.Remote.csproj +++ b/Software/Visual_Studio/Tango.DAL.Remote/Tango.DAL.Remote.csproj @@ -161,6 +161,9 @@ RemoteADO.tt + + RemoteADO.tt + RemoteADO.tt diff --git a/Software/Visual_Studio/Tango.Integration/Observables/Entities/MachineStudioVersion.cs b/Software/Visual_Studio/Tango.Integration/Observables/Entities/MachineStudioVersion.cs new file mode 100644 index 000000000..9ff07682b --- /dev/null +++ b/Software/Visual_Studio/Tango.Integration/Observables/Entities/MachineStudioVersion.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Xml.Serialization; +using Newtonsoft.Json; +using System.Linq; +using Tango.DAL.Remote.DB; + +namespace Tango.Integration.Observables +{ + [Table("MACHINE_STUDIO_VERSIONS")] + public partial class MachineStudioVersion : ObservableEntity + { + + protected String _version; + /// + /// Gets or sets the machinestudioversion version. + /// + [Column("VERSION")] + + public String Version + { + get + { + return _version; + } + + set + { + _version = value; RaisePropertyChanged(nameof(Version)); + } + + } + + protected String _ftpfilepath; + /// + /// Gets or sets the machinestudioversion ftp file path. + /// + [Column("FTP_FILE_PATH")] + + public String FtpFilePath + { + get + { + return _ftpfilepath; + } + + set + { + _ftpfilepath = value; RaisePropertyChanged(nameof(FtpFilePath)); + } + + } + + protected String _comments; + /// + /// Gets or sets the machinestudioversion comments. + /// + [Column("COMMENTS")] + + public String Comments + { + get + { + return _comments; + } + + set + { + _comments = value; RaisePropertyChanged(nameof(Comments)); + } + + } + + protected String _userguid; + /// + /// Gets or sets the machinestudioversion user guid. + /// + [Column("USER_GUID")] + [ForeignKey("User")] + + public String UserGuid + { + get + { + return _userguid; + } + + set + { + _userguid = value; RaisePropertyChanged(nameof(UserGuid)); + } + + } + + protected User _user; + /// + /// Gets or sets the machinestudioversion user. + /// + + [XmlIgnore] + [JsonIgnore] + public virtual User User + { + get + { + return _user; + } + + set + { + _user = value; RaisePropertyChanged(nameof(User)); + } + + } + + /// + /// Initializes a new instance of the class. + /// + public MachineStudioVersion() : base() + { + } + } +} diff --git a/Software/Visual_Studio/Tango.Integration/Observables/Entities/User.cs b/Software/Visual_Studio/Tango.Integration/Observables/Entities/User.cs index 3acfb8fb6..50ca7e775 100644 --- a/Software/Visual_Studio/Tango.Integration/Observables/Entities/User.cs +++ b/Software/Visual_Studio/Tango.Integration/Observables/Entities/User.cs @@ -198,6 +198,25 @@ namespace Tango.Integration.Observables } + protected ObservableCollection _machinestudioversions; + /// + /// Gets or sets the user machine studio versions. + /// + + public virtual ObservableCollection MachineStudioVersions + { + get + { + return _machinestudioversions; + } + + set + { + _machinestudioversions = value; RaisePropertyChanged(nameof(MachineStudioVersions)); + } + + } + protected ObservableCollection _machinesevents; /// /// Gets or sets the user machines events. @@ -265,6 +284,8 @@ namespace Tango.Integration.Observables Jobs = new ObservableCollection(); + MachineStudioVersions = new ObservableCollection(); + MachinesEvents = new ObservableCollection(); UsersRoles = new ObservableCollection(); diff --git a/Software/Visual_Studio/Tango.Integration/Observables/ObservablesContext.cs b/Software/Visual_Studio/Tango.Integration/Observables/ObservablesContext.cs index 6c5947306..37830081d 100644 --- a/Software/Visual_Studio/Tango.Integration/Observables/ObservablesContext.cs +++ b/Software/Visual_Studio/Tango.Integration/Observables/ObservablesContext.cs @@ -30,7 +30,7 @@ namespace Tango.Integration.Observables { if (!isFile) { - return String.Format("Data Source={0};Initial Catalog=Tango;Integrated Security=true", source); + return String.Format("Data Source={0};Initial Catalog=Tango;User Id=Developer;Password=1111;", source); } else { @@ -47,6 +47,11 @@ namespace Tango.Integration.Observables return new ObservablesContext(SettingsManager.Default.DataBase.SQLServerAddress, false); } + public static ObservablesContext CreateDefaultForWeb() + { + return new ObservablesContext("localhost\\SQLEXPRESS", false); + } + /// /// Gets or sets the ActionTypes. /// @@ -279,6 +284,14 @@ namespace Tango.Integration.Observables get; set; } + /// + /// Gets or sets the MachineStudioVersions. + /// + public DbSet MachineStudioVersions + { + get; set; + } + /// /// Gets or sets the MachineVersions. /// diff --git a/Software/Visual_Studio/Tango.Integration/Observables/ObservablesEntitiesAdapterExtension.cs b/Software/Visual_Studio/Tango.Integration/Observables/ObservablesEntitiesAdapterExtension.cs index 70aad649d..b8aef34f7 100644 --- a/Software/Visual_Studio/Tango.Integration/Observables/ObservablesEntitiesAdapterExtension.cs +++ b/Software/Visual_Studio/Tango.Integration/Observables/ObservablesEntitiesAdapterExtension.cs @@ -1050,6 +1050,42 @@ namespace Tango.Integration.Observables } + private ObservableCollection _machinestudioversions; + /// + /// Gets or sets the MachineStudioVersions. + /// + public ObservableCollection MachineStudioVersions + { + get + { + return _machinestudioversions; + } + + set + { + _machinestudioversions = value; RaisePropertyChanged(nameof(MachineStudioVersions)); + } + + } + + private ICollectionView _machinestudioversionsViewSource; + /// + /// Gets or sets the MachineStudioVersions View Source. + /// + public ICollectionView MachineStudioVersionsViewSource + { + get + { + return _machinestudioversionsViewSource; + } + + set + { + _machinestudioversionsViewSource = value; RaisePropertyChanged(nameof(MachineStudioVersionsViewSource)); + } + + } + private ObservableCollection _machineversions; /// /// Gets or sets the MachineVersions. @@ -2050,6 +2086,8 @@ namespace Tango.Integration.Observables LiquidTypesRmlsViewSource = CreateCollectionView(LiquidTypesRmls); + MachineStudioVersionsViewSource = CreateCollectionView(MachineStudioVersions); + MachineVersionsViewSource = CreateCollectionView(MachineVersions); MachinesViewSource = CreateCollectionView(Machines); diff --git a/Software/Visual_Studio/Tango.Integration/Tango.Integration.csproj b/Software/Visual_Studio/Tango.Integration/Tango.Integration.csproj index 1a053a937..3f4d2056b 100644 --- a/Software/Visual_Studio/Tango.Integration/Tango.Integration.csproj +++ b/Software/Visual_Studio/Tango.Integration/Tango.Integration.csproj @@ -113,6 +113,7 @@ + diff --git a/Software/Visual_Studio/Tango.PMR/Common/MessageType.cs b/Software/Visual_Studio/Tango.PMR/Common/MessageType.cs index 4811280d1..9ea29b24f 100644 --- a/Software/Visual_Studio/Tango.PMR/Common/MessageType.cs +++ b/Software/Visual_Studio/Tango.PMR/Common/MessageType.cs @@ -22,7 +22,7 @@ namespace Tango.PMR.Common { static MessageTypeReflection() { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( - "ChFNZXNzYWdlVHlwZS5wcm90bxIQVGFuZ28uUE1SLkNvbW1vbiqREAoLTWVz", + "ChFNZXNzYWdlVHlwZS5wcm90bxIQVGFuZ28uUE1SLkNvbW1vbirJFAoLTWVz", "c2FnZVR5cGUSCAoETm9uZRAAEhQKEENhbGN1bGF0ZVJlcXVlc3QQAxIVChFD", "YWxjdWxhdGVSZXNwb25zZRAEEhMKD1Byb2dyZXNzUmVxdWVzdBAFEhQKEFBy", "b2dyZXNzUmVzcG9uc2UQBhIcChhTdHViQ2FydHJpZGdlUmVhZFJlcXVlc3QQ", @@ -44,32 +44,45 @@ namespace Tango.PMR.Common { "ChBTdHViVmFsdmVSZXF1ZXN0EB8SFQoRU3R1YlZhbHZlUmVzcG9uc2UQIBIb", "ChdTdHViRXh0Rmxhc2hSZWFkUmVxdWVzdBAhEhwKGFN0dWJFeHRGbGFzaFJl", "YWRSZXNwb25zZRAiEhwKGFN0dWJFeHRGbGFzaFdyaXRlUmVxdWVzdBAjEh0K", - "GVN0dWJFeHRGbGFzaFdyaXRlUmVzcG9uc2UQJBIlCiBFeHRlcm5hbEJyaWRn", - "ZVVkcERpc2NvdmVyeVBhY2tldBDoBxIfChpFeHRlcm5hbENsaWVudExvZ2lu", - "UmVxdWVzdBDpBxIgChtFeHRlcm5hbENsaWVudExvZ2luUmVzcG9uc2UQ6gcS", - "IQocRGlyZWN0U3luY2hyb25pemF0aW9uUmVxdWVzdBDrBxIiCh1EaXJlY3RT", - "eW5jaHJvbml6YXRpb25SZXNwb25zZRDsBxIcChdPdmVycmlkZURhdGFCYXNl", - "UmVxdWVzdBDtBxIdChhPdmVycmlkZURhdGFCYXNlUmVzcG9uc2UQ7gcSFQoQ", - "S2VlcEFsaXZlUmVxdWVzdBDvBxIWChFLZWVwQWxpdmVSZXNwb25zZRDwBxIb", - "ChZQdXNoRGlhZ25vc3RpY3NSZXF1ZXN0ENAPEhwKF1B1c2hEaWFnbm9zdGlj", - "c1Jlc3BvbnNlENEPEhwKF01vdG9yQWJvcnRIb21pbmdSZXF1ZXN0ENIPEh0K", - "GE1vdG9yQWJvcnRIb21pbmdSZXNwb25zZRDTDxIXChJNb3RvckhvbWluZ1Jl", - "cXVlc3QQ1A8SGAoTTW90b3JIb21pbmdSZXNwb25zZRDVDxIYChNNb3Rvckpv", - "Z2dpbmdSZXF1ZXN0ENYPEhkKFE1vdG9ySm9nZ2luZ1Jlc3BvbnNlENcPEh0K", - "GE1vdG9yQWJvcnRKb2dnaW5nUmVxdWVzdBDYDxIeChlNb3RvckFib3J0Sm9n", - "Z2luZ1Jlc3BvbnNlENkPEiAKG0Rpc3BlbnNlckFib3J0SG9taW5nUmVxdWVz", - "dBDaDxIhChxEaXNwZW5zZXJBYm9ydEhvbWluZ1Jlc3BvbnNlENsPEhsKFkRp", - "c3BlbnNlckhvbWluZ1JlcXVlc3QQ3A8SHAoXRGlzcGVuc2VySG9taW5nUmVz", - "cG9uc2UQ3Q8SHAoXRGlzcGVuc2VySm9nZ2luZ1JlcXVlc3QQ3g8SHQoYRGlz", - "cGVuc2VySm9nZ2luZ1Jlc3BvbnNlEN8PEiEKHERpc3BlbnNlckFib3J0Sm9n", - "Z2luZ1JlcXVlc3QQ4A8SIgodRGlzcGVuc2VyQWJvcnRKb2dnaW5nUmVzcG9u", - "c2UQ4Q8SGQoUU2V0RGlnaXRhbE91dFJlcXVlc3QQ4g8SGgoVU2V0RGlnaXRh", - "bE91dFJlc3BvbnNlEOMPEhkKFFRocmVhZEpvZ2dpbmdSZXF1ZXN0EOQPEhoK", - "FVRocmVhZEpvZ2dpbmdSZXNwb25zZRDlDxIeChlUaHJlYWRBYm9ydEpvZ2dp", - "bmdSZXF1ZXN0EOYPEh8KGlRocmVhZEFib3J0Sm9nZ2luZ1Jlc3BvbnNlEOcP", - "Eg8KCkpvYlJlcXVlc3QQuBcSEAoLSm9iUmVzcG9uc2UQuRcSFAoPQWJvcnRK", - "b2JSZXF1ZXN0ELoXEhUKEEFib3J0Sm9iUmVzcG9uc2UQuxdCHAoaY29tLnR3", - "aW5lLnRhbmdvLnBtci5jb21tb25iBnByb3RvMw==")); + "GVN0dWJFeHRGbGFzaFdyaXRlUmVzcG9uc2UQJBIeChpTdHViRlBHQVJlYWRC", + "YWNrUmVnUmVxdWVzdBAlEh8KG1N0dWJGUEdBUmVhZEJhY2tSZWdSZXNwb25z", + "ZRAmEh4KGlN0dWJGUEdBUmVhZFZlcnNpb25SZXF1ZXN0ECcSHwobU3R1YkZQ", + "R0FSZWFkVmVyc2lvblJlc3BvbnNlECgSGgoWU3R1Ykw2NDcwRHJpdmVyUmVx", + "dWVzdBApEhsKF1N0dWJMNjQ3MERyaXZlclJlc3BvbnNlECoSGAoUU3R1Yk1v", + "dG9ySW5pdFJlcXVlc3QQKxIZChVTdHViTW90b3JJbml0UmVzcG9uc2UQLBIX", + "ChNTdHViTW90b3JSdW5SZXF1ZXN0EC0SGAoUU3R1Yk1vdG9yUnVuUmVzcG9u", + "c2UQLhIYChRTdHViTW90b3JTdG9wUmVxdWVzdBAvEhkKFVN0dWJNb3RvclN0", + "b3BSZXNwb25zZRAwEhoKFlN0dWJNb3RvclN0YXR1c1JlcXVlc3QQMRIbChdT", + "dHViTW90b3JTdGF0dXNSZXNwb25zZRAyEhcKE1N0dWJNb3Rvck1vdlJlcXVl", + "c3QQMxIYChRTdHViTW90b3JNb3ZSZXNwb25zZRA0EhkKFVN0dWJNb3RvclNw", + "ZWVkUmVxdWVzdBA1EhoKFlN0dWJNb3RvclNwZWVkUmVzcG9uc2UQNhIcChhT", + "dHViTW90b3JQb3NpdGlvblJlcXVlc3QQNxIdChlTdHViTW90b3JQb3NpdGlv", + "blJlc3BvbnNlEDgSJQogRXh0ZXJuYWxCcmlkZ2VVZHBEaXNjb3ZlcnlQYWNr", + "ZXQQ6AcSHwoaRXh0ZXJuYWxDbGllbnRMb2dpblJlcXVlc3QQ6QcSIAobRXh0", + "ZXJuYWxDbGllbnRMb2dpblJlc3BvbnNlEOoHEiEKHERpcmVjdFN5bmNocm9u", + "aXphdGlvblJlcXVlc3QQ6wcSIgodRGlyZWN0U3luY2hyb25pemF0aW9uUmVz", + "cG9uc2UQ7AcSHAoXT3ZlcnJpZGVEYXRhQmFzZVJlcXVlc3QQ7QcSHQoYT3Zl", + "cnJpZGVEYXRhQmFzZVJlc3BvbnNlEO4HEhUKEEtlZXBBbGl2ZVJlcXVlc3QQ", + "7wcSFgoRS2VlcEFsaXZlUmVzcG9uc2UQ8AcSGwoWUHVzaERpYWdub3N0aWNz", + "UmVxdWVzdBDQDxIcChdQdXNoRGlhZ25vc3RpY3NSZXNwb25zZRDRDxIcChdN", + "b3RvckFib3J0SG9taW5nUmVxdWVzdBDSDxIdChhNb3RvckFib3J0SG9taW5n", + "UmVzcG9uc2UQ0w8SFwoSTW90b3JIb21pbmdSZXF1ZXN0ENQPEhgKE01vdG9y", + "SG9taW5nUmVzcG9uc2UQ1Q8SGAoTTW90b3JKb2dnaW5nUmVxdWVzdBDWDxIZ", + "ChRNb3RvckpvZ2dpbmdSZXNwb25zZRDXDxIdChhNb3RvckFib3J0Sm9nZ2lu", + "Z1JlcXVlc3QQ2A8SHgoZTW90b3JBYm9ydEpvZ2dpbmdSZXNwb25zZRDZDxIg", + "ChtEaXNwZW5zZXJBYm9ydEhvbWluZ1JlcXVlc3QQ2g8SIQocRGlzcGVuc2Vy", + "QWJvcnRIb21pbmdSZXNwb25zZRDbDxIbChZEaXNwZW5zZXJIb21pbmdSZXF1", + "ZXN0ENwPEhwKF0Rpc3BlbnNlckhvbWluZ1Jlc3BvbnNlEN0PEhwKF0Rpc3Bl", + "bnNlckpvZ2dpbmdSZXF1ZXN0EN4PEh0KGERpc3BlbnNlckpvZ2dpbmdSZXNw", + "b25zZRDfDxIhChxEaXNwZW5zZXJBYm9ydEpvZ2dpbmdSZXF1ZXN0EOAPEiIK", + "HURpc3BlbnNlckFib3J0Sm9nZ2luZ1Jlc3BvbnNlEOEPEhkKFFNldERpZ2l0", + "YWxPdXRSZXF1ZXN0EOIPEhoKFVNldERpZ2l0YWxPdXRSZXNwb25zZRDjDxIZ", + "ChRUaHJlYWRKb2dnaW5nUmVxdWVzdBDkDxIaChVUaHJlYWRKb2dnaW5nUmVz", + "cG9uc2UQ5Q8SHgoZVGhyZWFkQWJvcnRKb2dnaW5nUmVxdWVzdBDmDxIfChpU", + "aHJlYWRBYm9ydEpvZ2dpbmdSZXNwb25zZRDnDxIPCgpKb2JSZXF1ZXN0ELgX", + "EhAKC0pvYlJlc3BvbnNlELkXEhQKD0Fib3J0Sm9iUmVxdWVzdBC6FxIVChBB", + "Ym9ydEpvYlJlc3BvbnNlELsXQhwKGmNvbS50d2luZS50YW5nby5wbXIuY29t", + "bW9uYgZwcm90bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Tango.PMR.Common.MessageType), }, null)); @@ -120,6 +133,26 @@ namespace Tango.PMR.Common { [pbr::OriginalName("StubExtFlashReadResponse")] StubExtFlashReadResponse = 34, [pbr::OriginalName("StubExtFlashWriteRequest")] StubExtFlashWriteRequest = 35, [pbr::OriginalName("StubExtFlashWriteResponse")] StubExtFlashWriteResponse = 36, + [pbr::OriginalName("StubFPGAReadBackRegRequest")] StubFpgareadBackRegRequest = 37, + [pbr::OriginalName("StubFPGAReadBackRegResponse")] StubFpgareadBackRegResponse = 38, + [pbr::OriginalName("StubFPGAReadVersionRequest")] StubFpgareadVersionRequest = 39, + [pbr::OriginalName("StubFPGAReadVersionResponse")] StubFpgareadVersionResponse = 40, + [pbr::OriginalName("StubL6470DriverRequest")] StubL6470DriverRequest = 41, + [pbr::OriginalName("StubL6470DriverResponse")] StubL6470DriverResponse = 42, + [pbr::OriginalName("StubMotorInitRequest")] StubMotorInitRequest = 43, + [pbr::OriginalName("StubMotorInitResponse")] StubMotorInitResponse = 44, + [pbr::OriginalName("StubMotorRunRequest")] StubMotorRunRequest = 45, + [pbr::OriginalName("StubMotorRunResponse")] StubMotorRunResponse = 46, + [pbr::OriginalName("StubMotorStopRequest")] StubMotorStopRequest = 47, + [pbr::OriginalName("StubMotorStopResponse")] StubMotorStopResponse = 48, + [pbr::OriginalName("StubMotorStatusRequest")] StubMotorStatusRequest = 49, + [pbr::OriginalName("StubMotorStatusResponse")] StubMotorStatusResponse = 50, + [pbr::OriginalName("StubMotorMovRequest")] StubMotorMovRequest = 51, + [pbr::OriginalName("StubMotorMovResponse")] StubMotorMovResponse = 52, + [pbr::OriginalName("StubMotorSpeedRequest")] StubMotorSpeedRequest = 53, + [pbr::OriginalName("StubMotorSpeedResponse")] StubMotorSpeedResponse = 54, + [pbr::OriginalName("StubMotorPositionRequest")] StubMotorPositionRequest = 55, + [pbr::OriginalName("StubMotorPositionResponse")] StubMotorPositionResponse = 56, /// ///Integration /// diff --git a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj index 3674c3e73..9e1f2dd76 100644 --- a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj +++ b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj @@ -24,8 +24,8 @@ pdbonly - true - bin\Release\ + false + ..\Build\Release\ TRACE prompt 4 diff --git a/Software/Visual_Studio/Tango.Settings/MachineStudioSettings/MachineStudio.cs b/Software/Visual_Studio/Tango.Settings/MachineStudioSettings/MachineStudio.cs index 0cb35199f..111c959f7 100644 --- a/Software/Visual_Studio/Tango.Settings/MachineStudioSettings/MachineStudio.cs +++ b/Software/Visual_Studio/Tango.Settings/MachineStudioSettings/MachineStudio.cs @@ -28,6 +28,11 @@ namespace Tango.Settings.MachineStudioSettings /// public bool RememberMe { get; set; } + /// + /// Gets or sets the update service address. + /// + public String UpdateServiceAddress { get; set; } + /// /// Gets or sets the logging categories. /// @@ -69,6 +74,7 @@ namespace Tango.Settings.MachineStudioSettings StubsModule = new StubsModule(); TechnicianModule = new TechnicianModule(); DeveloperModule = new DeveloperModule(); + UpdateServiceAddress = "http://localhost/MachineStudioUpdateService/MachineStudioUpdateService.svc"; } } } diff --git a/Software/Visual_Studio/Tango.Video/Tango.Video.csproj b/Software/Visual_Studio/Tango.Video/Tango.Video.csproj index f24d3a625..cb08ec0f9 100644 --- a/Software/Visual_Studio/Tango.Video/Tango.Video.csproj +++ b/Software/Visual_Studio/Tango.Video/Tango.Video.csproj @@ -24,18 +24,20 @@ DEBUG;TRACE prompt 4 - x86 + AnyCPU true pdbonly - true - bin\Release\ + false + ..\Build\Release\ TRACE prompt 4 + true + x86 diff --git a/Software/Visual_Studio/Tango.sln b/Software/Visual_Studio/Tango.sln index f5fe8c1c0..ec84fa212 100644 --- a/Software/Visual_Studio/Tango.sln +++ b/Software/Visual_Studio/Tango.sln @@ -127,6 +127,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.Visuals", "Tango.Visu EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.MachineStudio.DataCapture", "MachineStudio\Modules\Tango.MachineStudio.DataCapture\Tango.MachineStudio.DataCapture.csproj", "{FC337A7F-1214-41D8-9992-78092A3B961E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.MachineStudio.UpdateService", "MachineStudio\Tango.MachineStudio.UpdateService\Tango.MachineStudio.UpdateService.csproj", "{CC6D62E9-C300-42F3-B452-79966E902B10}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1657,6 +1659,36 @@ Global {FC337A7F-1214-41D8-9992-78092A3B961E}.Release|x64.Build.0 = Release|Any CPU {FC337A7F-1214-41D8-9992-78092A3B961E}.Release|x86.ActiveCfg = Release|Any CPU {FC337A7F-1214-41D8-9992-78092A3B961E}.Release|x86.Build.0 = Release|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Debug|ARM.ActiveCfg = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Debug|ARM.Build.0 = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Debug|ARM64.Build.0 = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Debug|x64.ActiveCfg = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Debug|x64.Build.0 = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Debug|x86.ActiveCfg = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Debug|x86.Build.0 = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.DefaultBuild|Any CPU.ActiveCfg = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.DefaultBuild|Any CPU.Build.0 = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.DefaultBuild|ARM.ActiveCfg = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.DefaultBuild|ARM.Build.0 = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.DefaultBuild|ARM64.ActiveCfg = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.DefaultBuild|ARM64.Build.0 = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.DefaultBuild|x64.ActiveCfg = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.DefaultBuild|x64.Build.0 = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.DefaultBuild|x86.ActiveCfg = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.DefaultBuild|x86.Build.0 = Debug|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Release|Any CPU.Build.0 = Release|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Release|ARM.ActiveCfg = Release|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Release|ARM.Build.0 = Release|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Release|ARM64.ActiveCfg = Release|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Release|ARM64.Build.0 = Release|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Release|x64.ActiveCfg = Release|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Release|x64.Build.0 = Release|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Release|x86.ActiveCfg = Release|Any CPU + {CC6D62E9-C300-42F3-B452-79966E902B10}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1692,5 +1724,6 @@ Global {37E4CEAB-B54B-451F-B535-04CF7DA9C459} = {EC62BC9C-F2FE-4333-B7E4-110E38D43958} {5B954D98-4020-4AC6-939F-C52B5646E8E6} = {5F6BBAA8-EAD0-4B18-97E5-55B4F56DD760} {FC337A7F-1214-41D8-9992-78092A3B961E} = {B2AF4F3F-2828-47C3-8F3E-A0EA0BD66FF8} + {CC6D62E9-C300-42F3-B452-79966E902B10} = {57DF2A95-5DDD-4830-A4AF-B484B59C7C2B} EndGlobalSection EndGlobal -- cgit v1.3.1 From f991f37a95a854e9b2aada52982d83ddaa0ca1b0 Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Wed, 21 Feb 2018 21:30:45 +0200 Subject: Working on macine studio update center.. --- Software/DB/Tango.mdf | Bin 75497472 -> 75497472 bytes Software/DB/Tango_log.ldf | Bin 8388608 -> 8388608 bytes .../Tango.MachineStudio.Common.csproj | 1 + .../Update/FileStreamWrapper.cs | 56 ++++++ .../Tango.MachineStudio.UI/App.config | 2 +- .../Tango.MachineStudio.UI.csproj | 9 + .../ViewModels/UpdateViewVM.cs | 189 ++++++++++++++++++--- .../Tango.MachineStudio.UI/packages.config | 2 + 8 files changed, 235 insertions(+), 24 deletions(-) create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/FileStreamWrapper.cs (limited to 'Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common') diff --git a/Software/DB/Tango.mdf b/Software/DB/Tango.mdf index 736485c47..88080fdb5 100644 Binary files a/Software/DB/Tango.mdf and b/Software/DB/Tango.mdf differ diff --git a/Software/DB/Tango_log.ldf b/Software/DB/Tango_log.ldf index 02e398280..7991ff3a9 100644 Binary files a/Software/DB/Tango_log.ldf and b/Software/DB/Tango_log.ldf differ diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj index a363ffc44..1c4a9d465 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj @@ -100,6 +100,7 @@ + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/FileStreamWrapper.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/FileStreamWrapper.cs new file mode 100644 index 000000000..83fbdf7ea --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/FileStreamWrapper.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.MachineStudio.Common.Update +{ + /// + /// Represents a FileStream Wrapper dedicated for delivering Read/Write progress callbacks. + /// + /// + public class FileStreamWrapper : FileStream + { + private Action _callback; + + /// + /// Initializes a new instance of the class. + /// + /// Name of the file. + /// The mode. + /// The callback. + public FileStreamWrapper(String fileName, FileMode mode, Action callback) : base(fileName, mode) + { + _callback = callback; + } + + /// + /// Writes a block of bytes to the file stream. + /// + /// The buffer containing data to write to the stream. + /// The zero-based byte offset in from which to begin copying bytes to the stream. + /// The maximum number of bytes to write. + public override void Write(byte[] array, int offset, int count) + { + _callback?.Invoke(Length); + base.Write(array, offset, count); + } + + /// + /// Reads a block of bytes from the stream and writes the data in a given buffer. + /// + /// When this method returns, contains the specified byte array with the values between and ( + - 1 replaced by the bytes read from the current source. + /// The byte offset in at which the read bytes will be placed. + /// The maximum number of bytes to read. + /// + /// The total number of bytes read into the buffer. This might be less than the number of bytes requested if that number of bytes are not currently available, or zero if the end of the stream is reached. + /// + public override int Read(byte[] array, int offset, int count) + { + _callback?.Invoke(Position); + return base.Read(array, offset, count); + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.config b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.config index 0bd51a469..1a0e57043 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.config +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/App.config @@ -9,7 +9,7 @@ - + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj index 0ad97907b..61ea92566 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Tango.MachineStudio.UI.csproj @@ -48,6 +48,9 @@ ..\..\packages\EntityFramework.6.0.0\lib\net45\EntityFramework.SqlServer.dll + + ..\..\packages\FluentFTP.19.1.2\lib\net45\FluentFTP.dll + ..\..\packages\FontAwesome.WPF.4.7.0.9\lib\net40\FontAwesome.WPF.dll @@ -63,6 +66,9 @@ ..\..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll + + ..\..\packages\Ionic.Zip.1.9.1.8\lib\Ionic.Zip.dll + ..\..\packages\MahApps.Metro.1.5.0\lib\net45\MahApps.Metro.dll @@ -94,6 +100,7 @@ True + ..\..\packages\System.Reactive.Core.3.1.1\lib\net46\System.Reactive.Core.dll @@ -110,7 +117,9 @@ ..\..\packages\System.Reactive.Windows.Threading.3.1.1\lib\net45\System.Reactive.Windows.Threading.dll + + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs index 014aecdb6..e5f3d7a46 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs @@ -1,11 +1,17 @@ -using System; +using FluentFTP; +using Ionic.Zip; +using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Runtime.CompilerServices; +using System.ServiceModel; using System.Text; using System.Threading; using System.Threading.Tasks; using Tango.Core.Commands; +using Tango.Core.Helpers; +using Tango.Logging; using Tango.MachineStudio.Common.Authentication; using Tango.MachineStudio.Common.Navigation; using Tango.MachineStudio.Common.Notifications; @@ -29,10 +35,13 @@ namespace Tango.MachineStudio.UI.ViewModels public class UpdateViewVM : ViewModel { + private String _appPath = AppDomain.CurrentDomain.BaseDirectory; + private INotificationProvider _notification; private INavigationManager _navigation; private IStudioApplicationManager _application; private IAuthenticationProvider _authentication; + private CheckForUpdatesResponse _updateInfo; private UpdateStatus _status; public UpdateStatus Status @@ -85,6 +94,11 @@ namespace Tango.MachineStudio.UI.ViewModels BackCommand = new RelayCommand(BackToApplication, () => Status != UpdateStatus.Updating); RestartCommand = new RelayCommand(RestartApplication, () => Status == UpdateStatus.UpdateCompleted); TryAgainCommand = new RelayCommand(TryAgain, () => Status == UpdateStatus.CheckingForUpdate); + + foreach (var file in Directory.GetFiles(_appPath, "*.tmp")) + { + PathHelper.TryDeleteFile(file); + } } public void OnNavigatedInto() @@ -96,22 +110,47 @@ namespace Tango.MachineStudio.UI.ViewModels { Status = UpdateStatus.CheckingForUpdate; + ChannelFactory service = null; + Task.Factory.StartNew(() => { - var service = UpdateServiceHelper.GetUpdateServiceChannel(); - var client = service.CreateChannel(); - - CheckForUpdatesResponse response = client.CheckForUpdates(new CheckForUpdatesRequest() + try { - Email = _authentication.CurrentUser.Email, - Password = _authentication.CurrentUser.Password, - Version = _application.Version, - }); + Thread.Sleep(2000); + + service = UpdateServiceHelper.GetUpdateServiceChannel(); + var client = service.CreateChannel(); - var a = response; + CheckForUpdatesResponse response = client.CheckForUpdates(new CheckForUpdatesRequest() + { + Email = _authentication.CurrentUser.Email, + Password = _authentication.CurrentUser.Password, + Version = _application.Version, + }); - Thread.Sleep(5000); - Status = UpdateStatus.UpdateAvailable; + if (response.IsUpdateAvailable) + { + _updateInfo = response; + Status = UpdateStatus.UpdateAvailable; + LatestVersion = response.Version; + } + else + { + Status = UpdateStatus.UpToDate; + } + } + catch (Exception ex) + { + LogManager.Log(ex, "Error while checking for version update!"); + Status = UpdateStatus.Error; + } + finally + { + if (service != null) + { + service.Close(); + } + } }); } @@ -128,7 +167,7 @@ namespace Tango.MachineStudio.UI.ViewModels _navigation.NavigateTo(NavigationView.MainView); Status = UpdateStatus.None; } - + private void StartUpdate() { DownloadProgress = 0; @@ -138,24 +177,128 @@ namespace Tango.MachineStudio.UI.ViewModels Task.Factory.StartNew(() => { - for (int i = 0; i < 100; i++) + try { - DownloadProgress++; - Thread.Sleep(30); - } + var tempFile = PathHelper.GetTempFilePath() + ".zip"; + + LogManager.Log("Creating temporary file " + tempFile); + + int fileSize = 0; + + using (FileStreamWrapper fs = new FileStreamWrapper(tempFile, FileMode.Create, (current) => + { + InvokeUINow(() => + { + Thread.Sleep(10); + DownloadProgress = ((double)current / (double)fileSize) * 100d; + }); + })) + { + using (FtpClient ftp = new FtpClient(_updateInfo.FtpHost, _updateInfo.UserName, _updateInfo.Password)) + { + LogManager.Log("Connecting to FTP site: " + _updateInfo.FtpHost); + ftp.ConnectAsync().Wait(); + LogManager.Log("Retrieving download size..."); + fileSize = (int)ftp.GetFileSize(_updateInfo.FilePath); + LogManager.Log("Download size: " + fileSize + " bytes."); + LogManager.Log("Starting download..."); + ftp.DownloadAsync(fs, _updateInfo.FilePath).Wait(); + } + } + + + Status = UpdateStatus.Updating; - Status = UpdateStatus.Updating; + int lockedCounter = 0; - for (int i = 0; i < 100; i++) + using (ZipFile zip = ZipFile.Read(tempFile)) + { + int currentEntry = 0; + + zip.ExtractProgress += (x, args) => + { + if (args.EventType == ZipProgressEventType.Extracting_AfterExtractEntry) + { + LogManager.Log("Extracting " + Path.GetFileName(args.CurrentEntry.FileName)); + UpdateProgress = ((double)(currentEntry++) / (double)zip.Entries.Count) * 100d; + } + }; + + foreach (ZipEntry entry in zip) + { + Thread.Sleep(10); + + string newPath = Path.Combine(_appPath, entry.FileName); + + try + { + if (entry.IsDirectory) + { + Directory.CreateDirectory(newPath); + } + else + { + if (!IsFileLocked(newPath)) + { + entry.Extract(_appPath, ExtractExistingFileAction.OverwriteSilently); + } + else + { + LogManager.Log("File locked: " + entry.FileName); + File.Move(newPath, newPath + ".tmp"); + entry.Extract(_appPath, ExtractExistingFileAction.OverwriteSilently); + LogManager.Log("Performed overwrite bypass... (changes will be applied on restart)."); + lockedCounter++; + } + } + } + catch + { + LogManager.Log("Could not overwrite " + entry.FileName); + } + } + } + + Status = UpdateStatus.UpdateCompleted; + } + catch (Exception ex) { - UpdateProgress++; - Thread.Sleep(30); + LogManager.Log(ex, "Error while extracting update package."); + Status = UpdateStatus.Error; } - - Status = UpdateStatus.UpdateCompleted; }); } + /// + /// Determines whether [is file locked] [the specified file]. + /// + /// The file. + + -- cgit v1.3.1 From 042b4d3e7b0af729792ca20e086756c36d2f5768 Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Thu, 22 Feb 2018 13:23:49 +0200 Subject: Working on machine studio update center ! --- Software/DB/Tango.mdf | Bin 75497472 -> 75497472 bytes Software/DB/Tango_log.ldf | Bin 8388608 -> 8388608 bytes .../Tango.MachineStudio.Common.csproj | 3 + .../Update/IMachineStudioUpdateService.cs | 9 + .../Update/UploadCompletedRequest.cs | 16 ++ .../Update/UploadVersionRequest.cs | 25 +++ .../Update/UploadVersionResponse.cs | 31 ++++ .../Tango.MachineStudio.Publisher/App.config | 14 ++ .../Tango.MachineStudio.Publisher/App.xaml | 9 + .../Tango.MachineStudio.Publisher/App.xaml.cs | 17 ++ .../Images/machine-trans.png | Bin 0 -> 45618 bytes .../Images/update.png | Bin 0 -> 5289 bytes .../Tango.MachineStudio.Publisher/MainWindow.xaml | 71 ++++++++ .../MainWindow.xaml.cs | 35 ++++ .../Tango.MachineStudio.Publisher/MainWindowVM.cs | 201 +++++++++++++++++++++ .../Properties/AssemblyInfo.cs | 7 + .../Properties/Resources.Designer.cs | 71 ++++++++ .../Properties/Resources.resx | 117 ++++++++++++ .../Properties/Settings.Designer.cs | 30 +++ .../Properties/Settings.settings | 7 + .../Tango.MachineStudio.Publisher.csproj | 139 ++++++++++++++ .../Tango.MachineStudio.Publisher/packages.config | 5 + .../ViewModels/UpdateViewVM.cs | 67 ++----- .../Tango.MachineStudio.UI/Views/UpdateView.xaml | 2 +- .../MachineStudioUpdateService.svc.cs | 130 ++++++++++++- .../Tango.MachineStudio.Updater/App.config | 6 + .../Tango.MachineStudio.Updater/App.xaml | 9 + .../Tango.MachineStudio.Updater/App.xaml.cs | 24 +++ .../Images/machine-trans.png | Bin 0 -> 45618 bytes .../Tango.MachineStudio.Updater/Images/update.png | Bin 0 -> 5289 bytes .../Tango.MachineStudio.Updater/MainWindow.xaml | 37 ++++ .../Tango.MachineStudio.Updater/MainWindow.xaml.cs | 146 +++++++++++++++ .../Properties/AssemblyInfo.cs | 17 ++ .../Properties/Resources.Designer.cs | 71 ++++++++ .../Properties/Resources.resx | 117 ++++++++++++ .../Properties/Settings.Designer.cs | 30 +++ .../Properties/Settings.settings | 7 + .../Tango.MachineStudio.Updater.csproj | 110 +++++++++++ .../Tango.MachineStudio.Updater/app.manifest | 76 ++++++++ Software/Visual_Studio/Tango.sln | 66 +++++++ 40 files changed, 1666 insertions(+), 56 deletions(-) create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadCompletedRequest.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadVersionRequest.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadVersionResponse.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/App.config create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/App.xaml create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/App.xaml.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Images/machine-trans.png create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Images/update.png create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/MainWindow.xaml create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/MainWindow.xaml.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/MainWindowVM.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/AssemblyInfo.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Resources.Designer.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Resources.resx create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Settings.Designer.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Settings.settings create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Tango.MachineStudio.Publisher.csproj create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/packages.config create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/App.config create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/App.xaml create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/App.xaml.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Images/machine-trans.png create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Images/update.png create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/MainWindow.xaml create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/MainWindow.xaml.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/AssemblyInfo.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Resources.Designer.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Resources.resx create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Settings.Designer.cs create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Settings.settings create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Tango.MachineStudio.Updater.csproj create mode 100644 Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/app.manifest (limited to 'Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common') diff --git a/Software/DB/Tango.mdf b/Software/DB/Tango.mdf index 88080fdb5..9f4b4ca30 100644 Binary files a/Software/DB/Tango.mdf and b/Software/DB/Tango.mdf differ diff --git a/Software/DB/Tango_log.ldf b/Software/DB/Tango_log.ldf index 7991ff3a9..81e9f8578 100644 Binary files a/Software/DB/Tango_log.ldf and b/Software/DB/Tango_log.ldf differ diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj index 1c4a9d465..abe888d73 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj @@ -103,6 +103,9 @@ + + + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/IMachineStudioUpdateService.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/IMachineStudioUpdateService.cs index 7b7269d23..53e49e52c 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/IMachineStudioUpdateService.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/IMachineStudioUpdateService.cs @@ -13,5 +13,14 @@ namespace Tango.MachineStudio.Common.Update { [OperationContract] CheckForUpdatesResponse CheckForUpdates(CheckForUpdatesRequest request); + + [OperationContract] + UploadVersionResponse UploadVersion(UploadVersionRequest request); + + [OperationContract] + void NotifyUploadCompleted(UploadCompletedRequest request); + + [OperationContract] + String GetLatestVersion(); } } diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadCompletedRequest.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadCompletedRequest.cs new file mode 100644 index 000000000..ce6096792 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadCompletedRequest.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.MachineStudio.Common.Update +{ + [DataContract] + public class UploadCompletedRequest + { + [DataMember] + public String Token { get; set; } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadVersionRequest.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadVersionRequest.cs new file mode 100644 index 000000000..71ce04f1f --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadVersionRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.MachineStudio.Common.Update +{ + [DataContract] + public class UploadVersionRequest + { + [DataMember] + public String Email { get; set; } + + [DataMember] + public String Password { get; set; } + + [DataMember] + public String Version { get; set; } + + [DataMember] + public String Comments { get; set; } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadVersionResponse.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadVersionResponse.cs new file mode 100644 index 000000000..36dc3df30 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadVersionResponse.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.MachineStudio.Common.Update +{ + [DataContract] + public class UploadVersionResponse + { + [DataMember] + public String FtpHost { get; set; } + + [DataMember] + public String FilePath { get; set; } + + [DataMember] + public String FileName { get; set; } + + [DataMember] + public String UserName { get; set; } + + [DataMember] + public String Password { get; set; } + + [DataMember] + public String Token { get; set; } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/App.config b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/App.config new file mode 100644 index 000000000..f2af62f53 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/App.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/App.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/App.xaml new file mode 100644 index 000000000..582bd0034 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/App.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/App.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/App.xaml.cs new file mode 100644 index 000000000..499f46424 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/App.xaml.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace Tango.MachineStudio.Publisher +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Images/machine-trans.png b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Images/machine-trans.png new file mode 100644 index 000000000..a7cf65852 Binary files /dev/null and b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Images/machine-trans.png differ diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Images/update.png b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Images/update.png new file mode 100644 index 000000000..a82777414 Binary files /dev/null and b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Images/update.png differ diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/MainWindow.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/MainWindow.xaml new file mode 100644 index 000000000..9f592ca6d --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/MainWindow.xaml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + MACHINE STUDIO + + + + + + + + Latest Version: + + + + Current Version: + + + + + Email: + + + + + Password: + + + + Comments + + + + + + + + + + + + + + + + + + + + + + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/MainWindow.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/MainWindow.xaml.cs new file mode 100644 index 000000000..db1922d59 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/MainWindow.xaml.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.MachineStudio.Publisher +{ + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : Window + { + public MainWindow() + { + InitializeComponent(); + + ContentRendered += MainWindow_ContentRendered; + } + + private void MainWindow_ContentRendered(object sender, EventArgs e) + { + DataContext = new MainWindowVM(); + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/MainWindowVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/MainWindowVM.cs new file mode 100644 index 000000000..2ceb36994 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/MainWindowVM.cs @@ -0,0 +1,201 @@ +using FluentFTP; +using Ionic.Zip; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.ServiceModel; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using Tango.Core.Commands; +using Tango.Core.Cryptography; +using Tango.MachineStudio.Common.Update; +using Tango.Settings; +using Tango.SharedUI; + +namespace Tango.MachineStudio.Publisher +{ + public class MainWindowVM : ViewModel + { + private String _appPath = AppDomain.CurrentDomain.BaseDirectory; + private ChannelFactory _service; + private IMachineStudioUpdateService _client; + + private String _email; + + public String Email + { + get { return _email; } + set { _email = value; RaisePropertyChangedAuto(); } + } + + private String _password; + + public String Password + { + get { return _password; } + set { _password = value; RaisePropertyChangedAuto(); } + } + + private String _comments; + + public String Comments + { + get { return _comments; } + set { _comments = value; RaisePropertyChangedAuto(); } + } + + private String _currentVersion; + + public String CurrentVersion + { + get { return _currentVersion; } + set { _currentVersion = value; RaisePropertyChangedAuto(); } + } + + private String _latestVersion; + + public String LatestVersion + { + get { return _latestVersion; } + set { _latestVersion = value; RaisePropertyChangedAuto(); } + } + + private double _maxProgress; + + public double MaxProgress + { + get { return _maxProgress; } + set { _maxProgress = value; RaisePropertyChangedAuto(); } + } + + private double _progress; + + public double Progress + { + get { return _progress; } + set { _progress = value; RaisePropertyChangedAuto(); } + } + + private bool _isUpdating; + + public bool IsUpdating + { + get { return _isUpdating; } + set { _isUpdating = value; RaisePropertyChangedAuto(); } + } + + public RelayCommand PublishCommand { get; set; } + + public MainWindowVM() + { + MaxProgress = 100; + + PublishCommand = new RelayCommand(Publish, () => Email != null && Password != null && Comments != null && CurrentVersion != null && LatestVersion != null && !IsUpdating && Version.Parse(CurrentVersion) > Version.Parse(LatestVersion)); + + _service = UpdateServiceHelper.GetUpdateServiceChannel(); + _client = _service.CreateChannel(); + + UpdateVersions(); + + Email = SettingsManager.Default.MachineStudio.LastLoginEmail; + + var cryptographer = new Rfc2898Cryptographer(); + Password = cryptographer.Decrypt(SettingsManager.Default.MachineStudio.LastLoginPassword); + } + + private void UpdateVersions() + { + CurrentVersion = typeof(MainWindowVM).Assembly.GetName().Version.ToString(); + LatestVersion = _client.GetLatestVersion(); + } + + private void Publish() + { + MaxProgress = 100; + Progress = 0; + + Task.Factory.StartNew(() => + { + IsUpdating = true; + + try + { + var response = _client.UploadVersion(new UploadVersionRequest() + { + Email = Email, + Password = Password, + Version = CurrentVersion.ToString(), + Comments = Comments, + }); + + String tempFile = Path.Combine(Path.GetTempPath(), response.FileName); + + using (ZipFile zip = new ZipFile()) + { + zip.AddDirectory(Path.Combine(_appPath, "x86"), "/x86"); + zip.AddDirectory(Path.Combine(_appPath, "x64"), "/x64"); + + foreach (var file in Directory.GetFiles(_appPath, "*.*", SearchOption.TopDirectoryOnly)) + { + zip.AddFile(file, "/"); + } + + zip.SaveProgress += (x, e) => + { + MaxProgress = e.TotalBytesToTransfer; + Progress = e.BytesTransferred; + }; + + zip.Save(tempFile); + } + + Progress = 0; + MaxProgress = 100; + + FileStreamWrapper fs = null; + + using (fs = new FileStreamWrapper(tempFile, FileMode.Open, (current) => + { + InvokeUINow(() => + { + Thread.Sleep(10); + Progress = ((double)current / (double)fs.Length) * 100d; + }); + })) + { + using (FtpClient ftp = new FtpClient(response.FtpHost, response.UserName, response.Password)) + { + ftp.ConnectAsync().Wait(); + ftp.UploadAsync(fs, response.FilePath, FtpExists.Overwrite, true).Wait(); + } + } + + UpdateVersions(); + } + catch (Exception ex) + { + ShowError(ex.Message.ToString()); + } + finally + { + IsUpdating = false; + } + }); + } + + private void ShowError(String error) + { + MessageBox.Show(error, "Machine Studio Publisher", MessageBoxButton.OK, MessageBoxImage.Error); + } + + protected override void RaisePropertyChangedAuto([CallerMemberName] string caller = null) + { + base.RaisePropertyChangedAuto(caller); + InvalidateRelayCommands(); + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/AssemblyInfo.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..8d5288e3c --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/AssemblyInfo.cs @@ -0,0 +1,7 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: System.Windows.ThemeInfo(System.Windows.ResourceDictionaryLocation.None, System.Windows.ResourceDictionaryLocation.SourceAssembly)] +[assembly: AssemblyTitle("Tango - Machine Studio Publish Utility")] +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Resources.Designer.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Resources.Designer.cs new file mode 100644 index 000000000..2538f4ffa --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Tango.MachineStudio.Publisher.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Tango.MachineStudio.Publisher.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Resources.resx b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Resources.resx new file mode 100644 index 000000000..af7dbebba --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Settings.Designer.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Settings.Designer.cs new file mode 100644 index 000000000..3fae4577d --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Tango.MachineStudio.Publisher.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Settings.settings b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Settings.settings new file mode 100644 index 000000000..033d7a5e9 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Tango.MachineStudio.Publisher.csproj b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Tango.MachineStudio.Publisher.csproj new file mode 100644 index 000000000..00bbe3539 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/Tango.MachineStudio.Publisher.csproj @@ -0,0 +1,139 @@ + + + + + Debug + AnyCPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A} + WinExe + Tango.MachineStudio.Publisher + Tango.MachineStudio.Publisher + v4.6 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + true + + + AnyCPU + true + full + false + ..\..\Build\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\packages\FluentFTP.19.1.2\lib\net45\FluentFTP.dll + + + ..\..\packages\Ionic.Zip.1.9.1.8\lib\Ionic.Zip.dll + + + + + + + + + + + + + + + + + 4.0 + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + GlobalVersionInfo.cs + + + App.xaml + Code + + + MainWindow.xaml + Code + + + + + + + + + + True + True + Resources.resx + + + True + Settings.settings + True + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + + + + + + + + + {a34ee0f0-649d-41c8-8489-b6f1cc6924ee} + Tango.Core + + + {d8f1ad85-526a-4f50-b6dc-d437af63d8d8} + Tango.Settings + + + {8491d07b-c1f6-4b62-a412-41b9fd2d6538} + Tango.SharedUI + + + {cb0b0aa2-bb24-4bca-a720-45e397684e12} + Tango.MachineStudio.Common + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/packages.config b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/packages.config new file mode 100644 index 000000000..83ee077e4 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Publisher/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs index e5f3d7a46..c24204fb6 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/ViewModels/UpdateViewVM.cs @@ -2,6 +2,7 @@ using Ionic.Zip; using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.CompilerServices; @@ -42,6 +43,7 @@ namespace Tango.MachineStudio.UI.ViewModels private IStudioApplicationManager _application; private IAuthenticationProvider _authentication; private CheckForUpdatesResponse _updateInfo; + private String _newPackageTempFolder; private UpdateStatus _status; public UpdateStatus Status @@ -94,11 +96,6 @@ namespace Tango.MachineStudio.UI.ViewModels BackCommand = new RelayCommand(BackToApplication, () => Status != UpdateStatus.Updating); RestartCommand = new RelayCommand(RestartApplication, () => Status == UpdateStatus.UpdateCompleted); TryAgainCommand = new RelayCommand(TryAgain, () => Status == UpdateStatus.CheckingForUpdate); - - foreach (var file in Directory.GetFiles(_appPath, "*.tmp")) - { - PathHelper.TryDeleteFile(file); - } } public void OnNavigatedInto() @@ -117,7 +114,7 @@ namespace Tango.MachineStudio.UI.ViewModels try { Thread.Sleep(2000); - + service = UpdateServiceHelper.GetUpdateServiceChannel(); var client = service.CreateChannel(); @@ -167,7 +164,7 @@ namespace Tango.MachineStudio.UI.ViewModels _navigation.NavigateTo(NavigationView.MainView); Status = UpdateStatus.None; } - + private void StartUpdate() { DownloadProgress = 0; @@ -209,7 +206,7 @@ namespace Tango.MachineStudio.UI.ViewModels Status = UpdateStatus.Updating; - int lockedCounter = 0; + _newPackageTempFolder = PathHelper.GetTempFolderPath(); using (ZipFile zip = ZipFile.Read(tempFile)) { @@ -228,7 +225,7 @@ namespace Tango.MachineStudio.UI.ViewModels { Thread.Sleep(10); - string newPath = Path.Combine(_appPath, entry.FileName); + string newPath = Path.Combine(_newPackageTempFolder, entry.FileName); try { @@ -238,23 +235,12 @@ namespace Tango.MachineStudio.UI.ViewModels } else { - if (!IsFileLocked(newPath)) - { - entry.Extract(_appPath, ExtractExistingFileAction.OverwriteSilently); - } - else - { - LogManager.Log("File locked: " + entry.FileName); - File.Move(newPath, newPath + ".tmp"); - entry.Extract(_appPath, ExtractExistingFileAction.OverwriteSilently); - LogManager.Log("Performed overwrite bypass... (changes will be applied on restart)."); - lockedCounter++; - } + entry.Extract(_newPackageTempFolder, ExtractExistingFileAction.OverwriteSilently); } } catch { - LogManager.Log("Could not overwrite " + entry.FileName); + LogManager.Log("Could not extract file " + entry.FileName); } } } @@ -269,36 +255,6 @@ namespace Tango.MachineStudio.UI.ViewModels }); } - /// - /// Determines whether [is file locked] [the specified file]. - /// - /// The file. Updating Machine Studio, please wait... - + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/MachineStudioUpdateService.svc.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/MachineStudioUpdateService.svc.cs index 4cfea1b8a..e573a0d77 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/MachineStudioUpdateService.svc.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UpdateService/MachineStudioUpdateService.svc.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; using System.Configuration; +using System.IO; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; +using Tango.Core.Helpers; using Tango.Integration.Observables; using Tango.Logging; using Tango.MachineStudio.Common.Update; @@ -14,6 +16,26 @@ namespace Tango.MachineStudio.UpdateService { public class MachineStudioUpdateService : IMachineStudioUpdateService { + private class PendingUpload + { + public String Token { get; set; } + + public String Version { get; set; } + + public String UserGuid { get; set; } + + public String Comments { get; set; } + + public String FilePath { get; set; } + } + + private static List _pendingUploads; + + MachineStudioUpdateService() + { + _pendingUploads = new List(); + } + public CheckForUpdatesResponse CheckForUpdates(CheckForUpdatesRequest request) { LogManager.Log("Request received..."); @@ -31,9 +53,9 @@ namespace Tango.MachineStudio.UpdateService if (user != null) { var latestVersion = db.MachineStudioVersions.FirstOrDefault(); - Version currentVersionNumber = Version.Parse(request.Version); + Version currentVersion = Version.Parse(request.Version); - if (latestVersion != null && Version.Parse(latestVersion.Version) > currentVersionNumber) + if (latestVersion != null && Version.Parse(latestVersion.Version) > currentVersion) { response.IsUpdateAvailable = true; @@ -58,5 +80,109 @@ namespace Tango.MachineStudio.UpdateService throw new FaultException(ex.ToString()); } } + + public UploadVersionResponse UploadVersion(UploadVersionRequest request) + { + try + { + UploadVersionResponse response = new UploadVersionResponse(); + + using (ObservablesContext db = ObservablesContext.CreateDefaultForWeb()) + { + db.Configuration.LazyLoadingEnabled = false; + + var user = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == request.Password); + + if (user != null) + { + var latestVersion = db.MachineStudioVersions.FirstOrDefault(); + Version currentVersion = Version.Parse(request.Version); + + String newVersionFileName = Path.GetRandomFileName() + ".zip"; + + String newVersionFilePath = "/machine studio versions/" + newVersionFileName; + + if (currentVersion > Version.Parse(latestVersion.Version)) + { + response.FtpHost = ConfigurationManager.AppSettings["FtpHost"].ToString(); + response.UserName = ConfigurationManager.AppSettings["UserName"].ToString(); + response.Password = ConfigurationManager.AppSettings["Password"].ToString(); + response.FilePath = newVersionFilePath; + response.FileName = newVersionFileName; + response.Token = Guid.NewGuid().ToString(); + + _pendingUploads.Add(new PendingUpload() + { + UserGuid = user.Guid, + Comments = request.Comments, + Token = response.Token, + Version = request.Version, + FilePath = response.FilePath, + }); + } + else + { + throw new FaultException("New version must be greater than latest version."); + } + } + else + { + throw new FaultException("Invalid user credentials."); + } + } + + return response; + } + catch (Exception ex) + { + LogManager.Log(ex); + throw new FaultException(ex.ToString()); + } + } + + public void NotifyUploadCompleted(UploadCompletedRequest request) + { + try + { + PendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.Token); + + if (upload != null) + { + _pendingUploads.RemoveAll(x => x.Token == upload.Token); + + using (ObservablesContext db = ObservablesContext.CreateDefaultForWeb()) + { + db.Configuration.LazyLoadingEnabled = false; + + db.MachineStudioVersions.Add(new MachineStudioVersion() + { + Comments = upload.Comments, + FtpFilePath = upload.FilePath, + UserGuid = upload.UserGuid, + Version = upload.Version + }); + + db.SaveChanges(); + } + } + else + { + throw new FaultException("Invalid Token."); + } + } + catch (Exception ex) + { + LogManager.Log(ex); + throw new FaultException(ex.ToString()); + } + } + + public string GetLatestVersion() + { + using (ObservablesContext db = ObservablesContext.CreateDefaultForWeb()) + { + return db.MachineStudioVersions.FirstOrDefault().Version; + } + } } } diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/App.config b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/App.config new file mode 100644 index 000000000..8324aa6ff --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/App.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/App.xaml new file mode 100644 index 000000000..c3e63550a --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/App.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/App.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/App.xaml.cs new file mode 100644 index 000000000..6c3dce868 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/App.xaml.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace Tango.MachineStudio.Updater +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + public static String[] StartupArgs { get; private set; } + + protected override void OnStartup(StartupEventArgs e) + { + StartupArgs = e.Args; + base.OnStartup(e); + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Images/machine-trans.png b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Images/machine-trans.png new file mode 100644 index 000000000..a7cf65852 Binary files /dev/null and b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Images/machine-trans.png differ diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Images/update.png b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Images/update.png new file mode 100644 index 000000000..a82777414 Binary files /dev/null and b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Images/update.png differ diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/MainWindow.xaml b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/MainWindow.xaml new file mode 100644 index 000000000..a8d428650 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/MainWindow.xaml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + MACHINE STUDIO + + + + + + + + + + + + + diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/MainWindow.xaml.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/MainWindow.xaml.cs new file mode 100644 index 000000000..e0e9e7f0d --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/MainWindow.xaml.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Threading; + +namespace Tango.MachineStudio.Updater +{ + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : Window + { + private String _appPath = AppDomain.CurrentDomain.BaseDirectory; + private String _msProcessName = "Tango.MachineStudio.UI"; + private String _sourceFolder = App.StartupArgs.FirstOrDefault(); + + public MainWindow() + { + if (!Directory.Exists(_sourceFolder)) + { + ShowError("This update utility can only be executed by Machine Studio."); + Environment.Exit(0); + } + + InitializeComponent(); + ContentRendered += MainWindow_ContentRendered; + } + + private void MainWindow_ContentRendered(object sender, EventArgs e) + { + Update(); + } + + private void Update() + { + EnsureMachineStudioIsDown(); + ReplaceFiles(); + StartMachineStudio(); + Environment.Exit(0); + } + + private void StartMachineStudio() + { + txtStatus.Text = "Update completed. Starting Machine Studio..."; + DoEvents(); + Thread.Sleep(1000); + + Process p = new Process(); + p.StartInfo.FileName = _appPath + "\\" + _msProcessName + ".exe"; + p.StartInfo.LoadUserProfile = true; + p.StartInfo.UseShellExecute = true; + p.Start(); + } + + private void ReplaceFiles() + { + int maxProgress = Directory.GetFiles(_sourceFolder, "*.*", SearchOption.AllDirectories).Length; + int progress = 0; + + foreach (string dirPath in Directory.GetDirectories(_sourceFolder, "*", SearchOption.AllDirectories)) + { + try + { + Directory.CreateDirectory(dirPath.Replace(_sourceFolder, _appPath)); + } + catch (Exception ex) + { + ShowError("Could not create directory " + Path.GetFileName(dirPath) + Environment.NewLine + ex.Message); + } + } + + foreach (string newPath in Directory.GetFiles(_sourceFolder, "*.*", SearchOption.AllDirectories)) + { + try + { + txtStatus.Text = "Copying file " + Path.GetFileName(newPath); + DoEvents(); + + File.Copy(newPath, newPath.Replace(_sourceFolder, _appPath), true); + + prog.Maximum = maxProgress; + prog.Value = progress++; + DoEvents(); + + Thread.Sleep(30); + } + catch (Exception ex) + { + ShowError("Could not create file " + Path.GetFileName(newPath) + Environment.NewLine + ex.Message); + } + } + } + + private void EnsureMachineStudioIsDown() + { + Process appProcess = null; + + int tries = 0; + + do + { + appProcess = Process.GetProcessesByName(_msProcessName).FirstOrDefault(); + + if (appProcess != null) + { + tries++; + appProcess.Kill(); + Thread.Sleep(1000); + } + + if (tries > 10) + { + ShowError("The main Machine Studio process seems to in a frozen state. Please restart your computer and try again."); + Environment.Exit(0); + } + + } while (appProcess != null); + } + + /// + /// Forces UI rendering. + /// + private void DoEvents() + { + Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { })); + } + + private void ShowError(String error) + { + MessageBox.Show(error, "Machine Studio Update", MessageBoxButton.OK, MessageBoxImage.Error); + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/AssemblyInfo.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..7a79d1042 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/AssemblyInfo.cs @@ -0,0 +1,17 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +[assembly: AssemblyTitle("Tango - Machine Studio Updater Utility")] +[assembly: ComVisible(false)] + +[assembly:ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Resources.Designer.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Resources.Designer.cs new file mode 100644 index 000000000..5061e6179 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Tango.MachineStudio.Updater.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Tango.MachineStudio.Updater.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Resources.resx b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Resources.resx new file mode 100644 index 000000000..af7dbebba --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Settings.Designer.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Settings.Designer.cs new file mode 100644 index 000000000..a18e7398e --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Tango.MachineStudio.Updater.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Settings.settings b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Settings.settings new file mode 100644 index 000000000..033d7a5e9 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Tango.MachineStudio.Updater.csproj b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Tango.MachineStudio.Updater.csproj new file mode 100644 index 000000000..c77222c03 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/Tango.MachineStudio.Updater.csproj @@ -0,0 +1,110 @@ + + + + + Debug + AnyCPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3} + WinExe + Tango.MachineStudio.Updater + Tango.MachineStudio.Updater + v4.6 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + true + + + AnyCPU + true + full + false + ..\..\Build\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + app.manifest + + + + + + + + + + + + 4.0 + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + GlobalVersionInfo.cs + + + App.xaml + Code + + + MainWindow.xaml + Code + + + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + + + + + + + + \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/app.manifest b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/app.manifest new file mode 100644 index 000000000..467015914 --- /dev/null +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/app.manifest @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Software/Visual_Studio/Tango.sln b/Software/Visual_Studio/Tango.sln index ec84fa212..5ef4a806b 100644 --- a/Software/Visual_Studio/Tango.sln +++ b/Software/Visual_Studio/Tango.sln @@ -129,6 +129,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.MachineStudio.DataCap EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.MachineStudio.UpdateService", "MachineStudio\Tango.MachineStudio.UpdateService\Tango.MachineStudio.UpdateService.csproj", "{CC6D62E9-C300-42F3-B452-79966E902B10}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.MachineStudio.Updater", "MachineStudio\Tango.MachineStudio.Updater\Tango.MachineStudio.Updater.csproj", "{844787CE-F409-4F18-BCCC-F3809ECB86F3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.MachineStudio.Publisher", "MachineStudio\Tango.MachineStudio.Publisher\Tango.MachineStudio.Publisher.csproj", "{E711CD86-89C1-432C-9C60-BFF30BBBFB3A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1689,6 +1693,66 @@ Global {CC6D62E9-C300-42F3-B452-79966E902B10}.Release|x64.Build.0 = Release|Any CPU {CC6D62E9-C300-42F3-B452-79966E902B10}.Release|x86.ActiveCfg = Release|Any CPU {CC6D62E9-C300-42F3-B452-79966E902B10}.Release|x86.Build.0 = Release|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Debug|ARM.ActiveCfg = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Debug|ARM.Build.0 = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Debug|ARM64.Build.0 = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Debug|x64.ActiveCfg = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Debug|x64.Build.0 = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Debug|x86.ActiveCfg = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Debug|x86.Build.0 = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.DefaultBuild|Any CPU.ActiveCfg = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.DefaultBuild|Any CPU.Build.0 = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.DefaultBuild|ARM.ActiveCfg = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.DefaultBuild|ARM.Build.0 = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.DefaultBuild|ARM64.ActiveCfg = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.DefaultBuild|ARM64.Build.0 = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.DefaultBuild|x64.ActiveCfg = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.DefaultBuild|x64.Build.0 = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.DefaultBuild|x86.ActiveCfg = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.DefaultBuild|x86.Build.0 = Debug|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Release|Any CPU.Build.0 = Release|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Release|ARM.ActiveCfg = Release|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Release|ARM.Build.0 = Release|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Release|ARM64.ActiveCfg = Release|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Release|ARM64.Build.0 = Release|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Release|x64.ActiveCfg = Release|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Release|x64.Build.0 = Release|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Release|x86.ActiveCfg = Release|Any CPU + {844787CE-F409-4F18-BCCC-F3809ECB86F3}.Release|x86.Build.0 = Release|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Debug|ARM.ActiveCfg = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Debug|ARM.Build.0 = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Debug|ARM64.Build.0 = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Debug|x64.ActiveCfg = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Debug|x64.Build.0 = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Debug|x86.ActiveCfg = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Debug|x86.Build.0 = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.DefaultBuild|Any CPU.ActiveCfg = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.DefaultBuild|Any CPU.Build.0 = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.DefaultBuild|ARM.ActiveCfg = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.DefaultBuild|ARM.Build.0 = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.DefaultBuild|ARM64.ActiveCfg = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.DefaultBuild|ARM64.Build.0 = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.DefaultBuild|x64.ActiveCfg = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.DefaultBuild|x64.Build.0 = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.DefaultBuild|x86.ActiveCfg = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.DefaultBuild|x86.Build.0 = Debug|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Release|Any CPU.Build.0 = Release|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Release|ARM.ActiveCfg = Release|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Release|ARM.Build.0 = Release|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Release|ARM64.ActiveCfg = Release|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Release|ARM64.Build.0 = Release|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Release|x64.ActiveCfg = Release|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Release|x64.Build.0 = Release|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Release|x86.ActiveCfg = Release|Any CPU + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1725,5 +1789,7 @@ Global {5B954D98-4020-4AC6-939F-C52B5646E8E6} = {5F6BBAA8-EAD0-4B18-97E5-55B4F56DD760} {FC337A7F-1214-41D8-9992-78092A3B961E} = {B2AF4F3F-2828-47C3-8F3E-A0EA0BD66FF8} {CC6D62E9-C300-42F3-B452-79966E902B10} = {57DF2A95-5DDD-4830-A4AF-B484B59C7C2B} + {844787CE-F409-4F18-BCCC-F3809ECB86F3} = {57DF2A95-5DDD-4830-A4AF-B484B59C7C2B} + {E711CD86-89C1-432C-9C60-BFF30BBBFB3A} = {57DF2A95-5DDD-4830-A4AF-B484B59C7C2B} EndGlobalSection EndGlobal -- cgit v1.3.1