00001
00002
00003
00004
00005
00006 #if !defined(AFX_FSSCHEDULEMGR_H__D5B62542_F8EA_4F9C_BC88_C3E2BB4E1B9D__INCLUDED_)
00007 #define AFX_FSSCHEDULEMGR_H__D5B62542_F8EA_4F9C_BC88_C3E2BB4E1B9D__INCLUDED_
00008
00009 #if _MSC_VER > 1000
00010 #pragma once
00011 #endif
00012
00013 #include "list.h"
00014
00015 enum fsWhatToStartType
00016 {
00017 WTS_PROGRAM,
00018 WTS_STARTDOWNLOAD,
00019 WTS_STOPDOWNLOAD,
00020 WTS_STARTALLDOWNLOADS,
00021 WTS_STOPALLDOWNLOADS,
00022 WTS_DIAL,
00023 WTS_HANGUP,
00024 WTS_CHANGE_TUM,
00025 WTS_EXIT,
00026 WTS_SHUTDOWN,
00027 WTS_RESTRAINALLDLDS,
00028 };
00029
00030 enum fsWhenToStartType
00031 {
00032 HTS_ONCE,
00033 HTS_DAILY,
00034 HTS_CONTINUOUSLY,
00035 HTS_WHENISTART,
00036 HTS_WHENDIALINGSUCCESS,
00037 HTS_WHENDIALINGFAILED,
00038 HTS_WHENNODOWNLOADS,
00039 HTS_WHENSPEEDLOW,
00040 HTS_NOTHINGRECEIVED,
00041 HTS_WHENDONE,
00042 };
00043
00044 struct fsProgramInfo
00045 {
00046 LPSTR pszName;
00047 LPSTR pszArgs;
00048 };
00049
00050 enum fsShutdownType
00051 {
00052 ST_SHUTDOWN,
00053 ST_RESTART,
00054 ST_LOGOFF,
00055 ST_HIBERNATE,
00056 ST_STANDBY,
00057 };
00058
00059 struct fsShutdown
00060 {
00061 fsShutdownType enShutdown;
00062 BOOL bForce;
00063 };
00064
00065 struct fsDialInfo
00066 {
00067 LPSTR pszConnection;
00068 UINT cAttempts;
00069 UINT cPauseBetween;
00070 DWORD dwHangupLess;
00071 UINT cAgains;
00072 };
00073
00074 enum fsRestrainAllDlds
00075 {
00076 RAD_ENABLE,
00077 RAD_DISABLE,
00078 RAD_INVERT,
00079 };
00080
00081 struct fsWhatToStart
00082 {
00083 fsWhatToStartType enType;
00084
00085 union
00086 {
00087 fsProgramInfo prog;
00088 fs::list <UINT> *pvIDs;
00089 fsTUM enTUM;
00090 fsShutdown shutdown;
00091 fsDialInfo dial;
00092
00093
00094 LPSTR pszHangupConnection;
00095 fsRestrainAllDlds enRAD;
00096 };
00097 };
00098
00099 struct fsSpeedLowInfo
00100 {
00101
00102 UINT uLowSpeed;
00103
00104 UINT uTimeInterval;
00105 };
00106
00107 struct fsWhenToStart
00108 {
00109 fsWhenToStartType enType;
00110
00111 union
00112 {
00113
00114 BOOL aWeeklyDays [7];
00115
00116 UINT interval;
00117 fsSpeedLowInfo speedLow;
00118
00119
00120 UINT uTimeNothingReceived;
00121 };
00122
00123 FILETIME last;
00124 FILETIME next;
00125 };
00126
00127 const UINT SCHEDULE_ID_INVALID = UINT_MAX;
00128
00129 #define SCHEDULE_ENABLED 1
00130 #define SCHEDULE_AUTODEL 2
00131 #define SCHEDULE_AUTODIS 4
00132
00133 struct fsSchedule
00134 {
00135 fsWhatToStart wts;
00136 fsWhenToStart hts;
00137 DWORD dwFlags;
00138 UINT uWaitForConfirmation;
00139 };
00140
00141 enum fsScheduleMgrEvent
00142 {
00143 SME_TASK_STARTED,
00144 SME_TASK_UPDATED,
00145 SME_TASK_WILLBEDELETED
00146 };
00147
00148 enum fsScheduleMgrEventType
00149 {
00150 SMET_S,
00151 SMET_E,
00152 SMET_INPROGRESS
00153 };
00154
00155 enum fsExternalEvent
00156 {
00157 EV_STARTUP,
00158 EV_DIALINGSUCCESS,
00159 EV_DIALINGFAILED,
00160 EV_NODOWNLOADS
00161 };
00162
00163 typedef void (*fntScheduleMgrEvents)(fsSchedule *task, fsScheduleMgrEvent ev, LPVOID lp);
00164 typedef void (*fntScheduleMgrEventDesc)(LPCSTR pszEvent, fsScheduleMgrEventType type, LPVOID lp);
00165
00166 class fsScheduleMgr
00167 {
00168 public:
00169 void RepairTasksNextTimes();
00170
00171 void OnTaskUpdated (fsSchedule* task);
00172
00173 int FindTask (fsWhatToStartType enType, int iStartPos = -1);
00174
00175 void RepairNextTime (fsSchedule *task);
00176
00177 fsSchedule* GetScheduleDLTask (DLDS_LIST &vDlds, BOOL bStartDL);
00178
00179 BOOL IsDownloadScheduled (vmsDownloadSmartPtr dld);
00180
00181 void Stop();
00182
00183 void ExciteEvent (fsExternalEvent ev);
00184
00185 void SetEventDescFunc (fntScheduleMgrEventDesc pfn, LPVOID lp);
00186 void SetEventFunc (fntScheduleMgrEvents pfn, LPVOID lp);
00187
00188 int FindTask (fsSchedule* task);
00189
00190 void DeleteTask (fsSchedule *task);
00191
00192 int GetTaskCount();
00193
00194 static void FreeTask (fsSchedule *task);
00195
00196 BOOL LoadStateFromFile (HANDLE hFile);
00197 BOOL SaveStateToFile (HANDLE hFile);
00198
00199 static CString LastTimeToStr(fsSchedule *task);
00200
00201 static CString NextTimeToStr (fsSchedule *task);
00202
00203 static CString HTSToStr (fsSchedule *task);
00204
00205 static CString WTSToStr (fsSchedule *task);
00206
00207 fsSchedule* GetTask (int i);
00208
00209 int AddTask (fsSchedule *task);
00210
00211 void CalculateStartTime (fsSchedule *task);
00212
00213 fsScheduleMgr();
00214 virtual ~fsScheduleMgr();
00215
00216 protected:
00217
00218 void Event (LPCSTR pszEvent, fsScheduleMgrEventType enType = SMET_S);
00219 void Event (fsSchedule* task, fsScheduleMgrEvent ev);
00220
00221 void UpdateTaskDownloads (fsSchedule* task);
00222
00223 void UpdateCurrentTime();
00224
00225 UINT m_uID;
00226
00227 static DWORD WINAPI _threadShutdown (LPVOID uFlags);
00228
00229 void ManageHalfEvents();
00230
00231 void ManageNotEvents();
00232
00233 fsWhenToStartType ExternalEventToHTS (fsExternalEvent ev);
00234
00235 void LaunchProgram (fsSchedule *task);
00236
00237 static DWORD WINAPI _threadDial (LPVOID lp);
00238
00239 void Shutdown (fsSchedule *task);
00240
00241 void Hangup (fsSchedule *task);
00242
00243 void Dial (fsSchedule *task);
00244
00245 void StopDownloads (fsSchedule *task);
00246 void StartDownloads (fsSchedule *task);
00247
00248 void FreeTasks ();
00249
00250 BOOL IsTimeBased (fsSchedule* task);
00251
00252 void GetNextTime (fsSchedule *task);
00253
00254 static BOOL IsTimeUnknown (FILETIME& time);
00255 FILETIME m_curTime;
00256
00257 void StartTask (fsSchedule* task);
00258
00259 BOOL IsNeedToStart (fsSchedule* task);
00260
00261 fntScheduleMgrEventDesc m_pfnEventDesc;
00262 LPVOID m_lpEventDesc;
00263 fntScheduleMgrEvents m_pfnEvents;
00264 LPVOID m_lpEvents;
00265
00266 static DWORD WINAPI _threadScheduleMgr (LPVOID lp);
00267 volatile BOOL m_bNeedExit;
00268
00269 fs::list <fsSchedule*> m_vTasks;
00270 };
00271
00272 #endif