|
|
#include "stdafx.h"
#include "evtview.h"
#include "globals.h"
#include "SInfoDlg.h"
#include "schview.h"
extern CScheduleView oScheduleView ; CScheduleInfo oSchedule ;
void DoAction (CPtrList &p) { POSITION pos ; SCHEDULE_ACTIONINFO *pInfo ; PROCESS_INFORMATION sProcessInformation ; STARTUPINFO sStartupInfo ;
GetStartupInfo (&sStartupInfo) ;
pos = p.GetHeadPosition () ;
while (pos) { pInfo = (SCHEDULE_ACTIONINFO *)p.GetNext (pos) ;
if (!CreateProcess (NULL, (LPWSTR)(LPCWSTR)pInfo->stParam, NULL, NULL, FALSE, 0, NULL, NULL, &sStartupInfo, &sProcessInformation)) { WCHAR szBuf [100] ;
wsprintf (szBuf, L"CreateProcess Failed : %ld", GetLastError()) ; AfxMessageBox (szBuf) ; } } }
void CheckForTime () { POSITION pos = ptrlstSInfo.GetHeadPosition (), posPrev ; SCHEDULE_INFO *pSInfo ; CTime t = CTime::GetCurrentTime () ;
while (pos) { posPrev = pos ; pSInfo = (SCHEDULE_INFO *) ptrlstSInfo.GetNext (pos) ;
if (pSInfo->lstTimeInfo.GetCount() && t >= pSInfo->minTime) { DoAction (pSInfo->lstActionInfo) ; }
ComputeAbsoluteTime (pSInfo) ;
if (pSInfo->lstTimeInfo.GetCount() == 0 && pSInfo->lstEventInfo.GetCount() == 0) { FreeEventList (pSInfo->lstEventInfo) ; FreeActionList (pSInfo->lstActionInfo) ; FreeTimeList (pSInfo->lstTimeInfo) ; delete pSInfo ; ptrlstSInfo.RemoveAt (posPrev) ; } } ResetTimer () ; if (oScheduleView.GetSafeHwnd()) oScheduleView.PostMessage (WM_REFRESH, 0, 0) ; }
void CheckForEvent (PEVTFILTER_TYPE pEvent) { POSITION pos = ptrlstSInfo.GetHeadPosition (), posPrev ; SCHEDULE_INFO *pSInfo ;
POSITION pos1 ; SCHEDULE_EVENTINFO *pEInfo ;
while (pos) { posPrev = pos ; pSInfo = (SCHEDULE_INFO *) ptrlstSInfo.GetNext (pos) ;
if (pSInfo->lstEventInfo.GetCount()) { pos1 = pSInfo->lstEventInfo.GetHeadPosition () ;
while (pos1) { pEInfo = (SCHEDULE_EVENTINFO *)pSInfo->lstEventInfo.GetNext (pos1) ;
if ((pEInfo->dwFilter & pEvent->dwFilter) && ((wcslen (pEInfo->szObjectName) == 0) || (wcscmp (pEInfo->szObjectName, pEvent->szObjectName) == 0)) && ((wcslen (pEInfo->szSourceName) == 0) || (wcscmp (pEInfo->szSourceName, pEvent->szSourceName) == 0))) { DoAction (pSInfo->lstActionInfo) ; break ; } } } } }
LRESULT CALLBACK WindowProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_TIMER: CheckForTime () ; break ; case WM_GOTEVENT: CheckForEvent ((PEVTFILTER_TYPE)lParam) ; break ; default: return DefWindowProc (hWnd, msg, wParam, lParam) ; } return 0 ; }
HWND InitWindow () { WNDCLASS sWndClass ;
sWndClass.style = 0 ; sWndClass.lpfnWndProc = WindowProc ; sWndClass.cbClsExtra = 0 ; sWndClass.cbWndExtra = 0 ; sWndClass.hInstance = AfxGetApp()->m_hInstance ; sWndClass.hIcon = NULL ; sWndClass.hCursor = NULL ; sWndClass.hbrBackground = NULL ; sWndClass.lpszMenuName = NULL ; sWndClass.lpszClassName = L"EVTVIEW_SCHEDULE" ;
RegisterClass ( &sWndClass) ;
return CreateWindow (sWndClass.lpszClassName, L"EVTVIEW_SCHEDULE", 0, 0, 0, 0, 0, NULL, NULL, sWndClass.hInstance, NULL) ; }
ScheduleInit () { hScheduleWnd = InitWindow () ;
if (hScheduleWnd != NULL) { } else { AfxMessageBox (L"Create Window failed in Schedule Thread") ; } return 0 ; }
void ScheduleDeInit() { UnregisterClass (L"EVTVIEW_SCHEDULE", AfxGetApp()->m_hInstance) ;
POSITION pos = ptrlstSInfo.GetHeadPosition () ; SCHEDULE_INFO *pSInfo ;
while (pos) { pSInfo = (SCHEDULE_INFO *)ptrlstSInfo.GetNext (pos) ;
FreeEventList (pSInfo->lstEventInfo) ; FreeActionList (pSInfo->lstActionInfo) ; FreeTimeList (pSInfo->lstTimeInfo) ; delete pSInfo ; } }
void FreeEventList (CPtrList &ptrlst) { POSITION pos ;
pos = ptrlst.GetHeadPosition () ;
while (pos) { delete (SCHEDULE_EVENTINFO *) ptrlst.GetNext (pos) ; } ptrlst.RemoveAll () ; }
void FreeActionList (CPtrList &ptrlst) { POSITION pos ;
pos = ptrlst.GetHeadPosition () ;
while (pos) { delete (SCHEDULE_ACTIONINFO *) ptrlst.GetNext (pos) ; } ptrlst.RemoveAll () ; }
void FreeTimeList (CPtrList &ptrlst) { POSITION pos ;
pos = ptrlst.GetHeadPosition () ;
while (pos) { delete (SCHEDULE_TIMEINFO *) ptrlst.GetNext (pos) ; } ptrlst.RemoveAll () ; }
CTime GetNextTime (SCHEDULE_TIMEINFO *pInfo) { CTime curTime = CTime::GetCurrentTime (), newTime ;
SCHEDULE_TIMEINFO tmpInfo ;
tmpInfo = *pInfo ;
int iYear, iYearStart, iYearEnd ; int iMon, iMonStart, iMonEnd ; int iDay, iDayStart, iDayEnd ; int iHour, iHourStart, iHourEnd ; int iMin, iMinStart, iMinEnd ; int iSec, iSecStart, iSecEnd ;
if (tmpInfo.iYear == -1) { iYearStart = curTime.GetYear () ; iYearEnd = 2038 ; } else iYearStart = iYearEnd = tmpInfo.iYear ;
if (tmpInfo.iMonth == -1) { iMonStart = 1 ; iMonEnd = 12 ; } else iMonStart = iMonEnd = tmpInfo.iMonth ;
if (tmpInfo.iDay == -1) { iDayStart = 1 ; iDayEnd = 31 ; } else iDayStart = iDayEnd = tmpInfo.iDay ;
if (tmpInfo.iHour == -1) { iHourStart = 0 ; iHourEnd = 23 ; } else iHourStart = iHourEnd = tmpInfo.iHour ;
if (tmpInfo.iMin == -1) { iMinStart = 0 ; iMinEnd = 59 ; } else iMinStart = iMinEnd = tmpInfo.iMin ;
if (tmpInfo.iSec == -1) { iSecStart = 0 ; iSecEnd = 59 ; } else iSecStart = iSecEnd = tmpInfo.iSec ;
for (iYear = iYearStart; iYear <= iYearEnd; iYear++) { for (iMon = iMonStart; iMon <= iMonEnd ; iMon++) { for (iDay = iDayStart; iDay <= iDayEnd; iDay++) { for (iHour = iHourStart; iHour <= iHourEnd; iHour++) { for (iMin = iMinStart; iMin <= iMinEnd; iMin++) { for (iSec = iSecStart; iSec <= iSecEnd; iSec++) { newTime = CTime (iYear, iMon, iDay, iHour, iMin, iSec) ; if (newTime > curTime) return newTime ; } // Second
} // Minutes
} } // Day
} // Month
} // Year
// Give a old value so that this entry will be deleted
newTime = curTime - CTimeSpan (1, 1, 1, 1) ; return newTime ; }
void ComputeAbsoluteTime (SCHEDULE_INFO *pSInfo) { CPtrList & ptrlst = pSInfo->lstTimeInfo ; POSITION pos = ptrlst.GetHeadPosition (), posPrev ; SCHEDULE_TIMEINFO *pInfo ; CTime curTime = CTime::GetCurrentTime (), minTime ; BOOL bFirstFlag = TRUE ;
while (pos) { posPrev = pos ; pInfo = (SCHEDULE_TIMEINFO *) ptrlst.GetNext (pos) ;
pInfo->ctime = GetNextTime (pInfo) ;
if (pInfo->ctime < curTime) { oSchedule.Terminate () ;
delete pInfo ; ptrlst.RemoveAt (posPrev) ; continue ; }
if (bFirstFlag) { minTime = pInfo->ctime ; bFirstFlag = FALSE ; } else if (minTime > pInfo->ctime) minTime = pInfo->ctime ; } pSInfo->minTime = minTime ; }
void ResetTimer () { KillTimer (hScheduleWnd, nIDTimer) ;
CTime minTime ; BOOL bFirstFlag = TRUE ; POSITION pos = ptrlstSInfo.GetHeadPosition () ; SCHEDULE_INFO *pSInfo ;
while (pos) { pSInfo = (SCHEDULE_INFO *) ptrlstSInfo.GetNext (pos) ;
if (pSInfo->lstTimeInfo.GetCount() && bFirstFlag) { bFirstFlag = FALSE ; minTime = pSInfo->minTime ; } else if (pSInfo->lstTimeInfo.GetCount() && minTime > pSInfo->minTime) minTime = pSInfo->minTime ; }
if (!bFirstFlag) { CTimeSpan s = minTime - CTime::GetCurrentTime () ;
int i = s.GetTotalSeconds() ; TRACE (L"SetTime %d\n", i) ; //i = 2 ;
nIDTimer = SetTimer (hScheduleWnd , 77, i*1000, NULL) ; // nIDTimer = SetTimer (hScheduleWnd , 77, s.GetTotalSeconds()*1000, NULL) ;
} }
// Copies from p2 to p1
void CopyScheduleInfo (SCHEDULE_INFO *p1, SCHEDULE_INFO *p2) { SCHEDULE_TIMEINFO *pTimeInfo ; SCHEDULE_EVENTINFO *pEventInfo ; SCHEDULE_ACTIONINFO *pActionInfo ; POSITION pos ;
FreeEventList (p1->lstEventInfo) ; FreeActionList (p1->lstActionInfo) ; FreeTimeList (p1->lstTimeInfo) ;
p1->minTime = p2->minTime ;
pos = p2->lstTimeInfo.GetHeadPosition () ; while (pos) { pTimeInfo = (SCHEDULE_TIMEINFO *) p2->lstTimeInfo.GetNext (pos) ; p1->lstTimeInfo.AddTail (new SCHEDULE_TIMEINFO(*pTimeInfo)) ; } pos = p2->lstEventInfo.GetHeadPosition () ; while (pos) { pEventInfo = (SCHEDULE_EVENTINFO *) p2->lstEventInfo.GetNext (pos) ; p1->lstEventInfo.AddTail (new SCHEDULE_EVENTINFO(*pEventInfo)) ; } pos = p2->lstActionInfo.GetHeadPosition () ; while (pos) { pActionInfo = (SCHEDULE_ACTIONINFO *) p2->lstActionInfo.GetNext (pos) ; p1->lstActionInfo.AddTail (new SCHEDULE_ACTIONINFO(*pActionInfo)) ; } }
AddSchedule () { SCHEDULE_INFO *pSInfo = new SCHEDULE_INFO ;
oSchedule.pSInfo = pSInfo ;
if (oSchedule.DoModal () == IDOK) { ComputeAbsoluteTime (pSInfo) ;
if (pSInfo->lstTimeInfo.GetCount() || pSInfo->lstEventInfo.GetCount() ) { ptrlstSInfo.AddTail (pSInfo) ;
if (pSInfo->lstTimeInfo.GetCount()) ResetTimer () ;
} else { FreeEventList (pSInfo->lstEventInfo) ; FreeActionList (pSInfo->lstActionInfo) ; FreeTimeList (pSInfo->lstTimeInfo) ; delete pSInfo ; } if (oScheduleView.GetSafeHwnd()) oScheduleView.PostMessage (WM_REFRESH, 0, 0) ; } else { FreeEventList (pSInfo->lstEventInfo) ; FreeActionList (pSInfo->lstActionInfo) ; FreeTimeList (pSInfo->lstTimeInfo) ; delete pSInfo ; }
return 0 ; }
ModifySchedule (SCHEDULE_INFO *pSOldInfo) { int iRet ; SCHEDULE_INFO *pSInfo = new SCHEDULE_INFO ;
CopyScheduleInfo (pSInfo, pSOldInfo) ;
oSchedule.pSInfo = pSInfo ;
if ((iRet = (int)oSchedule.DoModal ()) == IDOK) { ComputeAbsoluteTime (pSInfo) ; CopyScheduleInfo (pSOldInfo, pSInfo) ; ResetTimer () ; }
FreeEventList (pSInfo->lstEventInfo) ; FreeActionList (pSInfo->lstActionInfo) ; FreeTimeList (pSInfo->lstTimeInfo) ; delete pSInfo ;
return iRet ; }
|