#include "SocketGms.h"
#include "Logger.h"
#include "ProcessConfig.h"

#include <string.h>
#include <arpa/inet.h>
#include <stdio.h>


CSocketGms::CSocketGms()
	: CBaseSocket( SOCKET_NOT_VALID )
{
	// GMS 서버 정보 설정.
	m_strGmsServer = CProcessConfig::GetInstance()->GetGmsServer();
	m_nGmsPort     = CProcessConfig::GetInstance()->GetGmsPortStat();
	
	// 전송할 Message Header 정보 중 공통 부분 초기화.
	// 전송할 Header 초기화..
	memset( &m_stHeader, 0, sizeof( struct PacketHeaderGms ) );

	// 전송 Header 조립..
	// szTransactionID 정보는 거의 사용하지 않으므로 빈값으로 전송한다.

	// ulmode 는 GMS_MSG_MODE_VRCD_STATUSD_RTS_STATUS (0x0a01) 을 Network Byte order 로 변환하여 전송.
	m_stHeader.ulMode = htonl( GMS_MSG_MODE_VRCD_STATUSD_RTS_STATUS );

	// szIssuer 값은 프로그램 명을 입력 처리.
	sprintf(m_stHeader.szIssuer, "%s", PROG_NAME );

	// szServiceID 값은 사용하지 않음.

	// ulResult 값은 GMS_OK_ALL_PASSED (0x1000) 을 Network Byte Order 로 변환하여 전송.
	m_stHeader.ulResult = htonl( GMS_OK_ALL_PASSED );
}


CSocketGms::~CSocketGms()
{
	// 소멸자 Socket 명시적 Close 처리.
	Close();
}


bool CSocketGms::SendData( unsigned int nCount, char * szBuffer, unsigned int nBufferSize )
{
	// messae header 상의 ulBodyLength 는 FHS 갯수(int) 부분관 전송될 Body 부분 합 Size 임 ( Network Byte Order )
	m_stHeader.ulBodyLength = htonl( sizeof(int) + nBufferSize );

	//_LOG( LDBG, "GmsSendSocket: GMS send header size..[%u], count[%u], buffersize[%u]  body length[%u]" 
	//		, sizeof(struct gms_message_header), nCount, nBufferSize, sizeof(int) + nBufferSize ); 
	
	// GMS 장비와 TCP 연결.
	if( Connect( m_strGmsServer, m_nGmsPort ) == false )
	{
		LOG( LERR, "CSocketGms: GMS connect fail.[%s][%d]", m_strGmsServer.c_str(), m_nGmsPort );
		
		Close();
		return false;
	}
	
	
	// Message Header 부분을 전송...
	if( WriteN( &m_stHeader, sizeof( struct PacketHeaderGms ) ) != sizeof( struct PacketHeaderGms ) )
	{
		LOG( LERR, "CSocketGms: GMS message header send fail." );
		Close();
		return false;
	}

	// Message Body 부분 중.. 장비 수 부분을 전송한다.
	if( WriteN( &nCount, sizeof( int )) != sizeof(int) )
	{
		LOG( LERR, "CSocketGms: GMS message body count_info[%u] send fail.", nCount );
		Close();
		return false;
	}

	// Message Body 부분 전송.. (존재하는 경우만 )
	if( nBufferSize > 0 )
	{
		if( WriteN( szBuffer, nBufferSize) != nBufferSize )
		{
			LOG( LERR, "CSocketGms: GMS message body[%u] send fail.", nBufferSize );
			Close();
			return false;
		}
	}
	
	_LOG( LINF, "CSocketGms: FHS info[count: %u] send to GMS OK..GMS[%s] port[%d]", nCount, m_strGmsServer.c_str(), m_nGmsPort ); 

	// 전송 완료 후 Connection 을 종료 처리한다. (기존 rc_vrcd 소스 확인시 전송시에만 접속 후 세션 종료 처리함 )
	Close();

	return true;
}
