/***************************************************************************
                Replicate Control class
                -----------------------------------------
    begin      : 2010/03/31
    copyright  : (C) 2010 Solbox Inc.
    author     : storage dev team
    email      : storage.sd@solbox.com
    version    : 3.3

    CopyRight(C) 2010 Solbox Inc. All Rights reserved.
    Redistribution and use in source and binary forms, with or with out
    modification, are not permitted in outside of Solbox Inc.
***************************************************************************/

#ifndef __REPLICATE_CONTROL_H__
#define __REPLICATE_CONTROL_H__

#include <pthread.h>

#include "ProperFhs.h"
#include "ProcessStatus.h"
#include "DataQueue.hpp"
#include "ReplicationData.h"
#include "ReportLog.h"
#include "ReplicateQueueControl.h"


// CReplicateControl
// Replication 관련 각 Thread 및 Queue 를 제어하여...
// 전체적으로 Replication 생성 업무 Flow 를 제어한다.
// 내부적으로 Thread를 사용
class CReplicateControl
{
    public:

        // 생성자        
        CReplicateControl( CProperFhs * pProperFhs
						, CProcessStatus * pProcessStatus
						, CDataQueue<CSourceData> * pQueueSource
						, CDataQueue<CRetryData> * pQueueRetry
						, CDataQueue<CCompleteData> * pQueueComplete );

		// 소멸자
        ~CReplicateControl();
        
		// 객체 초기화 수행
		bool Init();

		// thread를 생성하여 업무 flow 를 시작.
        bool Start();
        

    private:

		// Proper FHS 정보를 관리하는 CProperFhs 객체에 대한 포인터.
		// - 생성자를 통해 전달받음.
		CProperFhs * m_pProperFhs;

		// 프로세스 상의 Queue, Thread 상태를 관리하는 CProcessStatus 객체에 대한 포인터
		// - 생성자를 통해 전달받음        
		CProcessStatus * m_pProcessStatus;

		// 복제대상 Content 정보를 관리하는 Queue 객체에 대한 포인터
		// - 생성자를 통해 전달받음        
		CDataQueue<CSourceData> * m_pSourceQueue;

		// 복제 처리 관련 재시도 Content 정보를 관리하는 Queue 객체에 대한 포인터
		// - 생성자를 통해 전달받음
		CDataQueue<CRetryData> * m_pRetryQueue;

		// 복제 완료된 Content 정보를 관리하는 Queue 객체에 대한 포인터
		// - 생성자를 통해 전달받음
		CDataQueue<CCompleteData> * m_pCompleteQueue;

		// 스레드 핸들
		pthread_t m_threadHandle;

		// Report log 처리 관련 객체
		CReportLog m_reportLog;

		// Thread Loop 마다 Sleep Time 정보를 저장하기 위한 변수
		unsigned int m_uSleep;

		// conf 에 설정된 Replication Retry count 정보를 저장하기 위한 멤버 변수
		unsigned int m_uRetryCount;
		
		// Queue Pop 처리를 담당할 멤버 객체
		CReplicateQueueControl m_controlQueuePop;
		

	private:
        
		// 스레드 함수
		static void* threadFunc( void* arg );
        
		// 스레드 내에서 각 loop 단위 처리 호출 함수.
        void Execute();

		// Replication 생성 처리를 수행하기 위한 함수.
		bool MakeReplication();


};
#endif //__REPLICATE_CONTROL_H__
