public void Dev2MonthlyDOWTrigger_Construct_Test() { var native = new MonthlyDOWTrigger(DaysOfTheWeek.Monday,MonthsOfTheYear.August); Dev2MonthlyDowTrigger wrapped = new Dev2MonthlyDowTrigger(_taskServiceConvertorFactory.Object, native); Assert.AreEqual(native, wrapped.Instance); Assert.AreEqual(native.DaysOfWeek, wrapped.DaysOfWeek); Assert.AreEqual(native.Enabled, wrapped.Enabled); Assert.AreEqual(native.EndBoundary, wrapped.EndBoundary); Assert.AreEqual(native.ExecutionTimeLimit, wrapped.ExecutionTimeLimit); Assert.AreEqual(native.MonthsOfYear, wrapped.MonthsOfYear); Assert.AreEqual(native.RandomDelay, wrapped.RandomDelay); }
/// <summary> /// Saves all the settings setted in the UI /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void btnOK_Click(object sender, EventArgs e) { bool isNewTask = true; try { TaskService service = new TaskService(); TaskDefinition td = service.NewTask(); TriggerCollection trgCollection; DateTime oldTriggerDate = new DateTime(); Task task = service.FindTask("PCCleaner1ClickMaint"); if (task != null) { isNewTask = false; oldTriggerDate = task.Definition.Triggers.Count > 0 ? task.Definition.Triggers[0].StartBoundary.Date : DateTime.Today; task.Definition.Triggers.Clear(); trgCollection = task.Definition.Triggers; } else { td.RegistrationInfo.Description = "PCCleaner 1 ClickMaint"; td.Settings.Enabled = true; td.Actions.Add(new ExecAction(Environment.CurrentDirectory + "\\1Click.exe", System.Diagnostics.Process.GetCurrentProcess().ProcessName, Environment.CurrentDirectory)); trgCollection = td.Triggers; } if (cmbSelectSchedule.SelectedIndex == (int)Schedule.Daily) { DailyTrigger dTrigger = new DailyTrigger { DaysInterval = (short)nudDays.Value }; if (isNewTask) dTrigger.StartBoundary = DateTime.Today.Date + timePicker.Value.TimeOfDay; else dTrigger.StartBoundary = oldTriggerDate + timePicker.Value.TimeOfDay; trgCollection.Add(dTrigger); } else if (cmbSelectSchedule.SelectedIndex == (int)Schedule.Weekly) { WeeklyTrigger wTrigger = new WeeklyTrigger(); if (!chkMon.Checked && !chkTue.Checked && !chkWed.Checked && !chkThu.Checked && !chkFri.Checked && !chkSat.Checked && !chkSun.Checked) { MessageBox.Show(WPFLocalizeExtensionHelpers.GetUIString("select_day"), System.Windows.Forms.Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (chkMon.Checked && chkTue.Checked && chkWed.Checked && chkThu.Checked && chkFri.Checked && chkSat.Checked && chkSun.Checked) { wTrigger.DaysOfWeek = DaysOfTheWeek.AllDays; trgCollection.Add(wTrigger); cmbSelectSchedule.SelectedIndex = (int)Schedule.Daily; } else { if (chkMon.Checked) { wTrigger = new WeeklyTrigger { DaysOfWeek = DaysOfTheWeek.Monday }; trgCollection.Add(wTrigger); } if (chkTue.Checked) { wTrigger = new WeeklyTrigger { DaysOfWeek = DaysOfTheWeek.Tuesday }; trgCollection.Add(wTrigger); } if (chkWed.Checked) { wTrigger = new WeeklyTrigger { DaysOfWeek = DaysOfTheWeek.Wednesday }; trgCollection.Add(wTrigger); } if (chkThu.Checked) { wTrigger = new WeeklyTrigger { DaysOfWeek = DaysOfTheWeek.Thursday }; trgCollection.Add(wTrigger); } if (chkFri.Checked) { wTrigger = new WeeklyTrigger { DaysOfWeek = DaysOfTheWeek.Friday }; trgCollection.Add(wTrigger); } if (chkSat.Checked) { wTrigger = new WeeklyTrigger { DaysOfWeek = DaysOfTheWeek.Saturday }; trgCollection.Add(wTrigger); } if (chkSun.Checked) { wTrigger = new WeeklyTrigger { DaysOfWeek = DaysOfTheWeek.Sunday }; trgCollection.Add(wTrigger); } } foreach (WeeklyTrigger trg in trgCollection) { if (isNewTask) trg.StartBoundary = DateTime.Today.Date + timePicker.Value.TimeOfDay; else trg.StartBoundary = oldTriggerDate + timePicker.Value.TimeOfDay; trg.WeeksInterval = (short)nudWeeks.Value; } } else if (cmbSelectSchedule.SelectedIndex == (int)Schedule.Monthly) { if (radDay.Checked) { MonthlyTrigger mTrigger = new MonthlyTrigger(); if (isNewTask) mTrigger.StartBoundary = DateTime.Today.Date + timePicker.Value.TimeOfDay; else mTrigger.StartBoundary = oldTriggerDate + timePicker.Value.TimeOfDay; mTrigger.MonthsOfYear = MonthsOfTheYear.AllMonths; mTrigger.DaysOfMonth = new[] { (int)nudDayMonth.Value }; trgCollection.Add(mTrigger); } else if (radMonth.Checked) { MonthlyDOWTrigger mdTrigger = new MonthlyDOWTrigger(); if (cmbday.Text == WPFLocalizeExtensionHelpers.GetUIString("MondayFull")) { mdTrigger.DaysOfWeek = DaysOfTheWeek.Monday; } else if (cmbday.Text == WPFLocalizeExtensionHelpers.GetUIString("TuesdayFull")) { mdTrigger.DaysOfWeek = DaysOfTheWeek.Tuesday; } else if (cmbday.Text == WPFLocalizeExtensionHelpers.GetUIString("WednesdayFull")) { mdTrigger.DaysOfWeek = DaysOfTheWeek.Wednesday; } else if (cmbday.Text == WPFLocalizeExtensionHelpers.GetUIString("ThursdayFull")) { mdTrigger.DaysOfWeek = DaysOfTheWeek.Thursday; } else if (cmbday.Text == WPFLocalizeExtensionHelpers.GetUIString("FridayFull")) { mdTrigger.DaysOfWeek = DaysOfTheWeek.Friday; } else if (cmbday.Text == WPFLocalizeExtensionHelpers.GetUIString("SaturdayFull")) { mdTrigger.DaysOfWeek = DaysOfTheWeek.Saturday; } else if (cmbday.Text == WPFLocalizeExtensionHelpers.GetUIString("SundayFull")) { mdTrigger.DaysOfWeek = DaysOfTheWeek.Sunday; } if (cmbweek.SelectedIndex == 0) { mdTrigger.WeeksOfMonth = WhichWeek.FirstWeek; } else if (cmbweek.SelectedIndex == 1) { mdTrigger.WeeksOfMonth = WhichWeek.SecondWeek; } else if (cmbweek.SelectedIndex == 2) { mdTrigger.WeeksOfMonth = WhichWeek.ThirdWeek; } else if (cmbweek.SelectedIndex == 3) { mdTrigger.WeeksOfMonth = WhichWeek.FourthWeek; } else if (cmbweek.SelectedIndex == 4) { mdTrigger.WeeksOfMonth = WhichWeek.LastWeek; } mdTrigger.MonthsOfYear = MonthsOfTheYear.AllMonths; mdTrigger.StartBoundary = DateTime.Today.Date + timePicker.Value.TimeOfDay; trgCollection.Add(mdTrigger); } } else if (cmbSelectSchedule.SelectedIndex == (int)Schedule.Once) { TimeTrigger tTrigger = new TimeTrigger { StartBoundary = timePickerOnce.Value.Date + timePicker.Value.TimeOfDay }; trgCollection.Add(tTrigger); } else if (cmbSelectSchedule.SelectedIndex == (int)Schedule.AtSystemStartUp) { BootTrigger bTrigger = new BootTrigger { Delay = TimeSpan.FromMinutes(2) }; trgCollection.Add(bTrigger); } else if (cmbSelectSchedule.SelectedIndex == (int)Schedule.AtLogon) { LogonTrigger lTrigger = new LogonTrigger { Delay = TimeSpan.FromSeconds(1) }; trgCollection.Add(lTrigger); } else if (cmbSelectSchedule.SelectedIndex == (int)Schedule.WhenIdel) { IdleTrigger iTrigger = new IdleTrigger(); if (isNewTask) iTrigger.StartBoundary = DateTime.Today.Date + TimeSpan.FromMinutes((double)nudMinutes.Value); else iTrigger.StartBoundary = oldTriggerDate + TimeSpan.FromMinutes((double)nudMinutes.Value); trgCollection.Add(iTrigger); } // Register the task in the root folder if (isNewTask) service.RootFolder.RegisterTaskDefinition(@"PCCleaner1ClickMaint", td); else task.RegisterChanges(); ((OneClickAppsViewModel)Application.Current.MainWindow.DataContext).SchedulerText = lblSchedule.Text; Close(); } catch { } }
public void TestMonthlyDowSelect() { var span1 = new MonthlyDOWTrigger(DaysOfTheWeek.Tuesday, MonthsOfTheYear.February, WhichWeek.SecondWeek) { StartBoundary = DateTime.Parse("12/7/2014 6:00 PM") }; var r = span1.SelectDates(x => x).Take(3).ToArray(); Debug.Assert(r.Length == 3); Debug.Assert(r[0].Date.Month == 2); Debug.Assert(r[0].TimeOfDay == new TimeSpan(18, 0, 0)); Debug.Assert(r[1].Date == r[0].Date.AddYears(1)); Debug.Assert(r[1].TimeOfDay == new TimeSpan(18, 0, 0)); Debug.Assert(r[2].Date == r[1].Date.AddYears(1)); Debug.Assert(r[2].TimeOfDay == new TimeSpan(18, 0, 0)); // repeat interval span1.Repetition.Interval = new TimeSpan(1, 0, 0); span1.Repetition.Duration = new TimeSpan(3, 0, 0); r = span1.SelectDates(x => x).Take(6).ToArray(); Debug.Assert(r.Length == 6); Debug.Assert(r[0].Date.Month == 2); Debug.Assert(r[0].TimeOfDay == new TimeSpan(18, 0, 0)); Debug.Assert(r[1].Date == r[0].Date); Debug.Assert(r[1].TimeOfDay == new TimeSpan(19, 0, 0)); Debug.Assert(r[2].Date == r[1].Date); Debug.Assert(r[2].TimeOfDay == new TimeSpan(20, 0, 0)); Debug.Assert(r[3].Date == r[2].Date.AddYears(1)); Debug.Assert(r[3].TimeOfDay == new TimeSpan(18, 0, 0)); Debug.Assert(r[4].Date == r[3].Date); Debug.Assert(r[4].TimeOfDay == new TimeSpan(19, 0, 0)); Debug.Assert(r[5].Date == r[4].Date); Debug.Assert(r[5].TimeOfDay == new TimeSpan(20, 0, 0)); // end boundry span1.EndBoundary = DateTime.Today.AddDays(-1).AddYears(1).AddHours(19); // move back to a januaray, then advance r = span1.SelectDates(x => x).Take(6).ToArray(); Debug.Assert(r.Length == 5); Debug.Assert(r[0].Date.Month == 2); Debug.Assert(r[0].TimeOfDay == new TimeSpan(18, 0, 0)); Debug.Assert(r[1].Date == r[0].Date); Debug.Assert(r[1].TimeOfDay == new TimeSpan(19, 0, 0)); Debug.Assert(r[1].Date == r[1].Date); Debug.Assert(r[2].TimeOfDay == new TimeSpan(20, 0, 0)); Debug.Assert(r[3].Date == r[2].Date.AddYears(1)); Debug.Assert(r[3].TimeOfDay == new TimeSpan(18, 0, 0)); Debug.Assert(r[4].Date == r[3].Date); Debug.Assert(r[4].TimeOfDay == new TimeSpan(19, 0, 0)); // every other week span1.EndBoundary = DateTime.MaxValue; for (var i = 0; i < 2; i++) { r = span1.SelectDates(x => x, DateTime.Today.AddDays(i * 7)).Take(5).ToArray(); Debug.Assert(r.Length == 5); Debug.Assert(r[0].Date.DayOfWeek == DayOfWeek.Tuesday); Debug.Assert(r[0].TimeOfDay == new TimeSpan(18, 0, 0)); Debug.Assert(r[1].Date == r[0].Date); Debug.Assert(r[1].TimeOfDay == new TimeSpan(19, 0, 0)); Debug.Assert(r[2].Date == r[1].Date); Debug.Assert(r[2].TimeOfDay == new TimeSpan(20, 0, 0)); Debug.Assert(r[3].Date == r[2].Date.AddDays(14)); Debug.Assert(r[3].TimeOfDay == new TimeSpan(18, 0, 0)); Debug.Assert(r[4].Date == r[3].Date); Debug.Assert(r[4].TimeOfDay == new TimeSpan(19, 0, 0)); } }
private void monthlyTriggerUI1_TriggerTypeChanged(object sender, EventArgs e) { if (!onAssignment) { Trigger newTrigger = null; if (monthlyTriggerUI1.TriggerType == TaskTriggerType.Monthly) newTrigger = new MonthlyTrigger(); else newTrigger = new MonthlyDOWTrigger(); if (newTrigger != null) { if (trigger != null) newTrigger.CopyProperties(trigger); this.Trigger = newTrigger; } } }
public Dev2MonthlyDowTrigger(ITaskServiceConvertorFactory taskServiceConvertorFactory, MonthlyDOWTrigger instance) : base(taskServiceConvertorFactory, instance) { }
internal static Trigger CreateTrigger(V1Interop.ITaskTrigger trigger, V1Interop.TaskTriggerType triggerType) { Trigger t = null; switch (triggerType) { case Microsoft.Win32.TaskScheduler.V1Interop.TaskTriggerType.RunOnce: t = new TimeTrigger(trigger); break; case Microsoft.Win32.TaskScheduler.V1Interop.TaskTriggerType.RunDaily: t = new DailyTrigger(trigger); break; case Microsoft.Win32.TaskScheduler.V1Interop.TaskTriggerType.RunWeekly: t = new WeeklyTrigger(trigger); break; case Microsoft.Win32.TaskScheduler.V1Interop.TaskTriggerType.RunMonthly: t = new MonthlyTrigger(trigger); break; case Microsoft.Win32.TaskScheduler.V1Interop.TaskTriggerType.RunMonthlyDOW: t = new MonthlyDOWTrigger(trigger); break; case Microsoft.Win32.TaskScheduler.V1Interop.TaskTriggerType.OnIdle: t = new IdleTrigger(trigger); break; case Microsoft.Win32.TaskScheduler.V1Interop.TaskTriggerType.OnSystemStart: t = new BootTrigger(trigger); break; case Microsoft.Win32.TaskScheduler.V1Interop.TaskTriggerType.OnLogon: t = new LogonTrigger(trigger); break; default: break; } //if (t != null) t.ttype = triggerType; return t; }
/// <summary> /// Creates a trigger using a cron string. /// </summary> /// <param name="cronString">String using cron defined syntax for specifying a time interval. See remarks for syntax.</param> /// <returns>Array of <see cref="Trigger" /> representing the specified cron string.</returns> /// <exception cref="System.NotImplementedException">Unsupported cron string.</exception> /// <remarks> /// <para>NOTE: This method does not support all combinations of cron strings. Please test extensively before use. Please post an issue with any syntax that should work, but doesn't.</para> /// <para>Currently the cronString only supports numbers and not any of the weekday or month strings. Please use numeric equivalent.</para> /// <para>This section borrows liberally from the site http://www.nncron.ru/help/EN/working/cron-format.htm. The cron format consists of five fields separated by white spaces:</para> /// <code> /// <Minute> <Hour> <Day_of_the_Month> <Month_of_the_Year> <Day_of_the_Week> /// </code> /// <para>Each item has bounds as defined by the following:</para> /// <code> /// * * * * * /// | | | | | /// | | | | +---- Day of the Week (range: 1-7, 1 standing for Monday) /// | | | +------ Month of the Year (range: 1-12) /// | | +-------- Day of the Month (range: 1-31) /// | +---------- Hour (range: 0-23) /// +------------ Minute (range: 0-59) /// </code> /// <para>Any of these 5 fields may be an asterisk (*). This would mean the entire range of possible values, i.e. each minute, each hour, etc.</para> /// <para>Any of the first 4 fields can be a question mark ("?"). It stands for the current time, i.e. when a field is processed, the current time will be substituted for the question mark: minutes for Minute field, hour for Hour field, day of the month for Day of month field and month for Month field.</para> /// <para>Any field may contain a list of values separated by commas, (e.g. 1,3,7) or a range of values (two integers separated by a hyphen, e.g. 1-5).</para> /// <para>After an asterisk (*) or a range of values, you can use character / to specify that values are repeated over and over with a certain interval between them. For example, you can write "0-23/2" in Hour field to specify that some action should be performed every two hours (it will have the same effect as "0,2,4,6,8,10,12,14,16,18,20,22"); value "*/4" in Minute field means that the action should be performed every 4 minutes, "1-30/3" means the same as "1,4,7,10,13,16,19,22,25,28".</para> /// </remarks> public static Trigger[] FromCronFormat(string cronString) { CronExpression cron = new CronExpression(); cron.Parse(cronString); // TODO: Figure out all the permutations of expression and convert to Trigger(s) /* Time (fields 1-4 have single number and dow = *) * Time repeating * Daily * Weekly * Monthly * Monthly DOW */ List<Trigger> ret = new List<Trigger>(); // MonthlyDOWTrigger if (!cron.DOW.IsEvery) { // Determine DOW DaysOfTheWeek dow = 0; if (cron.DOW.vals.Length == 0) dow = DaysOfTheWeek.AllDays; else if (cron.DOW.range) for (int i = cron.DOW.vals[0]; i <= cron.DOW.vals[1]; i += cron.DOW.step) dow |= (DaysOfTheWeek)(1 << (i - 1)); else for (int i = 0; i < cron.DOW.vals.Length; i++) dow |= (DaysOfTheWeek)(1 << (cron.DOW.vals[i] - 1)); // Determine months MonthsOfTheYear moy = 0; if ((cron.Months.vals.Length == 0 || (cron.Months.vals.Length == 1 && cron.Months.vals[0] == 1)) && cron.Months.IsEvery) moy = MonthsOfTheYear.AllMonths; else if (cron.Months.range) for (int i = cron.Months.vals[0]; i <= cron.Months.vals[1]; i += cron.Months.step) moy |= (MonthsOfTheYear)(1 << (i - 1)); else for (int i = 0; i < cron.Months.vals.Length; i++) moy |= (MonthsOfTheYear)(1 << (cron.Months.vals[i] - 1)); Trigger tr = new MonthlyDOWTrigger(dow, moy, WhichWeek.AllWeeks); ret.AddRange(ProcessCronTimes(cron, tr)); } // MonthlyTrigger else if (cron.Days.vals.Length > 0) { // Determine DOW List<int> days = new List<int>(); if (cron.Days.range) for (int i = cron.Days.vals[0]; i <= cron.Days.vals[1]; i += cron.Days.step) days.Add(i); else for (int i = 0; i < cron.Days.vals.Length; i++) days.Add(cron.Days.vals[i]); // Determine months MonthsOfTheYear moy = 0; if ((cron.Months.vals.Length == 0 || (cron.Months.vals.Length == 1 && cron.Months.vals[0] == 1)) && cron.Months.IsEvery) moy = MonthsOfTheYear.AllMonths; else if (cron.Months.range) for (int i = cron.Months.vals[0]; i <= cron.Months.vals[1]; i += cron.Months.step) moy |= (MonthsOfTheYear)(1 << (i - 1)); else for (int i = 0; i < cron.Months.vals.Length; i++) moy |= (MonthsOfTheYear)(1 << (cron.Months.vals[i] - 1)); Trigger tr = new MonthlyTrigger(1, moy) { DaysOfMonth = days.ToArray() }; ret.AddRange(ProcessCronTimes(cron, tr)); } // DailyTrigger else if (cron.Months.IsEvery && cron.DOW.IsEvery && cron.Days.repeating) { Trigger tr = new DailyTrigger((short)cron.Days.step); ret.AddRange(ProcessCronTimes(cron, tr)); } else { throw new NotImplementedException(); } return ret.ToArray(); }