[PATCH 2/2] mstask: Implement ITask::GetNextRunTime() for DAILY trigger type.
Dmitry Timoshkov
dmitry at baikal.ru
Mon May 21 05:17:49 CDT 2018
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
dlls/mstask/task.c | 44 ++++++++++++++++++++++++++++++++++++++++
dlls/mstask/tests/task_trigger.c | 18 +++++++++++++++-
2 files changed, 61 insertions(+), 1 deletion(-)
diff --git a/dlls/mstask/task.c b/dlls/mstask/task.c
index c004764af0..012bf48612 100644
--- a/dlls/mstask/task.c
+++ b/dlls/mstask/task.c
@@ -445,6 +445,27 @@ static void get_end_time(const TASK_TRIGGER *trigger, FILETIME *ft)
SystemTimeToFileTime(&st, ft);
}
+static void filetime_add_ms(FILETIME *ft, ULONGLONG ms)
+{
+ union u_ftll
+ {
+ FILETIME ft;
+ ULONGLONG ll;
+ } *ftll = (union u_ftll *)ft;
+
+ ftll->ll += ms * (ULONGLONG)10000;
+}
+
+static void filetime_add_hours(FILETIME *ft, ULONG hours)
+{
+ filetime_add_ms(ft, (ULONGLONG)hours * 60 * 60 * 1000);
+}
+
+static void filetime_add_days(FILETIME *ft, ULONG days)
+{
+ filetime_add_hours(ft, (ULONGLONG)days * 24);
+}
+
static HRESULT WINAPI MSTASK_ITask_GetNextRunTime(ITask *iface, SYSTEMTIME *rt)
{
TaskImpl *This = impl_from_ITask(iface);
@@ -483,6 +504,29 @@ static HRESULT WINAPI MSTASK_ITask_GetNextRunTime(ITask *iface, SYSTEMTIME *rt)
}
break;
+ case TASK_TIME_TRIGGER_DAILY:
+ st = current_st;
+ st.wHour = This->trigger[i].wStartHour;
+ st.wMinute = This->trigger[i].wStartMinute;
+ st.wSecond = 0;
+ st.wMilliseconds = 0;
+ SystemTimeToFileTime(&st, ¤t_ft);
+ while (CompareFileTime(¤t_ft, &end_ft) < 0)
+ {
+ if (CompareFileTime(¤t_ft, &begin_ft) >= 0)
+ {
+ if (!have_best_time || CompareFileTime(¤t_ft, &best_ft) < 0)
+ {
+ best_ft = current_ft;
+ have_best_time = TRUE;
+ }
+ break;
+ }
+
+ filetime_add_days(¤t_ft, This->trigger[i].Type.Daily.DaysInterval);
+ }
+ break;
+
default:
FIXME("trigger type %u is not handled\n", This->trigger[i].TriggerType);
break;
diff --git a/dlls/mstask/tests/task_trigger.c b/dlls/mstask/tests/task_trigger.c
index e880ce4996..f7ab461aa9 100644
--- a/dlls/mstask/tests/task_trigger.c
+++ b/dlls/mstask/tests/task_trigger.c
@@ -522,7 +522,23 @@ static void test_GetNextRunTime(void)
st.wDay, st.wMonth, st.wYear, st.wDayOfWeek,
st.wHour, st.wMinute, st.wSecond);
- /* FIXME: TASK_TIME_TRIGGER_DAILY */
+ /* TASK_TIME_TRIGGER_DAILY */
+
+ hr = ITaskTrigger_GetTrigger(trigger, &data);
+ ok(hr == S_OK, "got %#x\n", hr);
+ data.rgFlags &= ~TASK_TRIGGER_FLAG_DISABLED;
+ data.TriggerType = TASK_TIME_TRIGGER_DAILY;
+ data.Type.Daily.DaysInterval = 1;
+ hr = ITaskTrigger_SetTrigger(trigger, &data);
+ ok(hr == S_OK, "got %#x\n", hr);
+
+ memset(&st, 0xff, sizeof(st));
+ hr = ITask_GetNextRunTime(task, &st);
+ ok(hr == S_OK, "got %#x\n", hr);
+ ok(!memcmp(&st, &cmp, sizeof(st)), "got %u/%u/%u wday %u %u:%02u:%02u\n",
+ st.wDay, st.wMonth, st.wYear, st.wDayOfWeek,
+ st.wHour, st.wMinute, st.wSecond);
+
/* FIXME: TASK_TIME_TRIGGER_WEEKLY */
/* FIXME: TASK_TIME_TRIGGER_MONTHLYDATE */
/* FIXME: TASK_TIME_TRIGGER_MONTHLYDOW */
--
2.16.3
More information about the wine-devel
mailing list