/****************************************************************************
                csagentd shared memory interface function class
                -----------------------------------------

    begin      : 2015/04/21
    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 __FHS_SHM_H__
#define __FHS_SHM_H__

#include "ShmDefine.h"

#include <string>
#include <map>


// 공유메모리 영역 전체에 대한 접근 인터페이스를 제공하기 위한 클래스
class CFhsShm
{
	private:
		
		// 공유메모리에 대한 포인터
		struct FhsInfo * const m_pShm;

		// 서비스 상태 code 에 대한 문자열 정보를 저장하기 위한 변수.
		std::map<int, std::string> m_mapServiceStatString;
		
	public:

		// 생성자
		CFhsShm( struct FhsInfo * p );

		// 소멸자
		~CFhsShm();


	public:

		// 함수 선언시 const 구문 사용 이유
		// - 멤버변수인 m_pShm 값이 변경될 경우...엉뚱한 메모리 영역을 참조하는 불상사 발생.
		// - 따라서 코딩시 m_pShm 값이 변경되지 않음을 선언하여....
	    // - 컴파일시 문제가 없는지 확인하기 위한 목적으로 사용함.
	    // - map 관련 멤버 변수 사용으로 인해.. 일부 함수에서는 사용하지 못함.
	

		// 멤버 변수인 공유메모리에 대한 포인터가 유효하지 여부를 판단하기 위한 함수.
		// return 유효한 경우 true, NULL 인 경우 false
		bool IsValid( void ) const;

		// 공유메모리 전체 영역을 초기화하기 위한 함수.
		// return
		void ClearAll( void ) const;

		// 공유메모리 정보를 로그에 write
		void Print( void ) ;
		

	public:
		// shared memory 각 항목에 대한 interface 함수
		
		// hostname
		bool SetHostname( const char * name ) const;
		const char * GetHostName()  { return m_pShm->system.hostname; }
		
		// loadaverage
		bool SetLoadaverage( const int & index, const double & value ) const;

		// memory
		void SetMemoryTotal( const uint64_t & value ) const;
		void SetMemoryFree(  const uint64_t & value ) const;

		// swap		
		void SetSwapInfo( const uint64_t & total, const uint64_t & used ) const;
		
		// storage 용량, 사용률 
		void SetStorageInfo( const uint64_t & total, const uint64_t & avail, const int & max_usage ) const;
		int  GetStorageMaxUsage() const { return m_pShm->system.storage_max_usage; }
		uint64_t GetStorageTotal() const { return m_pShm->system.storage_total; }
		
		// Disk max queuelength, max busy.
		void SetDiskInfo( const uint64_t & queue, const double & busy ) const;

		// Network packet, traffic
		void SetNetworkInfo( const uint64_t & packetIn, const uint64_t & packetOut, const uint64_t & trafficIn, const uint64_t & trafficOut ) const;

		// TCP 세션 정보
		void SetTcpInfo( const unsigned int & total, const unsigned int & tcp80, const unsigned int & tcp80Establish ) const;


		// Service 상태 정보 설정.
		// false - 정의되지 않은 상태값인 경우...
		bool SetServiceStat( const int & stat );

		// Service 상태 정보 반환.
		int GetServiceStat() { return m_pShm->service.stat; }
		
		// Service 상태 정보에 대한 문자열 반환.
		const char * GetServiceStatString( const int & stat );

		// 현재 Service 상태 정보에 대한 문자열 반환.
		const char * GetServiceStatString();
		
		// 2018-02-07 NEW huibong Disk Busy 상황에서 Read Only 상태로 변경을 위한 Disk queue, busy 정보 반환 함수 추가 (#31701)
		uint64_t GetDiskMaxQueue() const { return m_pShm->system.disk_max_queue; }
		double GetDiskMaxBusy() const { return m_pShm->system.disk_max_busy; }


		// 2018-01-31 NEW huibong 공유메모리 상에 신규로 추가 time 관련 처리를 위한 함수 추가 (#31701)

		// Storage last check 시간 정보 업데이트
		// 전달받은 인자값이 true 인 경우 시간 정보 설정, false 인 경우 -1 설정 처리함.
		void UpdateTimeStorageCheck( bool bCheckSuccess );

		// Service 상태 Check Start 시간 정보 업데이트
		void UpdateTimeServiceCheck( void );
		
		// System 상태 Check Start 시간 정보 업데이트
		void UpdateTimeSystemCheck( void );

		time_t GetTimeStorageCheck() const { return m_pShm->time_storage_check_ok_sec; }
		time_t GetTimeServiceCheck() const { return m_pShm->time_service_check_start_sec; }
		time_t GetTimeSystemCheck()  const { return m_pShm->time_system_check_start_sec; }


	public:
		// RCTS 전송 처리 모듈에서 사용하기 위한 interface 함수.
		const struct SystemInfo * GetSystemInfo() { return &(m_pShm->system); };
		const struct ServiceStatus * GetServiceStatus() { return &( m_pShm->service ); };

};


#endif /* __FHS_SHM_H__ */

