freeswitch/libs/sipcc/core/ccapp/ccapp_task.c

178 lines
4.5 KiB
C

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "ccapp_task.h"
#include "phone.h"
#include "CCProvider.h"
#include "platform_api.h"
extern cprMsgQueue_t ccapp_msgq;
extern void CCAppInit();
static sll_lite_list_t sll_list;
/**
* Add/Get ccapp task listener
*/
void addCcappListener(appListener* listener, int type) {
listener_t *alistener = NULL;
CCAPP_DEBUG(DEB_F_PREFIX"Entered: listenr=0x%x, type=%d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "addCcappListener"),
listener, type);
if (listener == NULL)
{
CCAPP_ERROR(DEB_F_PREFIX"listener is NULL, returning\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "addCcappListener"));
return;
}
alistener = cpr_malloc(sizeof(listener_t));
if (alistener == NULL) {
CCAPP_ERROR(DEB_F_PREFIX"alistener is NULL, returning\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "addCcappListener"));
return;
}
alistener->type = type;
alistener->listener_p = listener;
sll_lite_link_tail(&sll_list, (sll_lite_node_t *)alistener);
CCAPP_DEBUG(DEB_F_PREFIX"Added: listenr=0x%x, type=%d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "addCcappListener"),
alistener->listener_p, alistener->type);
}
appListener *getCcappListener(int type) {
static const char fname[] ="getCcappListener";
listener_t *temp_info;
sll_lite_node_t *iterator;
CCAPP_DEBUG(DEB_F_PREFIX"entered: for app[%d]\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),
type);
iterator = sll_list.head_p;
while (iterator) {
temp_info = (listener_t *)iterator;
CCAPP_DEBUG(DEB_F_PREFIX"appid=%d, listener=0x%x\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), temp_info->type, temp_info->listener_p);
if (temp_info->type == type) {
{
return temp_info->listener_p;
}
}
iterator = iterator->next_p;
}
return NULL;
}
/**
*
* CC Provider wrapper for posting msg to CCAPP
*
* @param msgId - message ID
* @param data - ptr to data
* @param len - len of data
*
* @return CPR_SUCCESS/CPR_FAILURE
*
* @pre None
*/
cpr_status_e ccappTaskPostMsg(unsigned int msgId, void * data, uint16_t len, int appId)
{
cprBuffer_t *msg;
static const char fname[] = "ccappPostMsg";
cpr_status_e retval = CPR_SUCCESS;
msg = (cprBuffer_t *) cpr_malloc(len);
if (msg == NULL) {
CCAPP_ERROR(DEB_F_PREFIX"failed to allocate message.\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
return CPR_FAILURE;
}
memcpy(msg, data, len);
if ((retval=ccappTaskSendMsg(msgId, msg, len, appId)) == CPR_FAILURE) {
cpr_free(msg);
}
return retval;
}
/**
*
* CC Provider wrapper for cprSendMessage
*
* @param cmd - Command
* @param msg - msg ptr
* @param len - len of msg
* @param usr -
*
* @return CPR_SUCCESS/CPR_FAILURE
*
* @pre msg is a malloc mem ptr
*/
cpr_status_e
ccappTaskSendMsg (uint32_t cmd, void *msg, uint16_t len, uint32_t UsrInfo)
{
phn_syshdr_t *syshdr;
syshdr = (phn_syshdr_t *) cprGetSysHeader(msg);
if (!syshdr) {
return CPR_FAILURE;
}
syshdr->Cmd = cmd;
syshdr->Len = len;
syshdr->Usr.UsrInfo = UsrInfo;
if (cprSendMessage(ccapp_msgq , (cprBuffer_t*)msg, (void **)&syshdr) == CPR_FAILURE) {
cprReleaseSysHeader(syshdr);
return CPR_FAILURE;
}
return CPR_SUCCESS;
}
/**
*
* CCApp Provider main routine.
*
* @param arg - CCApp msg queue
*
* @return void
*
* @pre None
*/
void CCApp_task(void * arg)
{
static const char fname[] = "CCApp_task";
phn_syshdr_t *syshdr = NULL;
appListener *listener = NULL;
void * msg;
//initialize the listener list
sll_lite_init(&sll_list);
CCAppInit();
while (1) {
msg = cprGetMessage(ccapp_msgq, TRUE, (void **) &syshdr);
if ( msg) {
CCAPP_DEBUG(DEB_F_PREFIX"Received Cmd[%d] for app[%d]\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),
syshdr->Cmd, syshdr->Usr.UsrInfo);
listener = getCcappListener(syshdr->Usr.UsrInfo);
if (listener != NULL) {
(* ((listener)))(msg, syshdr->Cmd);
} else {
CCAPP_DEBUG(DEB_F_PREFIX"Event[%d] doesn't have a dedicated listener.\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),
syshdr->Usr.UsrInfo);
}
cprReleaseSysHeader(syshdr);
cpr_free(msg);
}
}
}