2012-12-17 20:15:23 -05:00

1667 lines
52 KiB
C
Executable File

/* 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/. */
/** @file tnp_ui.c
* API provided by Platform to the Call Control for User Interface activities
*/
#include "cpr.h"
#include "cpr_in.h"
#include "phone.h"
#include "time2.h"
#include "debug.h"
#include "phone_debug.h"
#include "dialplan.h"
#include "ccapi.h"
#include "cfgfile_utils.h"
#include "prot_configmgr.h"
#include "dns_utils.h"
#include "uiapi.h"
#include "lsm.h"
#include "fsm.h"
#include "CCProvider.h"
#include "ccSession.h"
#include "platform_api.h"
#include "vcm.h"
#include "ccapp_task.h"
/*
* Note: Do not include "msprovider.h" here unless the dependencies on
* /vob/ip_phone/ip_g4/infra have been removed, as those dependencies
* break CSF builds.
*/
/*--------------------------------------------------------------------------
* Local definitions
*--------------------------------------------------------------------------
*/
#define CCAPP_F_PREFIX "CCAPP : %s : " // requires 1 arg: __FUNCTION__
// Why don't we modify strlib_malloc to handle NULL?
#define STRLIB_CREATE(str) (str)?strlib_malloc((str), strlen((str))):strlib_empty()
// Define default display timeout and priority
#define DEFAULT_DISPLAY_NOTIFY_TIMEOUT 0
#define DEFAULT_DISPLAY_NOTIFY_PRIORITY 0
/*--------------------------------------------------------------------------
* Global data
*--------------------------------------------------------------------------
*/
/*--------------------------------------------------------------------------
* External data references
* -------------------------------------------------------------------------
*/
/*--------------------------------------------------------------------------
* External function prototypes
*--------------------------------------------------------------------------
*/
extern int Basic_Get_Line_By_Name(char *name);
extern char *Basic_is_phone_forwarded(line_t line);
extern void dp_int_dial_immediate(line_t line, callid_t call_id,
boolean collect_more, char *digit_str,
char *g_call_id,
monitor_mode_t monitor_mode);
extern void dp_int_init_dialing_data(line_t line, callid_t call_id);
extern callid_t dp_get_dialing_call_id(void);
extern void dp_int_update_key_string(line_t line, callid_t call_id,
char *digits);
extern void platform_set_time(int32_t gmt_time);
extern session_id_t createSessionId(line_t line, callid_t call);
// XXX need to either make msprovider.h platform-independent and include that file instead,
// or move ui_keypad_button out of this file (ccmedia.c, perhaps?)
/*--------------------------------------------------------------------------
* Local scope function prototypes
*--------------------------------------------------------------------------
*/
/**
* wrapper to post Call State change to CCAPP
*
* @param event - new state change event
* @param nLine - line identifier for which call state change
* @param nCallID - call identifier
*
*
* @return none (Side effect: Call bubble changes accordingly)
*
*/
void
ui_call_state (call_events event, line_t nLine, callid_t nCallID, cc_causes_t cause)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"event=%d \n", DEB_L_C_F_PREFIX_ARGS(UI_API, nLine, nCallID, __FUNCTION__),
event);
if (nCallID == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID = createSessionId(nLine, nCallID);
msg.eventID = CALL_STATE;
msg.update.ccSessionUpd.data.state_data.state = event;
msg.update.ccSessionUpd.data.state_data.line_id = nLine;
msg.update.ccSessionUpd.data.state_data.cause = cause;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_STATE(%d) msg \n", __FUNCTION__, event);
}
}
/**
* wrapper to post presentation for new call to CCAPP
* Function: ui_new_call
*
* @param nLine line identifier
* @param nCallID - call identifier
* @param call_attr - call attribute(normal, transfer consult, conf consult)
* @param call_instance_id - call instance identifier
*
* @return none
*/
void
ui_new_call (call_events event, line_t nLine, callid_t nCallID,
int call_attr, uint16_t call_instance_id, boolean dialed_digits)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"state=%d attr=%d call_instance=%d, dialed_digits=%s\n",
DEB_L_C_F_PREFIX_ARGS(UI_API, nLine, nCallID, __FUNCTION__), event, call_attr, call_instance_id, (dialed_digits)? "true" : "false");
if (nCallID == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID= createSessionId(nLine, nCallID);
msg.eventID = CALL_NEWCALL;
msg.update.ccSessionUpd.data.state_data.state = event;
msg.update.ccSessionUpd.data.state_data.attr = call_attr;
msg.update.ccSessionUpd.data.state_data.inst = call_instance_id;
msg.update.ccSessionUpd.data.state_data.line_id = nLine;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_STATE(%d) msg \n", __FUNCTION__, event);
}
return;
}
/**
* set or change the attribute on the call and reflect the changes
* to call plane (such as change in softkeys or other visual aspects).
* used to change the call attribute back to normal from consult
*
* Posts the update to CCAPP
*
* @param line_id - line identifier
* @param call_id - call identifier
* @param attr - call attribute has to be one of call_attr_t
*
* @return none
*/
void
ui_set_call_attr (line_t line_id, callid_t call_id, call_attr_t attr)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"attr=%d\n", DEB_L_C_F_PREFIX_ARGS(UI_API, line_id, call_id, __FUNCTION__), attr);
if (call_id == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID = createSessionId(line_id, call_id);
msg.eventID = CALL_ATTR;
msg.update.ccSessionUpd.data.state_data.attr = attr;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_ATTR(%d) msg \n", __FUNCTION__, attr);
}
}
/**
* Wrapper for ui_update_callref
*
* @param line - line for the session
* @param call_id - callid for the session
* @param callref - callref for the session
*
* @return none
*/
void
ui_update_callref (line_t line, callid_t call_id, unsigned int callref)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"callref = %d\n", DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, __FUNCTION__), callref);
if ( callref == 0 ) return;
if (call_id == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID = createSessionId(line, call_id);
msg.eventID = CALL_CALLREF;
msg.update.ccSessionUpd.data.callref = callref;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_REF() msg \n", __FUNCTION__);
}
return;
}
/**
* Wrapper for ui_update_gcid - global_call_id
*
* @param line - line for the session
* @param call_id - callid for the session
* @param gcid - Global CallId for the session
*
* @return none
*/
void
ui_update_gcid (line_t line, callid_t call_id, char *gcid)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"gcid = %s\n", DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, __FUNCTION__), gcid);
if ( *gcid == '\0' ) return;
if (call_id == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID = createSessionId(line, call_id);
msg.eventID = CALL_GCID;
sstrncpy(msg.update.ccSessionUpd.data.gcid, gcid, CC_MAX_GCID);
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_GCID() msg \n", __FUNCTION__);
}
return;
}
/**
* Wrapper for ui_update_video_avail
* indicates video stream is avail for this session to UI
* @param line - line for the session
* @param call_id - callid for the session
*
* @return none
*/
void
ui_update_video_avail (line_t line, callid_t call_id, int avail)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, __FUNCTION__));
if (call_id == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID = createSessionId(line, call_id);
msg.eventID = VIDEO_AVAIL;
msg.update.ccSessionUpd.data.action = avail;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send VIDEO_AVAIL() msg \n", __FUNCTION__);
}
return;
}
void ui_update_media_interface_change(line_t line, callid_t call_id, group_call_event_t event) {
session_update_t msg;
if (event != MEDIA_INTERFACE_UPDATE_BEGIN &&
event != MEDIA_INTERFACE_UPDATE_SUCCESSFUL &&
event != MEDIA_INTERFACE_UPDATE_FAIL) {
// un-related event. ignore.
return;
}
if (event != MEDIA_INTERFACE_UPDATE_BEGIN) {
/* we are sending final result */
g_dock_undock_event = MEDIA_INTERFACE_UPDATE_NOT_REQUIRED;
}
DEF_DEBUG(DEB_L_C_F_PREFIX "event=%s", DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, __FUNCTION__),
event == MEDIA_INTERFACE_UPDATE_BEGIN ? "MEDIA_INTERFACE_UPDATE_BEGIN" :
event == MEDIA_INTERFACE_UPDATE_SUCCESSFUL ? "MEDIA_INTERFACE_UPDATE_SUCCESSFUL" :
event == MEDIA_INTERFACE_UPDATE_FAIL ? "MEDIA_INTERFACE_UPDATE_FAIL" : "unknown");
if (call_id == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID = createSessionId(line, call_id);
msg.eventID = event;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send media update () msg \n", __FUNCTION__);
}
}
void
ui_call_stop_ringer (line_t line, callid_t call_id)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, __FUNCTION__));
if (call_id == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID = createSessionId(line, call_id);
msg.eventID = RINGER_STATE;
msg.update.ccSessionUpd.data.ringer.start = FALSE;
msg.update.ccSessionUpd.data.ringer.mode = VCM_RING_OFF;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send RINGER_STATE() msg \n", __FUNCTION__);
}
return;
}
void
ui_call_start_ringer (vcm_ring_mode_t ringMode, short once, line_t line, callid_t call_id)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, __FUNCTION__));
if (call_id == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID = createSessionId(line, call_id);
msg.eventID = RINGER_STATE;
msg.update.ccSessionUpd.data.ringer.start = TRUE;
msg.update.ccSessionUpd.data.ringer.mode = ringMode;
msg.update.ccSessionUpd.data.ringer.once = (cc_boolean) once;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send RINGER_STATE() msg \n", __FUNCTION__);
}
return;
}
/**
* Wrapper for ui_update_video_avail
* indicates video stream is avail for this session to UI
* @param line - line for the session
* @param call_id - callid for the session
*
* @return none
*/
void
ui_update_video_offered (line_t line, callid_t call_id, int avail)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, __FUNCTION__));
if (call_id == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID = createSessionId(line, call_id);
msg.eventID = VIDEO_OFFERED;
msg.update.ccSessionUpd.data.action = avail;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send VIDEO_OFFERED() msg \n", __FUNCTION__);
}
return;
}
/**
* Wrapper for ui call info post to CCAPP
* call bubble with appropriate party information
*
* @param pCallingPartyNameStr/NumberStr - Calling party information
* @param displayCallingNumber
* @param pCalledPartyNameStr/NumberStr - called party information
* @param displayCalledNumber
* @param pOrigCalledNameStr/NumberStr
* @param pLastRedirectingNameStr/NumberStr
* @param call_type
* @param line - line identifier
* @param call_id - call identifier
* @param call_instance_id - call instance displayed in call bubble
* @param cc_security
*
* @return none
*/
void
ui_call_info (string_t pCallingPartyNameStr,
string_t pCallingPartyNumberStr,
string_t pAltCallingPartyNumberStr,
boolean displayCallingNumber,
string_t pCalledPartyNameStr,
string_t pCalledPartyNumberStr,
boolean displayCalledNumber,
string_t pOrigCalledNameStr,
string_t pOrigCalledNumberStr,
string_t pLastRedirectingNameStr,
string_t pLastRedirectingNumberStr,
calltype_t call_type,
line_t line,
callid_t call_id,
uint16_t call_instance_id,
cc_security_e call_security,
cc_policy_e call_policy)
{
session_update_t msg;
const char *uiCalledName;
const char *uiCalledNumber;
const char *uiCallingName;
const char *uiCallingNumber;
int inbound;
char lineName[MAX_LINE_NAME_SIZE];
char lineNumber[MAX_LINE_NAME_SIZE];
TNP_DEBUG(DEB_L_C_F_PREFIX"call instance=%d callednum=%s calledname=%s clngnum=%s clngname = %s\n",
DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, __FUNCTION__), call_instance_id, pCalledPartyNumberStr,
pCalledPartyNameStr, pCallingPartyNumberStr, pCallingPartyNameStr);
TNP_DEBUG(DEB_F_PREFIX"calltype=%d displayClng=%d displayCld=%d\n", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__), call_type,
displayCallingNumber, displayCalledNumber);
inbound = (call_type == FSMDEF_CALL_TYPE_INCOMING) || (call_type == FSMDEF_CALL_TYPE_FORWARD);
uiCalledNumber = pCalledPartyNumberStr;
uiCalledName = pCalledPartyNameStr;
uiCallingNumber = pCallingPartyNumberStr;
uiCallingName = pCallingPartyNameStr;
config_get_line_string(CFGID_LINE_DISPLAYNAME, lineName, line, sizeof(lineName));
config_get_line_string(CFGID_LINE_NAME, lineNumber, line, sizeof(lineNumber));
if (inbound) {
uiCalledNumber = lineNumber;
uiCalledName = lineName;
} else {
uiCallingNumber = lineNumber;
uiCallingName = lineName;
}
if (call_id == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID = createSessionId(line, call_id);
msg.eventID = CALL_INFORMATION;
msg.update.ccSessionUpd.data.call_info.clgName = uiCallingName?strlib_malloc(uiCallingName, strlen(uiCallingName)):strlib_empty();
if ( uiCallingNumber== NULL || (inbound && !displayCallingNumber)) {
msg.update.ccSessionUpd.data.call_info.clgNumber = strlib_empty();
} else {
msg.update.ccSessionUpd.data.call_info.clgNumber = strlib_malloc(uiCallingNumber, strlen(uiCallingNumber));
}
if ( pAltCallingPartyNumberStr == NULL || (inbound && !displayCallingNumber)) {
msg.update.ccSessionUpd.data.call_info.altClgNumber = strlib_empty();
} else {
msg.update.ccSessionUpd.data.call_info.altClgNumber = strlib_malloc(pAltCallingPartyNumberStr,strlen(pAltCallingPartyNumberStr));
}
msg.update.ccSessionUpd.data.call_info.cldName = uiCalledName?strlib_malloc(uiCalledName,strlen(uiCalledName)):strlib_empty();
if (uiCalledNumber == NULL || (!inbound && !displayCalledNumber)) {
msg.update.ccSessionUpd.data.call_info.cldNumber = strlib_empty();
} else {
msg.update.ccSessionUpd.data.call_info.cldNumber = strlib_malloc(uiCalledNumber,strlen(uiCalledNumber));
}
msg.update.ccSessionUpd.data.call_info.origCalledName = pOrigCalledNameStr?strlib_malloc(pOrigCalledNameStr, strlen(pOrigCalledNameStr)):strlib_empty();
msg.update.ccSessionUpd.data.call_info.origCalledNumber = pOrigCalledNumberStr?strlib_malloc(pOrigCalledNumberStr,strlen(pOrigCalledNumberStr)):strlib_empty();
msg.update.ccSessionUpd.data.call_info.lastRedirectingName = pLastRedirectingNameStr?strlib_malloc(pLastRedirectingNameStr,strlen(pLastRedirectingNameStr)):strlib_empty();
msg.update.ccSessionUpd.data.call_info.lastRedirectingNumber = pLastRedirectingNumberStr?strlib_malloc(pLastRedirectingNumberStr, strlen(pLastRedirectingNumberStr)):strlib_empty();
msg.update.ccSessionUpd.data.call_info.call_type = call_type;
msg.update.ccSessionUpd.data.call_info.instance_id = call_instance_id;
msg.update.ccSessionUpd.data.call_info.security = call_security;
msg.update.ccSessionUpd.data.call_info.policy = call_policy;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_INFO() msg \n", __FUNCTION__);
}
return;
}
/**
* Wrapper for ui cc capability post to CCAPP
*
* @param line - line identifier
* @param callID - call identifier
* @param capability - cc capability
*
* @return none
*/
void
ui_cc_capability (line_t line, callid_t call_id, string_t recv_info_list)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"recv_info_list:%s\n",
DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, __FUNCTION__),
recv_info_list);
msg.sessionID = createSessionId(line, call_id);
msg.eventID = CALL_RECV_INFO_LIST;
msg.update.ccSessionUpd.data.recv_info_list = strlib_copy(recv_info_list);
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_RECV_INFO_LIST msg \n", __FUNCTION__);
}
}
/**
* Wrapper for ui info received post to CCAPP
*
* @param line - line identifier
* @param callID - call identifier
* @param info_package - the Info-Package header of the Info Package
* @param content_type - the Content-Type header of the Info Package
* @param message_body - the message body of the Info Package
*
* @return none
*/
void
ui_info_received (line_t line, callid_t call_id, const char *info_package,
const char *content_type, const char *message_body)
{
session_rcvd_info_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"info_package:%s content_type:%s message_body:%s\n",
DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, __FUNCTION__),
info_package, content_type, message_body);
msg.sessionID = createSessionId(line, call_id);
msg.packageID = INFO_PKG_ID_GENERIC_RAW;
msg.info.generic_raw.info_package = info_package?strlib_malloc(info_package, strlen(info_package)):strlib_empty();
msg.info.generic_raw.content_type = content_type?strlib_malloc(content_type, strlen(content_type)):strlib_empty();
msg.info.generic_raw.message_body = message_body?strlib_malloc(message_body, strlen(message_body)):strlib_empty();
if ( ccappTaskPostMsg(CCAPP_RCVD_INFO, &msg, sizeof(session_rcvd_info_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_INFO_RECEIVED msg \n", __FUNCTION__);
}
}
/**
* An internal wrapper for ui call status post to CCAPP
*
* @param pString - status string
* @param line - line identifier
* @param callID - call identifier
* @param timeout - timeout for the status line
*
* @return none
*/
static void
ui_set_call_status_display (string_t status, line_t line, callid_t callID, int timeout, char priority)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"the stat string =%s, timeout= %d, priority=%d\n", DEB_L_C_F_PREFIX_ARGS(UI_API, line, callID, __FUNCTION__),
status,
timeout,
priority);
if (callID == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID = createSessionId(line, callID);
msg.eventID = CALL_STATUS;
msg.update.ccSessionUpd.data.status.timeout = timeout;
msg.update.ccSessionUpd.data.status.priority = priority;
if ( status ) {
msg.update.ccSessionUpd.data.status.status = strlib_malloc(status, strlen(status));
} else {
msg.update.ccSessionUpd.data.status.status = strlib_empty();
}
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_STATUS(%s) msg \n", __FUNCTION__, status);
}
}
/**
* Wrapper for ui call status post to CCAPP
*
* @param pString - status string
* @param line - line identifier
* @param callID - call identifier
* @param timeout - timeout for the status line
*
* @return none
*/
void
ui_set_call_status (string_t status, line_t line, callid_t callID)
{
TNP_DEBUG(DEB_L_C_F_PREFIX"the stat string =%s\n", DEB_L_C_F_PREFIX_ARGS(UI_API, line, callID, __FUNCTION__),
status);
if (callID == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
ui_set_call_status_display(status, line, callID, DEFAULT_DISPLAY_NOTIFY_TIMEOUT, DEFAULT_DISPLAY_NOTIFY_PRIORITY);
}
/**
* Wrapper for sending notification CCAPP
*
* @param promptString - notification string
* @param timeout - timeout of this notify
* @param notifyProgress- the type of notification
* TRUE - Progress, FALSE- Normal
* @param priority - priority of this notification
* Pri 1..5 Low .. High
*
* @return none
*/
void
ui_set_notification (line_t line, callid_t call_id, char *promptString, int timeout,
boolean notifyProgress, char priority)
{
feature_update_t msg;
TNP_DEBUG(DEB_F_PREFIX"line=%d callid=%d str=%s tout=%d notifyProgress=%d pri=%d\n", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__),
line, call_id, promptString, timeout, notifyProgress, priority);
if (line > 0 && call_id > 0) {
ui_set_call_status_display(promptString, line, call_id, timeout, priority);
return;
}
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = DEVICE_NOTIFICATION;
msg.update.ccFeatUpd.data.notification.timeout = timeout;
msg.update.ccFeatUpd.data.notification.notifyProgress = notifyProgress;
msg.update.ccFeatUpd.data.notification.priority = priority;
if ( promptString != NULL ) {
msg.update.ccFeatUpd.data.notification.prompt = strlib_malloc(promptString, strlen(promptString));
} else {
msg.update.ccFeatUpd.data.notification.prompt = strlib_empty();
}
if ( ccappTaskPostMsg(CCAPP_FEATURE_UPDATE, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send DEVICE_NOTIFICATION(%s) msg \n", __FUNCTION__, promptString);
}
}
/**
* CCAPPPost to clear the previous notify of given priority
*
* @param priority - notification of the given pri
*
* @return none
*/
/* TBD: the API should have priority param */
void
ui_clear_notification ()
{
TNP_DEBUG(DEB_F_PREFIX"called..\n", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__));
// A promptString of NULL shall act as a clear
ui_set_notification(CC_NO_LINE, CC_NO_CALL_ID, NULL, 0, FALSE, 1);
}
/**
*
* CCAPP Post to set the MWI lamp indication of the device
*
* @param 1 - on or else off
*
* @return none
*/
void
ui_change_mwi_lamp (int status)
{
feature_update_t msg;
TNP_DEBUG(DEB_F_PREFIX"status=%d \n", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__), status);
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = DEVICE_FEATURE_MWILAMP;
msg.update.ccFeatUpd.data.state_data.state = status;
if ( ccappTaskPostMsg(CCAPP_FEATURE_UPDATE, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send DEVICE_FEATURE_MWILAMP(%d) msg \n", __FUNCTION__, status);
}
}
/**
*
* CCAPP post to set the MWI lamp indication for given line
*
* @param line - line identifier
* @param on - TRUE -> on, otherwise off
*
* @return none
*/
void
ui_set_mwi (line_t line, boolean status, int type, int newCount, int oldCount, int hpNewCount, int hpOldCount)
{
feature_update_t msg;
TNP_DEBUG(DEB_F_PREFIX"line=%d count=%d \n", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__), line, status);
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = DEVICE_FEATURE_MWI;
msg.update.ccFeatUpd.data.mwi_status.line = line;
msg.update.ccFeatUpd.data.mwi_status.status = status;
msg.update.ccFeatUpd.data.mwi_status.type = type;
msg.update.ccFeatUpd.data.mwi_status.newCount = newCount;
msg.update.ccFeatUpd.data.mwi_status.oldCount = oldCount;
msg.update.ccFeatUpd.data.mwi_status.hpNewCount = hpNewCount;
msg.update.ccFeatUpd.data.mwi_status.hpOldCount = hpOldCount;
if ( ccappTaskPostMsg(CCAPP_FEATURE_UPDATE, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send DEVICE_FEATURE_MWI(%d,%d) msg \n", __FUNCTION__, line, status);
}
}
/*
* Function: ui_mnc_reached
*
* @param line - line number
* @param boolean - maximum number of calls reached on this line
*
* Description:
* post mnc_reached status to CCAPP
*
* @return none
*
*/
void ui_mnc_reached (line_t line, boolean mnc_reached)
{
feature_update_t msg;
DEF_DEBUG(DEB_F_PREFIX"line %d: Max number of calls reached =%d \n",
DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__),
line, mnc_reached);
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = DEVICE_FEATURE_MNC_REACHED;
msg.update.ccFeatUpd.data.line_info.line = line;
msg.update.ccFeatUpd.data.line_info.info = mnc_reached;
if ( ccappTaskPostMsg(CCAPP_FEATURE_UPDATE, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send DEVICE_FEATURE_MNC_REACHED(%d,%d) msg \n", __FUNCTION__,
line, mnc_reached);
}
}
/**
*
* Check if MWI is active on a given line
*
* @param line - line identifier
*
* @return true if active; false otherwise.
*/
boolean
ui_line_has_mwi_active (line_t line)
{
session_mgmt_t msg;
TNP_DEBUG(DEB_F_PREFIX"line=%d\n", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__), line);
msg.func_id = SESSION_MGMT_LINE_HAS_MWI_ACTIVE;
msg.data.line_mwi_active.line = line;
ccappSyncSessionMgmt(&msg);
return msg.data.line_mwi_active.ret_val;
}
/**
* CCAPP msg post to Set linekey values
*
* @param line - line identifier
* @param SpeedDial - Speeddial string to be changed
* @param label - Feature lable to be changed
*
* @return none
*/
void
ui_update_label_n_speeddial (line_t line, line_t button_no, string_t speed_dial, string_t label)
{
feature_update_t msg;
TNP_DEBUG(DEB_F_PREFIX"line=%d speeddial=%s displayname=%s\n", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__), line,
speed_dial, label);
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = DEVICE_LABEL_N_SPEED;
msg.update.ccFeatUpd.data.cfg_lbl_n_spd.line = line;
msg.update.ccFeatUpd.data.cfg_lbl_n_spd.button = (unsigned char) button_no;
msg.update.ccFeatUpd.data.cfg_lbl_n_spd.speed = strlib_malloc(speed_dial, sizeof(speed_dial));
msg.update.ccFeatUpd.data.cfg_lbl_n_spd.label = strlib_malloc(label, sizeof(label));
if ( ccappTaskPostMsg(CCAPP_FEATURE_UPDATE, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send DEVICE_LABEL_N_SPEED(%d) msg \n", __FUNCTION__, button_no);
}
}
/**
* Inform CCAPP of registration state of given line in Line Plane
*
* @param line - line identifier
* @param registered - whether the line was registered or not
*
* @return none
*/
void
ui_set_sip_registration_state (line_t line, boolean registered)
{
feature_update_t msg;
int value;
TNP_DEBUG(DEB_F_PREFIX"%s %d: %s\n", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__),
(line==CC_ALL_LINES) ? "ALL LINES":"LINE" ,line,
(registered)? "REGISTERED":"UN-REGISTERED");
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = DEVICE_REG_STATE;
msg.update.ccFeatUpd.data.line_info.line = line;
msg.update.ccFeatUpd.data.line_info.info = registered ? CC_REGISTERED : CC_UNREGISTERED;
config_get_value(CFGID_PROXY_REGISTER, &value, sizeof(value));
if (value == 0) {
msg.update.ccFeatUpd.data.line_info.info = CC_REGISTERED;
}
if ( ccappTaskPostMsg(CCAPP_FEATURE_UPDATE, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_STATE(%d, %d) msg \n", __FUNCTION__, line, registered);
}
}
/**
* Inform CCAPP of registration state of given line in Line Plane
*
* @param registered - line registered true/false
*
* @return none
*/
void
ui_update_registration_state_all_lines (boolean registered)
{
DEF_DEBUG(DEB_F_PREFIX"***********ALL LINES %s****************\n",
DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__),
(registered)? "REGISTERED":"UN-REGISTERED");
ui_set_sip_registration_state(CC_ALL_LINES, registered);
}
/**
* Inform the CCAPP that all registration attempts with
* all call controls have failed.
*
* @param none
*
* @return none
*/
void
ui_reg_all_failed (void)
{
feature_update_t msg;
TNP_DEBUG(DEB_F_PREFIX"***********Registration to all CUCMs failed.***********\n",
DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__));
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = CCAPP_REG_ALL_FAIL;
msg.update.ccFeatUpd.data.line_info.line = CC_ALL_LINES;
msg.update.ccFeatUpd.data.line_info.info = FALSE;
if ( ccappTaskPostMsg(CCAPP_REG_ALL_FAIL, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_STATE() msg \n", __FUNCTION__);
}
}
/**
*
* inform CCAPP about the status of the CCMs
*
* @param ccm_addr - IP address string
* @param status - status (notconnected, active, standby, notavail)
*
* @return none
*/
void
ui_set_ccm_conn_status (char * ccm_addr, int status)
{
feature_update_t msg;
DEF_DEBUG(DEB_F_PREFIX"***********CUCM %s %s***********\n",
DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__), ccm_addr,
((status == 0) ?"Not connected":((status == 1)?"STAND BY":
((status == 2)?"ACTIVE":"UNKNOWN"))));
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = DEVICE_CCM_CONN_STATUS;
msg.update.ccFeatUpd.data.ccm_conn.addr = ccm_addr?strlib_malloc(ccm_addr, strlen(ccm_addr)):strlib_empty();
msg.update.ccFeatUpd.data.ccm_conn.status = status;
if ( ccappTaskPostMsg(CCAPP_FEATURE_UPDATE, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send DEVICE_CCM_CONN_STATUS(%d) msg \n", __FUNCTION__, status);
}
}
/**
* Treat given line and callid as being put on hold by user.
*
* @param line - line identifier
* @param call_id - call identifier
*
* @return none
*/
void
ui_set_local_hold (line_t line, callid_t call_id)
{
/* THIS IS A NOP FOR TNP */
TNP_DEBUG(DEB_L_C_F_PREFIX"called\n", DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, "ui_set_local_hold"));
return;
}
/**
* Sets the call forward status as a flashing arrow and status line
* accordingly.
*
* @param line - line identifier
* @param cfa - call forward all true/false
* @param cfa_number - string representing call forwarded to number
*
* @return none
*/
void
ui_cfwd_status (line_t line, boolean cfa, char *cfa_number, boolean lcl_fwd)
{
feature_update_t msg;
TNP_DEBUG(DEB_F_PREFIX"line=%d cfa=%d cfa_number=%s lcl_fwd=%d", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__),
line, cfa, cfa_number, lcl_fwd);
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = DEVICE_FEATURE_CFWD;
msg.update.ccFeatUpd.data.cfwd.line = line;
msg.update.ccFeatUpd.data.cfwd.isFwd = cfa;
msg.update.ccFeatUpd.data.cfwd.isLocal = lcl_fwd;
msg.update.ccFeatUpd.data.cfwd.cfa_num = cfa_number?strlib_malloc(cfa_number, strlen(cfa_number)):strlib_empty();
if ( ccappTaskPostMsg(CCAPP_FEATURE_UPDATE, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send DEVICE_FEATURE_CFWD(%d) msg \n", __FUNCTION__, cfa);
}
}
/**
* Get the Idle prompt string.
*
* @return the idle prompt phrase from locale
*/
char *
ui_get_idle_prompt_string (void)
{
TNP_DEBUG(DEB_F_PREFIX"called\n", DEB_F_PREFIX_ARGS(UI_API, "ui_get_idle_prompt_string"));
return platform_get_phrase_index_str(IDLE_PROMPT);
}
/**
* Set the Appropriate Idle prompt string.
*
* @param pString - New Idle Prompt String
* @param prompt - The Idle Prompt To Be Modified
*
* @return the idle prompt phrase from locale
*/
void
ui_set_idle_prompt_string (string_t pString, int prompt)
{
TNP_DEBUG(DEB_F_PREFIX"Prompt=%d, Prompt string=%s NOP operation\n", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__), prompt, pString);
}
/**
* Updates placed call information for call history
*
* @param line - line identifier
* @param call_id - call identifier
* @param cldName - called name
* @param cldNumber - called number
*
* @return none
*/
void
ui_update_placed_call_info (line_t line, callid_t call_id, string_t cldName,
string_t cldNumber)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"calledName:calledNumber %s:%s\n",
DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, __FUNCTION__), cldName, cldNumber);
if (call_id == CC_NO_CALL_ID) {
/* no operation when no call ID */
TNP_DEBUG(DEB_F_PREFIX"invalid callid\n", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__));
return;
}
msg.sessionID = createSessionId(line, call_id);
msg.eventID = CALL_PLACED_INFO;
msg.update.ccSessionUpd.data.plcd_info.cldName = strlib_empty();
msg.update.ccSessionUpd.data.plcd_info.cldNum = strlib_empty();
if ( cldName) {
msg.update.ccSessionUpd.data.plcd_info.cldName = strlib_update(
msg.update.ccSessionUpd.data.plcd_info.cldName, cldName);
}
if ( cldNumber) {
msg.update.ccSessionUpd.data.plcd_info.cldNum = strlib_update(
msg.update.ccSessionUpd.data.plcd_info.cldNum, cldNumber);
}
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_PLACED_INFO(%s) msg \n", __FUNCTION__, cldNumber);
}
}
/**
* Description: remove last digit from input box
*
* @param line - line identifier
* @param call_id - call identifier
*
* @return none
*/
void
ui_delete_last_digit (line_t line_id, callid_t call_id)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"called\n", DEB_L_C_F_PREFIX_ARGS(UI_API, line_id, call_id, __FUNCTION__));
if (call_id == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID = createSessionId(line_id, call_id);
msg.eventID = CALL_DELETE_LAST_DIGIT;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_DELETE_LAST_DIGIT() msg \n", __FUNCTION__);
}
}
/**
* Keep/Remove BackSpace key if presented
*
* @param line_id - line identifier
* @param call_id - call identifier
* @param enable - TRUE -> enable backspace softkey
*
* @return none
*/
void
ui_control_featurekey_bksp (line_t line_id, callid_t call_id, boolean enable)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"enable=%d\n", DEB_L_C_F_PREFIX_ARGS(UI_API, line_id, call_id, __FUNCTION__),
enable);
msg.sessionID = createSessionId(line_id, call_id);
msg.eventID = CALL_ENABLE_BKSP;
msg.update.ccSessionUpd.data.action = enable;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_ENABLE_BKSP(%d) msg \n", __FUNCTION__, enable);
}
}
/**
* Select(lock-down) the call specified.
* For tnp this visually places a check box on the bubble.
*
* @param line_id - line identifier
* @param call_id - call identifier
* @param selected - TRUE -> call is locked-down in signaling,
* mark as such on UI
*
* @return none
*/
void
ui_call_selected (line_t line_id, callid_t call_id, int selected)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"selected=%d\n",
DEB_L_C_F_PREFIX_ARGS(UI_API, line_id, call_id, __FUNCTION__), selected);
msg.sessionID = createSessionId(line_id, call_id);
msg.eventID = CALL_SELECTED;
msg.update.ccSessionUpd.data.action = selected;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_SELECTED(%d) msg \n", __FUNCTION__, selected);
}
}
/**
* Send the BLF state to the UI apps.
*
* @param[in] state - TRUE/FALSE
*
* @return none
*/
void ui_BLF_notification (int request_id, cc_blf_state_t blf_state, int app_id)
{
feature_update_t msg;
TNP_DEBUG(DEB_F_PREFIX"state=%d app_id=%d\n", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__), blf_state, app_id);
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = DEVICE_FEATURE_BLF;
msg.update.ccFeatUpd.data.blf_data.state = blf_state;
msg.update.ccFeatUpd.data.blf_data.request_id = request_id;
msg.update.ccFeatUpd.data.blf_data.app_id = app_id;
if ( ccappTaskPostMsg(CCAPP_FEATURE_UPDATE, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send DEVICE_FEATURE_BLF(state=%d, app_id=%d) msg \n",
__FUNCTION__, blf_state, app_id);
}
}
/**
*
* Change the softkey set to preservation key set (with just the EndCall key)
* From the platform perspective, this is strictly a softkey set change
* operation. There is no underlying state change in the call or its status.
* In other words, after this invocation, the clients can still issue
* ui_call_state() or any other call operation if they deem fit and
* the softkey set will adhere to that state.
*
* @param line_id - line identifier
* @param call_id - call identifier
*
* @return none
*/
void
ui_call_in_preservation (line_t line_id, callid_t call_id)
{
TNP_DEBUG(DEB_L_C_F_PREFIX"called\n", DEB_L_C_F_PREFIX_ARGS(UI_API, line_id, call_id, __FUNCTION__));
/* simply update the state . A Preservation event from
CUCM is just for the session */
ui_call_state (evCallPreservation , line_id, call_id, CC_CAUSE_NORMAL);
}
/**
* request ui to present a named softkey set for given call.
* The softkey set passed(set_name param) must be known to the platform.
* enable_mask is a set of bits (starting from LSB) one for each softkey.
* (so least significant bit represents left most softkey and so on).
* This function is typically used to mask certain softkeys in a given set.
* Use of this API as general purpose mechanism to present softkeys is
* discouraged because it breaks encapsulation. This API is introduced
* for the tough cases where adapter can not determine which keys to
* mask based on its state alone.
*
* @param line_id - line identifier
* @param call_id - call identifier
* @param set_name - name of the softkey set
* @param sk_mask_list - the softkey events that need to be masked
* @param len - length of the softkey list array
*
* @return none
*/
void
ui_select_feature_key_set (line_t line_id, callid_t call_id, char *set_name,
int sk_mask_list[], int len)
{
int i;
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"called\n", DEB_L_C_F_PREFIX_ARGS(UI_API, line_id, call_id, __FUNCTION__));
if (call_id == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
if (len <= 0 || len > MAX_SOFT_KEYS) {
TNP_DEBUG(DEB_F_PREFIX"Incorrect softkey array length passed in : %d\n", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__), len);
return;
}
memset( &msg, 0, sizeof(session_update_t));
msg.sessionID = createSessionId(line_id, call_id);
msg.eventID = CALL_SELECT_FEATURE_SET;
if ( set_name == NULL ) {
// No point continuing here
return;
}
msg.update.ccSessionUpd.data.feat_set.featSet = set_name?strlib_malloc(set_name, sizeof(set_name)):strlib_empty();
for (i = 0; i < len; i++) {
msg.update.ccSessionUpd.data.feat_set.featMask[i] = sk_mask_list[i];
}
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_SELECT_FEATURE_SET() msg \n", __FUNCTION__);
}
}
/* Test Interface Operations */
/**
* Inject a simulated keypress into the Java Infrastructure
*
* @param uri - string
*
* @return none
*/
void
ui_execute_uri (char *uri)
{
session_mgmt_t msg;
TNP_DEBUG(DEB_F_PREFIX"uri=%s\n", DEB_F_PREFIX_ARGS(UI_API, __FUNCTION__), uri);
msg.func_id = SESSION_MGMT_EXECUTE_URI;
msg.data.uri.uri = STRLIB_CREATE(uri);
if ( ccappTaskPostMsg(CCAPP_SESSION_MGMT, &msg, sizeof(session_mgmt_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(DEB_F_PREFIX"failed to send EXECUTE_URI() msg\n", DEB_F_PREFIX_ARGS(PLAT_API, __FUNCTION__));
}
}
/* Log Message Interface Operations */
/**
*
* Update Security (mainly lock) Icon on the call bubble.
* NOTE: Only used to indicate media security (ENCRYPTED or not).
* For updating the signaling security(shield icon), use uiCallInfo or
* uiUpdateCallInfo.
*
* @param line - line identifier
* @param call_id - call identifier
* @param call_security - follows the cc_security_e enum
*
* @return none
*/
void
ui_update_call_security (line_t line, callid_t call_id,
cc_security_e call_security)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"security=%d\n", DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, __FUNCTION__),
call_security);
msg.sessionID = createSessionId(line, call_id);
msg.eventID = CALL_SECURITY;
msg.update.ccSessionUpd.data.security = call_security;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_SECURITY(%d) msg \n", __FUNCTION__, call_security);
}
}
/*
*Just for TNP currently.
*/
void
ui_update_conf_invoked (line_t line, callid_t call_id,
boolean invoked)
{
//Nothing to do here
}
/**
*
* Cancel the feature plane given by call_id.
*
* @param line - line identifier
* @param call_id - call identifier
* @param target_call_id - target call id
*
* @return none
*/
void
ui_terminate_feature (line_t line, callid_t call_id,
callid_t target_call_id)
{
session_update_t msg;
TNP_DEBUG(DEB_L_C_F_PREFIX"target_call_id=%d\n", DEB_L_C_F_PREFIX_ARGS(UI_API, line, call_id, __FUNCTION__),
target_call_id);
msg.sessionID = createSessionId(line, call_id);
msg.eventID = CALL_FEATURE_CANCEL;
if (target_call_id != CC_NO_CALL_ID) {
msg.update.ccSessionUpd.data.target_sess_id = createSessionId(line, target_call_id);
} else {
msg.update.ccSessionUpd.data.target_sess_id = 0;
}
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_FEATURE_CANCEL(%d) msg \n", __FUNCTION__, target_call_id);
}
}
/* APIs required for CTI operations */
/* NOP for TNP: the speaker mode is set by media manager. if call control
* need to set the mode explicitely use vcm_set_speaker_mode.
*/
void
ui_set_speaker_mode (boolean mode)
{
return;
}
void
ui_cfwdall_req (unsigned int line)
{
lsm_clear_cfwd_all_ccm(line);
return;
}
/***********************************************************/
char *
Basic_is_phone_forwarded (line_t line)
{
TNP_DEBUG(DEB_F_PREFIX"called for line %d\n", DEB_F_PREFIX_ARGS(UI_API, "Basic_is_phone_forwarded"), line);
return ((char *) lsm_is_phone_forwarded(line));
}
void
ui_sip_config_done (void)
{
}
/**
* convert to numeric dtmf tone code that ms
* understands from ascii code
*/
static int map_digit(char k)
{
switch(k) {
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case '0':
return 0;
case '*':
return 10;
case'#':
return 11;
case 'A':
return 12;
case 'B':
return 13;
case 'C':
return 14;
case 'D':
return 15;
default:
return -1;
}
}
/**
* Emulate keypad button press
*
* @param digitstr - one or more digits to be pressed
* @param direction - either VCM_PLAY_TONE_TO_EAR or VCM_PLAY_TONE_TO_NET
* or VCM_PLAY_TONE_TO_ALL
*
* @return none
*/
void
ui_keypad_button (char *digitstr, int direction)
{
int digit;
unsigned int i;
for (i=0; i<strlen(digitstr); i++) {
digit = map_digit(digitstr[i]);
if (digit != -1) {
/* burst it out */
vcmDtmfBurst(digit, direction, 100);
cprSleep(100+10);
}
}
}
/**
* Send a log message to the Java Status messages screen
*
* @param message - string
*
* @return none
*/
void
ui_log_status_msg (char *msg)
{
ui_set_notification(CC_NO_LINE, CC_NO_CALL_ID, msg, 0, FALSE, 1);
}
/**
* Set the log disposition for call history application
*
* @param callid_t - callID of the call
* @param int - log disposition
*
* @return none
*/
void ui_log_disposition (callid_t call_id, int logdisp)
{
session_update_t msg;
fsmdef_dcb_t *dcb = fsmdef_get_dcb_by_call_id(call_id);
if (call_id == CC_NO_CALL_ID || dcb == NULL) {
/* no operation when no call ID */
return;
}
TNP_DEBUG(DEB_L_C_F_PREFIX"called\n", DEB_L_C_F_PREFIX_ARGS(UI_API, dcb->line, call_id, __FUNCTION__));
msg.sessionID = createSessionId(dcb->line, call_id);
msg.eventID = CALL_LOGDISP;
msg.update.ccSessionUpd.data.action = logdisp;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR("%s: failed to send CALL_PRESERVATION_ACTIVE(%d) msg \n", __FUNCTION__, call_id);
}
}
/**
* Stub for ui_control_feature
*
* @param line_id - line identifier
* @param call_id - call identifier
* @param feature - name of the softkey set
* @param enable - enable/disable
*
* @return none
*/
void
ui_control_feature (line_t line_id, callid_t call_id,
int feat_list[], int len, int enable)
{
// do nothing.
}
/*
* Helper for the following four functions which all load up a
* session_update message and post it.
*
*/
static void post_message_helper(
group_call_event_t eventId,
call_events event,
line_t nLine,
callid_t nCallId,
uint16_t call_instance_id,
char *sdp,
cc_int32_t status)
{
session_update_t msg;
if (nCallId == CC_NO_CALL_ID) {
/* no operation when no call ID */
return;
}
msg.sessionID = createSessionId(nLine, nCallId);
msg.eventID = eventId;
msg.update.ccSessionUpd.data.state_data.state = event;
msg.update.ccSessionUpd.data.state_data.inst = call_instance_id;
msg.update.ccSessionUpd.data.state_data.line_id = nLine;
msg.update.ccSessionUpd.data.state_data.sdp = sdp;
if (eventId == SET_LOCAL_DESC || eventId == SET_REMOTE_DESC) {
msg.update.ccSessionUpd.data.state_data.cause = status;
}
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_STATE(%d) msg \n", __FUNCTION__, event);
}
return;
}
/**
* Send data from createOffer to the UI, can send success with SDP string
* or can send error
*
* @return none
*/
void ui_create_offer(call_events event, line_t nLine, callid_t nCallID,
uint16_t call_instance_id, char* sdp)
{
TNP_DEBUG(DEB_L_C_F_PREFIX"state=%d attr=%d call_instance=%d\n",
DEB_L_C_F_PREFIX_ARGS(UI_API, nLine, nCallID, __FUNCTION__), event, call_instance_id);
post_message_helper(CREATE_OFFER, event, nLine, nCallID, call_instance_id, sdp, 0);
return;
}
/**
* Send data from createAnswer to the UI, can send success with SDP string
* or can send error
*
* @return none
*/
void ui_create_answer(call_events event, line_t nLine, callid_t nCallID,
uint16_t call_instance_id, char* sdp)
{
TNP_DEBUG(DEB_L_C_F_PREFIX"state=%d call_instance=%d\n",
DEB_L_C_F_PREFIX_ARGS(UI_API, nLine, nCallID, __FUNCTION__), event, call_instance_id);
post_message_helper(CREATE_ANSWER, event, nLine, nCallID, call_instance_id, sdp, 0);
return;
}
/**
* Send data from setLocalDescription to the UI
*
* @return none
*/
void ui_set_local_description(call_events event, line_t nLine, callid_t nCallID,
uint16_t call_instance_id, char* sdp, cc_int32_t status)
{
TNP_DEBUG(DEB_L_C_F_PREFIX"state=%d call_instance=%d\n",
DEB_L_C_F_PREFIX_ARGS(UI_API, nLine, nCallID, __FUNCTION__), event, call_instance_id);
post_message_helper(SET_LOCAL_DESC, event, nLine, nCallID, call_instance_id, sdp, status);
return;
}
/**
* Send data from setRemoteDescription to the UI
*
* @return none
*/
void ui_set_remote_description(call_events event, line_t nLine, callid_t nCallID,
uint16_t call_instance_id, char* sdp, cc_int32_t status)
{
TNP_DEBUG(DEB_L_C_F_PREFIX"state=%d call_instance=%d\n",
DEB_L_C_F_PREFIX_ARGS(UI_API, nLine, nCallID, __FUNCTION__), event, call_instance_id);
post_message_helper(SET_REMOTE_DESC, event, nLine, nCallID, call_instance_id, sdp, status);
return;
}
/**
* Send Remote Stream data to the UI
*
* @return none
*/
void ui_on_remote_stream_added(call_events event, line_t nLine, callid_t nCallID, uint16_t call_instance_id, cc_media_remote_track_table_t media_track)
{
session_update_t msg;
fsmdef_dcb_t *dcb = fsmdef_get_dcb_by_call_id(nCallID);
if (nCallID == CC_NO_CALL_ID || dcb == NULL) {
/* no operation when no call ID */
return;
}
TNP_DEBUG(DEB_L_C_F_PREFIX"state=%d call_instance=%d\n",
DEB_L_C_F_PREFIX_ARGS(UI_API, nLine, nCallID, __FUNCTION__), event, call_instance_id);
msg.sessionID = createSessionId(nLine, nCallID);
msg.eventID = REMOTE_STREAM_ADD;
msg.update.ccSessionUpd.data.state_data.state = event;
msg.update.ccSessionUpd.data.state_data.inst = call_instance_id;
msg.update.ccSessionUpd.data.state_data.line_id = nLine;
msg.update.ccSessionUpd.data.state_data.media_stream_track_id = media_track.track[0].media_stream_track_id;
msg.update.ccSessionUpd.data.state_data.media_stream_id = (unsigned int)media_track.media_stream_id;
if ( ccappTaskPostMsg(CCAPP_SESSION_UPDATE, &msg, sizeof(session_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(CCAPP_F_PREFIX"failed to send CALL_STATE(%d) msg \n", __FUNCTION__, event);
}
return;
}