/****************************************************************************
                rc_rmcd's service config module 
                -----------------------------------------

    begin      : 2014/05/19
    copyright  : (C) 2005 Solbox Inc.
    author     : Dev 1 Team 
	                 - huibong : 최초 작성
    email      : dev1@solbox.com
    version    : 3.4.0

    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 __SERVICE_CONFIG_H__
#define __SERVICE_CONFIG_H__

#include <string>

#include "Config.h"

// 본 모듈은 conf 파일의 정보를 read 하여... 본 프로세스 관련 설정 정보를 저장한다.
// 본 모듈은 singleton 으로 동작시켜 Main 프로세스 및 Worker 프로세스에서도 접근이 가능토록 한다.
// conf 파일에 대한 파싱 및 설정 정보 추출은 lib 하위의 Config 클래스를 이용한다.
// 본 객체는 singleton 객체이므로 상속받아 사용하지 않도록 한다. ( 상속받아 사용할 수 없도록 private 처리함 )

class CServiceConfig
{
	
	private:

		// sigleton 객체 생성을 위해 생성자를 public 으로 처리하지 않음.
		CServiceConfig();
	
		// 소멸자
		virtual ~CServiceConfig();

		static CServiceConfig * m_pInstance;


	public:

		// 객체 초기화 처리용 Function.
		// 본 함수 호출시 Instance 생성 후 입력 받은 Config 파일 load.
		// 따라서 본 함수를 호출하지 않을 경우.. GetInstance() 함수는 NULL 을 반환
		// 본 함수를 객체가 생성된 상태에서 재 호출할 경우 
		// - 주어진 Conf 파일 정보가 정확하다면.. conf 정보를 다시 load 함.
		// - 주어진 conf 파일 정보가 부정확하다면... 이전 conf 를 계속 사용함.
		static bool Init( const std::string strProgramName, const std::string & strConfFileName, std::string & strErrorMessage );
		
		// Singleton 객체 접근 메소드
		static CServiceConfig * GetInstance(); 


	private:

		// 전달받은 conf 파일에서 해당 config 정보를 로드하여 멤버 변수에 저장한다.
		// 만약 반환값이 false 인 경우 해당 오류 관련 내역은 strErrorMessage 변수에 저장된다.
		bool Load( const std::string & strProgramName, const std::string & strConfFileName, std::string & strErrorMessage );


		// Config 객체로 부터 지정된 strKey 정보를 가져와 유효성 여부를 판단.
		// 반환값이 false 인 경우 strErrorMessage 상에 오류 내역이 저장된다.
		bool GetConfigValue( Config & conf, const std::string & strProgramName, const std::string strKey, std::string & strValue, std::string & strErrorMessage );


	private:

		// 객체 초기화시 전달받은 정보 
		std::string m_strConfigFileName;		// 설정 파일 정보
		std::string m_strProgramName;			// 프로그램 명 (conf 상에서 해당 프로그램의 설정 정보를 가져올 때 사용)


		// 기본 설정 정보.
		std::string m_strLogPath;				// 로그 저장 Path
		int m_nLogLevel;						// 로그 기록 Level

		std::string m_strRcId;					// RC ID

		std::string m_strRcdbIp;				// RCDB IP
		unsigned int m_nRcdbPort;				// RCDB Port
		std::string m_strRcdbName;				// RCDB DB Name
		std::string m_strRcdbAcct;				// RCDB 접근 계정
		std::string m_strRcdbAcctPw;			// RCDB 접근 Password.

		
		// Process 공통
		unsigned int m_nHashCheckLevel;				// Content 복제 및 Cache 관련 전송시 Hash Check Level 설정.
		                                            // 0:Not use hash, 1:Partitial hash(Default), 2:Full Hash
		unsigned int m_nFhsTransferDaemonPort;		// FHS File Transfer Daemon (ftsd) 의  TCP Listen Port = 14001 (default)
		
		// Replication 관련 설정 정보				
		unsigned int m_nMaxQueueSize;				// Max Queue Size ( 0: infinite, 4096: default )
		unsigned int m_nMaxRetryCount;				// 복제 실패 발생시 최대 재시도 횟수, ( default 2 )

		unsigned int m_nMaxReplicationThread;		// 동시 수행 Replication Thread 의 최대 갯수

		unsigned int m_nTargetSelectInterval;		// 현재 시간을 기준으로 지정된 시간 이전의 Content 에 대해서만 replication 대상 여부를 조회
		                                            // 금방 업로드된 Content 의 경우.. 수정, 삭제 등의 추가 작업 발생이 가능하므로... 
													// 되도록 추가 작업이 완료된 Cotnent 에 대해서 Replication 이 수행될 수 있도록 
													// 지정된 시간동안 Delay 처리, 이로 인해 지정된 시간만큼 지연 복제가 발생된다.
													// range : 180 ~ 1800 (second)

		unsigned int m_nTargetSelectIntervalOnStarting;   // 최초 기동시 Replication 대상 조회 범위를 지정
		                                                  // 본 설정값만큼 과거 Content 중에서 Replicaton 대상을 조회한다.
														  // 본 설정값은 기동시 1번만 적용된다.
														  // range : 1 ~ unlimited (hour) (Default: 168Hour(7Days))

		std::vector<std::string> m_vecSkipWord;		// 복제 대상에서 제외할 문자열 정보 저장.
		                                            // 설정값이 존재하지 않을 수 있음.
		
		// Hot Content Cache 관련 설정 정보
		unsigned int m_nFhsHotContentListenPort;	// FHS fimngd 에서 전송하는 Hot Content 관련 TCP Data 수신을 위한 TCP Port = 13110

		unsigned int m_nCacheCreateMinimumFdCount;  // Hot content cache 생성을 위한 최소 동접 fd 설정값.
		                                            // - fimngd 로 부터 전송받은 정보 중 본 설정값 이상인 Content 에 대해서만 Cache 생성을 시도한다.
		
		unsigned int m_nCacheFileTimeout;			// Cache 목적으로 생성된 Content 의 최대 생존 시간 (sec, default 84600 = 24hour )

		unsigned int m_nMaxCacheThread;				// 동시 수행 Cache 생성 Thread 의 최대 갯수


		
	public:	// 멤버 변수에 대한 Get 함수 선언 및 정의

		const char * GetConfigFileName()          { return m_strConfigFileName.c_str(); }
		const char * GetProgramName()             { return m_strProgramName.c_str(); }

		const char * GetLogPath()                 { return m_strLogPath.c_str(); }
		int          GetLogLevel()                { return m_nLogLevel; }

		const char * GetRcId()                    { return m_strRcId.c_str(); }

		const char * GetRcdbIp()                  { return m_strRcdbIp.c_str(); }
		unsigned int GetRcdbPort()                { return m_nRcdbPort; }
		const char * GetRcdbName()                { return m_strRcdbName.c_str(); }
		const char * GetRcdbAcct()                { return m_strRcdbAcct.c_str(); }
		const char * GetRcdbAcctPw()              { return m_strRcdbAcctPw.c_str(); }

		unsigned int GetHashCheckLevel()                 { return m_nHashCheckLevel; }
		unsigned int GetFhsTransferDaemonPort()          { return m_nFhsTransferDaemonPort; }
						
		unsigned int GetMaxQueueSize()                   { return m_nMaxQueueSize; }
		unsigned int GetMaxRetryCount()                  { return m_nMaxRetryCount; }
		unsigned int GetMaxReplicationThread()           { return m_nMaxReplicationThread; }
		unsigned int GetTargetSelectInterval()           { return m_nTargetSelectInterval; }
		unsigned int GetTargetSelectIntervalOnStarting() { return m_nTargetSelectIntervalOnStarting; }
		std::vector<std::string> GetSkipWord()           { return m_vecSkipWord; }

		unsigned int GetFhsHotContentListenPort()        { return m_nFhsHotContentListenPort; }
		unsigned int GetHotContentCreateMinimumFd()      { return m_nCacheCreateMinimumFdCount; }
		unsigned int GetMaxCacheThread()                 { return m_nMaxCacheThread; }
		unsigned int GetCacheFileTimeout()               { return m_nCacheFileTimeout; }
		
	
		

};

#endif /* __SERVICE_CONFIG_H__ */

