/*
 * EvHandler.c
 *
 * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.      
 * All rights reserved.                                                  
 *                                                                       
 * 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 Texas Instruments 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.
 */

#define __FILE_ID__  FILE_ID_50
#include "IPCKernelApi.h"
#include "EvHandler.h"
#include "osApi.h"
#include "osDebug.h"

#ifndef _WINDOWS
#include "windows_types.h"
#else
#include <windows.h>
#endif /*_WINDOWS*/

#ifdef EV_HANDLER_DEBUG
TI_HANDLE ghEvHandler; /* for debug, remove later*/
#endif

/* ************************** Upper Interface **********************************/

TI_HANDLE EvHandler_Create (TI_HANDLE hOs)
{
    TEvHandlerObj *pEvHandler;

    PRINT(DBG_INIT_LOUD, (" EvHandlerInit\n"));
    pEvHandler = os_memoryAlloc(hOs,sizeof(TEvHandlerObj));
    os_memoryZero(hOs,pEvHandler,sizeof(TEvHandlerObj));

    #ifdef EV_HANDLER_DEBUG
    ghEvHandler= pEvHandler;
      PRINTF(DBG_INIT_VERY_LOUD, ("EvHandlerInit: ghEvHandler set to %08X\n", ghEvHandler));
    #endif

    pEvHandler->hOs = hOs;

    pEvHandler->LastUMEventType = 0xFFFFFFFF;

    return (TI_HANDLE) pEvHandler;
}

TI_UINT32 EvHandlerUnload (TI_HANDLE hEvHandler)
{

    TEvHandlerObj *pEvHandler;

    PRINT(DBG_INIT_LOUD, (" ev_handler_unLoad\n"));
    pEvHandler = (TEvHandlerObj *)hEvHandler;

    os_memoryFree(pEvHandler->hOs,pEvHandler,sizeof(TEvHandlerObj));

    return TI_OK;
}


TI_UINT32 EvHandlerRegisterEvent(TI_HANDLE hEvHandler, TI_UINT8* pData, TI_UINT32 Length)
{
    TEvHandlerObj *pEvHandler;
    IPC_EVENT_PARAMS *pEvParams;
    TI_UINT32 ModuleIndex;

    if( (hEvHandler==NULL) || (pData == NULL)){
        PRINT(DBG_INIT_ERROR, "EvHandler:EvHandlerRegisterEvent Bad Handle passed \n");
        return TI_NOK;
    }

#ifdef EV_HANDLER_DEBUG
    if (ghEvHandler !=  hEvHandler)
    {
        return TI_NOK;
    }
#endif

    pEvHandler  = (TEvHandlerObj *)hEvHandler;
    pEvParams = (IPC_EVENT_PARAMS *)pData;

    PRINTF(DBG_INIT_LOUD, (" EvHandlerRegisterEvent EventType = %d \n",pEvParams->uEventType));

    /* used to be: if ( sizeof(IPC_EVENT_PARAMS) != Length)
       relaxed size checking (okay if output buffer is larger)  */
    if (sizeof(IPC_EVENT_PARAMS) > Length)
    {
        PRINTF(DBG_INIT_ERROR, (" EvHandlerRegisterEvent Error sizeof(IPC_EVENT_PARAMS) != Length,"
                               "%d != %d \n",sizeof(IPC_EVENT_PARAMS), (int)Length));
        return (TI_UINT32)STATUS_INVALID_PARAMETER;
    }

    if (pEvParams->uEventType >= IPC_EVENT_MAX){
        PRINTF(DBG_INIT_ERROR, (" EvHandlerRegisterEvent Error - Invalid Event Type = %d \n",
              pEvParams->uEventType));
        return (TI_UINT32)STATUS_INVALID_PARAMETER;
    }

    ModuleIndex = 0;

    while ((ModuleIndex < MAX_REGISTERED_MODULES) &&
       (pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID != NULL))
    {
        ModuleIndex++;
    }

    if (ModuleIndex == MAX_REGISTERED_MODULES)
    {
        PRINTF(DBG_INIT_WARNING, (" EvHandlerRegisterEvent %d "
                                  "Registration queue full or event already registered!\n",
                                  pEvParams->uEventType));
        return (TI_UINT32)STATUS_INVALID_PARAMETER;
    }

    os_memoryCopy(pEvHandler->hOs,(TI_UINT8*)&pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex],
                    (TI_UINT8*)pEvParams,Length);

    pEvParams->uEventID = (TI_HANDLE)&pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex];

    pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID = pEvParams->uEventID;

    PRINT(DBG_INIT_LOUD, " EvHandlerRegisterEvent Out \n");
    return STATUS_SUCCESS;

}


