using MediaBrowser.Model.Updates; using System; using System.Deployment.Application; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.ClickOnce { /// /// Class ApplicationUpdateCheck /// public class ApplicationUpdateCheck { /// /// The _task completion source /// private TaskCompletionSource _taskCompletionSource; /// /// The _progress /// private IProgress _progress; /// /// Checks for application update. /// /// The cancellation token. /// The progress. /// Task{CheckForUpdateCompletedEventArgs}. /// Current deployment is not a ClickOnce deployment public Task CheckForApplicationUpdate(CancellationToken cancellationToken, IProgress progress) { if (!ApplicationDeployment.IsNetworkDeployed) { throw new InvalidOperationException("Current deployment is not network deployed."); } _progress = progress; _taskCompletionSource = new TaskCompletionSource(); var deployment = ApplicationDeployment.CurrentDeployment; cancellationToken.Register(deployment.CheckForUpdateAsyncCancel); cancellationToken.ThrowIfCancellationRequested(); deployment.CheckForUpdateCompleted += deployment_CheckForUpdateCompleted; deployment.CheckForUpdateProgressChanged += deployment_CheckForUpdateProgressChanged; deployment.CheckForUpdateAsync(); return _taskCompletionSource.Task; } /// /// To the result. /// /// The instance containing the event data. /// CheckForUpdateResult. private CheckForUpdateResult ToResult(CheckForUpdateCompletedEventArgs args) { return new CheckForUpdateResult { AvailableVersion = args.AvailableVersion, IsUpdateAvailable = args.UpdateAvailable }; } /// /// Handles the CheckForUpdateCompleted event of the deployment control. /// /// The source of the event. /// The instance containing the event data. void deployment_CheckForUpdateCompleted(object sender, CheckForUpdateCompletedEventArgs e) { var deployment = ApplicationDeployment.CurrentDeployment; deployment.CheckForUpdateCompleted -= deployment_CheckForUpdateCompleted; deployment.CheckForUpdateProgressChanged -= deployment_CheckForUpdateProgressChanged; if (e.Error != null) { _taskCompletionSource.SetException(e.Error); } else if (e.Cancelled) { _taskCompletionSource.SetCanceled(); } else { _taskCompletionSource.SetResult(ToResult(e)); } } /// /// Handles the CheckForUpdateProgressChanged event of the deployment control. /// /// The source of the event. /// The instance containing the event data. void deployment_CheckForUpdateProgressChanged(object sender, DeploymentProgressChangedEventArgs e) { _progress.Report(e.ProgressPercentage); } } }