/*
 * eventreg.h - CC31xx/CC32xx Host Driver Implementation
 *
 * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/ 
 * 
 * 
 *  Redistribution and use in source and binary forms, with or without 
 *  modification, are permitted provided that the following conditions 
 *  are met:
 *
 *    Redistributions of source code must retain the above copyright 
 *    notice, this list of conditions and the following disclaimer.
 *
 *    Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the 
 *    documentation and/or other materials provided with the   
 *    distribution.
 *
 *    Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
 *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
*/

#ifndef EVENTREG_H_
#define EVENTREG_H_

#ifdef    __cplusplus
extern "C"
{
#endif

/*!
    \defgroup event_registration
    \short Allows user to register event handlers dynamically. 

*/
/*!

    \addtogroup event_registration
    @{

*/

typedef enum
{
	SL_EVENT_HDL_FATAL_ERROR,
	SL_EVENT_HDL_DEVICE_GENERAL,
	SL_EVENT_HDL_WLAN,
	SL_EVENT_HDL_NETAPP,
	SL_EVENT_HDL_SOCKET,
	SL_EVENT_HDL_HTTP_SERVER,
	SL_EVENT_HDL_NETAPP_REQUEST,
	SL_EVENT_HDL_MEM_FREE,
	SL_EVENT_HDL_SOCKET_TRIGGER,
	SL_NUM_OF_EVENT_TYPES
}SlEventHandler_e;

typedef struct SlEventsListNode_s
{
	void *event;
	struct SlEventsListNode_s *next;
}SlEventsListNode_t;

#ifdef SL_RUNTIME_EVENT_REGISTERATION

/*!
    \brief register events in runtime

    this api enables registration of the SimpleLink host driver in runtime.

    \param[in]  EventHandlerType event type - SlEventHandler_e - to register

    \param[in]  EventHandler pointer to the event handler

    \return 0 on success, error otherwise

    \sa     sl_RegisterEventHandler

    \note   registration of event with NULL, clears any registered event.
*/
_i32 sl_RegisterEventHandler(SlEventHandler_e EventHandlerType , void* EventHandler);



_i32 _SlIsEventRegistered(SlEventHandler_e EventHandlerType);

/******************************************************************************
    sl_RegisterLibsEventHandler

    \brief  this function registers event handlers from external libraries in runtime.

    the allocation and memory maintenance of the SlEventsListNode_t is on the library
    Responsibility.

    RETURNS:        success or error code.
******************************************************************************/

_i32 sl_RegisterLibsEventHandler(SlEventHandler_e EventHandlerType , SlEventsListNode_t* EventHandlerNode);

/******************************************************************************
    sl_UnregisterLibsEventHandler

    DESCRIPTION:
    this function unregisters event handlers from external libraries in runtime.
    the SlEventsListNode_t that was used for registration, must be used to unregister that event handler.

    the allocation and memory maintenance of the SlEventsListNode_t is on the library
    Responsibility.

    RETURNS:        success or error code.
******************************************************************************/
_i32 sl_UnregisterLibsEventHandler(SlEventHandler_e EventHandlerType , SlEventsListNode_t* EventHandlerNode);

/*!

 Close the Doxygen group.
 @}

 */


void _SlDeviceFatalErrorEvtHdlr(SlDeviceFatal_t *pSlFatalErrorEvent);
void _SlDeviceGeneralEvtHdlr(SlDeviceEvent_t *pSlDeviceEvent);
void _SlWlanEvtHdlr(SlWlanEvent_t* pSlWlanEvent);
void _SlNetAppEvtHdlr(SlNetAppEvent_t* pSlNetAppEvent);
void _SlSockEvtHdlr(SlSockEvent_t* pSlSockEvent);
void _SlNetAppHttpServerHdlr(SlNetAppHttpServerEvent_t *pSlHttpServerEvent, SlNetAppHttpServerResponse_t *pSlHttpServerResponse);
void _SlNetAppRequestHdlr(SlNetAppRequest_t *pNetAppRequest, SlNetAppResponse_t *pNetAppResponse);
void _SlNetAppRequestMemFree (_u8 *buffer);
void _SlSocketTriggerEventHandler(SlSockTriggerEvent_t* pSlSockTriggerEvent);

#endif /* SL_RUNTIME_EVENT_REGISTERATION */


#ifdef  __cplusplus
}
#endif /* __cplusplus */


#endif /* EVENTREG_H_ */
