#include "CacheRequestData.h"

#include <stdlib.h>

#include "Logger.h"


CCacheRequestData::CCacheRequestData()
{
	m_uContentLength = 0;
	m_uConcurrentFd  = 0;
}

// Set 함수
void CCacheRequestData::Set( struct stCacheRequestBody * pRequestBody )
{
	m_strRcid         = pRequestBody->szRCID;
	m_strFileNameHash = pRequestBody->szFileNameHash;
	m_strRequestHost  = pRequestBody->szHostname;
	m_strServiceSeq   = pRequestBody->szServiceID;

	m_uContentLength = atoll( pRequestBody->szContentLength );
	m_uConcurrentFd  = atoi( pRequestBody->szFDCount );

	Trim( m_strRcid );
	Trim( m_strFileNameHash );
	Trim( m_strServiceSeq );
}

// 본 객체의 재사용을 위한 멤버 변수 초기화 함수
void CCacheRequestData::Init()
{
	m_strRcid.clear();
	m_strFileNameHash.clear();
	m_strRequestHost.clear();
	m_strServiceSeq.clear();
	m_uContentLength = 0;
	m_uConcurrentFd = 0;
}

// Key 값 생성 지원을 위해 수신된 filename_hash 정보 중
// 경로 정보를 제외한 hash name 만을 반환 처리한다.
// @param [OUT] value 추출된 hash name 정보 ( 경로정보 제외 )
// @return false hash name 정보가 유효화지 않은 경우.
//         true  정상.
bool CCacheRequestData::GetOnlyHashFileName( std::string & value )
{
	if( m_strFileNameHash.empty() == true )
		return false;

	std::string::size_type pos = m_strFileNameHash.rfind( '/' );
	if( pos == std::string::npos )
	{
		// 잘못된 filename_hash 정보임.
		return false;
	}

	// 경로 부분을 제외한 hash filename 부분만 추출.
	value = m_strFileNameHash.substr( pos + 1 );
	if( value.empty() == true )
		return false;
	
	return true;
}


void CCacheRequestData::Print()
{
	_LOG( LDBG, "---- cache request data ----" );

	_LOG( LDBG, "rc id          [%s]", m_strRcid.c_str() );
	_LOG( LDBG, "filename_hash  [%s]", m_strFileNameHash.c_str() );
	_LOG( LDBG, "host name      [%s]", m_strRequestHost.c_str() );
	_LOG( LDBG, "service id     [%s]", m_strServiceSeq.c_str() );
	_LOG( LDBG, "content length [%llu]", m_uContentLength );
	_LOG( LDBG, "fd count       [%u]", m_uConcurrentFd );
	
	_LOG( LDBG, "-----------------------------" );

	return;
}

// std 상에 trim 함수가 없어서 직접 구현 아니면 boost/algorithm/string.hpp 상의 boost::trim 함수 사용
void CCacheRequestData::Trim( std::string & str )
{
	if( str.length() == 0 )
		return;

	// 문자열 뒤의 공백, TAB, CR 등의 문자 제거처리.
	std::string::size_type pos = str.find_last_not_of( " \a\b\f\n\r\t\v" );
	if( pos != std::string::npos )
		str.erase( pos + 1 );

	// 문자열 앞의 공백, TAB, CR 등의 문자 제거처리.
	pos = str.find_first_not_of( " \a\b\f\n\r\t\v" );
	if( pos != std::string::npos )
		str.erase( 0, pos );
}
