diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-08-12 19:00:36 +0300 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-08-12 19:00:36 +0300 |
| commit | 18fc4053deb06af6643f28a6bb4fd66c6a9a93e0 (patch) | |
| tree | db2e3b344e30a95a3a09d662930ce129246a57d9 /Software/Visual_Studio/PPC | |
| parent | bbbc155a96729050b9aa7d966055726df46696af (diff) | |
| download | Tango-18fc4053deb06af6643f28a6bb4fd66c6a9a93e0.tar.gz Tango-18fc4053deb06af6643f28a6bb4fd66c6a9a93e0.zip | |
Implemented temporary DB user login for machine service machine setup.
Implemented Tango updater!
Implemented support for software update on machine setup.
Diffstat (limited to 'Software/Visual_Studio/PPC')
27 files changed, 716 insertions, 118 deletions
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs index e1d06034f..aba2d2fcd 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs @@ -38,7 +38,7 @@ namespace Tango.PPC.Common.Application /// <summary> /// Occurs when machine setup is required. /// </summary> - event EventHandler<SetupRequiredEventArgs> SetupRequired; + event EventHandler SetupRequired; /// <summary> /// Gets a value indicating whether the application is shutting down. @@ -51,8 +51,13 @@ namespace Tango.PPC.Common.Application void ShutDown(); /// <summary> - /// Gets the application version. + /// Gets the machine studio application version. /// </summary> - String Version { get; } + Version Version { get; } + + /// <summary> + /// Gets the build date. + /// </summary> + String BuildDate { get; } } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/SetupRequiredEventArgs.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/SetupRequiredEventArgs.cs deleted file mode 100644 index 9a545d781..000000000 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/SetupRequiredEventArgs.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Tango.PPC.Common.Application -{ - public class SetupRequiredEventArgs : EventArgs - { - private Action _continueAction; - - public SetupRequiredEventArgs(Action continueAction) - { - _continueAction = continueAction; - } - - public void Continue() - { - _continueAction?.Invoke(); - } - } -} diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/ApplicationStates.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/ApplicationStates.cs new file mode 100644 index 000000000..3b4dbf4f7 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/ApplicationStates.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.PPC.Common +{ + public enum ApplicationStates + { + PreSetup = 0, + SemiSetup = 1, + Default = 2, + Updating = 3, + } +} diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/IMachineSetupManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/IMachineSetupManager.cs index 096431d63..8856bcfd4 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/IMachineSetupManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/IMachineSetupManager.cs @@ -13,6 +13,6 @@ namespace Tango.PPC.Common.MachineSetup double DownloadingPackagesProgress { get; } String DownloadingPackagesStatus { get; } event EventHandler<MachineSetupSteps> ProgressStep; - Task Setup(String serialNumber, String hostAddress); + Task<MachineSetupResult> Setup(String serialNumber, String hostAddress); } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs index 72c6da515..01f828c3f 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs @@ -11,8 +11,10 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using Tango.Core; +using Tango.Core.DB; using Tango.Core.IO; using Tango.PMR.Synchronization; +using Tango.PPC.Common.Application; using Tango.Settings; using Tango.SQLExaminer; using Tango.Transport.Web; @@ -21,6 +23,8 @@ namespace Tango.PPC.Common.MachineSetup { public class MachineSetupManager : ExtendedObject, IMachineSetupManager { + private IPPCApplicationManager _applicationManager; + public event EventHandler<string> ProgressLog; public event EventHandler<MachineSetupSteps> ProgressStep; @@ -53,9 +57,14 @@ namespace Tango.PPC.Common.MachineSetup set { _updatingPackagesStatus = value; RaisePropertyChangedAuto(); } } - public Task Setup(string serialNumber, string machineServiceAddress) + public MachineSetupManager(IPPCApplicationManager applicationManager) { - return Task.Factory.StartNew(() => + _applicationManager = applicationManager; + } + + public Task<MachineSetupResult> Setup(string serialNumber, string machineServiceAddress) + { + return Task.Factory.StartNew<MachineSetupResult>(() => { //Connect to machine service and get matching packages for this machine. @@ -94,15 +103,15 @@ namespace Tango.PPC.Common.MachineSetup }); })) { - using (FtpClient ftp = new FtpClient(setup_response.FtpAddress, setup_response.UserName, setup_response.Password)) + using (FtpClient ftp = new FtpClient(setup_response.FtpAddress, setup_response.FtpUserName, setup_response.FtpPassword)) { LogManager.Log("Connecting to FTP site: " + setup_response.FtpAddress); ftp.ConnectAsync().Wait(); LogManager.Log("Retrieving download size..."); - fileSize = (int)ftp.GetFileSize(setup_response.FilePath); + fileSize = (int)ftp.GetFileSize(setup_response.FtpFilePath); LogManager.Log("Download size: " + fileSize + " bytes."); LogManager.Log("Starting download..."); - ftp.DownloadAsync(fs, setup_response.FilePath).Wait(); + ftp.DownloadAsync(fs, setup_response.FtpFilePath).Wait(); } } @@ -117,14 +126,16 @@ namespace Tango.PPC.Common.MachineSetup String localAddress = SettingsManager.Default.GetOrCreate<CoreSettings>().DataBaseSource; String remote_address = setup_response.DbAddress; - DbManager db = new DbManager(new SqlConnection(String.Format("Server={0};Integrated security=SSPI", localAddress))); + DbManager db = DbManager.FromAddressAndName(localAddress, db_name); if (!db.Exists(db_name)) { throw new InvalidProgramException("Database tango does not exists."); } - db.ClearDb(db_name); //TODO: This is not working! + db.ClearDb(); + + db.Dispose(); ExaminerSequenceConfigurationRunner runner = new ExaminerSequenceConfigurationRunner( Path.Combine(_newPackageTempFolder, "Synchronization Scripts", "config.xml"), @@ -133,7 +144,9 @@ namespace Tango.PPC.Common.MachineSetup { Address = remote_address, DataBaseName = db_name, - IntegratedSecurity = true, + IntegratedSecurity = false, + UserName = setup_response.DbUserName, + Password = setup_response.DbPassword, }, new ExaminerSequenceDataSource() { @@ -142,12 +155,12 @@ namespace Tango.PPC.Common.MachineSetup IntegratedSecurity = true, }, serialNumber); - runner.Log += (x, msg) => + runner.Log += (x, msg) => { ProgressLog.Invoke(this, msg); }; - runner.ScriptExecuting += (x, item) => + runner.ScriptExecuting += (x, item) => { if (item.Type == ExaminerSequenceItemType.Data && item.RequiresSerialNumber) { @@ -160,6 +173,11 @@ namespace Tango.PPC.Common.MachineSetup }; runner.Run().Wait(); + + return new MachineSetupResult() + { + UpdatePackagePath = _newPackageTempFolder, + }; }); } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupResult.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupResult.cs index 5887a6d34..c459ddf50 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupResult.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupResult.cs @@ -8,6 +8,6 @@ namespace Tango.PPC.Common.MachineSetup { public class MachineSetupResult { - public bool Completed { get; set; } + public String UpdatePackagePath { get; set; } } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCSettings.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCSettings.cs index aecf93a0d..2b87e89bb 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCSettings.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCSettings.cs @@ -26,9 +26,9 @@ namespace Tango.PPC.Common public List<LogCategory> LoggingCategories { get; set; } /// <summary> - /// Gets or sets a value indicating whether this instance has setup. + /// Gets or sets the state of the application. /// </summary> - public bool HasSetup { get; set; } + public ApplicationStates ApplicationState { get; set; } /// <summary> /// Gets the update service address. diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj b/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj index aeb478a36..1214093b9 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj @@ -102,7 +102,7 @@ <Compile Include="..\..\Versioning\GlobalVersionInfo.cs"> <Link>GlobalVersionInfo.cs</Link> </Compile> - <Compile Include="Application\SetupRequiredEventArgs.cs" /> + <Compile Include="ApplicationStates.cs" /> <Compile Include="Connection\DefaultMachineProvider.cs" /> <Compile Include="Connection\IMachineProvider.cs" /> <Compile Include="Connection\MachineOperatorChangedEventArgs.cs" /> @@ -280,7 +280,7 @@ </Target> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Publisher/MainWindowVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.Publisher/MainWindowVM.cs index 6a0f92966..d429c8935 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Publisher/MainWindowVM.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Publisher/MainWindowVM.cs @@ -28,7 +28,13 @@ namespace Tango.PPC.Publisher public class MainWindowVM : ViewModel { private IPPCUpdateService _client; + +#if DEBUG + private String _appPath = AppDomain.CurrentDomain.BaseDirectory + "..\\..\\Debug\\PPC"; +#else private String _appPath = AppDomain.CurrentDomain.BaseDirectory + "..\\..\\Release\\PPC"; +#endif + private BasicHashGenerator _hashGenerator; private List<MachineVersion> _machineVersions; diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/App.xaml.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/App.xaml.cs index f33ca1c42..4187967dc 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/App.xaml.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/App.xaml.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Configuration; using System.Data; +using System.Diagnostics; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -20,6 +21,7 @@ namespace Tango.PPC.UI /// </summary> public partial class App : Application { + public static String[] StartupArgs { get; private set; } private LogManager LogManager = LogManager.Default; /// <summary> @@ -28,6 +30,14 @@ namespace Tango.PPC.UI /// <param name="e">A <see cref="T:System.Windows.StartupEventArgs" /> that contains the event data.</param> protected override void OnStartup(StartupEventArgs e) { + //If no debugger is attached and the argument --debug was passed launch the debugger + if (e.Args.Contains("-debug") && !Debugger.IsAttached) + { + Debugger.Launch(); + } + + StartupArgs = e.Args; + LogManager.RegisterLogger(new VSOutputLogger()); LogManager.RegisterLogger(new FileLogger()); diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/MainWindow.xaml.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/MainWindow.xaml.cs index 181c05145..ca26b7761 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/MainWindow.xaml.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/MainWindow.xaml.cs @@ -37,7 +37,7 @@ namespace Tango.PPC.UI WindowStyle = WindowStyle.None; ResizeMode = ResizeMode.NoResize; WindowStartupLocation = WindowStartupLocation.Manual; - Topmost = false; // sure? + Topmost = true; // sure? var screens = System.Windows.Forms.Screen.AllScreens; diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/PPCApplication/DefaultPPCApplicationManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/PPCApplication/DefaultPPCApplicationManager.cs index e75a0616c..f2fba05fe 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/PPCApplication/DefaultPPCApplicationManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/PPCApplication/DefaultPPCApplicationManager.cs @@ -53,11 +53,11 @@ namespace Tango.PPC.UI.PPCApplication /// Gets the application version. /// </summary> /// <exception cref="NotImplementedException"></exception> - public string Version + public Version Version { get { - throw new NotImplementedException(); + return AssemblyHelper.GetCurrentAssemblyVersion(); } } @@ -102,32 +102,26 @@ namespace Tango.PPC.UI.PPCApplication settings.Save(); } - if (settings.HasSetup) + if (App.StartupArgs.Contains("-update_ok")) + { + settings.ApplicationState = ApplicationStates.Default; + settings.Save(); + } + + if (settings.ApplicationState == ApplicationStates.Default) { ObservablesEntitiesAdapter.Instance.Initialize(); } }); - if (settings.HasSetup) + if (settings.ApplicationState == ApplicationStates.PreSetup || settings.ApplicationState == ApplicationStates.SemiSetup) { - PostSetup(); + SetupRequired?.Invoke(this, new EventArgs()); } else { - SetupRequiredEventArgs args = new SetupRequiredEventArgs(() => - { - Task.Factory.StartNew(() => - { - ObservablesEntitiesAdapter.Instance.Initialize(); - - InvokeUI(() => - { - PostSetup(); - }); - }); - }); - SetupRequired?.Invoke(this, args); + PostSetup(); } }; } @@ -198,7 +192,16 @@ namespace Tango.PPC.UI.PPCApplication } public event EventHandler Ready; - public event EventHandler<SetupRequiredEventArgs> SetupRequired; + public event EventHandler SetupRequired; public event EventHandler ContentRendered; + + public String BuildDate + { + get + { + return AssemblyHelper.GetCurrentAssemblyBuildDate().ToShortDateString(); + } + } + } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs index 2a76ba80f..77767d588 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs @@ -26,12 +26,8 @@ namespace Tango.PPC.UI.ViewModels /// Represents the PPC loading splash screen view model. /// </summary> /// <seealso cref="Tango.PPC.Common.PPCViewModel" /> - public class LoadingViewVM : PPCViewModel, INavigationObjectReceiver<MachineSetupResult> + public class LoadingViewVM : PPCViewModel { - private bool _setup; - private SetupRequiredEventArgs _setupArgs; - private bool _post_setup; - /// <summary> /// Gets or sets the module loader. /// </summary> @@ -55,42 +51,17 @@ namespace Tango.PPC.UI.ViewModels { if (!DesignMode) { - applicationManager.SetupRequired += ApplicationManager_SetupRequired; Task.Delay(1000).ContinueWith((x) => { IsLoading = true; }); } } - private void ApplicationManager_SetupRequired(object sender, SetupRequiredEventArgs e) - { - _setupArgs = e; - _setup = true; - NavigationManager.NavigateTo(NavigationView.MachineSetupView); - } - /// <summary> /// Called when the application has been started. /// </summary> public override void OnApplicationStarted() { IsLoading = false; - - if (!_setup || _post_setup) - { - NavigationManager.NavigateTo(NavigationView.LoginView); - } - } - - public async void OnNavigatedToWithObject(MachineSetupResult machineSetupResult) - { - if (machineSetupResult.Completed) - { - _post_setup = true; - _setup = false; - IsLoading = true; - - await Task.Delay(500); - _setupArgs.Continue(); - } + NavigationManager.NavigateTo(NavigationView.LoginView); } } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs index 7b4016341..2877d52b3 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; using System.Data.SqlClient; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core; using Tango.Core.Commands; +using Tango.Core.Helpers; using Tango.PPC.Common; using Tango.PPC.Common.Application; using Tango.PPC.Common.MachineSetup; @@ -27,9 +29,7 @@ namespace Tango.PPC.UI.ViewModels Failed, } - private bool _postSetp; - - private SetupRequiredEventArgs _setupRequiredEventArgs; + private MachineSetupResult _setup_result; public IMachineSetupManager MachineSetupManager { get; set; } @@ -80,24 +80,9 @@ namespace Tango.PPC.UI.ViewModels applicationManager.SetupRequired += ApplicationManager_SetupRequired; } - private void ApplicationManager_SetupRequired(object sender, SetupRequiredEventArgs e) - { - _setupRequiredEventArgs = e; - } - - public override void OnApplicationStarted() - { - base.OnApplicationStarted(); - - if (_postSetp) - { - NavigationManager.NavigateTo(Common.Navigation.NavigationView.LoginView); - } - } - - public override void OnNavigatedTo() + private void ApplicationManager_SetupRequired(object sender, EventArgs e) { - base.OnNavigatedTo(); + NavigationManager.NavigateTo(NavigationView.MachineSetupView); } private void AppendLog(String msg) @@ -117,9 +102,8 @@ namespace Tango.PPC.UI.ViewModels try { - await MachineSetupManager.Setup(SerialNumber, HostAddress); - Settings.HasSetup = true; - _postSetp = true; + _setup_result = await MachineSetupManager.Setup(SerialNumber, HostAddress); + Settings.ApplicationState = ApplicationStates.SemiSetup; Settings.Save(); State = MachineSetupStates.Completed; } @@ -132,7 +116,8 @@ namespace Tango.PPC.UI.ViewModels private void CompleteSetup() { - NavigationManager.NavigateWithObject(NavigationView.LoadingView, new MachineSetupResult() { Completed = true }); + Process.Start(AssemblyHelper.GetCurrentAssemblyFolder() + "\\Tango.PPC.Updater.exe", _setup_result.UpdatePackagePath); + Environment.Exit(0); } } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/MachineSetupView.xaml b/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/MachineSetupView.xaml index e300d95aa..9ff98ce52 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/MachineSetupView.xaml +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/MachineSetupView.xaml @@ -37,7 +37,7 @@ <TextBlock>SERIAL NUMBER</TextBlock> <touch:TouchTextBox Foreground="{StaticResource TangoGrayTextBrush}" Margin="0 10 0 0" Text="{Binding SerialNumber}" KeyboardContainer="{Binding ElementName=Container}" /> - <TextBlock Margin="0 40 0 0">HOST ADDRESS</TextBlock> + <TextBlock Margin="0 40 0 0">MACHINE SERVICE ADDRESS</TextBlock> <touch:TouchTextBox Foreground="{StaticResource TangoGrayTextBrush}" Margin="0 10 0 0" Text="{Binding HostAddress}" KeyboardContainer="{Binding ElementName=Container}" /> <touch:TouchButton Margin="0 200 0 0" Padding="20" Width="300" CornerRadius="35" Command="{Binding StartCommand}">INSTALL</touch:TouchButton> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.config b/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.config new file mode 100644 index 000000000..8324aa6ff --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.config @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" ?> +<configuration> + <startup> + <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" /> + </startup> +</configuration>
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.xaml b/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.xaml new file mode 100644 index 000000000..35893782c --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.xaml @@ -0,0 +1,9 @@ +<Application x:Class="Tango.PPC.Updater.App" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:local="clr-namespace:Tango.PPC.Updater" + StartupUri="MainWindow.xaml"> + <Application.Resources> + + </Application.Resources> +</Application> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.xaml.cs b/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.xaml.cs new file mode 100644 index 000000000..bf390b97d --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.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.PPC.Updater +{ + /// <summary> + /// Interaction logic for App.xaml + /// </summary> + 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/PPC/Tango.PPC.Updater/Images/package.png b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Images/package.png Binary files differnew file mode 100644 index 000000000..46446c02f --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Images/package.png diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml b/Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml new file mode 100644 index 000000000..77a87d224 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml @@ -0,0 +1,17 @@ +<Window x:Class="Tango.PPC.Updater.MainWindow" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:local="clr-namespace:Tango.PPC.Updater" + mc:Ignorable="d" + WindowStyle="None" ResizeMode="NoResize" Width="800" Height="1280"> + + <Grid> + <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> + <Image Source="/Images/package.png" Width="200" /> + <TextBlock x:Name="txtStatus" Margin="0 100 0 0" FontSize="22" Text="Updating Tango..." HorizontalAlignment="Center"></TextBlock> + <ProgressBar x:Name="prog" Margin="0 30 0 0" Width="500" Height="10" Maximum="100" Value="50" BorderThickness="0" Foreground="#1c63ea"></ProgressBar> + </StackPanel> + </Grid> +</Window> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml.cs b/Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml.cs new file mode 100644 index 000000000..a1c68bd78 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml.cs @@ -0,0 +1,169 @@ +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.PPC.Updater +{ + /// <summary> + /// Interaction logic for MainWindow.xaml + /// </summary> + public partial class MainWindow : Window + { + private String _appPath = AppDomain.CurrentDomain.BaseDirectory; + private String _msProcessName = "Tango.PPC.UI"; + private String _sourceFolder = App.StartupArgs.FirstOrDefault(); + + public MainWindow() + { + if (!Directory.Exists(_sourceFolder)) + { + ShowError("This update utility can only be executed by the main Tango."); + Environment.Exit(0); + } + + InitializeComponent(); + + WindowStyle = WindowStyle.None; + ResizeMode = ResizeMode.NoResize; + WindowStartupLocation = WindowStartupLocation.Manual; + Topmost = true; // sure? + + var screens = System.Windows.Forms.Screen.AllScreens; + + //Search for the vertical touch monitor. + var touch_screen = screens.Where(x => x.Bounds.Height > x.Bounds.Width).Last(); + + if (touch_screen != null) + { + Left = touch_screen.Bounds.Left; + Top = touch_screen.Bounds.Top; + Width = touch_screen.Bounds.Width; + Height = touch_screen.Bounds.Height; + } + + ContentRendered += MainWindow_ContentRendered; + } + + private void MainWindow_ContentRendered(object sender, EventArgs e) + { + Update(); + } + + private void Update() + { + EnsureTangoIsDown(); + ReplaceFiles(); + StartTango(); + Environment.Exit(0); + } + + private void StartTango() + { + txtStatus.Text = "Update completed. Starting application..."; + DoEvents(); + Thread.Sleep(1000); + + Process p = new Process(); + p.StartInfo.FileName = _appPath + "\\" + _msProcessName + ".exe"; + p.StartInfo.LoadUserProfile = true; + p.StartInfo.UseShellExecute = true; + p.StartInfo.Arguments = "-update_ok"; + 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) + { + if (!newPath.ToLower().Contains("updater.exe")) + { + ShowError("Could not create file " + Path.GetFileName(newPath) + Environment.NewLine + ex.Message); + } + } + } + } + + private void EnsureTangoIsDown() + { + 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 Tango process seems to in a frozen state. Please restart your computer and try again."); + Environment.Exit(0); + } + + } while (appProcess != null); + } + + /// <summary> + /// Forces UI rendering. + /// </summary> + private void DoEvents() + { + Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { })); + } + + private void ShowError(String error) + { + MessageBox.Show(error, "Tango Update", MessageBoxButton.OK, MessageBoxImage.Error); + } + } +} diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/AssemblyInfo.cs b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..499122342 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// 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.PPC.Updater")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Tango.PPC.Updater")] +[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)] + +//In order to begin building localizable applications, set +//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file +//inside a <PropertyGroup>. For example, if you are using US english +//in your source files, set the <UICulture> to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[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) +)] + + +// 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 Build and Revision 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/PPC/Tango.PPC.Updater/Properties/Resources.Designer.cs b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Resources.Designer.cs new file mode 100644 index 000000000..8b92f59d7 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// 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. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace Tango.PPC.Updater.Properties +{ + + + /// <summary> + /// A strongly-typed resource class, for looking up localized strings, etc. + /// </summary> + // 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() + { + } + + /// <summary> + /// Returns the cached ResourceManager instance used by this class. + /// </summary> + [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.PPC.Updater.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// <summary> + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// </summary> + [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/PPC/Tango.PPC.Updater/Properties/Resources.resx b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Resources.resx new file mode 100644 index 000000000..af7dbebba --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Resources.resx @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root>
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Settings.Designer.cs b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Settings.Designer.cs new file mode 100644 index 000000000..58f5a764e --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// 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. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace Tango.PPC.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/PPC/Tango.PPC.Updater/Properties/Settings.settings b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Settings.settings new file mode 100644 index 000000000..033d7a5e9 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Settings.settings @@ -0,0 +1,7 @@ +<?xml version='1.0' encoding='utf-8'?> +<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)"> + <Profiles> + <Profile Name="(Default)" /> + </Profiles> + <Settings /> +</SettingsFile>
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/Tango.PPC.Updater.csproj b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Tango.PPC.Updater.csproj new file mode 100644 index 000000000..41b03e807 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Tango.PPC.Updater.csproj @@ -0,0 +1,102 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{D0E71A4D-9EEA-4F07-983F-EEB4416C587F}</ProjectGuid> + <OutputType>WinExe</OutputType> + <RootNamespace>Tango.PPC.Updater</RootNamespace> + <AssemblyName>Tango.PPC.Updater</AssemblyName> + <TargetFrameworkVersion>v4.6</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> + <WarningLevel>4</WarningLevel> + <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>..\..\Build\Debug\PPC\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>..\..\Build\Release\PPC\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="System" /> + <Reference Include="System.Data" /> + <Reference Include="System.Drawing" /> + <Reference Include="System.Windows.Forms" /> + <Reference Include="System.Xml" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="System.Net.Http" /> + <Reference Include="System.Xaml"> + <RequiredTargetFramework>4.0</RequiredTargetFramework> + </Reference> + <Reference Include="WindowsBase" /> + <Reference Include="PresentationCore" /> + <Reference Include="PresentationFramework" /> + </ItemGroup> + <ItemGroup> + <ApplicationDefinition Include="App.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </ApplicationDefinition> + <Page Include="MainWindow.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </Page> + <Compile Include="App.xaml.cs"> + <DependentUpon>App.xaml</DependentUpon> + <SubType>Code</SubType> + </Compile> + <Compile Include="MainWindow.xaml.cs"> + <DependentUpon>MainWindow.xaml</DependentUpon> + <SubType>Code</SubType> + </Compile> + </ItemGroup> + <ItemGroup> + <Compile Include="Properties\AssemblyInfo.cs"> + <SubType>Code</SubType> + </Compile> + <Compile Include="Properties\Resources.Designer.cs"> + <AutoGen>True</AutoGen> + <DesignTime>True</DesignTime> + <DependentUpon>Resources.resx</DependentUpon> + </Compile> + <Compile Include="Properties\Settings.Designer.cs"> + <AutoGen>True</AutoGen> + <DependentUpon>Settings.settings</DependentUpon> + <DesignTimeSharedInput>True</DesignTimeSharedInput> + </Compile> + <EmbeddedResource Include="Properties\Resources.resx"> + <Generator>ResXFileCodeGenerator</Generator> + <LastGenOutput>Resources.Designer.cs</LastGenOutput> + </EmbeddedResource> + <None Include="Properties\Settings.settings"> + <Generator>SettingsSingleFileGenerator</Generator> + <LastGenOutput>Settings.Designer.cs</LastGenOutput> + </None> + </ItemGroup> + <ItemGroup> + <None Include="App.config" /> + </ItemGroup> + <ItemGroup> + <Resource Include="Images\package.png" /> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> +</Project>
\ No newline at end of file |
