/****************************************************************************
                Send Data to GTS cc_statd
                -----------------------------------------

    begin      : 2015/09/01
    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 __GTS_SEND_SOCKET_H__
#define __GTS_SEND_SOCKET_H__


#include <unistd.h>
#include <stdint.h>
#include <vector>
#include <string>

#include "BaseSocket.h"


// GTS cc_statd 로 각 서비스별 네트워크 트래픽 정보 전송을 위해
// local db 의 조회결과를 저장하기 위한 구조체...
struct gts_send_stat_network {

	unsigned int timestamp;  // 5분 단위 timestamp 값 저장...

	int user_seq;            // 고객사 sequence 정보..
	int svc_seq;             // 서비스 sequence 정보.

	uint64_t down_traffic;                 // 서비스에서 5분간 발생된 download Packet량.. Byte 단위
	uint64_t up_traffic;                   // 서비스에서 5분간 발생된 upload   Packet량.. Byte 단위

	uint64_t down_content_size;            // 서비스에서 5분간 발생된 download content size. Byte 단위
	uint64_t up_content_size;              // 서비스에서 5분간 발생된 upload   content size. Byte 단위
	
	int send_flag;                         // cc_statd 로의 전송 여부를 판단하여... local db 정보 update 에 사용하기 위한 flag 값..
	                                       // 0: not send(default), 1: sent ok, 2: ignore (통계 정보 전송하지 않도록 설정된 경우.)
};

// GTS cc_statd 로 각 서비스별 스토리지 사용량  정보 전송을 위해
// local db 의 조회결과를 저장하기 위한 구조체...
struct gts_send_stat_storage {

	unsigned int timestamp;  // 5분 단위 timestamp 값 저장...

	int user_seq;            // 고객사 sequence 정보..
	int svc_seq;             // 서비스 sequence 정보.

	uint64_t quota;          // Storage 할당량 (Byte)
	uint64_t used;           // Storage 사용량 (Byte)

	int send_flag;           // cc_statd 로의 전송 여부를 판단하여... local db 정보 update 에 사용하기 위한 flag 값..
	                         // 0: not send(default), 1: sent ok, 2: ignore (통계 정보 전송하지 않도록 설정된 경우.)
};


// GTS cc_stat 로 통계 정보를 전송하지 않을 서비스 정보를 저장하기 위한 구조체.
// Local DB stat_not_send_service table 결과를 저장.
struct gts_not_send_service {

	int user_seq;            // 고객사 sequence 정보..
	int svc_seq;             // 서비스 sequence 정보.
};


/// @brief CGtsSendSocket
/// 본 클래스는 GMS 와 TCP 연결을 수행한 후...
/// 전달받은 정보를 전송 정보를 XML 규칙에 맞도록 조합한 후... GTS cc_statd 로 전송 처리하는 역활을 수행한다.
/// GTS cc_statd 와의 통신은 1개 Data 전송 후.. 자동으로 세션이 끊어지는 구조임.. (cc_statd 구조에 맞도록 처리 )
class CGtsSendSocket : public CBaseSocket
{
	public:
		
		CGtsSendSocket();
		
		~CGtsSendSocket();

		// GTS cc_statd 로 서비스 트래픽 관련 통계 정보를 전송한다.
		bool SendStatNetwork( std::vector<struct gts_send_stat_network> &vecNetworkStat );

		// GTS cc_statd 로 서비스 Storage 사용량 정보를 전송한다.
		bool SendStatStorage( std::vector<struct gts_send_stat_storage> &vecStorageStat );


	private:

		// 통계 정보 중 GTS 로 전송하지 않을 서비스 정보를 Local DB 에서 조회하여 저장하기 위한 함수.
		bool InitNotSendService();
		
		// 전달받은 서비스 정보가 GTS 로 통계을 전송하지 않을 서비스 목록에 포함되어 있는지 검사
		// true  : GTS 로 통계 전송.
		// false : GTS 로 통계 전송하지 않을 서비스임.
		bool IsSendStat(const int & user_seq, const int & svc_seq );


	private:

		// GTS Server 정보.
		std::string m_strGtsServer;
		int         m_nGtsPort;

		// RC ID 정보
		std::string m_strRcId;

		// GTS 로 전송하지 않을 서비스 정보를 저장하기 위한 vector 객체.
		std::vector<struct gts_not_send_service> m_vecNotSendService;



};


#endif /* __GTS_SEND_SOCKET_H__ */

