aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2019-02-19 11:19:21 +0200
committerShlomo Hecht <shlomo@twine-s.com>2019-02-19 11:19:21 +0200
commit93e6a6bfa7238826dcdea989e279ec3450067f83 (patch)
tree212b5023935862346a7de311e37cf1ef727efcd5 /Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common
parente99efd9d9b7b67a76db82a9a40525f96bcf064c0 (diff)
parent3fcd0dbc6650749421f0390a60154c52254682e6 (diff)
downloadTango-93e6a6bfa7238826dcdea989e279ec3450067f83.tar.gz
Tango-93e6a6bfa7238826dcdea989e279ec3450067f83.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common')
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/AuthenticationLoginResult.cs1
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/IAuthenticationProvider.cs5
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/MachineStudioSettings.cs8
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Publish/MachineStudioPublisher.cs246
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Publish/PublishOptions.cs87
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Publish/PublishProgressEventArgs.cs16
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Tango.MachineStudio.Common.csproj44
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/IMachineStudioUpdateService.cs24
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/MachineStudioUpdateService.cs51
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UpdateServiceHelper.cs29
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/CheckForUpdatesRequest.cs (renamed from Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesRequest.cs)2
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/CheckForUpdatesResponse.cs (renamed from Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesResponse.cs)2
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/DownloadLatestVersionRequest.cs (renamed from Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/DownloadLatestVersionRequest.cs)2
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/DownloadLatestVersionResponse.cs (renamed from Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/DownloadLatestVersionResponse.cs)2
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/LatestVersionRequest.cs (renamed from Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/LatestVersionRequest.cs)2
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/LatestVersionResponse.cs (renamed from Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/LatestVersionResponse.cs)2
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/LoginRequest.cs (renamed from Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/LoginRequest.cs)2
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/LoginResponse.cs (renamed from Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/LoginResponse.cs)6
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/MachineStudioWebClient.cs33
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/MachineStudioWebClientBase.cs79
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/UploadCompletedRequest.cs (renamed from Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadCompletedRequest.cs)4
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/UploadCompletedResponse.cs (renamed from Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadCompletedResponse.cs)2
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/UploadVersionRequest.cs (renamed from Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadVersionRequest.cs)8
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/UploadVersionResponse.cs (renamed from Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadVersionResponse.cs)2
-rw-r--r--Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/packages.config2
25 files changed, 516 insertions, 145 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/AuthenticationLoginResult.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/AuthenticationLoginResult.cs
index 78f5365a5..dd18d75b2 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/AuthenticationLoginResult.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/AuthenticationLoginResult.cs
@@ -4,6 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.BL.Entities;
+using Tango.MachineStudio.Common.Web;
namespace Tango.MachineStudio.Common.Authentication
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/IAuthenticationProvider.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/IAuthenticationProvider.cs
index 7cc2b5b51..4958cb0f4 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/IAuthenticationProvider.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/IAuthenticationProvider.cs
@@ -13,11 +13,6 @@ namespace Tango.MachineStudio.Common.Authentication
public interface IAuthenticationProvider
{
/// <summary>
- /// Gets the access token that was retrieved at the last login.
- /// </summary>
- String AccessToken { get; }
-
- /// <summary>
/// Occurs when the current logged-in user has changed.
/// </summary>
event EventHandler<User> CurrentUserChanged;
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/MachineStudioSettings.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/MachineStudioSettings.cs
index b8d767c5e..f7c05c1a8 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/MachineStudioSettings.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/MachineStudioSettings.cs
@@ -110,6 +110,14 @@ namespace Tango.MachineStudio.Common
/// <summary>
/// Gets the machine service address.
/// </summary>
+ public String MachineServiceAddress
+ {
+ get { return GetMachineServiceAddress(); }
+ }
+
+ /// <summary>
+ /// Gets the machine service address.
+ /// </summary>
/// <returns></returns>
public String GetMachineServiceAddress()
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Publish/MachineStudioPublisher.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Publish/MachineStudioPublisher.cs
new file mode 100644
index 000000000..dfbe0adc6
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Publish/MachineStudioPublisher.cs
@@ -0,0 +1,246 @@
+using CommandLine;
+using Ionic.Zip;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Core;
+using Tango.Core.Cryptography;
+using Tango.Core.Helpers;
+using Tango.MachineStudio.Common.Web;
+using Tango.Transport.Web;
+using Tango.Web;
+
+namespace Tango.MachineStudio.Common.Publish
+{
+ public class MachineStudioPublisher : ExtendedObject
+ {
+ private MachineStudioWebClient _client;
+
+ /// <summary>
+ /// Occurs on publish progress.
+ /// </summary>
+ public event EventHandler<PublishProgressEventArgs> PublishProgress;
+
+ private PublishOptions _options;
+ /// <summary>
+ /// Gets or sets the publish options.
+ /// </summary>
+ public PublishOptions Options
+ {
+ get { return _options; }
+ set { _options = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MachineStudioPublisher"/> class.
+ /// </summary>
+ public MachineStudioPublisher()
+ {
+ _client = new MachineStudioWebClient();
+ Options = new PublishOptions();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MachineStudioPublisher"/> class.
+ /// </summary>
+ /// <param name="publishOptions">The publish options.</param>
+ public MachineStudioPublisher(PublishOptions publishOptions) : this()
+ {
+ Options = publishOptions;
+ }
+
+ /// <summary>
+ /// Gets the latest version.
+ /// </summary>
+ /// <returns></returns>
+ public async Task<String> GetRemoteVersion()
+ {
+ _client.Environment = Options.Environment;
+ var response = await _client.GetLatestVersion(new LatestVersionRequest());
+ return response.Version;
+ }
+
+ /// <summary>
+ /// Gets the latest version.
+ /// </summary>
+ /// <returns></returns>
+ public async Task<String> GetRemoteVersion(DeploymentSlot environment)
+ {
+ _client.Environment = environment;
+ var response = await _client.GetLatestVersion(new LatestVersionRequest());
+ return response.Version;
+ }
+
+ /// <summary>
+ /// Gets the latest version.
+ /// </summary>
+ /// <returns></returns>
+ public String GetLocalVersion()
+ {
+ return FileVersionInfo.GetVersionInfo(GetMachineStudioExecutablePath()).ProductVersion;
+ }
+
+ /// <summary>
+ /// Gets the machine studio executable path.
+ /// </summary>
+ /// <returns></returns>
+ public String GetMachineStudioExecutablePath()
+ {
+ String appPath = Path.Combine(Options.GetApplicationPath(), "Tango.MachineStudio.UI.exe");
+ return appPath;
+ }
+
+ /// <summary>
+ /// Login to machine service and returns an access token.
+ /// </summary>
+ /// <returns></returns>
+ private Task Login()
+ {
+ return Task.Factory.StartNew(() =>
+ {
+ return _client.Login(new LoginRequest()
+ {
+ Email = Options.Email,
+ Password = Options.Password,
+ Version = GetLocalVersion(),
+ }).Result;
+ });
+ }
+
+ /// <summary>
+ /// Publish a machine studio version using the specified <see cref="Options"/>.
+ /// </summary>
+ /// <returns></returns>
+ public Task Publish()
+ {
+ _client.Environment = Options.Environment;
+
+ String appPath = GetMachineStudioExecutablePath();
+ String folder = Options.GetApplicationPath();
+
+ if (!File.Exists(appPath))
+ {
+ throw new FileNotFoundException($"Could not locate the machine studio executable at {appPath}.");
+ }
+
+ String tempFile = TemporaryManager.CreateFile();
+
+ return Task.Factory.StartNew(() =>
+ {
+ try
+ {
+ OnPublishProgress(0, 100, $"Logging in to machine service at {Options.Environment.ToAddress()}...");
+ Login().Wait();
+
+ OnPublishProgress(0, 100, $"Fetching remote version from {Options.Environment.ToAddress()}...");
+
+ String remote_version = GetRemoteVersion().Result;
+ String local_version = GetLocalVersion();
+
+ OnPublishProgress(0, 100, $"Remote version: {remote_version}");
+ OnPublishProgress(0, 100, $"Local version: {local_version}");
+
+ if (Version.Parse(local_version) <= Version.Parse(remote_version))
+ {
+ throw new InvalidOperationException($"The local version '{local_version}' is not greater than the remote version '{remote_version}'.");
+ }
+
+ OnPublishProgress(0, 100, $"Requesting version upload...");
+
+ var response = _client.UploadVersion(new UploadVersionRequest()
+ {
+ Version = local_version,
+ Comments = Options.Comments,
+ }).Result;
+
+ OnPublishProgress(0, 100, $"Starting version packaging...");
+
+ using (ZipFile zip = new ZipFile())
+ {
+ zip.AddDirectory(Path.Combine(folder, "x86"), "/x86");
+ zip.AddDirectory(Path.Combine(folder, "x64"), "/x64");
+
+ var files = Directory.GetFiles(folder, "*.*", SearchOption.TopDirectoryOnly).ToList();
+
+ foreach (var file in files)
+ {
+ zip.AddFile(file, "/");
+ }
+
+ zip.SaveProgress += (x, e) =>
+ {
+ if (e.EventType == ZipProgressEventType.Saving_BeforeWriteEntry)
+ {
+ OnPublishProgress(e.EntriesSaved + 1, e.EntriesTotal, $"Compressing files {(((double)(e.EntriesSaved + 1) / (double)e.EntriesTotal) * 100d).ToString("0.0")}%...", true);
+ }
+ };
+
+ zip.Save(tempFile);
+ }
+
+ OnPublishProgress(0, 100, $"Starting version upload...");
+
+ using (StorageBlobUploader uploader = new StorageBlobUploader(response.BlobAddress, tempFile))
+ {
+ uploader.Progress += (x, e) =>
+ {
+ OnPublishProgress(e.Current, e.Total, $"Uploading to storage {(((double)e.Current / (double)e.Total) * 100d).ToString("0.0")}%...", true);
+ };
+
+ uploader.Upload().Wait();
+ }
+
+ OnPublishProgress(100, 100, $"Finalizing version upload...");
+
+ _client.NotifyUploadCompleted(new UploadCompletedRequest()
+ {
+ Token = response.Token,
+ }).Wait();
+
+ remote_version = GetRemoteVersion().Result;
+ local_version = GetLocalVersion();
+
+ OnPublishProgress(0, 0, $"Remote version: {remote_version}");
+ OnPublishProgress(0, 0, $"Local version: {local_version}");
+
+ if (remote_version != local_version)
+ {
+ throw new InvalidOperationException("The remote version does not seems to have been updated.");
+ }
+
+ OnPublishProgress(0, 0, "Version published successfully.");
+ }
+ catch (Exception ex)
+ {
+ OnPublishProgress(0, 100, $"Failed: {ex.Message}");
+ throw ex;
+ }
+ finally
+ {
+ PathHelper.TryDeleteFile(tempFile);
+ }
+ });
+ }
+
+ /// <summary>
+ /// Raises the publish progress event.
+ /// </summary>
+ /// <param name="progress">The progress.</param>
+ /// <param name="total">The total.</param>
+ /// <param name="message">The message.</param>
+ protected virtual void OnPublishProgress(double progress, double total, String message, bool singleLine = false)
+ {
+ PublishProgress?.Invoke(this, new PublishProgressEventArgs()
+ {
+ Progress = progress,
+ Total = total,
+ Message = message,
+ SingleLineRecommended = singleLine,
+ });
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Publish/PublishOptions.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Publish/PublishOptions.cs
new file mode 100644
index 000000000..047d7c0b4
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Publish/PublishOptions.cs
@@ -0,0 +1,87 @@
+using CommandLine;
+using CommandLine.Text;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Core;
+using Tango.Web;
+
+namespace Tango.MachineStudio.Common.Publish
+{
+ public class PublishOptions : ExtendedObject
+ {
+ public event EventHandler EnvironmentChanged;
+ public event EventHandler BuidConfigChanged;
+ public event EventHandler BasicInfoChanged;
+
+ private String basePath;
+ [Option("path", HelpText = "Specifies the application base path.", Required = false)]
+ public String BasePath
+ {
+ get { return basePath; }
+ set { basePath = value; RaisePropertyChangedAuto(); }
+ }
+
+ private String _buildConfig;
+ [Option("build", HelpText = "Specifies the build configuration.", Required = false, DefaultValue = "Release")]
+ public String BuildConfig
+ {
+ get { return _buildConfig; }
+ set { _buildConfig = value; RaisePropertyChangedAuto(); BuidConfigChanged?.Invoke(this, new EventArgs()); }
+ }
+
+ private String _email;
+ [Option("email", HelpText = "Email account used for login to the machine service.", Required = true)]
+ public String Email
+ {
+ get { return _email; }
+ set { _email = value; RaisePropertyChangedAuto(); BasicInfoChanged?.Invoke(this, new EventArgs()); }
+ }
+
+ private String _password;
+ [Option("pass", HelpText = "Password used for login to the machine service.", Required = true)]
+ public String Password
+ {
+ get { return _password; }
+ set { _password = value; RaisePropertyChangedAuto(); BasicInfoChanged?.Invoke(this, new EventArgs()); }
+ }
+
+ private String _comments;
+ [Option("comments", HelpText = "Optional comments that are attached to this release.", Required = false, DefaultValue = "No comments.")]
+ public String Comments
+ {
+ get { return _comments; }
+ set { _comments = value; RaisePropertyChangedAuto(); BasicInfoChanged?.Invoke(this, new EventArgs()); }
+ }
+
+ private DeploymentSlot _environment;
+ [Option("env", HelpText = "Specifies the target environment to publish.", Required = true)]
+ public DeploymentSlot Environment
+ {
+ get { return _environment; }
+ set { _environment = value; RaisePropertyChangedAuto(); EnvironmentChanged?.Invoke(this, new EventArgs()); }
+ }
+
+ private String _installerProject;
+ [Option("installer-project-file", HelpText = "Specifies the advanced installer project file to build and upload.", Required = false)]
+ public String InstallerProject
+ {
+ get { return _installerProject; }
+ set { _installerProject = value; RaisePropertyChangedAuto(); }
+ }
+
+ public PublishOptions()
+ {
+ BasePath = AppDomain.CurrentDomain.BaseDirectory + "..\\";
+ BuildConfig = "Release";
+ }
+
+ public String GetApplicationPath()
+ {
+ return Path.Combine(BasePath, BuildConfig);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Publish/PublishProgressEventArgs.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Publish/PublishProgressEventArgs.cs
new file mode 100644
index 000000000..ff550b9de
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Publish/PublishProgressEventArgs.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.MachineStudio.Common.Publish
+{
+ public class PublishProgressEventArgs : EventArgs
+ {
+ public double Progress { get; set; }
+ public double Total { get; set; }
+ public String Message { get; set; }
+ public bool SingleLineRecommended { get; set; }
+ }
+}
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 aff4c056c..48c78e865 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
@@ -31,6 +31,9 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
+ <Reference Include="CommandLine, Version=1.9.71.2, Culture=neutral, PublicKeyToken=de6f01bd326f8c32, processorArchitecture=MSIL">
+ <HintPath>..\..\packages\CommandLineParser.1.9.71\lib\net45\CommandLine.dll</HintPath>
+ </Reference>
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll</HintPath>
</Reference>
@@ -40,6 +43,9 @@
<Reference Include="Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
<HintPath>..\..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
+ <Reference Include="Ionic.Zip, Version=1.9.1.8, Culture=neutral, PublicKeyToken=edbe51ad942a3f5c, processorArchitecture=MSIL">
+ <HintPath>..\..\packages\Ionic.Zip.1.9.1.8\lib\Ionic.Zip.dll</HintPath>
+ </Reference>
<Reference Include="MahApps.Metro, Version=1.5.0.23, Culture=neutral, PublicKeyToken=f4fb5a3c4d1e5b4f, processorArchitecture=MSIL">
<HintPath>..\..\packages\MahApps.Metro.1.5.0\lib\net45\MahApps.Metro.dll</HintPath>
</Reference>
@@ -49,6 +55,8 @@
<Reference Include="MaterialDesignThemes.Wpf, Version=2.3.1.953, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\MaterialDesignThemes.2.3.1.953\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
</Reference>
+ <Reference Include="Microsoft.SqlServer.AzureStorageEnum, Version=14.100.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL" />
+ <Reference Include="Microsoft.WindowsAzure.Storage, Version=4.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
<Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Data" />
@@ -76,8 +84,8 @@
<Link>GlobalVersionInfo.cs</Link>
</Compile>
<Compile Include="Authentication\AuthenticationLoginResult.cs" />
- <Compile Include="Authentication\LoginRequest.cs" />
- <Compile Include="Authentication\LoginResponse.cs" />
+ <Compile Include="Web\LoginRequest.cs" />
+ <Compile Include="Web\LoginResponse.cs" />
<Compile Include="AutoComplete\MachinesProvider.cs" />
<Compile Include="Automation\Developer.cs" />
<Compile Include="Automation\UI.cs" />
@@ -110,6 +118,9 @@
<Compile Include="Navigation\INavigationObjectReceiver.cs" />
<Compile Include="Navigation\INavigationResultProvider.cs" />
<Compile Include="Notifications\BarItem.cs" />
+ <Compile Include="Publish\MachineStudioPublisher.cs" />
+ <Compile Include="Publish\PublishOptions.cs" />
+ <Compile Include="Publish\PublishProgressEventArgs.cs" />
<Compile Include="Speech\DefaultSpeechProvider.cs" />
<Compile Include="Speech\ISpeechProvider.cs" />
<Compile Include="StudioApplication\IStudioApplicationManager.cs" />
@@ -119,19 +130,18 @@
<Compile Include="StudioModuleBase.cs" />
<Compile Include="StudioViewModel.cs" />
<Compile Include="Threading\IDispatcherProvider.cs" />
- <Compile Include="Update\DownloadLatestVersionResponse.cs" />
- <Compile Include="Update\DownloadLatestVersionRequest.cs" />
- <Compile Include="Update\CheckForUpdatesResponse.cs" />
- <Compile Include="Update\CheckForUpdatesRequest.cs" />
- <Compile Include="Update\IMachineStudioUpdateService.cs" />
- <Compile Include="Update\LatestVersionRequest.cs" />
- <Compile Include="Update\LatestVersionResponse.cs" />
- <Compile Include="Update\MachineStudioUpdateService.cs" />
- <None Include="Update\UpdateServiceHelper.cs" />
- <Compile Include="Update\UploadCompletedRequest.cs" />
- <Compile Include="Update\UploadCompletedResponse.cs" />
- <Compile Include="Update\UploadVersionRequest.cs" />
- <Compile Include="Update\UploadVersionResponse.cs" />
+ <Compile Include="Web\DownloadLatestVersionResponse.cs" />
+ <Compile Include="Web\DownloadLatestVersionRequest.cs" />
+ <Compile Include="Web\CheckForUpdatesResponse.cs" />
+ <Compile Include="Web\CheckForUpdatesRequest.cs" />
+ <Compile Include="Web\LatestVersionRequest.cs" />
+ <Compile Include="Web\LatestVersionResponse.cs" />
+ <Compile Include="Web\MachineStudioWebClient.cs" />
+ <Compile Include="Web\MachineStudioWebClientBase.cs" />
+ <Compile Include="Web\UploadCompletedRequest.cs" />
+ <Compile Include="Web\UploadCompletedResponse.cs" />
+ <Compile Include="Web\UploadVersionRequest.cs" />
+ <Compile Include="Web\UploadVersionResponse.cs" />
<Compile Include="ValidationRules\Required.cs" />
<Compile Include="Video\DefaultVideoCaptureProvider.cs" />
<Compile Include="Video\IVideoCaptureProvider.cs" />
@@ -195,7 +205,9 @@
</EmbeddedResource>
<None Include="app.config" />
<Resource Include="Fonts\digital-7.ttf" />
- <None Include="packages.config" />
+ <None Include="packages.config">
+ <SubType>Designer</SubType>
+ </None>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/IMachineStudioUpdateService.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/IMachineStudioUpdateService.cs
deleted file mode 100644
index f9462009a..000000000
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/IMachineStudioUpdateService.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Runtime.Serialization;
-using System.ServiceModel;
-using System.Text;
-using System.Threading.Tasks;
-using Tango.MachineStudio.Common.Update;
-
-namespace Tango.MachineStudio.Common.Update
-{
- public interface IMachineStudioUpdateService
- {
- Task<CheckForUpdatesResponse> CheckForUpdates(CheckForUpdatesRequest request);
-
- Task<DownloadLatestVersionResponse> DownloadLatestVersion(DownloadLatestVersionRequest request);
-
- Task<UploadVersionResponse> UploadVersion(UploadVersionRequest request);
-
- Task<UploadCompletedResponse> NotifyUploadCompleted(UploadCompletedRequest request);
-
- Task<LatestVersionResponse> GetLatestVersion(LatestVersionRequest request);
- }
-}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/MachineStudioUpdateService.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/MachineStudioUpdateService.cs
deleted file mode 100644
index 79dd2ec96..000000000
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/MachineStudioUpdateService.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Tango.Settings;
-using Tango.Transport.Web;
-
-namespace Tango.MachineStudio.Common.Update
-{
- public class MachineStudioUpdateService : IMachineStudioUpdateService
- {
- private WebTransportClient _client;
-
- public MachineStudioUpdateService()
- {
-
- _client = new WebTransportClient();
- }
-
- public Task<CheckForUpdatesResponse> CheckForUpdates(CheckForUpdatesRequest request)
- {
- return _client.PostJson<CheckForUpdatesRequest, CheckForUpdatesResponse>(GetAddress() + "CheckForUpdates", request);
- }
-
- public Task<UploadVersionResponse> UploadVersion(UploadVersionRequest request)
- {
- return _client.PostJson<UploadVersionRequest, UploadVersionResponse>(GetAddress() + "UploadVersion", request);
- }
-
- public Task<UploadCompletedResponse> NotifyUploadCompleted(UploadCompletedRequest request)
- {
- return _client.PostJson<UploadCompletedRequest, UploadCompletedResponse>(GetAddress() + "NotifyUploadCompleted", request);
- }
-
- public Task<LatestVersionResponse> GetLatestVersion(LatestVersionRequest request)
- {
- return _client.PostJson<LatestVersionRequest, LatestVersionResponse>(GetAddress() + "GetLatestVersion", request);
- }
-
- private String GetAddress()
- {
- return SettingsManager.Default.GetOrCreate<MachineStudioSettings>().GetMachineServiceAddress() + "/api/MachineStudio/";
- }
-
- public Task<DownloadLatestVersionResponse> DownloadLatestVersion(DownloadLatestVersionRequest request)
- {
- return _client.PostJson<DownloadLatestVersionRequest, DownloadLatestVersionResponse>(GetAddress() + "DownloadLatestVersion", 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
deleted file mode 100644
index 067e4470d..000000000
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UpdateServiceHelper.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-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<IMachineStudioUpdateService> GetUpdateServiceChannel()
- {
- BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None);
- binding.ReceiveTimeout = TimeSpan.FromSeconds(60);
- binding.SendTimeout = TimeSpan.FromSeconds(60);
- 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<IMachineStudioUpdateService>(binding, SettingsManager.Default.GetOrCreate<MachineStudioSettings>().UpdateServiceAddress);
- }
- }
-}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesRequest.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/CheckForUpdatesRequest.cs
index e31a7f59e..4f9576f50 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesRequest.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/CheckForUpdatesRequest.cs
@@ -6,7 +6,7 @@ using System.Text;
using System.Threading.Tasks;
using Tango.Transport.Web;
-namespace Tango.MachineStudio.Common.Update
+namespace Tango.MachineStudio.Common.Web
{
public class CheckForUpdatesRequest : WebRequestSecureMessage
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesResponse.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/CheckForUpdatesResponse.cs
index 450236f79..51608e6c4 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/CheckForUpdatesResponse.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/CheckForUpdatesResponse.cs
@@ -6,7 +6,7 @@ using System.Text;
using System.Threading.Tasks;
using Tango.Transport.Web;
-namespace Tango.MachineStudio.Common.Update
+namespace Tango.MachineStudio.Common.Web
{
public class CheckForUpdatesResponse : WebResponseMessage
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/DownloadLatestVersionRequest.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/DownloadLatestVersionRequest.cs
index 98aa9f1a4..d63654726 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/DownloadLatestVersionRequest.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/DownloadLatestVersionRequest.cs
@@ -5,7 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using Tango.Transport.Web;
-namespace Tango.MachineStudio.Common.Update
+namespace Tango.MachineStudio.Common.Web
{
public class DownloadLatestVersionRequest : WebRequestSecureMessage
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/DownloadLatestVersionResponse.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/DownloadLatestVersionResponse.cs
index f85999f3d..3209b9a2f 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/DownloadLatestVersionResponse.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/DownloadLatestVersionResponse.cs
@@ -5,7 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using Tango.Transport.Web;
-namespace Tango.MachineStudio.Common.Update
+namespace Tango.MachineStudio.Common.Web
{
public class DownloadLatestVersionResponse : WebResponseMessage
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/LatestVersionRequest.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/LatestVersionRequest.cs
index b4e7bd975..59bb71db4 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/LatestVersionRequest.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/LatestVersionRequest.cs
@@ -6,7 +6,7 @@ using System.Text;
using System.Threading.Tasks;
using Tango.Transport.Web;
-namespace Tango.MachineStudio.Common.Update
+namespace Tango.MachineStudio.Common.Web
{
public class LatestVersionRequest : WebRequestMessage
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/LatestVersionResponse.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/LatestVersionResponse.cs
index b90cbf370..7d43128f1 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/LatestVersionResponse.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/LatestVersionResponse.cs
@@ -6,7 +6,7 @@ using System.Text;
using System.Threading.Tasks;
using Tango.Transport.Web;
-namespace Tango.MachineStudio.Common.Update
+namespace Tango.MachineStudio.Common.Web
{
public class LatestVersionResponse : WebResponseMessage
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/LoginRequest.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/LoginRequest.cs
index 94fe7f5e2..577f5e208 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/LoginRequest.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/LoginRequest.cs
@@ -5,7 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using Tango.Transport.Web;
-namespace Tango.MachineStudio.Common.Authentication
+namespace Tango.MachineStudio.Common.Web
{
public class LoginRequest : WebRequestMessage
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/LoginResponse.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/LoginResponse.cs
index e1d9c615a..78c7bc560 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Authentication/LoginResponse.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/LoginResponse.cs
@@ -5,13 +5,13 @@ using System.Text;
using System.Threading.Tasks;
using Tango.Core;
using Tango.Transport.Web;
+using Tango.Web.Authentication;
-namespace Tango.MachineStudio.Common.Authentication
+namespace Tango.MachineStudio.Common.Web
{
- public class LoginResponse : WebResponseMessage
+ public class LoginResponse : WebTokenResponse
{
public DataSource DataSource { get; set; }
- public String Token { get; set; }
public bool VersionChangeRequired { get; set; }
public String RequiredVersion { get; set; }
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/MachineStudioWebClient.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/MachineStudioWebClient.cs
new file mode 100644
index 000000000..02276d641
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/MachineStudioWebClient.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Settings;
+using Tango.Web;
+using Tango.Web.Authentication;
+
+namespace Tango.MachineStudio.Common.Web
+{
+ public class MachineStudioWebClient : MachineStudioWebClientBase
+ {
+ public MachineStudioWebClient(DeploymentSlot environment) : base(environment)
+ {
+ }
+
+ public MachineStudioWebClient(DeploymentSlot environment, WebToken token) : base(environment, token)
+ {
+
+ }
+
+ public MachineStudioWebClient(WebToken token) : this(SettingsManager.Default.GetOrCreate<MachineStudioSettings>().DeploymentSlot, token)
+ {
+
+ }
+
+ public MachineStudioWebClient() : this(null)
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/MachineStudioWebClientBase.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/MachineStudioWebClientBase.cs
new file mode 100644
index 000000000..dc5a14856
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/MachineStudioWebClientBase.cs
@@ -0,0 +1,79 @@
+
+using System.Threading.Tasks;
+using Tango.Web;
+using Tango.Web.Authentication;
+
+namespace Tango.MachineStudio.Common.Web
+{
+ /// <summary>
+ /// Represents a machine service MachineStudio web client.
+ /// </summary>
+ /// <seealso cref="Tango.Web.TangoWebClient" />
+ public abstract class MachineStudioWebClientBase : TangoWebClient<Tango.MachineStudio.Common.Web.LoginRequest, Tango.MachineStudio.Common.Web.LoginResponse>
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MachineStudioWebClientBase"/> class.
+ /// </summary>
+ /// <param name="environment">The environment.</param>
+ /// <param name="token">Existing token.</param>
+ public MachineStudioWebClientBase(DeploymentSlot environment, WebToken token) : base(environment, "MachineStudio", token)
+ {
+
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="MachineStudioWebClientBase"/> class.
+ /// </summary>
+ /// <param name="environment">The environment.</param>
+ public MachineStudioWebClientBase(DeploymentSlot environment) : this(environment, null)
+ {
+
+ }
+
+ /// <summary>
+ /// Executes the CheckForUpdates action and returns Tango.MachineStudio.Common.Web.CheckForUpdatesResponse.
+ /// </summary>
+ /// <returns></returns>
+ public Task<Tango.MachineStudio.Common.Web.CheckForUpdatesResponse> CheckForUpdates(Tango.MachineStudio.Common.Web.CheckForUpdatesRequest request)
+ {
+ return Post<Tango.MachineStudio.Common.Web.CheckForUpdatesRequest, Tango.MachineStudio.Common.Web.CheckForUpdatesResponse>("CheckForUpdates", request);
+ }
+
+ /// <summary>
+ /// Executes the DownloadLatestVersion action and returns Tango.MachineStudio.Common.Web.DownloadLatestVersionResponse.
+ /// </summary>
+ /// <returns></returns>
+ public Task<Tango.MachineStudio.Common.Web.DownloadLatestVersionResponse> DownloadLatestVersion(Tango.MachineStudio.Common.Web.DownloadLatestVersionRequest request)
+ {
+ return Post<Tango.MachineStudio.Common.Web.DownloadLatestVersionRequest, Tango.MachineStudio.Common.Web.DownloadLatestVersionResponse>("DownloadLatestVersion", request);
+ }
+
+ /// <summary>
+ /// Executes the UploadVersion action and returns Tango.MachineStudio.Common.Web.UploadVersionResponse.
+ /// </summary>
+ /// <returns></returns>
+ public Task<Tango.MachineStudio.Common.Web.UploadVersionResponse> UploadVersion(Tango.MachineStudio.Common.Web.UploadVersionRequest request)
+ {
+ return Post<Tango.MachineStudio.Common.Web.UploadVersionRequest, Tango.MachineStudio.Common.Web.UploadVersionResponse>("UploadVersion", request);
+ }
+
+ /// <summary>
+ /// Executes the NotifyUploadCompleted action and returns Tango.MachineStudio.Common.Web.UploadCompletedResponse.
+ /// </summary>
+ /// <returns></returns>
+ public Task<Tango.MachineStudio.Common.Web.UploadCompletedResponse> NotifyUploadCompleted(Tango.MachineStudio.Common.Web.UploadCompletedRequest request)
+ {
+ return Post<Tango.MachineStudio.Common.Web.UploadCompletedRequest, Tango.MachineStudio.Common.Web.UploadCompletedResponse>("NotifyUploadCompleted", request);
+ }
+
+ /// <summary>
+ /// Executes the GetLatestVersion action and returns Tango.MachineStudio.Common.Web.LatestVersionResponse.
+ /// </summary>
+ /// <returns></returns>
+ public Task<Tango.MachineStudio.Common.Web.LatestVersionResponse> GetLatestVersion(Tango.MachineStudio.Common.Web.LatestVersionRequest request)
+ {
+ return Post<Tango.MachineStudio.Common.Web.LatestVersionRequest, Tango.MachineStudio.Common.Web.LatestVersionResponse>("GetLatestVersion", request);
+ }
+
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadCompletedRequest.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/UploadCompletedRequest.cs
index d23d57351..48f5b2a6e 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadCompletedRequest.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/UploadCompletedRequest.cs
@@ -6,10 +6,10 @@ using System.Text;
using System.Threading.Tasks;
using Tango.Transport.Web;
-namespace Tango.MachineStudio.Common.Update
+namespace Tango.MachineStudio.Common.Web
{
public class UploadCompletedRequest : WebRequestSecureMessage
{
-
+ public String Token { get; set; }
}
}
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadCompletedResponse.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/UploadCompletedResponse.cs
index 89850e3e5..a290cf642 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadCompletedResponse.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/UploadCompletedResponse.cs
@@ -5,7 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using Tango.Transport.Web;
-namespace Tango.MachineStudio.Common.Update
+namespace Tango.MachineStudio.Common.Web
{
public class UploadCompletedResponse : WebResponseMessage
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadVersionRequest.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/UploadVersionRequest.cs
index fedb586ba..33577deb2 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadVersionRequest.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/UploadVersionRequest.cs
@@ -6,14 +6,10 @@ using System.Text;
using System.Threading.Tasks;
using Tango.Transport.Web;
-namespace Tango.MachineStudio.Common.Update
+namespace Tango.MachineStudio.Common.Web
{
- public class UploadVersionRequest : WebRequestMessage
+ public class UploadVersionRequest : WebRequestSecureMessage
{
- public String Email { get; set; }
-
- public String Password { get; set; }
-
public String Version { get; set; }
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/Web/UploadVersionResponse.cs
index 4d13fc6ad..9fb3ab94d 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Update/UploadVersionResponse.cs
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/Web/UploadVersionResponse.cs
@@ -6,7 +6,7 @@ using System.Text;
using System.Threading.Tasks;
using Tango.Transport.Web;
-namespace Tango.MachineStudio.Common.Update
+namespace Tango.MachineStudio.Common.Web
{
public class UploadVersionResponse : WebResponseMessage
{
diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/packages.config b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/packages.config
index a0c68600c..f871776f5 100644
--- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/packages.config
+++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Common/packages.config
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
+ <package id="CommandLineParser" version="1.9.71" targetFramework="net461" />
<package id="CommonServiceLocator" version="1.3" targetFramework="net46" />
<package id="EntityFramework" version="6.2.0" targetFramework="net461" />
<package id="Expression.Blend.Sdk" version="1.0.2" targetFramework="net46" />
<package id="Google.Protobuf" version="3.4.1" targetFramework="net46" />
+ <package id="Ionic.Zip" version="1.9.1.8" targetFramework="net461" />
<package id="MahApps.Metro" version="1.5.0" targetFramework="net46" />
<package id="MaterialDesignColors" version="1.1.2" targetFramework="net46" />
<package id="MaterialDesignThemes" version="2.3.1.953" targetFramework="net46" />