CSCommon: MMatchSchedule.h 소스 파일

MAIET

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