/***************************************************************************
                IP Cache Class
                -----------------------------------------
    begin      : 2010/03/02
    copyright  : (C) 2005 SolutionBox Inc.
    author     : Service 1 Team
    email      : svc1@solbox.com
    version    : 1.0

    CopyRight(C) 2005 SolutionBox Inc. All Rights reserved.
    Redistribution and use in source and binary forms, with or with out
    modification, are not permitted in outside of SolutionBox Inc.
***************************************************************************/

#ifndef __IPCACHE_H__
#define __IPCACHE_H__

#include <string>
#include <map>


/// @brief CIPCache class
class CPrivateIP
{
	public :
		CPrivateIP();
		CPrivateIP(const std::string szPrivateIP, const long time_lastUpdated );
		
		/// @brief 사설 IP값을 저장한다.
		std::string m_szPrivateIP;
		long m_time_lastUpdated;
	private :
};


/// @brief CIPCache class
class CIPCache
{
	public :

		CIPCache();
		~CIPCache();

		/// @brief 요청된 Host명(혹은 공인IP)에 대해 캐시된 데이터를 반환한다.
		/// @param szPublic [in] 요청 Host명 값.
		/// @param szPrivate [out] 요청 Host에 매칭되는 Private IP값. 
		/// @return 성공은 return true, 그 외에는 return false
		bool GetPrivateIP( const std::string& szPublic, std::string& szPrivate);

		/// @brief 요청된 Host명(혹은 공인IP)에 대해 캐시된 데이터를 저장한다.
		/// @param szPublic [in] 요청 Host명 값.
		/// @param szPrivate [in] 요청 Host에 매칭되는 Private IP값. 
		/// @return 성공은 return true, 그 외에는 return false
		bool SetPrivateIP(const std::string& szPublic, std::string& szPrivate);

		/// @brief timeout 만료 기준을 설정한다. default = 300.
		/// @param time_timeout [in] 만료 설정 할 초(second).
		/// @return 성공은 return true, 그 외에는 return false
		bool SetTimeout(const long time_timeout);

		/// @brief 설정된 timeout 만료 값을 얻어온다. default = 300.
		/// @param time_timeout [out] 만료 설정 할 초(second).
		/// @return 성공은 return true, 그 외에는 return false
		bool GetTimeout(long& time_timeout);


	private :
		/// @brief IP Pair를 저장하는 map 
		typedef std::map<std::string, CPrivateIP> IPPairMap;

		/// @brief SetTimeout()을 통해 설정되는 값.
		long m_time_timeout;

		/// @brief Public IP와 Private IP의 쌍을 가지는 Map,  최근 수정 시각을 포함한다.
		IPPairMap m_IPPair;

		/// @brief ipPairMap의 mutex
		pthread_mutex_t m_mx_IPPairMap;
}; 

#endif //__IPCACHE_H__