TI_UINT32 EvHandlerUnRegisterEvent(TI_HANDLE hEvHandler, TI_HANDLE uEventID)
{
    TEvHandlerObj *pEvHandler;
    IPC_EVENT_PARAMS *pEvParams;
    TI_UINT32 ModuleIndex;

#ifdef EV_HANDLER_DEBUG
    if (ghEvHandler !=  hEvHandler )
    {
          return TI_NOK;
    }
#endif

    if (uEventID == NULL)
    {
        return TI_NOK;
    }

    pEvHandler = (TEvHandlerObj *)hEvHandler;
    pEvParams  = (IPC_EVENT_PARAMS *)uEventID;

    PRINTF(DBG_INIT_LOUD, (" EvHandlerUnRegisterEvent EventType = %d \n",pEvParams->uEventType));

    if( pEvParams->uEventType >= IPC_EVENT_MAX){
        PRINTF(DBG_INIT_ERROR, (" EvHandlerRegisterEvent Error Event Type = %d \n",
              pEvParams->uEventType));
        return (TI_UINT32)STATUS_INVALID_PARAMETER;
    }

    ModuleIndex = 0;

    while ((ModuleIndex < MAX_REGISTERED_MODULES) &&
           (pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID != pEvParams->uEventID))
    {
        ModuleIndex++;
    }

    if (ModuleIndex == MAX_REGISTERED_MODULES)
    {
        PRINTF(DBG_INIT_ERROR, (" EvHandlerUnRegisterEvent %d "
                               "Registration queue doesn't hold this event!\n",
                               pEvParams->uEventType ));
        return (TI_UINT32)STATUS_INVALID_PARAMETER;
    }
    pEvHandler->RegistrationArray[pEvParams->uEventType][ModuleIndex].uEventID = NULL;

    return STATUS_SUCCESS;
}

/* ************************** Upper Interface End*********************************/

/* ************************** Bottom Interface **********************************/

TI_UINT32 EvHandlerSendEvent(TI_HANDLE hEvHandler, TI_UINT32 EvType, TI_UINT8* pData, TI_UINT32 Length)
{
    TEvHandlerObj *pEvHandler;
    IPC_EV_DATA*         pNewEvent;
    TI_UINT32            TailIndex=0;
    TI_UINT32            ModuleIndex=0;

    PRINTF(DBG_INIT_LOUD, (" EvHandlerSendEvent %d  \n", EvType));

    if(hEvHandler == NULL){
        PRINT(DBG_INIT_ERROR, "EvHandlerSendEvent Bad Handle passed \n");
        return TI_NOK;
    }

#ifdef EV_HANDLER_DEBUG
    if (ghEvHandler !=  hEvHandler)
    {
        return TI_NOK;
    }
#endif

    pEvHandler  = (TEvHandlerObj *)hEvHandler;

    TailIndex   = pEvHandler->SendEventArray.TailIndex;

    while ((ModuleIndex < MAX_REGISTERED_MODULES) && (EvType <= IPC_EVENT_MAX))
    {
        if (pEvHandler->RegistrationArray[EvType][ModuleIndex].uEventID != NULL )
        {
            if(pEvHandler->SendEventArray.Counter == MAX_SEND_EVENTS)
            {
                PRINT(DBG_INIT_ERROR, " EvHandlerSendEvent Array Full u Fool! \n");
                return TI_NOK;
            }

            pNewEvent = &pEvHandler->SendEventArray.Array[TailIndex];

            /* copy the event parameters and data to the events queue*/
            os_memoryCopy(pEvHandler->hOs,(TI_UINT8*)&pNewEvent->EvParams,
                            (TI_UINT8*)&pEvHandler->RegistrationArray[EvType][ModuleIndex],
                            sizeof(IPC_EVENT_PARAMS));

            os_memoryZero(pEvHandler->hOs,(TI_UINT8*)pNewEvent->uBuffer, sizeof(pNewEvent->uBuffer));

            os_memoryCopy(pEvHandler->hOs,
                          (TI_UINT8*)pNewEvent->uBuffer,
                          (TI_UINT8*)pData,
                          Length);

            pNewEvent->uBufferSize = Length;

            if(pNewEvent->EvParams.uDeliveryType ==  DELIVERY_PUSH)
            {
                    PRINTF(DBG_INIT_LOUD, (" EvHandlerSendEvent %d to OS \n", EvType));
                    PRINTF(DBG_INIT_LOUD, ("EvHandlerSendEvent Matching OS Registered event found at EvType = %d,"
                                          "ModuleIndex = %d  \n", EvType, ModuleIndex));
                    IPC_EventSend (pEvHandler->hOs,(TI_UINT8*)pNewEvent,sizeof(IPC_EV_DATA));
            }
            else {

                pEvHandler->LastUMEventType = EvType;
                pEvHandler->SendEventArray.TailIndex = (TailIndex+1) % MAX_SEND_EVENTS;
                pEvHandler->SendEventArray.Counter++;
                TailIndex   = pEvHandler->SendEventArray.TailIndex;
                PRINTF(DBG_INIT_LOUD, (" EvHandlerSendEvent %d to User Mode \n", EvType));
                PRINTF(DBG_INIT_LOUD, ("EvHandlerSendEvent Matching User Mode Registered event found at EvType = %d,"
                                       "ModuleIndex = %d  \n", EvType, ModuleIndex));
                if (pEvHandler->SendEventArray.Counter == 1)
                {
                    IPC_EventSend (pEvHandler->hOs,NULL,0);
                }
            }
        } /* end if*/

       ModuleIndex++;

   } /* end of while*/

    return TI_OK;
}

 /* ************************** Bottom Interface End **********************************/
