[SCHEDSVC]

Calculate the next start time of a job and store it in the job object. DaysOfMonth and DaysOfWeek are not taken into account yet.

svn path=/trunk/; revision=74315
This commit is contained in:
Eric Kohl 2017-04-14 21:16:37 +00:00
parent 2769768c33
commit 645f25c4dd
3 changed files with 57 additions and 28 deletions

View file

@ -282,7 +282,8 @@ LoadJobs(VOID)
/* Release the job list lock */ /* Release the job list lock */
RtlReleaseResource(&JobListLock); RtlReleaseResource(&JobListLock);
// Calculate start time /* Calculate the next start time */
CalculateNextStartTime(pJob);
// Insert job into the start list // Insert job into the start list
@ -310,38 +311,62 @@ done:
} }
#if 0 static
WORD
DaysOfMonth(
WORD wMonth,
WORD wYear)
{
WORD wDaysArray[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (wMonth == 2 && wYear % 4 == 0 && wYear % 400 != 0)
return 29;
return wDaysArray[wMonth];
}
VOID VOID
CalculateNextStartTime(PJOB pJob) CalculateNextStartTime(PJOB pJob)
{ {
SYSTEMTIME Time; SYSTEMTIME StartTime;
DWORD_PTR JobTime; DWORD_PTR Now;
WORD wDay;
BOOL bToday = FALSE;
GetLocalTime(&Time); GetLocalTime(&StartTime);
Now = (DWORD_PTR)Time.wHour * 3600000 + Now = (DWORD_PTR)StartTime.wHour * 3600000 +
(DWORD_PTR)Time.wMinute * 60000; (DWORD_PTR)StartTime.wMinute * 60000;
if (pJob->JobTime > Now)
bToday = TRUE;
if (pJob->DaysOfMonth != 0) StartTime.wMilliseconds = 0;
StartTime.wSecond = 0;
StartTime.wHour = (WORD)(pJob->JobTime / 3600000);
StartTime.wMinute = (WORD)((pJob->JobTime % 3600000) / 60000);
/* Start the job tomorrow */
if (Now > pJob->JobTime)
{ {
wDay = 0; if (StartTime.wDay + 1 > DaysOfMonth(StartTime.wMonth, StartTime.wYear))
for (i = Time.wDay - 1; i < 32; i++)
{ {
if (pJob->DaysOfMonth && (1 << i)) if (StartTime.wMonth == 12)
{ {
wDay = i; StartTime.wDay = 1;
break; StartTime.wMonth = 1;
StartTime.wYear++;
}
else
{
StartTime.wDay = 1;
StartTime.wMonth++;
} }
} }
ERR("Next day this month: %hu\n", wDay); else
{
StartTime.wDay++;
}
} }
else if (pJob->DaysOfWeek != 0)
{
} ERR("Next start: %02hu:%02hu %02hu.%02hu.%hu\n", StartTime.wHour,
StartTime.wMinute, StartTime.wDay, StartTime.wMonth, StartTime.wYear);
SystemTimeToFileTime(&StartTime, &pJob->StartTime);
} }
#endif

View file

@ -28,7 +28,7 @@ typedef struct _JOB
LIST_ENTRY JobEntry; LIST_ENTRY JobEntry;
LIST_ENTRY StartEntry; LIST_ENTRY StartEntry;
LARGE_INTEGER StartTime; FILETIME StartTime;
WCHAR Name[9]; WCHAR Name[9];
DWORD JobId; DWORD JobId;
@ -64,6 +64,9 @@ DeleteJob(
LONG LONG
LoadJobs(VOID); LoadJobs(VOID);
VOID
CalculateNextStartTime(
PJOB pJob);
/* rpcserver.c */ /* rpcserver.c */

View file

@ -121,11 +121,12 @@ NetrJobAdd(
/* Save the job in the registry */ /* Save the job in the registry */
SaveJob(pJob); SaveJob(pJob);
// Calculate start time /* Calculate the next start time */
CalculateNextStartTime(pJob);
// Insert job into start list // Insert job into the start list
// Update start timer // Update the start timer
/* Return the new job ID */ /* Return the new job ID */
*pJobId = pJob->JobId; *pJobId = pJob->JobId;
@ -162,9 +163,9 @@ NetrJobDel(
if ((CurrentJob->JobId >= MinJobId) && (CurrentJob->JobId <= MaxJobId)) if ((CurrentJob->JobId >= MinJobId) && (CurrentJob->JobId <= MaxJobId))
{ {
// Remove job from start list // Remove job from the start list
// Update start timer // Update the start timer
/* Remove the job from the registry */ /* Remove the job from the registry */
DeleteJob(CurrentJob); DeleteJob(CurrentJob);