/****************************************************************************
                csagentd socket class
                -----------------------------------------

    begin      : 2015/07/02
    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_CSAGENTD_H__
#define __SOCKET_CSAGENTD_H__

#include "BaseSocket.h"
#include "ShmDefine.h"
#include "ProtocolCsagentd.h"


// CSocketCsagentd
// FHS csagentd 와의 TCP socket 통신을 관리하고... Data  수신 처리를 담당하는 class
class CSocketCsagentd: public CBaseSocket
{
	public:

		// 생성자
		// param [in] clientSocket client 와 통신 연결된 socket.
		// param [in] szRcid       RC ID 정보.
		CSocketCsagentd( int clientSocket, const char * szRcid  );
		
		// 소멸자
		~CSocketCsagentd();


		// 수신된 Data 를 전달받은 인자에 설정하여 반환 처리.
		// param [out] strHostname 장비의 hostname 정보.
		// param [out] pData       수신된 data
		// param [in]  timeout	   대기 timeout (sec)		
		// return  -1 : Socket 오류 또는 잘못된 Data 수신시 ( RC ID 가 다른 경우 포함)
		//          0 : timeout 발생시
		//          1 : 정상
		int GetSystemInfo( std::string & strHostname, struct SystemInfo * pData, int timeout = DEFAULT_DATA_RECEIVE_TIMEOUT );

		// 수신된 Data 를 전달받은 인자에 설정하여 반환 처리.
		// param [out] strHostname      장비의 hostname 정보.
		// param [out] iServiceStat     수신된 data
		// param [out] iStorageMaxUsage 수신된 data
		// param [in]  timeout	   대기 timeout (sec)		
		// return  -1 : Socket 오류 또는 잘못된 Data 수신시 ( RC ID 가 다른 경우 포함)
		//          0 : timeout 발생시
		//          1 : 정상
		int GetServiceInfo( std::string & strHostname, int & iServiceStat, int & iStorageMaxUsage, int timeout = DEFAULT_DATA_RECEIVE_TIMEOUT );
		

	private:

		// Packet Header 변수
		struct PacketHeaderCsagentd m_packetHeader;

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

		// Packet Header 에 저장된 Data 부분의 길이 정보값.
		unsigned int m_uPacketDataLen;
		
		// Packet Data 의 유효성을 검증할 RC ID 정보
		// - 생성자를 통해 전달받음.
		std::string m_strRcId;


	protected:

		// Packet Header 정보를 Log 파일에 Logging 처리 ( Debug 처리를 위한 함수)
		void PrintHeaderToLog( void );

		// Packet Header 부분의 수신 처리를 위한 함수
		// param timeout [in] 대기시간.
		// retrun 0 : timeout
		//        1 : 성공
		//       -1 : socket 오류 또는 정의된 Data 가 아닌 경우.
		int GetPacketHeader( int timeout = DEFAULT_DATA_RECEIVE_TIMEOUT );

		// COMMAND_TRANSFER_SYSTEM 요청 관련 Packet Body 부분을 수신 처리
		bool GetPacketBodySystem( std::string & strHostname, struct SystemInfo * pData );
		
		// COMMAND_TRANSFER_SERVICE 요청 관련 Packet Body 부분을 수신 처리
		bool GetPacketBodyService( std::string & strHostname, int & iServiceStat, int & iStorageMaxUsage );

};


#endif /* __SOCKET_CSAGENTD_H__ */

