/***************************************************************************
                Areca Wrapper Class
                -----------------------------------------
    begin      : 2010/05/19
    copyright  : (C) 2010 SolutionBox Inc.
    author     : svc1
    email      : svc1@solbox.com
    version    : 1.0

    CopyRight(C) 2010 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 __ARECA_WRAPPER__
#define __ARECA_WRAPPER__

#include <algorithm>
#include <iostream>


// 가장 중요하고 핵심적인 헤더 파일
#include "arclib.h"	
#include "ethernet.h"
#include "EventData.h"
#include <list>
#include "Logger.h"

using namespace std;

// 필요한 인터페이스에 대한 헤더파일
#if defined(__linux__) || defined(__FreeBSD__)
	#include "linux_comm.h"
	#include "linux_ioctl.h"
	#if defined(__linux__)
		#include "linux_scsi.h"
		#include "linux_pass_ioctl.h"
	#else
		#include "freebsd_scsi.h"
	#endif
#endif

// 정보를 조회할 최대 컨트롤 수.
#define MAX_CONTROLLER_SUPPORTED	64

// for GetEvent()'s first param
#define GET_EVENT_ALL 0
#define GET_EVENT_ONE 1

class CArecaWrapper
{
	public:

		/// @brief 생성자.
		/// @param nEventLevel [in] 필터 할 이벤트 레벨을 지정한다. conf를 통해 받아오게 되며, 레벨은 아래와 같다.
		///<  -------- EVENT LEVEL ---------
		///< 0: Not to report
		///< 1: Serious Error Notification
		///< 2: Error Notification
		///< 3: Warning Notification
		///< 4: Information Notification
		///< ------------------------------
		CArecaWrapper(int nEventLevel);

		/// @brief 소멸자.
		~CArecaWrapper();

		/// @brief Areca Controller의 정보를 얻을 준비를 한다.
		//  @return Areca Controller의 개수를 리턴한다. 없을 경우 -1을 리턴한다.
		int InitArecaControllers(void);


		/// @brief Areca Controller의 정보를 얻을 준비를 한다.
		/// @param nFlag [in] 이벤트 받을 형태를 지정한다. 
		//<       GET_EVENT_ALL : 저장된 모든 이벤트 데이터를 수신한다.
		//<       GET_EVENT_ONE : 최근 1개의 이벤트 데이터를 수신한다.
		/// @param listRet [out] Areca Library를 통해 얻은 데이터를 저장한다. 데이터의 타입은 CEventData 형태이다.
		/// @return 성공시 true, 실패시 false 를 리턴한다.
		bool GetEvent(int nFlag, list<CEventData>& listRet);

	private:
		CArclib m_Arc[MAX_CONTROLLER_SUPPORTED];

		pthread_mutex_t mutex_lock;

		int DiscoveryDevice(void);
		time_t GetTime_t(pSYS_TIME evtTime);
		int m_nEventLevel;
		int m_nTotalCtrl;

		//bool IsDisableUpload( int eventCategory, int eventId );
		//bool DisableUpload();
};
#endif // __ARECA_WRAPPER__
