/***************************************************************************
                Config File Parser Class 
                -----------------------------------------
	begin      : 2010/02/27
	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 __LIBRARY_CONFIG_H__
#define __LIBRARY_CONFIG_H__

#include <string>
#include <map>
#include <vector>

using namespace std;


#define CONFIG_DEFAULT_KEY_DELIMITER   "="
#define CONFIG_DEFAULT_VALUE_DELIMITER ","


/// @brief Config class
/// 1. config 파일의 내용을 파싱처리하여 각 Section, Key 에 해당하는 값을 반환처리
/// 2. config 파일은 [section] 단위로 구분된다.
/// 3. config 파일은 key=value 로 구분가능하며 이는 Delimiter 설정을 통해 변경가능하다.
/// 4. value 값이 다중으로 존재하는 경우 "," 값을 통해 구분가능, Delimiter 변경시 다른 값도 사용가능함.
/// 5. config 파일상에서 "#" 로 시작하는 문자열은 라인 끝까지 주석으로 처리된다.
/// 6. 특정 Key 값에 대한 다중 value 값 조회는 vector<string> 을 통해 수행한다.
/// 7. 만약 다중 value 값이 존재시 string 으로 반환받을 경우 해당 Row 가 통째로 반환된다.
/// 8. 본 객체는 Open , Clear 함수가 호출되기전까지 이전 Config 정보가 저장된다.
class Config
{
	private:
		/// @brief config information saved variable
		// string : section data
		// vector<string> : key=value data
		map< string, vector< string> > m_configData;

		/// @brief Key, Value 구분자 저장 변수
		string m_keyDelimiter;
		string m_valueDelimiter;

	public:
		/// @brief constructor
		Config();
		
		/// @brief destructor
		~Config();

		/// @brief 지정된 Config 파일의 모든 정보를 읽어 내부 변수에 저장처리
		/// @param path [in] Config file 의 전체 경로정보( C 배열 지원을 위해 & 사용안함)
		/// @return On success return true, otherwise return false
		bool Open( const string path );

		/// @brief Config 멤버 변수에 저장된 데이터 삭제처리.
		/// @return void
		void Clear();

		/// @brief 해당 Section, Key 에 해당하는 value 값을 찾아 반환
		/// @param section [in] 찾고자 하는 Section 값
		/// @param key [in] 찾고자 하는 key 값
		/// @param value [out] 해당 Section, Key 에 해당하는 value 값을 저장하기 위한 변수
		/// @return On success return true, otherwise return false
		bool GetConfig( const string& section, const string& key, string& value );

		/// @brief 해당 Section, Key 에 해당하는 value Array 값을 찾아 반환
		/// @param section [in] 찾고자 하는 Section 값
		/// @param key [in] 찾고자 하는 key 값
		/// @param value [out] 해당 Section, Key 에 해당하는 value 값을 저장하기 위한 배열
		/// @return On success return true, otherwise return false
		bool GetConfig( const string& section, const string& key, vector< string >& value );

		/// @brief Key, Value Delimiter Get 함수
		/// @param key [out] key delimiter 값
		/// @param value [out] value delimiter 값
		void GetDelimiter( string& key, string& value )
		{
			key = m_keyDelimiter;
			value = m_valueDelimiter;
		}

		/// @brief Key, Value Delimiter Set 함수
		/// @param key [out] key delimiter 값
		/// @param value [out] value delimiter 값, 지정하지 않을 경우 Default 값이 사용됨.
		void SetDelimiter( string& key, string value = CONFIG_DEFAULT_VALUE_DELIMITER )
		{
			m_keyDelimiter = key; 
			m_valueDelimiter = value;
		}


	protected:
		/// @brief Config 멤버 변수에 저장된 데이터 중 해당 Section 에 해당하는 데이터 반환.
		/// @param section [in] section 명
		/// @param configData [out] 해당 Section 에서 읽은 Cofig 정보를 저장할 string 배열
		/// @return On success return true, otherwise return false
		bool Find( const string& section, vector<string>& configData );

};



#endif /* __LIBRARY_CONFIG_H__ */
