/****************************************************************************
				rc_apid header for API Server 와 통신을 담당하는 socket class 
				-----------------------------------------

	begin      : 2021/03/11
	copyright  : (C) 2005 Solbox Inc.
	author     : huibong
	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_API_CLIENT_H__
#define __SOCKET_API_CLIENT_H__

#include "BaseSocket.h"

#include <string>

// API server Client 와 통신 관련 id 정보 ( 숫자로 9 이며.. network byte order 변환시.. 0x09000000 임)
#define HEADER_ID_CODE_API_CLIENT		0x09000000


// API Server client 와 TCP 통신 관련 request header 구조체
struct RequestHeaderApiClient {

	unsigned int id;			// packet 유효성 관리 코드   (Nwtwork Byte order)
	unsigned int data_length;	// packet data 부분의 길이값 (Network Byte order)
};


// API Server 와 TCP 통신 및 Data 송,수신 처리를 담당할 class
class CSocketApiClient : public CBaseSocket
{

	public:
		// 생성자
		// param [in] clientSocket API Server 와 연결된 socket.
		CSocketApiClient( int clientSocket );

		// 소멸자
		~CSocketApiClient();


	private:

		// API Server client 와 통신 관련 request header
		struct RequestHeaderApiClient m_stRequestHeader;

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

		// Packet Hader 에 저장된 data 부분의 길이 정보값
		unsigned int m_uRequestDataLen;


		// log 기록시 사용할 thread id 정보
		long m_lThreadId;


	public:

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

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

		// Request size, hash 정보 추출 요청 관련 body 정보 수신 처리
		// retrun 1 : 성공
		//        0 : body 정보 파싱 오류 발생시
		//       -1 : socket 오류 또는 정의된 Data 가 아닌 경우.
		int GetRequestSizHashBody( std::string & szService, std::string & szUri, std::string& szErrorMessage );


		// size, hash 요청 관련 오류 발생 결과를 client 에게 전송
		bool SendResultSizeHashError( std::string & szService, std::string & szUri, std::string & szMessage );
		
		// size, hash 요청 관련 최종 처리 발생 결과를 client 에게 전송
		bool SendResultSizeHash( std::string & szService, std::string & szUri, unsigned long long & uContentLength, std::string & szHash );




};

#endif /* __SOCKET_API_CLIENT_H__ */

