ScheduledTaskHelpers.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. using MediaBrowser.Model.Tasks;
  2. using System;
  3. using System.Linq;
  4. namespace MediaBrowser.Common.ScheduledTasks
  5. {
  6. /// <summary>
  7. /// Class ScheduledTaskHelpers
  8. /// </summary>
  9. public static class ScheduledTaskHelpers
  10. {
  11. /// <summary>
  12. /// Gets the task info.
  13. /// </summary>
  14. /// <param name="task">The task.</param>
  15. /// <returns>TaskInfo.</returns>
  16. public static TaskInfo GetTaskInfo(IScheduledTaskWorker task)
  17. {
  18. var isHidden = false;
  19. var configurableTask = task.ScheduledTask as IConfigurableScheduledTask;
  20. if (configurableTask != null)
  21. {
  22. isHidden = configurableTask.IsHidden;
  23. }
  24. string key = null;
  25. var hasKey = task.ScheduledTask as IHasKey;
  26. if (hasKey != null)
  27. {
  28. key = hasKey.Key;
  29. }
  30. var triggers = task.Triggers
  31. .Select(GetTriggerInfo)
  32. .OrderBy(i => i.Type)
  33. .ThenBy(i => i.DayOfWeek ?? DayOfWeek.Sunday)
  34. .ThenBy(i => i.TimeOfDayTicks ?? 0)
  35. .ToList();
  36. return new TaskInfo
  37. {
  38. Name = task.Name,
  39. CurrentProgressPercentage = task.CurrentProgress,
  40. State = task.State,
  41. Id = task.Id,
  42. LastExecutionResult = task.LastExecutionResult,
  43. Triggers = triggers,
  44. Description = task.Description,
  45. Category = task.Category,
  46. IsHidden = isHidden,
  47. Key = key
  48. };
  49. }
  50. /// <summary>
  51. /// Gets the trigger info.
  52. /// </summary>
  53. /// <param name="trigger">The trigger.</param>
  54. /// <returns>TaskTriggerInfo.</returns>
  55. public static TaskTriggerInfo GetTriggerInfo(ITaskTrigger trigger)
  56. {
  57. var info = new TaskTriggerInfo
  58. {
  59. Type = trigger.GetType().Name
  60. };
  61. var dailyTrigger = trigger as DailyTrigger;
  62. if (dailyTrigger != null)
  63. {
  64. info.TimeOfDayTicks = dailyTrigger.TimeOfDay.Ticks;
  65. }
  66. var weeklyTaskTrigger = trigger as WeeklyTrigger;
  67. if (weeklyTaskTrigger != null)
  68. {
  69. info.TimeOfDayTicks = weeklyTaskTrigger.TimeOfDay.Ticks;
  70. info.DayOfWeek = weeklyTaskTrigger.DayOfWeek;
  71. }
  72. var intervalTaskTrigger = trigger as IntervalTrigger;
  73. if (intervalTaskTrigger != null)
  74. {
  75. info.IntervalTicks = intervalTaskTrigger.Interval.Ticks;
  76. }
  77. var systemEventTrigger = trigger as SystemEventTrigger;
  78. if (systemEventTrigger != null)
  79. {
  80. info.SystemEvent = systemEventTrigger.SystemEvent;
  81. }
  82. if (trigger.TaskOptions != null)
  83. {
  84. info.MaxRuntimeMs = trigger.TaskOptions.MaxRuntimeMs;
  85. }
  86. return info;
  87. }
  88. /// <summary>
  89. /// Converts a TaskTriggerInfo into a concrete BaseTaskTrigger
  90. /// </summary>
  91. /// <param name="info">The info.</param>
  92. /// <returns>BaseTaskTrigger.</returns>
  93. /// <exception cref="System.ArgumentNullException"></exception>
  94. /// <exception cref="System.ArgumentException">Invalid trigger type: + info.Type</exception>
  95. public static ITaskTrigger GetTrigger(TaskTriggerInfo info)
  96. {
  97. var options = new TaskExecutionOptions
  98. {
  99. MaxRuntimeMs = info.MaxRuntimeMs
  100. };
  101. if (info.Type.Equals(typeof(DailyTrigger).Name, StringComparison.OrdinalIgnoreCase))
  102. {
  103. if (!info.TimeOfDayTicks.HasValue)
  104. {
  105. throw new ArgumentNullException();
  106. }
  107. return new DailyTrigger
  108. {
  109. TimeOfDay = TimeSpan.FromTicks(info.TimeOfDayTicks.Value),
  110. TaskOptions = options
  111. };
  112. }
  113. if (info.Type.Equals(typeof(WeeklyTrigger).Name, StringComparison.OrdinalIgnoreCase))
  114. {
  115. if (!info.TimeOfDayTicks.HasValue)
  116. {
  117. throw new ArgumentNullException();
  118. }
  119. if (!info.DayOfWeek.HasValue)
  120. {
  121. throw new ArgumentNullException();
  122. }
  123. return new WeeklyTrigger
  124. {
  125. TimeOfDay = TimeSpan.FromTicks(info.TimeOfDayTicks.Value),
  126. DayOfWeek = info.DayOfWeek.Value,
  127. TaskOptions = options
  128. };
  129. }
  130. if (info.Type.Equals(typeof(IntervalTrigger).Name, StringComparison.OrdinalIgnoreCase))
  131. {
  132. if (!info.IntervalTicks.HasValue)
  133. {
  134. throw new ArgumentNullException();
  135. }
  136. return new IntervalTrigger
  137. {
  138. Interval = TimeSpan.FromTicks(info.IntervalTicks.Value),
  139. TaskOptions = options
  140. };
  141. }
  142. if (info.Type.Equals(typeof(SystemEventTrigger).Name, StringComparison.OrdinalIgnoreCase))
  143. {
  144. if (!info.SystemEvent.HasValue)
  145. {
  146. throw new ArgumentNullException();
  147. }
  148. return new SystemEventTrigger
  149. {
  150. SystemEvent = info.SystemEvent.Value,
  151. TaskOptions = options
  152. };
  153. }
  154. if (info.Type.Equals(typeof(StartupTrigger).Name, StringComparison.OrdinalIgnoreCase))
  155. {
  156. return new StartupTrigger();
  157. }
  158. throw new ArgumentException("Unrecognized trigger type: " + info.Type);
  159. }
  160. }
  161. }