MMatchSchedule.h
00001 #pragma once 00002 00003 #include <vector> 00004 #include <list> 00005 00006 using std::vector; 00007 using std::list; 00008 00009 class MCommand; 00010 class MMatchServer; 00011 class MMatchScheduleImpl; 00012 00013 /* 00014 * 모든 스케쥴은 bIsNeedDelete이 true가 되면 제거됨. 00015 * 00016 * once : 한번 실행하면 무조건 bIsNeedDelete를 true로 설정함. 00017 * 00018 * count : 실행시 m_nCount변수를 1씩 감소시키고 0이 되는 시점에서 bIsNeedDelete를 true로 설정함. 00019 * cMonth, cDay, cHour, cMin이 실행 시간과 같아야 실행함. 00020 * cNextMonth, cNextDay, cNextHour, cNextMin는 다음에 실행될 시간의 증가치. 00021 * 00022 * repeat : 계속해서 실행함. bIsNeedDelete를 true로 만들지 않음. 00023 * cMonth, cDay, cHour, cMin이 실행 시간과 같아야 실행함. 00024 */ 00025 00026 class MMatchDayOfMonth 00027 { 00028 public : 00029 MMatchDayOfMonth(); 00030 ~MMatchDayOfMonth(); 00031 00032 static MMatchDayOfMonth& GetInst() 00033 { 00034 static MMatchDayOfMonth inst; 00035 return inst; 00036 } 00037 00038 inline char GetMaxDay( const int iMonth ) 00039 { 00040 if( 1 > iMonth ) 00041 return -1; 00042 00043 // 배열값으로 수정후 처리. 00044 return m_cDayOfMonth[ iMonth - 1 ]; 00045 } 00046 private : 00047 void Init(); 00048 00049 private : 00050 enum MONTH_NUM 00051 { 00052 MonthNum = 12, 00053 }; 00054 00055 char m_cDayOfMonth[ MONTH_NUM::MonthNum ]; 00056 }; 00057 00058 class MMatchScheduleData 00059 { 00060 public: 00061 // 스케쥴의 종류는 1:repeat, 2:Count, 3:Once로 되어있음. 00062 enum MMatchScheduleState 00063 { 00064 REPEAT = 0, 00065 COUNT, 00066 ONCE, 00067 }; 00068 00069 MMatchScheduleData(void); 00070 ~MMatchScheduleData(void); 00071 00072 void CorrectTime(); 00073 00074 inline int GetType() { return m_nType; } 00075 inline MCommand* GetCommand() { return m_pCmd; } 00076 inline bool IsNeedDelete() { return m_bIsNeedDelete; } 00077 inline MMatchScheduleImpl* GetImpl() { return m_pImpl; } 00078 inline int GetErrorTime() { return m_nErrorTime; } 00079 00080 inline int GetCount() { return m_nCount; } 00081 00082 inline void IncreaseCount() { ++m_nCount; } 00083 inline void DecreaseCount() { --m_nCount; } 00084 00085 inline unsigned char GetYear() { return m_cYear; } 00086 inline unsigned char GetMonth() { return m_cMonth; } 00087 inline unsigned char GetDay() { return m_cDay; } 00088 inline unsigned char GetHour() { return m_cHour; } 00089 inline unsigned char GetMin() { return m_cMin; } 00090 00091 inline unsigned char GetNextYear() { return m_cNextYear; } 00092 inline unsigned char GetNextMonth() { return m_cNextMonth; } 00093 inline unsigned char GetNextDay() { return m_cNextDay; } 00094 inline unsigned char GetNextHour() { return m_cNextHour; } 00095 inline unsigned char GetNextMin() { return m_cNextMin; } 00096 00097 inline void SetType( const int nType ) { m_nType = nType; } 00098 inline void SetCommand( MCommand* pCmd ) { m_pCmd = pCmd; } 00099 inline void SetImpl( MMatchScheduleImpl* pImpl ) { m_pImpl = pImpl; } 00100 inline void SetDeleteState( const bool bState ) { m_bIsNeedDelete = bState; } 00101 inline void SetErrorTime( const int nErrorTime ) { m_nErrorTime = nErrorTime; } 00102 00103 inline void SetCount( const int nStartCount ) { m_nCount = nStartCount; } 00104 00105 inline void SetYear( const unsigned char cYear ) { m_cYear = cYear; } 00106 inline void SetMonth( const unsigned char cMonth ) { m_cMonth = cMonth; } 00107 inline void SetDay( const unsigned char cDay ) { m_cDay = cDay; } 00108 inline void SetHour( const unsigned char cHour ) { m_cHour = cHour; } 00109 inline void SetMin( const unsigned char cMin ) { m_cMin = cMin; } 00110 00111 inline void SetNextYear( const unsigned char cYear ) { m_cNextYear = cYear; } 00112 inline void SetNextMonth( const unsigned char cMonth ) { m_cNextMonth = cMonth; } 00113 inline void SetNextDay( const unsigned char cDay ) { m_cNextDay = cDay; } 00114 inline void SetNextHour( const unsigned char cHour ) { m_cNextHour = cHour; } 00115 inline void SetNextMin( const unsigned char cMin ) { m_cNextMin = cMin; } 00116 00117 // return if same, then 0, less -1, greater 1. 00118 int CompareCurrentTime(); 00119 bool SetTimes( const unsigned char cYear, 00120 const unsigned char cMonth, 00121 const unsigned char cDay, 00122 const unsigned char cHour, 00123 const unsigned char cMin ); 00124 bool SetNextTimes( const unsigned char cNextYear, 00125 const unsigned char cNextMonth, 00126 const unsigned char cNextDay, 00127 const unsigned char cNextHour, 00128 const unsigned char cNextMin ); 00129 00130 void ResetTime(); 00131 00132 void Release(); 00133 00134 private : 00135 // int nID; 00136 int m_nType; // 스케쥴 타입( REPAT, COUNT, ONCE ). 00137 MCommand* m_pCmd; // 스케쥴이 활성화 되었을때 실행할 명령. 00138 bool m_bIsNeedDelete; // true이면 스케쥴을 제거 또는 비활성화 함. 00139 MMatchScheduleImpl* m_pImpl; // 스케쥴이 수행되기전에 해야 할 수행자. 00140 00141 int m_nCount; // 특정 횟수를 실행할 경우 사용. 00142 int m_nErrorTime; // 보정에 적용될수 있는 한계치( 분 ). 00143 00144 unsigned char m_cYear; // 실행 되어야 하는 해. 00145 unsigned char m_cMonth; // 실행 되어야 하는 달. 00146 unsigned char m_cDay; // 실행 되어야 하는 날. 00147 unsigned char m_cHour; // 실행 되어야 하는 시간. 00148 unsigned char m_cMin; // 실행 되어야 하는 분. 00149 00150 unsigned char m_cNextYear; // 다음에 실해되어야 하는 해의 증가치. 00151 unsigned char m_cNextMonth; // 다음에 실행되어야 하는 달의 증가치. 00152 unsigned char m_cNextDay; // 다음에 실행되어야 하는 일의 증가치. 00153 unsigned char m_cNextHour; // 다음에 실행되어야 하는 시간의 증가치. 00154 unsigned char m_cNextMin; // 다음에 실행되어야 하는 분의 증가치. 00155 }; 00156 00157 class MMatchScheduleReleaser 00158 { 00159 public : 00160 void operator() ( MMatchScheduleData*& rfSchedulerData ) 00161 { 00162 if( 0 != rfSchedulerData ){ 00163 rfSchedulerData->Release(); 00164 delete rfSchedulerData; 00165 rfSchedulerData = 0; 00166 } 00167 } 00168 }; 00169 00171 // 순수 가상 인터페이스 클래스. 00172 class MMatchScheduleImpl 00173 { 00174 public : 00175 virtual ~MMatchScheduleImpl() {} 00176 00177 // 시간 오차 보정. 00178 virtual void CorrectTime( MMatchScheduleData* pScheduleData ) = 0; 00179 // 시간을 다시 설정함. 00180 virtual void Reset( MMatchScheduleData* pScheduleData ) = 0; 00181 }; 00182 // 제거되지 않고 계속 반복되는 스케쥴. 00183 class MMatchRepeatScheduleImpl : public MMatchScheduleImpl 00184 { 00185 public : 00186 // 시간 오차 보정. 00187 void CorrectTime( MMatchScheduleData* pScheduleData ); 00188 // 시간을 다시 설정함. 00189 void Reset( MMatchScheduleData* pScheduleData ); 00190 }; 00191 // 일정 횟수를 실행하고 제거되는 스케쥴. 00192 class MMatchCountScheduleImpl : public MMatchScheduleImpl 00193 { 00194 public : 00195 // 시간 오차 보정. 00196 void CorrectTime( MMatchScheduleData* pScheduleData ); 00197 // 시간을 다시 설정함. 00198 void Reset( MMatchScheduleData* pScheduleData ); 00199 }; 00200 // 한번만 실행하고 제거되는 스케쥴. 00201 class MMatchOnceScheduleImpl : public MMatchScheduleImpl 00202 { 00203 public : 00204 // 시간 오차 보정. 00205 void CorrectTime( MMatchScheduleData* pScheduleData ); 00206 // 시간을 다시 설정함. 00207 void Reset( MMatchScheduleData* pScheduleData ); 00208 }; 00209 00210 00212 typedef vector< MMatchScheduleData* > ScheduleVec; 00213 typedef ScheduleVec::iterator ScheduleVecIter; 00214 00215 typedef list< MMatchScheduleData* > ScheduleLst; 00216 typedef ScheduleLst::iterator ScheduleLstIter; 00217 00218 00219 class MMatchScheduleMgr 00220 { 00221 public : 00222 MMatchScheduleMgr( MMatchServer* pMatchServer ); 00223 ~MMatchScheduleMgr(); 00224 00225 // 동적인 스케쥴 등록. 조건에 의해서 지워질수 있음. 00226 bool AddDynamicSchedule( MMatchScheduleData* pNewSchedule ); 00227 // 시스템이 시작하면서 종료될때까지 유지되어야 하는 스케쥴. 00228 bool AddStaticSchedule( MMatchScheduleData* pNewSchedule ); 00229 00230 // Schedule data maker. 00231 MMatchScheduleData* MakeRepeatScheduleData( const unsigned char cNextYear, // 다음에 실행될 해의 상대값. ex) 1년 후. 00232 const unsigned char cNextMonth, // 다음에 실행될 달의 상대값. ex) 1달 후. 00233 const unsigned char cNextDay, // 다음에 실행될 일의 상대값. ex) 1일 후. 00234 const unsigned char cNextHour, // 다음에 실행될 시간의 상대값. ex) 1시간 후. 00235 const unsigned char cNextMin, // 다음에 실행될 분의 상대값. ex) 1분 후. 00236 MCommand* pCmd // 수행할 명령. 00237 ); 00238 MMatchScheduleData* MakeCountScheduleData( const unsigned char cNextYear, // 다음에 실행될 해의 상대값. ex) 1년 후. 00239 const unsigned char cNextMonth, // 다음에 실행될 달의 상대값. ex) 1달 후. 00240 const unsigned char cNextDay, // 다음에 실행될 일의 상대값. ex) 1일 후. 00241 const unsigned char cNextHour, // 다음에 실행될 시간의 상대값. ex) 1시간 후. 00242 const unsigned char cNextMin, // 다음에 실행될 분의 상대값. ex) 1분 후. 00243 const unsigned int nCount, // 실행될 횟수. 00244 MCommand* pCmd // 수행할 명령. 00245 ); 00246 MMatchScheduleData* MakeOnceScheduleData( const unsigned char cYear, // 실행될 해. 00247 const unsigned char cMonth, // 실행될 달. 00248 const unsigned char cDay, // 실행될 날. 00249 const unsigned char cHour, // 실행될 시간. 00250 const unsigned char cMin, // 실행될 분. 00251 MCommand* pCmd // 수행할 명령. 00252 ); 00253 00254 // 초기화. 00255 bool Init(); 00256 00257 inline void SetUpdateTerm( time_t tmTime ) { m_tmUpdateTerm = tmTime; } 00258 00259 // 등록되있는 모든 스케쥴을 탐색하여 업데이트함. 00260 void Update(); 00261 00262 // 종료시까지 남아있는 스케쥬을 제거함. 00263 void Release(); 00264 00265 private : 00266 // 마지막 업데이트 시점에서부터 경과시간 계산. 00267 const time_t CalculateElapseUpdateTime(); 00268 // 정상적적인 데이터인지 검사함. 00269 bool CheckData( MMatchScheduleData* pScheduleData ) const; 00270 // 업데이트 되어야 하는 시간인지 검사함. 00271 bool CompareTime( MMatchScheduleData* pScheduleData ); 00272 // 업데이트가 가능한지 검사. 00273 bool IsUpdate(); 00274 00275 void UpdateStaticSchedule(); 00276 void UpdateDynamicSchedule(); 00277 00278 void SetLastUpdateTime(); 00279 00280 void ReleaseStaticSchedule(); 00281 void ReleaseDynamicSchedule(); 00282 00283 enum MONTH_NUM { MonthNum = 12, }; 00284 00285 // 수행자를 가지고 있는 저장 클래스. 00286 class MMatchScheduleImplPrototype 00287 { 00288 private : 00289 friend MMatchScheduleMgr; 00290 00291 typedef vector< MMatchScheduleImpl* > ScheduleImplVec; 00292 00293 MMatchScheduleImplPrototype() {} 00294 ~MMatchScheduleImplPrototype() {} 00295 00296 bool Init(); 00297 // 해당 타입ID에 맞는 수행자의 포인터를 넘겨줌. 절대 delete하면 않됨. 00298 MMatchScheduleImpl* GetImpl( const unsigned int nTypeID ); 00299 void Release(); 00300 00301 // 수행자를 저장하고 있을 벡터. 00302 ScheduleImplVec m_ScheduleImplVec; 00303 }; 00304 00305 class MMatchScheduleImplRelease 00306 { 00307 public : 00308 void operator() ( MMatchScheduleImpl*& rfImpl ) 00309 { 00310 if( 0 != rfImpl ){ 00311 delete rfImpl; 00312 rfImpl = 0; 00313 } 00314 } 00315 }; 00316 00317 private : 00318 00319 MMatchServer* m_pMatchServer; 00320 00321 int m_nIndex; 00322 00323 time_t m_tmUpdateTerm; // 업데이트되는 간격. 00324 time_t m_tmLastUpdateTime; // 마지막 업데이트된 시간. 00325 00326 MMatchScheduleImplPrototype m_ScheduleImplPrototype; 00327 00328 vector< MMatchScheduleData* > m_vecStaticSchedule; // 시스템 가동시 등록되는 스케쥴. 시스템수명과 같음. 00329 list< MMatchScheduleData* > m_lstDynamicSchedule; // 공지사항. 00330 }; 00331 00332 struct tm* MMatchGetLocalTime(); 00333 char GetMaxDay( const int iMonth ); 00334 char GetMaxDay();
MAIET entertainment