/***************************************************************************
                UDP Listener Class
                -----------------------------------------
    begin      : 2010/05/17
    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 __UDP_LISTENER__
#define __UDP_LISTENER__

#include <pthread.h>
#include <string>
#include "Logger.h"
#include "EventDataManager.h"

using namespace std;

/// @brief Protocols
#define CMD_UDP_BASE  1000 
#define CMD_UDP_ERROR CMD_UDP_BASE
#define CMD_EVENT_INFO_ONE ( CMD_UDP_BASE + 101  )
#define CMD_EVENT_INFO_ALL ( CMD_UDP_BASE + 102  )

/// @brief CUdpListener 
/// UdpListener 는 client에서 udp 요청되는 패킷을 수신해서 관리하게 되며, 
/// raid 정보 조회 후, 결과를 전송한다.
/// 내부적으로 Thread를 사용하고있다. 
class CUdpListener 
{
    public:
        /// @brief 생성자
        /// @param [in] pEventManager CEventManager 객체
		CUdpListener(CEventDataManager* pEventDataManager);
        ~CUdpListener();
        
        /// @brief Init 함수 클래스 환경이 정상적인지를 검사한다.
        /// @param [in] nPort UDP listen port 번호.
        /// @return 성공: true, 실패: false
        bool Init(int nPort);

        /// @brief Thread를 생성하고, 이를 시작한다.
        /// @param none
        /// @return 성공: true, 실패: false
        bool Start();
        
    private:
		// 이벤트 저장 객체 
		CEventDataManager* m_pEventDataManager;
        
        // 쓰레드 핸들
        pthread_t m_threadHandle;
        
        // 쓰레드 시작 루틴이다.
        static void* EntryPoint(void* arg);

        int m_nSocket;
        
        // 해당 함수의 내용은 수정하지 말것.
        void Execute();
        

		/// @brief 클라이언트로 부터 받아온 스트링 프로토콜을 정수 프로토콜로 변환한다.
		/// @param [in] szProtocol 클라이언트로부터 전송받은 스트링 프로토콜.
		/// @return 성공: 양의 정수의 프로토콜 값. 실패: -1
		int  ParsingPacket(const char * szProtocol);
		int SendMsg(char * szSndBuffer,int size, struct sockaddr_in * cliaddr, socklen_t nAddrSize);
		CEventData  m_evtData;
};
#endif // __UDP_LISTENER__
