/***************************************************************************
                fimngd socket control class
                -----------------------------------------
	begin      : 2014/07/04
	copyright  : (C) 2005 Solbox Inc.
	author     : Storage Dev Team
	email      : storage.sd@solbox.com
	version    : 3.3

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

#include "BaseSocket.h"
#include "CacheRequestData.h"


///< BYTE 타입 정의
#ifndef _BYTE_DEFINED
#define _BYTE_DEFINED
typedef unsigned char BYTE;
#endif  // _BYTE_DEFINED

// fimngd 와의 통신 관련 Packet Header
// - 계산상 크기는 16Byte 이지만...
// - 통신상 sizeof() : 20Byte ( 64Bit OS )
struct stFimngdPacketHeader {

	char stx;					// Packet 유효성 관리 코드
	char type;					// Request or Response 여부 ( 0x00: Request, 0x01: Response )
	char command[4];			// Command Code ( 4 Byte) : 3th 0x01 설정
	char result[4];				// Result Code  ( 4 Byte )
	unsigned int  data_length;	// Packet Data 부분의 길이값 ( Network Byte Order 사용)
	char extend_code[2];		// 확장 및 Padding bits ( 2 Byte )
};


// CFimngdSocketControl
// FHS 의 fimngd 로 부터 Hot Content 정보 수신 처리를 담당할 Socket 처리 Class
class CFimngdSocketControl : public CBaseSocket
{

	public:

		// 생성자.
		// @param [IN] clientSocket client 와 통신 연결된 socket.
		CFimngdSocketControl( int clientSocket );
		
		// 소멸자.
		~CFimngdSocketControl();
		
		// 수신된 Data 를 전달받은 인자에 설정하여 반환 처리
		// @param [OUT] data 수신된 Data 를 저장할 객체에 대한 참조
		// @param [in] timeout 대기 timeout (sec)
		// @return  -1 : Socket 오류 또는 잘못된 Data 수신시
		//           0 : timeout 발생시
		//           1 : 정상
		int GetData( CCacheRequestData & data, int timeout = DEFAULT_DATA_RECEIVE_TIMEOUT );
		


	private:
		
		// Packet Header 변수
		struct stFimngdPacketHeader m_packetHeader;

		// m_packetHeader 구조체의 크기를 저장하기 위한 상수
		const int m_nPacketHeaderLen;
		
		// Packet Header 에 저장된 Data 부분의 길이 정보값.
		unsigned int m_nPacketDataLen;
		

	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 );

		// FHS 의 Hot Content Cache 생성 요청 Packet Body 부분을 수신 처리
		bool GetBodyCacheRequest( CCacheRequestData & data );

		
};

#endif /* __FIMNGD_SOCKET_CONTROL_H__ */

