SystemUpdateTask.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using MediaBrowser.Common.Kernel;
  2. using MediaBrowser.Common.Logging;
  3. using MediaBrowser.Common.Updates;
  4. using MediaBrowser.Model.Tasks;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.ComponentModel.Composition;
  8. using System.Deployment.Application;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. namespace MediaBrowser.Common.ScheduledTasks.Tasks
  12. {
  13. /// <summary>
  14. /// Plugin Update Task
  15. /// </summary>
  16. [Export(typeof(IScheduledTask))]
  17. public class SystemUpdateTask : BaseScheduledTask<IKernel>
  18. {
  19. /// <summary>
  20. /// Creates the triggers that define when the task will run
  21. /// </summary>
  22. /// <returns>IEnumerable{BaseTaskTrigger}.</returns>
  23. protected override IEnumerable<BaseTaskTrigger> GetDefaultTriggers()
  24. {
  25. return new BaseTaskTrigger[] {
  26. // 1am
  27. new DailyTrigger { TimeOfDay = TimeSpan.FromHours(1) },
  28. new IntervalTrigger { Interval = TimeSpan.FromHours(2)}
  29. };
  30. }
  31. /// <summary>
  32. /// Returns the task to be executed
  33. /// </summary>
  34. /// <param name="cancellationToken">The cancellation token.</param>
  35. /// <param name="progress">The progress.</param>
  36. /// <returns>Task.</returns>
  37. protected override async Task ExecuteInternal(CancellationToken cancellationToken, IProgress<TaskProgress> progress)
  38. {
  39. if (!ApplicationDeployment.IsNetworkDeployed) return;
  40. EventHandler<TaskProgress> innerProgressHandler = (sender, e) => progress.Report(new TaskProgress { PercentComplete = e.PercentComplete * .1 });
  41. // Create a progress object for the update check
  42. var innerProgress = new Progress<TaskProgress>();
  43. innerProgress.ProgressChanged += innerProgressHandler;
  44. var updateInfo = await new ApplicationUpdateCheck().CheckForApplicationUpdate(cancellationToken, innerProgress).ConfigureAwait(false);
  45. // Release the event handler
  46. innerProgress.ProgressChanged -= innerProgressHandler;
  47. progress.Report(new TaskProgress { PercentComplete = 10 });
  48. if (!updateInfo.UpdateAvailable)
  49. {
  50. progress.Report(new TaskProgress { PercentComplete = 100 });
  51. return;
  52. }
  53. cancellationToken.ThrowIfCancellationRequested();
  54. if (Kernel.Configuration.EnableAutoUpdate)
  55. {
  56. Logger.Info("Update Revision {0} available. Updating...", updateInfo.AvailableVersion);
  57. innerProgressHandler = (sender, e) => progress.Report(new TaskProgress { PercentComplete = (e.PercentComplete * .9) + .1 });
  58. innerProgress = new Progress<TaskProgress>();
  59. innerProgress.ProgressChanged += innerProgressHandler;
  60. await new ApplicationUpdater().UpdateApplication(cancellationToken, innerProgress).ConfigureAwait(false);
  61. // Release the event handler
  62. innerProgress.ProgressChanged -= innerProgressHandler;
  63. Kernel.OnApplicationUpdated(updateInfo.AvailableVersion);
  64. }
  65. else
  66. {
  67. Logger.Info("A new version of Media Browser is available.");
  68. }
  69. progress.Report(new TaskProgress { PercentComplete = 100 });
  70. }
  71. /// <summary>
  72. /// Gets the name of the task
  73. /// </summary>
  74. /// <value>The name.</value>
  75. public override string Name
  76. {
  77. get { return "Check for application updates"; }
  78. }
  79. /// <summary>
  80. /// Gets the description.
  81. /// </summary>
  82. /// <value>The description.</value>
  83. public override string Description
  84. {
  85. get { return "Downloads and installs application updates."; }
  86. }
  87. }
  88. }