/****************************************************************************
                SendInfo Worker 에서 data 송수신을 담당할 socket class
                -----------------------------------------

    begin      : 2015/07/16
    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_SEND_INFO_H__
#define __SOCKET_SEND_INFO_H__

#include "BaseSocket.h"
#include "ProtocolSendInfo.h"
#include "ShmManager.h"

#include <string>
#include <vector>


// CSocketSendInfo
// Worker SendInfo 에서 TCP 통신 및 data 송수신을 담당할 class.
class CSocketSendInfo: public CBaseSocket
{
	public:

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

	private:

		// Packet Header 변수
		struct PacketHeaderSendInfo 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_ALIVE_FHS 요청에 대한 Body 수신 처리.
		// - protocol version 에 따른 처리 필요.
		// param strHostname [out] 수신된 hostname 정보.
		// return false socket 오류, 해당 protocol version 미지원, RC ID 불일치 등 비정상 상황.
		//        그외 true
		bool GetPacketBodyAliveFhs( std::string & strHostname );
		
		// COMMAND_ALIVE_FHS 요청 관련 error message 전송
		bool SendResultAliveFhsError( std::string & strMessage );
		
		// COMMAND_ALIVE_FHS 요청 관련 SKIP result 전송
		bool SendResultAliveFhsSkip( void );
		
		// COMMAND_ALIVE_FHS 요청 관련 Alive FHS 목록 전송
		bool SendResultAliveFhs( std::vector< struct FhsServiceStatInfo > & vecAliveFhs );
		

};


#endif /* __SOCKET_SEND_INFO_H__ */

