/****************************************************************************
                Thread class for Service Traffic Control
                -----------------------------------------

    begin      : 2013/11/20
    copyright  : (C) 2005 Solbox Inc.
    author     : Dev Storage Team
	email      : huibong@solbox.com
	version    : 3.5

    CopyRight(C) 2005 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 __TRAFFIC_CONTROL_THREAD_H__
#define __TRAFFIC_CONTROL_THREAD_H__


#include <pthread.h>
#include <unistd.h>
#include <vector>


// 각 서비스별 트래픽 제어 관련 정보를 저장하기 위한 변수...
//

struct traffic_control_info {

	int user_seq;                           // 고객사 sequence 정보..
	int svc_seq;                            // 서비스 sequence 정보.

	unsigned long long limit;               // 제한 트래픽 정보 ( bps 단위 )

	unsigned long long previous_traffic;    // RCDB t_sms_sp_svc_product_band 테이블 volume_bandwidth_current 항목에
	                                        // 저장되었던 이전 traffic 정보. (bps 단위 )

	unsigned long long current_traffic;     // 각 FHS 로 부터 전달받은 합산된 traffic 정보. (bps 단위)


	unsigned int previous_control_precent;  // RCDB t_sms_sp_svc_product_band 테이블 volume_bandwidth_control_current 항목에 저장되었던...
	                                        // 트래픽 제어 Percent 정보. (정수형 처리를 위해 99.99 % -> 9999 로 형식으로 처리 )
	
	unsigned int current_control_precent;   // 현재 통계 정보를 바탕으로 계산된.. 트래픽 제어 percent 정보.
	                                        // (정수형 처리를 위해 99.99 % -> 9999 로 형식으로 처리)
};


/// @brief CTrafficControlThread
/// 본 클래스는 Thread 클래스로서...
/// 서비스별 5분단위 Network 통계 정보 바탕으로... RCDB t_sms_sp_svc_product_band 테이블에.. 서비스 Traffic 제어 정보를 갱신하여...
/// opendav-listener 모듈에서 해당 정보를 주기적으로 갱신하고... opendav 모듈에서 전송 처리시 제어 정보를 사용되도록 한다.
class CTrafficControlThread
{
	public:
	
		// 생성 및 소멸자.
		CTrafficControlThread();
		~CTrafficControlThread();

		// 작업 시작
		bool Start( void );
			
	private:
		
		// Thread function....
		static void * threadFunc( void * arg );

		// 실제 트래픽 제어 정보 갱신을 담당하는 함수...
		void Execute( void );

	private:
		
		// 쓰레드 핸들
        pthread_t m_threadHandle;

		// DB 조회 정보를 저장할 Vector 객체
		std::vector<struct traffic_control_info> m_vecTraffic;


};

#endif /* __TRAFFIC_CONTROL_THREAD_H__ */

