/****************************************************************************
                fimngd 와 data 송수신을 담당할 socket class
                -----------------------------------------

    begin      : 2015/08/27
    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 __SOCKET_FIMNGD_H__
#define __SOCKET_FIMNGD_H__

#include "BaseSocket.h"
#include "ProtocolFimngd.h"

#include <vector>


// fimngd 로 부터 수신된 각 서비스별 network 통계 정보를 저장하기 위한 구조체
struct ServiceNetworkStat {

	char        hostname[FIMNGD_HOST_NAME_MAX_LENGTH + 1];   // hostname, 최대 63자까지만 허용.

	uint32_t	timestamp;          // timestamp
	int         user_seq;           // user sequence
	int         svc_seq;            // service sequence

	uint64_t    down_content_size;  // download content size
	uint64_t    up_content_size;    // upload content size

	uint64_t    down_traffic;       // download packet size
	uint64_t    up_traffic;         // upload packet size
};

// CSocketFimngd
// fimngd 와 TCP 통신 및 data 송수신을 담당할 class.
class CSocketFimngd : public CBaseSocket
{
	public:

		// 생성자
		// param [in] clientSocket client 와 통신 연결된 socket.		
		CSocketFimngd( int clientSocket );
		
		// 소멸자
		~CSocketFimngd();
		

	private:

		// Packet Header 변수
		struct PacketHeaderFimngd m_packetHeader;

		// m_packetHeader 구조체의 크기를 저장하기 위한 상수
		const int m_iPacketHeaderLen;

		// Packet Header 에 저장된 Data 부분의 길이 정보값.
		unsigned int m_uPacketDataLen;


		
	public:
	
		// Packet Header 부분의 수신 처리를 위한 함수
		// param command  [out] 수신된 command code		
		// param timeout  [in]  대기시간.
		// retrun 0 : timeout
		//        1 : 성공
		//       -1 : socket 오류 또는 정의된 Data 가 아닌 경우.
		int GetPacketHeader( char & command, int timeout = DEFAULT_DATA_RECEIVE_TIMEOUT );
		
		// Packet Header 정보를 Log 파일에 Logging 처리 ( Debug 처리를 위한 함수)
		void PrintHeaderToLog( void );
		
		// COMMAND_SERVICE_NETWORK_STAT 요청 관련 Body 수신 처리.
		// - protocol version 에 따른 처리 필요.
		// param vecNetworkStat [out] 수신된 각 서비스별 network 통계 정보 저장
		// return false socket 오류, 해당 protocol version 미지원, RC ID 불일치 등 비정상 상황.
		//        그외 true
		bool GetPacketBodyNetworkStat( std::vector< struct ServiceNetworkStat > & vecStat );		
				
		// NEW 2016-05-27 huibong
		// - #27106 에 의해 
		// - fimngd 로 부터 Network 통계 수신시 Protocol version 0x01 이상이면.. 처리 결과를 전송하도록 기능 추가
		// - bSuccess = true  : 성공인 경우.. Packet header 에 성공으로 표시하여 전달. ( 성공시 추가 메시지는 전달 안함)
		//            = false : 실패인 경우.. Packet header 에 실패로 표시하고.. 전달할 메시지가 있는 경우.. 해당 정보까지 전달. 
		bool SendResultNetworkStat( bool bSuccess, std::string& strMessage );

		
};


#endif /* __SOCKET_FIMNGD_H__ */

