Merge branch 'master' into v1.2.stable

This commit is contained in:
Ken Rice 2013-03-04 09:47:38 -06:00
commit 58b6f6518e
375 changed files with 2 additions and 184174 deletions

View File

@ -1,419 +0,0 @@
AM_CFLAGS = -Iinclude -Icore/includes -Icpr/include -Icore/common -Icore/sipstack/h -I core/ccapp -Icore/sdp -Icore/gsm/h -Iplat/common
AUTOMAKE_OPTIONS = gnu
AM_CPPFLAGS = $(AM_CFLAGS)
lib_LTLIBRARIES = libsipcc.la
CORE_CCAPP_SRC = \
core/ccapp/call_logger.c \
core/ccapp/capability_set.c \
core/ccapp/cc_blf.c \
core/ccapp/cc_call_feature.c \
core/ccapp/cc_config.c \
core/ccapp/cc_device_feature.c \
core/ccapp/cc_device_manager.c \
core/ccapp/cc_info.c \
core/ccapp/cc_service.c \
core/ccapp/ccapi_call.c \
core/ccapp/ccapi_call_info.c \
core/ccapp/ccapi_config.c \
core/ccapp/ccapi_device.c \
core/ccapp/ccapi_device_info.c \
core/ccapp/ccapi_feature_info.c \
core/ccapp/ccapi_line.c \
core/ccapp/ccapi_line_info.c \
core/ccapp/ccapi_service.c \
core/ccapp/ccapi_snapshot.c \
core/ccapp/ccapp_task.c \
core/ccapp/ccprovider.c \
core/ccapp/conf_roster.c \
core/ccapp/sessionHash.c
CORE_COMMON_SRC = \
core/common/cfgfile_utils.c \
core/common/config_api.c \
core/common/config_parser.c \
core/common/init.c \
core/common/logger.c \
core/common/misc.c \
core/common/plat.c \
core/common/platform_api.c \
core/common/prot_configmgr.c \
core/common/resource_manager.c \
core/common/sip_socket_api.c \
core/common/subscription_handler.c \
core/common/text_strings.c \
core/common/ui.c
GSM_SRC = \
core/gsm/ccapi.c \
core/gsm/ccapi_strings.c \
core/gsm/dcsm.c \
core/gsm/fim.c \
core/gsm/fsm.c \
core/gsm/fsmb2bcnf.c \
core/gsm/fsmcac.c \
core/gsm/fsmcnf.c \
core/gsm/fsmdef.c \
core/gsm/fsmxfr.c \
core/gsm/gsm.c \
core/gsm/gsm_sdp.c \
core/gsm/gsm_sdp_crypto.c \
core/gsm/lsm.c \
core/gsm/media_cap_tbl.c \
core/gsm/sm.c \
core/gsm/subapi.c
CORE_SDP_SRC = \
core/sdp/ccsdp.c \
core/sdp/sdp_access.c \
core/sdp/sdp_attr.c \
core/sdp/sdp_attr_access.c \
core/sdp/sdp_base64.c \
core/sdp/sdp_config.c \
core/sdp/sdp_main.c \
core/sdp/sdp_services_unix.c \
core/sdp/sdp_token.c \
core/sdp/sdp_utils.c
CORE_SIPSTACK_SRC = \
core/sipstack/ccsip_callinfo.c \
core/sipstack/ccsip_cc.c \
core/sipstack/ccsip_common_util.c \
core/sipstack/ccsip_core.c \
core/sipstack/ccsip_debug.c \
core/sipstack/ccsip_info.c \
core/sipstack/ccsip_messaging.c \
core/sipstack/ccsip_platform.c \
core/sipstack/ccsip_platform_tcp.c \
core/sipstack/ccsip_platform_timers.c \
core/sipstack/ccsip_platform_tls.c \
core/sipstack/ccsip_platform_udp.c \
core/sipstack/ccsip_pmh.c \
core/sipstack/ccsip_publish.c \
core/sipstack/ccsip_register.c \
core/sipstack/ccsip_reldev.c \
core/sipstack/ccsip_sdp.c \
core/sipstack/ccsip_spi_utils.c \
core/sipstack/ccsip_subsmanager.c \
core/sipstack/ccsip_task.c \
core/sipstack/httpish.c \
core/sipstack/pmhutils.c \
core/sipstack/sip_common_regmgr.c \
core/sipstack/sip_common_transport.c \
core/sipstack/sip_csps_transport.c \
core/sipstack/sip_interface_regmgr.c
CORE_SIPSTACK_UNIX_SRC = core/sipstack/sip_platform_task.c
CORE_SRCCOMMON_SRC = \
core/src-common/configapp.c \
core/src-common/dialplan.c \
core/src-common/dialplanint.c \
core/src-common/digcalc.c \
core/src-common/kpml_common_util.c \
core/src-common/kpmlmap.c \
core/src-common/md5.c \
core/src-common/misc_apps_task.c \
core/src-common/pres_sub_not_handler.c \
core/src-common/publish_int.c \
core/src-common/singly_link_list.c \
core/src-common/sll_lite.c \
core/src-common/string_lib.c \
core/src-common/util_ios_queue.c \
core/src-common/util_parse.c \
core/src-common/util_string.c
CPR_COMMON_SRC = cpr/common/cpr_string.c cpr/common/strtok.c
CPR_DARWIN_SRC = \
cpr/darwin/cpr_darwin_errno.c \
cpr/darwin/cpr_darwin_init.c \
cpr/darwin/cpr_darwin_ipc.c \
cpr/darwin/cpr_darwin_locks.c \
cpr/darwin/cpr_darwin_socket.c \
cpr/darwin/cpr_darwin_stdio.c \
cpr/darwin/cpr_darwin_string.c \
cpr/darwin/cpr_darwin_threads.c \
cpr/darwin/cpr_darwin_timers_using_select.c
CPR_LINUX_SRC = \
cpr/linux/cpr_linux_errno.c \
cpr/linux/cpr_linux_init.c \
cpr/linux/cpr_linux_ipc.c \
cpr/linux/cpr_linux_locks.c \
cpr/linux/cpr_linux_socket.c \
cpr/linux/cpr_linux_stdio.c \
cpr/linux/cpr_linux_string.c \
cpr/linux/cpr_linux_threads.c \
cpr/linux/cpr_linux_timers_using_select.c \
cpr/linux/cpr_linux_tst.c
CPR_WIN32_SRC = \
cpr/win32/cpr_win_debug.c \
cpr/win32/cpr_win_errno.c \
cpr/win32/cpr_win_init.c \
cpr/win32/cpr_win_ipc.c \
cpr/win32/cpr_win_locks.c \
cpr/win32/cpr_win_rand.c \
cpr/win32/cpr_win_socket.c \
cpr/win32/cpr_win_stdio.c \
cpr/win32/cpr_win_string.c \
cpr/win32/cpr_win_threads.c \
cpr/win32/cpr_win_timers.c
PLAT_COMMON_SRC = plat/common/dns_utils.c
PLAT_CSF2G_SRC = \
plat/csf2g/model.c \
plat/csf2g/reset_api.c
PLAT_DARWIN_SRC = plat/darwin/plat_api_stub.c
#plat/darwin/netif.c
libsipcc_la_CFLAGS = $(AM_CFLAGS) $(SWITCH_AM_CFLAGS)
libsipcc_la_LDFLAGS = $(LIBS) $(PLATFORM_CORE_LDFLAGS)
libsipcc_la_SOURCES = $(CORE_CCAPP_SRC) $(CORE_COMMON_SRC) $(GSM_SRC) $(CORE_SDP_SRC) $(CORE_SIPSTACK_SRC) $(CORE_SRCCOMMON_SRC) $(CPR_COMMON_SRC) $(PLAT_CSF2G_SRC)
if ISMAC
libsipcc_la_SOURCES += $(CPR_DARWIN_SRC) $(PLAT_DARWIN_SRC)
libsipcc_la_CFLAGS += -DSIP_OS_OSX -D_POSIX_SOURCE -DCPR_MEMORY_LITTLE_ENDIAN -DNO_SOCKET_POLLING -DUSE_TIMER_SELECT_BASED -DFULL_BUILD -DSTUBBED_OUT -DUSE_PRINTF -D_DARWIN_C_SOURCE -DNO_NSPR_10_SUPPORT
endif
#if not win32
libsipcc_la_SOURCES += $(PLAT_COMMON_SRC) $(CORE_SIPSTACK_UNIX_SRC)
if !ISMAC
libsipcc_la_CFLAGS += -DSIP_OS_LINUX -D_GNU_SOURCE -DCPR_MEMORY_LITTLE_ENDIAN -DNO_SOCKET_POLLING -DUSE_TIMER_SELECT_BASED -DFULL_BUILD -DSTUBBED_OUT -DUSE_PRINTF -DLINUX
libsipcc_la_SOURCES += $(CPR_LINUX_SRC)
endif
#endif
library_includedir = $(prefix)/include
library_include_HEADERS = \
core/ccapp/call_logger.h \
core/ccapp/capability_set.h \
core/ccapp/cc_device_manager.h \
core/ccapp/ccapi_snapshot.h \
core/ccapp/ccapp_task.h \
core/ccapp/CCProvider.h \
core/ccapp/conf_roster.h \
core/ccapp/sessionHash.h \
core/common/cfgfile_utils.h \
core/common/config_parser.h \
core/common/logger.h \
core/common/logmsg.h \
core/common/prot_cfgmgr_private.h \
core/common/prot_configmgr.h \
core/common/resource_manager.h \
core/common/subscription_handler.h \
core/common/text_strings.h \
core/gsm/h/fim.h \
core/gsm/h/fsm.h \
core/gsm/h/gsm.h \
core/gsm/h/gsm_sdp.h \
core/gsm/h/lsm.h \
core/gsm/h/lsm_private.h \
core/gsm/h/sm.h \
core/includes/ccapi.h \
core/includes/ccSession.h \
core/includes/check_sync.h \
core/includes/ci.h \
core/includes/config.h \
core/includes/configapp.h \
core/includes/configmgr.h \
core/includes/debug.h \
core/includes/dialplan.h \
core/includes/dialplanint.h \
core/includes/digcalc.h \
core/includes/dns_utils.h \
core/includes/dtmf.h \
core/includes/embedded.h \
core/includes/intelpentiumtypes.h \
core/includes/kpml_common_util.h \
core/includes/kpmlmap.h \
core/includes/md5.h \
core/includes/memory.h \
core/includes/misc_apps_task.h \
core/includes/misc_util.h \
core/includes/phntask.h \
core/includes/phone.h \
core/includes/phone_debug.h \
core/includes/phone_platform_constants.h \
core/includes/phone_types.h \
core/includes/platform_api.h \
core/includes/pres_sub_not_handler.h \
core/includes/publish_int.h \
core/includes/rcc_int_types.h \
core/includes/regexp.h \
core/includes/ringlist.h \
core/includes/rtp_defs.h \
core/includes/scSession.h \
core/includes/session.h \
core/includes/sessionConstants.h \
core/includes/sessionTypes.h \
core/includes/sessuri.h \
core/includes/singly_link_list.h \
core/includes/sip_socket_api.h \
core/includes/sntp.h \
core/includes/string_lib.h \
core/includes/subapi.h \
core/includes/task.h \
core/includes/time2.h \
core/includes/timer.h \
core/includes/tnpphone.h \
core/includes/uart.h \
core/includes/uiapi.h \
core/includes/upgrade.h \
core/includes/util_ios_queue.h \
core/includes/util_parse.h \
core/includes/util_string.h \
core/includes/www.h \
core/includes/xml_defs.h \
core/sdp/sdp.h \
core/sdp/sdp_base64.h \
core/sdp/sdp_os_defs.h \
core/sdp/sdp_private.h \
core/sipstack/h/ccsip_callinfo.h \
core/sipstack/h/ccsip_cc.h \
core/sipstack/h/ccsip_common_cb.h \
core/sipstack/h/ccsip_core.h \
core/sipstack/h/ccsip_credentials.h \
core/sipstack/h/ccsip_macros.h \
core/sipstack/h/ccsip_messaging.h \
core/sipstack/h/ccsip_platform.h \
core/sipstack/h/ccsip_platform_tcp.h \
core/sipstack/h/ccsip_platform_timers.h \
core/sipstack/h/ccsip_platform_tls.h \
core/sipstack/h/ccsip_platform_udp.h \
core/sipstack/h/ccsip_pmh.h \
core/sipstack/h/ccsip_protocol.h \
core/sipstack/h/ccsip_publish.h \
core/sipstack/h/ccsip_register.h \
core/sipstack/h/ccsip_reldev.h \
core/sipstack/h/ccsip_sdp.h \
core/sipstack/h/ccsip_sim.h \
core/sipstack/h/ccsip_spi_utils.h \
core/sipstack/h/ccsip_subsmanager.h \
core/sipstack/h/ccsip_task.h \
core/sipstack/h/httpish.h \
core/sipstack/h/httpish_protocol.h \
core/sipstack/h/pmhdefs.h \
core/sipstack/h/pmhutils.h \
core/sipstack/h/regmgrapi.h \
core/sipstack/h/sip_ccm_transport.h \
core/sipstack/h/sip_common_regmgr.h \
core/sipstack/h/sip_common_transport.h \
core/sipstack/h/sip_csps_transport.h \
core/sipstack/h/sip_interface_regmgr.h \
core/sipstack/h/sip_platform_task.h \
cpr/android/cpr_android_align.h \
cpr/android/cpr_android_assert.h \
cpr/android/cpr_android_errno.h \
cpr/android/cpr_android_in.h \
cpr/android/cpr_android_ipc.h \
cpr/android/cpr_android_locks.h \
cpr/android/cpr_android_private.h \
cpr/android/cpr_android_rand.h \
cpr/android/cpr_android_socket.h \
cpr/android/cpr_android_stdio.h \
cpr/android/cpr_android_string.h \
cpr/android/cpr_android_strings.h \
cpr/android/cpr_android_time.h \
cpr/android/cpr_android_timers.h \
cpr/android/cpr_android_tst.h \
cpr/android/cpr_android_types.h \
cpr/darwin/cpr_darwin_align.h \
cpr/darwin/cpr_darwin_assert.h \
cpr/darwin/cpr_darwin_errno.h \
cpr/darwin/cpr_darwin_in.h \
cpr/darwin/cpr_darwin_ipc.h \
cpr/darwin/cpr_darwin_locks.h \
cpr/darwin/cpr_darwin_private.h \
cpr/darwin/cpr_darwin_rand.h \
cpr/darwin/cpr_darwin_socket.h \
cpr/darwin/cpr_darwin_stdio.h \
cpr/darwin/cpr_darwin_string.h \
cpr/darwin/cpr_darwin_strings.h \
cpr/darwin/cpr_darwin_time.h \
cpr/darwin/cpr_darwin_timers.h \
cpr/darwin/cpr_darwin_tst.h \
cpr/darwin/cpr_darwin_types.h \
cpr/include/cpr.h \
cpr/include/plstr.h \
cpr/include/cpr_assert.h \
cpr/include/cpr_debug.h \
cpr/include/cpr_errno.h \
cpr/include/cpr_in.h \
cpr/include/cpr_ipc.h \
cpr/include/cpr_locks.h \
cpr/include/cpr_memory.h \
cpr/include/cpr_rand.h \
cpr/include/cpr_socket.h \
cpr/include/cpr_stddef.h \
cpr/include/cpr_stdio.h \
cpr/include/cpr_stdlib.h \
cpr/include/cpr_string.h \
cpr/include/cpr_strings.h \
cpr/include/cpr_threads.h \
cpr/include/cpr_time.h \
cpr/include/cpr_timers.h \
cpr/include/cpr_types.h \
cpr/linux/cpr_linux_align.h \
cpr/linux/cpr_linux_assert.h \
cpr/linux/cpr_linux_errno.h \
cpr/linux/cpr_linux_in.h \
cpr/linux/cpr_linux_ipc.h \
cpr/linux/cpr_linux_locks.h \
cpr/linux/cpr_linux_private.h \
cpr/linux/cpr_linux_rand.h \
cpr/linux/cpr_linux_socket.h \
cpr/linux/cpr_linux_stdio.h \
cpr/linux/cpr_linux_string.h \
cpr/linux/cpr_linux_strings.h \
cpr/linux/cpr_linux_time.h \
cpr/linux/cpr_linux_timers.h \
cpr/linux/cpr_linux_tst.h \
cpr/linux/cpr_linux_types.h \
include/cc_blf.h \
include/cc_blf_listener.h \
include/cc_call_feature.h \
include/cc_call_listener.h \
include/cc_config.h \
include/cc_constants.h \
include/cc_debug.h \
include/cc_device_feature.h \
include/cc_device_listener.h \
include/cc_info.h \
include/cc_info_listener.h \
include/cc_service.h \
include/cc_service_listener.h \
include/cc_types.h \
include/ccapi_call.h \
include/ccapi_call_info.h \
include/ccapi_call_listener.h \
include/ccapi_calllog.h \
include/ccapi_conf_roster.h \
include/ccapi_device.h \
include/ccapi_device_info.h \
include/ccapi_device_listener.h \
include/ccapi_feature_info.h \
include/ccapi_line.h \
include/ccapi_line_info.h \
include/ccapi_line_listener.h \
include/ccapi_service.h \
include/ccapi_types.h \
include/ccsdp.h \
include/config_api.h \
include/dns_util.h \
include/peer_connection_types.h \
include/plat_api.h \
include/reset_api.h \
include/sll_lite.h \
include/vcm.h \
include/xml_parser_defines.h \
plat/common/plat_debug.h \
plat/common/tnp_blf.h

View File

@ -1,144 +0,0 @@
/* 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/. */
#ifndef __CCPROVIDER_H__
#define __CCPROVIDER_H__
#include "cpr_types.h"
#include "cpr_ipc.h"
#include "cpr_socket.h"
#include "cpr_memory.h"
#include "cpr_errno.h"
#include "cpr_in.h"
#include "cpr_rand.h"
#include "cpr_string.h"
#include "cpr_threads.h"
#include "phone_types.h"
#include "session.h"
#include "cc_constants.h"
#include "ccapi_types.h"
#include "conf_roster.h"
#define CC_DEVICE_ID 0
#include "ccapi_service.h"
typedef enum {
FAILOVER,
FALLBACK,
NO_CUCM_SRST_AVAILABLE,
NONE_AVAIL,
} Cucm_mode_t;
typedef struct
{
cc_reg_state_t state;
Cucm_mode_t cucm_mode;
cc_boolean inPreservation;
session_id_t preservID;
unsigned int mode;
unsigned int cause;
} CCAppGlobal_t;
typedef struct cc_call_log_t_ {
string_t localPartyName;
string_t localPartyNumber;
string_t remotePartyName[2];
string_t remotePartyNumber[2];
string_t altPartyNumber[2];
cc_log_disposition_t logDisp;
cc_call_state_t callState;
time_t startTime;
cc_uint32_t duration;
} cc_call_log_t;
typedef struct cc_call_info_t_{
uint32_t ref_count;
session_id_t sess_id;
line_t line;
callid_t id;
uint16_t inst;
cc_call_state_t state;
cc_call_attr_t attr;
cc_call_type_t type;
cc_call_security_t security;
cc_call_policy_t policy;
unsigned int callref;
int isSelected;
unsigned int log_disp;
string_t clg_name;
string_t clg_number;
string_t alt_number;
string_t cld_name;
string_t cld_number;
string_t orig_called_name;
string_t orig_called_number;
string_t last_redir_name;
string_t last_redir_number;
string_t plcd_name;
string_t plcd_number;
string_t status;
char gci[CC_MAX_GCID];
cc_int32_t cause;
cc_int32_t vid_dir;
cc_int32_t vid_offer;
cc_boolean is_conf;
cc_boolean ringer_start;
cc_boolean ringer_once;
cc_int32_t ringer_mode;
cc_boolean allowed_features[CCAPI_CALL_CAP_MAX];
cc_string_t info_package;
cc_string_t info_type;
cc_string_t info_body;
cc_call_log_t call_log;
cc_boolean audio_mute;
cc_boolean video_mute;
cc_call_conference_Info_t call_conference;
cc_string_t sdp;
unsigned int media_stream_track_id;
unsigned int media_stream_id;
const cc_media_constraints_t* cc_constraints;
} session_data_t;
typedef enum {
NO_ACTION=0,
RESET_ACTION,
RESTART_ACTION,
RE_REGISTER_ACTION,
STOP_ACTION,
DESTROY_ACTION
} cc_action_t;
#define CCAPP_SERVICE_CMD 1
#define CCAPP_CREATE_SESSION 2
#define CCAPP_CLOSE_SESSION 3
#define CCAPP_INVOKE_FEATURE 4
#define CCAPP_SESSION_UPDATE 5
#define CCAPP_FEATURE_UPDATE 6
#define CCAPP_UPDATELINES 7
#define CCAPP_FAILOVER_IND 8
#define CCAPP_FALLBACK_IND 9
#define CCAPP_MODE_NOTIFY 10
#define CCAPP_SHUTDOWN_ACK 11
#define CCAPP_REG_ALL_FAIL 12
#define CCAPP_INVOKEPROVIDER_FEATURE 13
#define CCAPP_SEND_INFO 14
#define CCAPP_RCVD_INFO 15
#define CCAPP_LOGOUT_RESET 16
#define CCAPP_THREAD_UNLOAD 17
#define CCAPP_SESSION_MGMT 18
extern cpr_status_e ccappTaskPostMsg(unsigned int msgId, void * data, uint16_t len, int appId);
extern void ccappSyncSessionMgmt(session_mgmt_t *sessMgmt);
extern void CCApp_task(void * arg);
extern void *findhash(unsigned int key);
extern session_id_t createSessionId(line_t line, callid_t call);
extern void getLineIdAndCallId (line_t *line_id, callid_t *call_id);
extern void ccp_handler(void* msg, int type);
extern session_data_t * getDeepCopyOfSessionData(session_data_t *data);
extern void cleanSessionData(session_data_t *data);
extern cc_call_handle_t ccappGetConnectedCall();
#endif

View File

@ -1,303 +0,0 @@
/* 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 "cpr_stdio.h"
#include <time.h>
#include "sessionHash.h"
#include "CCProvider.h"
#include "call_logger.h"
void calllogger_init_call_log (cc_call_log_t *log)
{
log->localPartyName = strlib_empty();
log->localPartyNumber = strlib_empty();
log->remotePartyName[0] = strlib_empty();
log->remotePartyName[1] = strlib_empty();
log->remotePartyNumber[0] = strlib_empty();
log->remotePartyNumber[1] = strlib_empty();
log->altPartyNumber[0] = strlib_empty();
log->altPartyNumber[1] = strlib_empty();
log->startTime = 0;
log->duration = 0;
log->logDisp = CC_LOGD_UNKNWN;
log->callState = MAX_CALL_STATES;
}
void calllogger_copy_call_log (cc_call_log_t *dest, cc_call_log_t * src)
{
dest->localPartyName = strlib_copy(src->localPartyName);
dest->localPartyNumber = strlib_copy(src->localPartyNumber);
dest->remotePartyName[0] = strlib_copy(src->remotePartyName[0]);
dest->remotePartyName[1] = strlib_copy(src->remotePartyName[1]);
dest->remotePartyNumber[0] = strlib_copy(src->remotePartyNumber[0]);
dest->remotePartyNumber[1] = strlib_copy(src->remotePartyNumber[1]);
dest->altPartyNumber[0] = strlib_copy(src->altPartyNumber[0]);
dest->altPartyNumber[1] = strlib_copy(src->altPartyNumber[1]);
dest->startTime = src->startTime;
dest->duration = src->duration;
dest->logDisp = src->logDisp;
dest->callState = src->callState;
}
void calllogger_free_call_log (cc_call_log_t *log)
{
strlib_free(log->localPartyName);
strlib_free(log->localPartyNumber);
strlib_free(log->remotePartyName[0]);
strlib_free(log->remotePartyName[1]);
strlib_free(log->remotePartyNumber[0]);
strlib_free(log->remotePartyNumber[1]);
strlib_free(log->altPartyNumber[0]);
strlib_free(log->altPartyNumber[1]);
calllogger_init_call_log(log);
}
void calllogger_print_call_log(cc_call_log_t *log)
{
static const char *fname = "calllogger_print_call_log";
CCLOG_DEBUG(DEB_F_PREFIX"Entering...\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
CCLOG_DEBUG("Remote ID %s:%s %s:%s\n LocalID %s:%s \n alt %s:%s\n",
log->remotePartyName[0], log->remotePartyNumber[0],
log->remotePartyName[1], log->remotePartyNumber[1],
log->localPartyName, log->localPartyNumber,
log->altPartyNumber[0], log->altPartyNumber[1] );
CCLOG_DEBUG("state %d \n Disp %d\n", log->callState, log->logDisp);
}
/**
* Call logger update to be called placed call num update
*/
void calllogger_setPlacedCallInfo (session_data_t *data)
{
static const char *fname = "calllogger_setPlacedCallInfo";
CCLOG_DEBUG(DEB_F_PREFIX"updating placed number for session %x to %s:%s\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->sess_id,
data->cld_name, data->cld_number);
if ( data->call_log.logDisp == CC_LOGD_RCVD ) { return;}
data->call_log.remotePartyName[0] = strlib_copy(data->plcd_name);
data->call_log.remotePartyNumber[0] = strlib_copy(data->plcd_number);
data->call_log.logDisp = CC_LOGD_SENT;
data->call_log.startTime = time(NULL);
}
/**
* call logger api to be called for log disp update
*/
void calllogger_updateLogDisp (session_data_t *data)
{
static const char *fname = "calllogger_updateLogDisp";
CCLOG_DEBUG(DEB_F_PREFIX"updating log disposition for session %x to %d\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->sess_id, data->log_disp);
data->call_log.logDisp = data->log_disp;
}
cc_boolean partyInfoPassedTheNumberFilter (cc_string_t partyString)
{
static const char *fname = "partyInfoPassedTheNumberFilter";
CCLOG_DEBUG(DEB_F_PREFIX"Entering...\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
// check if partyString is something we should not be logging at this point
// Uris: CfwdALL 105
// Conference 152
if (partyString && strlen(partyString) > 1 &&
(partyString[1] == 17 ||
partyString[1] == 91 ||
partyString[1] == 05 ||
partyString[1] == 18 ||
partyString[1] == 16 ||
partyString[1] == 52 )) {
CCLOG_DEBUG(DEB_F_PREFIX"Filtering out the partyName=%s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), partyString);
return FALSE;
}
return TRUE;
}
/**
* partyInfoPassedTheNameFilter
*
* @param partyString String
* @return boolean
*/
cc_boolean partyInfoPassedTheNameFilter(cc_string_t partyString) {
static const char *fname = "partyInfoPassedTheNameFilter";
CCLOG_DEBUG(DEB_F_PREFIX"Entering...\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
// If the name String has Conference, filter it out
if (partyString && strlen(partyString) > 1 &&
(partyString[1] == 52 || partyString[1] == 53)) {
CCLOG_DEBUG(DEB_F_PREFIX"Filtering out the partyName=%s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), partyString);
return FALSE;
}
return TRUE;
}
static cc_string_t missedCallMask=NULL;
void calllogger_setMissedCallLoggingConfig(cc_string_t mask) {
static const char *fname = "calllogger_setMissedCallLoggingConfig";
CCLOG_DEBUG(DEB_F_PREFIX"Entering... mask=%s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), mask);
if ( missedCallMask == NULL) {
missedCallMask = strlib_empty();
}
missedCallMask = strlib_update(missedCallMask, mask);
}
cc_boolean isMissedCallLoggingEnabled (unsigned int line)
{
static const char *fname = "isMissedCallLoggingEnabled";
CCLOG_DEBUG(DEB_F_PREFIX"Entering... mask=%s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), missedCallMask);
if (missedCallMask == NULL) {
return TRUE;
}
if ((line > 0) && strlen(missedCallMask) > (line-1)) {
if ( missedCallMask[line-1] == '0' ) {
return FALSE;
}
}
return TRUE;
}
void handlePlacedCall (session_data_t *data)
{
static const char *fname = "handlePlacedCall";
CCLOG_DEBUG(DEB_F_PREFIX"Entering...\n",DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
//populate calling party if not already populated
if ( data->call_log.localPartyNumber == strlib_empty() ) {
data->call_log.localPartyNumber = strlib_update(data->call_log.localPartyNumber, data->clg_number);
data->call_log.localPartyName = strlib_update(data->call_log.localPartyName, data->clg_name);
}
// first update or update with the same number we update name and number
if ( data->call_log.remotePartyNumber[0] == strlib_empty() ||
(data->cld_number[0] != 0 && strncmp(data->call_log.remotePartyNumber[0],
data->cld_number, strlen(data->cld_number)) == 0 )) {
if ( partyInfoPassedTheNameFilter(data->cld_name) &&
partyInfoPassedTheNumberFilter(data->cld_number) )
data->call_log.remotePartyNumber[0] = strlib_update(data->call_log.remotePartyNumber[0], data->cld_number);
data->call_log.remotePartyName[0] = strlib_update(data->call_log.remotePartyName[0], data->cld_name);
}
// Start the duration count once the call reaches connected state.
if ( data->state == CONNECTED &&
data->call_log.startTime == 0 ) {
data->call_log.startTime = time(NULL);
}
if (data->state == ONHOOK ) {
// only set the duration if the call entered the connected state
if ( data->call_log.startTime != 0 ) {
data->call_log.duration = (cc_uint32_t) (time(NULL) - data->call_log.startTime);
} else {
data->call_log.startTime = time(NULL);
}
}
data->call_log.callState = data->state;
}
void handleMissedOrReceviedCall ( session_data_t *data )
{
static const char *fname = "handleMissedOrReceviedCall";
int line = GET_LINE_ID(data->sess_id);
cc_string_t localName = strlib_empty(), localNumber = strlib_empty();
cc_string_t remoteName = strlib_empty(), remoteNumber = strlib_empty();
CCLOG_DEBUG(DEB_F_PREFIX"Entering...\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if (data->type == CC_CALL_TYPE_INCOMING || data->type == CC_CALL_TYPE_FORWARDED ) {
localName = data->cld_name;
localNumber = data->cld_number;
remoteName = data->clg_name;
remoteNumber = data->clg_number;
} else {
localName = data->clg_name;
localNumber = data->clg_number;
remoteName = data->cld_name;
remoteNumber = data->cld_number;
}
if ( data->call_log.localPartyNumber == strlib_empty() ) {
data->call_log.localPartyNumber = strlib_update(data->call_log.localPartyNumber, localNumber);
data->call_log.localPartyName = strlib_update(data->call_log.localPartyName, localName);
}
// first update or update with the same number we update name and number
if ( data->call_log.remotePartyNumber[0] == strlib_empty() ||
(remoteNumber[0] != 0 && strncmp(data->call_log.remotePartyNumber[0],
remoteNumber, strlen(remoteNumber)) == 0 )) {
data->call_log.remotePartyNumber[0] = strlib_update(data->call_log.remotePartyNumber[0], remoteNumber);
data->call_log.altPartyNumber[0] = strlib_update(data->call_log.altPartyNumber[0], data->alt_number);
if (data->call_log.remotePartyName[0] == strlib_empty() ) {
data->call_log.remotePartyName[0] = strlib_update(data->call_log.remotePartyName[0], remoteName);
}
} else {
// since number doesn't match this is a new leg
data->call_log.remotePartyName[1] = strlib_update(data->call_log.remotePartyName[1], remoteName);
data->call_log.remotePartyNumber[1] = strlib_update(data->call_log.remotePartyNumber[1], remoteNumber);
data->call_log.altPartyNumber[1] = strlib_update(data->call_log.altPartyNumber[1], data->alt_number);
}
if ( data->state == ONHOOK ) {
if ( data->call_log.callState == RINGIN ) {
data->call_log.startTime = time(NULL);
if (isMissedCallLoggingEnabled(line)) {
data->call_log.logDisp = CC_LOGD_MISSED;
} else {
data->call_log.logDisp = CC_LOGD_DELETE;
}
data->call_log.startTime = time(NULL);
data->call_log.duration = 0; //missed call duration is 0
} else if ( data->call_log.startTime != 0 ){
//connected call going onhook update duration
data->call_log.duration = (cc_uint32_t) (time(NULL) - data->call_log.startTime);
}
}
if ( data->state == CONNECTED && data->call_log.startTime == 0 ) {
data->call_log.logDisp = CC_LOGD_RCVD;
data->call_log.startTime = time(NULL);
}
data->call_log.callState = data->state;
}
/**
* Call logger update to be called on attr or callinfo or state events
*/
void calllogger_update (session_data_t *data)
{
static const char *fname = "calllogger_update";
CCLOG_DEBUG(DEB_F_PREFIX"Entering...\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if (data->call_log.logDisp == CC_LOGD_DELETE) {
CCLOG_DEBUG(DEB_F_PREFIX"log disposition set to delete. Ignoring call logging for sess_id=%x\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->sess_id);
}
if (data->call_log.logDisp == CC_LOGD_RCVD || data->call_log.logDisp == CC_LOGD_MISSED ||
data->type == CC_CALL_TYPE_INCOMING || data->type == CC_CALL_TYPE_FORWARDED ) {
handleMissedOrReceviedCall(data);
} else if ( data->call_log.logDisp == CC_LOGD_SENT ||
data->type == CC_CALL_TYPE_OUTGOING ) {
handlePlacedCall (data);
}
}

View File

@ -1,20 +0,0 @@
/* 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/. */
#ifndef __CALL_LOGGER_H__
#define __CALL_LOGGER_H__
#include "cc_types.h"
#include "CCProvider.h"
void calllogger_init_call_log(cc_call_log_t *log);
void calllogger_copy_call_log(cc_call_log_t *dest, cc_call_log_t * src);
void calllogger_free_call_log(cc_call_log_t *log);
void calllogger_print_call_log(cc_call_log_t *log);
void calllogger_setPlacedCallInfo(session_data_t *data);
void calllogger_updateLogDisp(session_data_t *data);
void calllogger_setMissedCallLoggingConfig(cc_string_t mask);
void calllogger_update(session_data_t *data);
#endif

View File

@ -1,281 +0,0 @@
/* 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 "capability_set.h"
#include "CCProvider.h"
// --------------------------------------------------------------------------------
// Data Structures Used to Store the Capability Set Information
// Settings on kept on a per call state, per feature basis.
// Includes all general endpoint capabilities, plus fcp-controlled ones
// --------------------------------------------------------------------------------
static cc_boolean capability_set[MAX_CALL_STATES][CCAPI_CALL_CAP_MAX];
static cc_boolean capability_idleset[CCAPI_CALL_CAP_MAX];
// --------------------------------------------------------------------------------
// Data Structures Used to Store the Parsed FCP information from UCM/FCP file
// (after parse will be used to selectively set capabilities in the above also)
// --------------------------------------------------------------------------------
// maximum number of features
#define FCP_FEATURE_MAX 9
char g_fp_version_stamp[MAX_FP_VERSION_STAMP_LEN];
static cc_feature_control_policy_info_t cc_feat_control_policy[FCP_FEATURE_MAX];
static ccapi_call_capability_e cc_fcp_id_to_capability_map[FCP_FEATURE_MAX+1]; // 0th entry of map is not used/null entry
static const unsigned int CALL_FORWARD_ALL_FCP_INDEX = 1;
static const unsigned int CONFERENCE_LIST_FCP_INDEX = 4;
static const unsigned int SPEED_DIAL_FCP_INDEX = 5;
static const unsigned int CALL_BACK_FCP_INDEX = 6;
static const unsigned int REDIAL_FCP_INDEX = 7;
static int fcp_index = -1;
// --------------------------------------------------------------------------------
/*
* capset_set_fcp_forwardall - sets the fcp-controlled call forward all feature
*
*/
static void capset_set_fcp_forwardall (cc_boolean state)
{
CONFIG_DEBUG(DEB_F_PREFIX"FCP Setting CALLFWD Capability to [%d]\n", DEB_F_PREFIX_ARGS(JNI, "capset_set_fcp_forwardall"), (unsigned int)state);
capability_idleset[CCAPI_CALL_CAP_CALLFWD] = state;
capability_set[OFFHOOK][CCAPI_CALL_CAP_CALLFWD] = state;
}
/*
* capset_set_fcp_redial - sets the fcp-controlled redial feature
*
*/
static void capset_set_fcp_redial (cc_boolean state)
{
CONFIG_DEBUG(DEB_F_PREFIX"FCP Setting REDIAL capability to [%d]\n", DEB_F_PREFIX_ARGS(JNI, "capset_set_fcp_redial"), (unsigned int)state);
capability_idleset[CCAPI_CALL_CAP_REDIAL] = state;
capability_set[OFFHOOK][CCAPI_CALL_CAP_REDIAL] = state;
capability_set[ONHOOK][CCAPI_CALL_CAP_REDIAL] = state;
}
// --------------------------------------------------------------------------------
/*
* fcp_set_index - sets a given feture index number (from fcp xml file), maps it to the internal
* call capability, and sets the appropriate state-based capability for the feature index
*
*/
static void fcp_set_index (unsigned int fcpCapabilityId, cc_boolean state)
{
ccapi_call_capability_e capabilityId = CCAPI_CALL_CAP_MAX;
// range check the capability index
if ((fcpCapabilityId <= 0) || (fcpCapabilityId > FCP_FEATURE_MAX))
{
CONFIG_ERROR(CFG_F_PREFIX "Unable to set capability of unknown feature [%d] in FCP \n", "fcp_set_index", fcpCapabilityId);
return;
}
// convert the fcp index to an fcp capability id
capabilityId = cc_fcp_id_to_capability_map[fcpCapabilityId];
// based on the capability id, invoke the appropate method specific to that capability
switch (capabilityId)
{
case CCAPI_CALL_CAP_CALLFWD : capset_set_fcp_forwardall (state); break;
case CCAPI_CALL_CAP_REDIAL : capset_set_fcp_redial (state); break;
default :
{
CONFIG_ERROR(CFG_F_PREFIX "Unable to update settings for capability [%d]\n", "fcp_set_index", (int)capabilityId);
break;
}
}
}
/*
* capset_init - initialize the internal capability data structures to defaults
*
*/
static void capset_init ()
{
// initialize the 4 tables related to capability set to false
memset(capability_idleset, 0, sizeof(capability_idleset));
memset(capability_set, 0, sizeof(capability_set));
// ----------------------------------------------------------------------
// FCP based capabilities
// ----------------------------------------------------------------------
CONFIG_DEBUG(DEB_F_PREFIX"FCP Initializing Capabilities to default\n", DEB_F_PREFIX_ARGS(JNI, "capset_init"));
// ----------------------------------------------------------------------
// Non-FCP-based Capabilities
// ----------------------------------------------------------------------
// Now, set all the non-FCP based capabilities to appropriate default settings
// (some of which may be enabled by default)
capability_idleset[CCAPI_CALL_CAP_NEWCALL] = TRUE;
// call-state based settings
// offhook
capability_set[OFFHOOK][CCAPI_CALL_CAP_ENDCALL] = TRUE;
// onhook
capability_set[ONHOOK][CCAPI_CALL_CAP_NEWCALL] = TRUE;
// ringout
capability_set[RINGOUT][CCAPI_CALL_CAP_ENDCALL] = TRUE;
// ringing
capability_set[RINGIN][CCAPI_CALL_CAP_ANSWER] = TRUE;
// proceed
capability_set[PROCEED][CCAPI_CALL_CAP_ENDCALL] = TRUE;
// connected
capability_set[CONNECTED][CCAPI_CALL_CAP_ENDCALL] = TRUE;
capability_set[CONNECTED][CCAPI_CALL_CAP_HOLD] = TRUE;
capability_set[CONNECTED][CCAPI_CALL_CAP_TRANSFER] = TRUE;
capability_set[CONNECTED][CCAPI_CALL_CAP_CONFERENCE] = TRUE;
capability_set[CONNECTED][CCAPI_CALL_CAP_SELECT] = TRUE;
// hold
capability_set[HOLD][CCAPI_CALL_CAP_RESUME] = TRUE;
capability_set[REMHOLD][CCAPI_CALL_CAP_RESUME] = TRUE;
// busy
capability_set[BUSY][CCAPI_CALL_CAP_ENDCALL] = TRUE;
// reorder
capability_set[REORDER][CCAPI_CALL_CAP_ENDCALL] = TRUE;
// dialing
capability_set[DIALING][CCAPI_CALL_CAP_ENDCALL] = TRUE;
capability_set[DIALING][CCAPI_CALL_CAP_DIAL] = TRUE;
capability_set[DIALING][CCAPI_CALL_CAP_SENDDIGIT] = TRUE;
capability_set[DIALING][CCAPI_CALL_CAP_BACKSPACE] = TRUE;
// holdrevert
capability_set[HOLDREVERT][CCAPI_CALL_CAP_ANSWER] = TRUE;
// preservation
capability_set[PRESERVATION][CCAPI_CALL_CAP_ENDCALL] = TRUE;
// waiting for digits
capability_set[WAITINGFORDIGITS][CCAPI_CALL_CAP_SENDDIGIT] = TRUE;
capability_set[WAITINGFORDIGITS][CCAPI_CALL_CAP_BACKSPACE] = TRUE;
}
/*
* capset_get_idleset - get the set of features associated with idle state
*
*/
void capset_get_idleset ( cc_cucm_mode_t mode, cc_boolean features[])
{
static const char fname[] = "capset_get_idleset";
int i;
CCAPP_DEBUG(DEB_F_PREFIX"updating idleset",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
for (i=0;i < CCAPI_CALL_CAP_MAX; i++) {
CCAPP_DEBUG(DEB_F_PREFIX"updating line features %d=%d",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), i, capability_idleset[i]);
features[i] = capability_idleset[i];
}
}
/*
* capset_get_allowed_features - get the set of features
*
*/
void capset_get_allowed_features ( cc_cucm_mode_t mode, cc_call_state_t state, cc_boolean features[])
{
static const char fname[] = "capset_get_allowed_features";
int i;
CCAPP_DEBUG(DEB_F_PREFIX"updating idleset",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
for (i=0;i < CCAPI_CALL_CAP_MAX; i++) {
features[i] = capability_set[state][i];
}
}
// --------------------------------------------------------------------------------------------------------
// ---------------------------- XML Parse Logic for Feature Control Policy --------------------------------
// --------------------------------------------------------------------------------------------------------
/*
* fcp_set_capabilities - updates the capabilities structure, based on the now parsed information
* from fcp xml file
*
*/
static void fcp_set_capabilities()
{
int my_fcp_index = 0;
if ( (fcp_index+1) >= FCP_FEATURE_MAX) {
fcp_index = (FCP_FEATURE_MAX -1);
CONFIG_ERROR(CFG_F_PREFIX "Received more than the maximum supported features [%d] in FCP \n", "fcp_set_capabilities", FCP_FEATURE_MAX);
}
// loop over all the FCP features parsed, and for each one, based on ID, and enabled settings,
// update the corresponding call capability flags
for (my_fcp_index = 0; my_fcp_index <= fcp_index; my_fcp_index++)
{ // set the capability if fcp file has it marked as 'enabled'
fcp_set_index(cc_feat_control_policy[my_fcp_index].featureId, (cc_feat_control_policy[my_fcp_index].featureEnabled == TRUE));
}
}
/*
* fcp_init - initialize the data structure used to store the fcp parse info
*
*/
static void fcp_init()
{
// master index; set to null
fcp_index = -1;
// initialize the map of fcp xml feature indexes to internal call capabilities
cc_fcp_id_to_capability_map[CALL_FORWARD_ALL_FCP_INDEX] = CCAPI_CALL_CAP_CALLFWD;
cc_fcp_id_to_capability_map[REDIAL_FCP_INDEX] = CCAPI_CALL_CAP_REDIAL;
// initialize the capability set data structures
capset_init();
// initialize the version
g_fp_version_stamp[0] = '\0';
}
/*
* capset_set_fcp_forwardall - sets the fcp-controlled call forward all feature
*
*/
int fcp_init_template (const char* fcp_plan_string)
{
fcp_init();
if (fcp_plan_string == NULL)
{ // set up the default fcp
return (0);
}
// update the fcp capabilities structure, based on the parsed feature information
fcp_set_capabilities();
return (0);
}
// ---------------------------- End Of XML Parse Logic for Feature Control Policy --------------------------

View File

@ -1,33 +0,0 @@
/* 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/. */
#ifndef _CC_CAPABILITY_SET_H_
#define _CC_CAPABILITY_SET_H_
#include "ccapi_types.h"
extern void capset_get_idleset( cc_cucm_mode_t mode, cc_boolean features[]);
extern void capset_get_allowed_features( cc_cucm_mode_t mode, cc_call_state_t state, cc_boolean features[]);
// FCP (feature control policy) methods
int fcp_init_template (const char* fcp_plan_string);
// FCP Definitions
#define FCP_MAX_SIZE 0x5000
#define FCP_FEATURE_NAME_MAX 24
#define MAX_FP_VERSION_STAMP_LEN (64+1)
extern char g_fp_version_stamp[MAX_FP_VERSION_STAMP_LEN];
// for each feature in the XML FCP file, we'll receive the
// feature name, featureId, and whether or not it is enabled
typedef struct cc_feature_control_policy_info_t_
{
char featureName[FCP_FEATURE_NAME_MAX];
unsigned int featureId;
cc_boolean featureEnabled;
} cc_feature_control_policy_info_t;
#endif /* _CC_CAPABILITY_SET_H_ */

View File

@ -1,50 +0,0 @@
/* 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 "cc_blf.h"
#include "pres_sub_not_handler.h"
/**
* Initialize the BLF stack
* @return
*/
int CC_BLF_init() {
pres_sub_handler_initialized();
return CC_SUCCESS;
}
/**
* Start BLF subscription
* @param request_id the request id
* @param duration the subscription duration
* @param watcher the name of subscription watcher
* @param presentity
* @param app_id the application id for the BLF
* @param feature_mask
* @return void
*/
void CC_BLF_subscribe(int request_id,
int duration,
const char *watcher,
const char *presentity,
int app_id,
cc_blf_feature_mask_t feature_mask) {
pres_get_state(request_id, duration, watcher, presentity, app_id, feature_mask);
}
/**
* Unsubscribe the BLF subscription
* @param request_id the request id
* @return void
*/
void CC_BLF_unsubscribe(int request_id) {
pres_terminate_req(request_id);
}
/**
* Unsubscribe all BLF subscription
* @return void
*/
void CC_BLF_unsubscribe_All() {
pres_terminate_req_all();
}

View File

@ -1,681 +0,0 @@
/* 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 "cc_call_feature.h"
#include "CCProvider.h"
#include "sessionConstants.h"
#include "sessionTypes.h"
#include "lsm.h"
#include "phone_debug.h"
#include "text_strings.h"
#include "ccapi.h"
#include "ccapp_task.h"
#include "sessionHash.h"
#include "cpr_rand.h"
extern cpr_status_e ccappTaskPostMsg(unsigned int msgId, void * data, uint16_t len, int appId);
/**
* Internal method: create call handle
* @param line
* @paran call_id
*/
cc_call_handle_t cc_createCallHandle(cc_lineid_t line, cc_callid_t call_id)
{
return (CREATE_CALL_HANDLE(line, call_id));
}
/**
* Internal method: assign a valid call id.
* @param line_id line number
* @param call_id call id
* @return void
*/
void cc_getLineIdAndCallId (cc_lineid_t *line_id, cc_callid_t *call_id)
{
// assign proper line_id and call_id if not already there
if ((*line_id) == 0 || (*line_id) == CC_ALL_LINES) {
/*
* If the filter is the All Calls Complex Filter and the primary line
* is at its configured call capacity, the next available line should
* be used. In this scenario, sessionUI/Mgr send the line_id as zero.
*/
(*line_id) = lsm_get_available_line(FALSE);
}
if ((*call_id) == 0) {
(*call_id) = cc_get_new_call_id();
}
}
/**
* Invoke a call feature.
*/
cc_return_t cc_invokeFeature(cc_call_handle_t call_handle, group_cc_feature_t featureId, cc_sdp_direction_t video_pref, string_t data) {
session_feature_t callFeature;
callFeature.session_id = (SESSIONTYPE_CALLCONTROL << CC_SID_TYPE_SHIFT) + call_handle;
callFeature.featureID = featureId;
callFeature.featData.ccData.state = video_pref;
CCAPP_DEBUG(DEB_F_PREFIX"cc_invokeFeature:sid=%d, line=%d, cid=%d, fid=%d, video_pref=%s data=%s\n",
DEB_F_PREFIX_ARGS("cc_call_feature", "cc_invokeFeature"),
callFeature.session_id,
GET_LINE_ID(call_handle),
GET_CALL_ID(call_handle),
featureId, SDP_DIRECTION_PRINT(video_pref),
((featureId == CC_FEATURE_KEYPRESS) ? "...": data));
switch (featureId) {
case CC_FEATURE_KEYPRESS:
case CC_FEATURE_DIALSTR:
case CC_FEATURE_SPEEDDIAL:
case CC_FEATURE_BLIND_XFER_WITH_DIALSTRING:
case CC_FEATURE_END_CALL:
case CC_FEATURE_B2BCONF:
case CC_FEATURE_CONF:
case CC_FEATURE_XFER:
case CC_FEATURE_HOLD:
callFeature.featData.ccData.info = strlib_malloc(data, strlen(data));
callFeature.featData.ccData.info1 = NULL;
break;
default:
callFeature.featData.ccData.info = NULL;
callFeature.featData.ccData.info1 = NULL;
break;
}
if (ccappTaskPostMsg(CCAPP_INVOKE_FEATURE, &callFeature, sizeof(session_feature_t), CCAPP_CCPROVIER) == CPR_FAILURE) {
CCAPP_DEBUG(DEB_F_PREFIX"ccappTaskSendMsg failed\n",
DEB_F_PREFIX_ARGS("cc_call_feature", "cc_invokeFeature"));
return CC_FAILURE;
}
return CC_SUCCESS;
}
/**
* Invoke a call feature.
*/
cc_return_t cc_invokeFeatureSDPMode(cc_call_handle_t call_handle, group_cc_feature_t featureId, cc_jsep_action_t action,
cc_media_stream_id_t stream_id, cc_media_track_id_t track_id, cc_media_type_t media_type,
uint16_t level, const cc_media_constraints_t *constraints, string_t data, string_t data1) {
session_feature_t callFeature;
session_data_t * sessionData;
unsigned int session_id = 0;
callFeature.session_id = (SESSIONTYPE_CALLCONTROL << CC_SID_TYPE_SHIFT) + call_handle;
callFeature.featureID = featureId;
callFeature.featData.ccData.action = action;
callFeature.featData.ccData.media_type = media_type;
callFeature.featData.ccData.stream_id = stream_id;
callFeature.featData.ccData.track_id = track_id;
callFeature.featData.ccData.level = level;
callFeature.featData.ccData.has_constraints = FALSE;
/* If constraints exist add to session hash */
if (constraints) {
if (constraints->constraint_count > 0 &&
(CC_FEATURE_CREATEOFFER == featureId || CC_FEATURE_CREATEANSWER == featureId )) {
/* A random number of 5 digits will not conflict with any
* other usage of the hash table */
session_id = abs(cpr_rand()) % 60000;
sessionData = (session_data_t *)findhash(session_id);
sessionData = cpr_malloc(sizeof(session_data_t));
memset(sessionData, 0, sizeof(session_data_t));
sessionData->cc_constraints = constraints;
(void) addhash(session_id, sessionData);
callFeature.featData.ccData.sessionid = session_id;
callFeature.featData.ccData.has_constraints = TRUE;
}
}
CCAPP_DEBUG(DEB_F_PREFIX"cc_invokeFeatureSDPMode:sid=%d, line=%d, cid=%d, fid=%d, video_pref=%s data=%s\n",
DEB_F_PREFIX_ARGS("cc_call_feature", "cc_invokeFeatureSDPMode"),
callFeature.session_id,
GET_LINE_ID(call_handle),
GET_CALL_ID(call_handle),
featureId,
((featureId == CC_FEATURE_KEYPRESS) ? "...": data));
switch (featureId) {
case CC_FEATURE_KEYPRESS:
case CC_FEATURE_DIALSTR:
case CC_FEATURE_SPEEDDIAL:
case CC_FEATURE_BLIND_XFER_WITH_DIALSTRING:
case CC_FEATURE_END_CALL:
case CC_FEATURE_B2BCONF:
case CC_FEATURE_CONF:
case CC_FEATURE_XFER:
case CC_FEATURE_HOLD:
case CC_FEATURE_SETLOCALDESC:
case CC_FEATURE_SETREMOTEDESC:
case CC_FEATURE_SETPEERCONNECTION:
callFeature.featData.ccData.info = strlib_malloc(data, strlen(data));
callFeature.featData.ccData.info1 = NULL;
break;
case CC_FEATURE_ADDICECANDIDATE:
callFeature.featData.ccData.info = strlib_malloc(data, strlen(data));
callFeature.featData.ccData.info1 = strlib_malloc(data1, strlen(data1));
break;
default:
callFeature.featData.ccData.info = NULL;
callFeature.featData.ccData.info1 = NULL;
break;
}
if (ccappTaskPostMsg(CCAPP_INVOKE_FEATURE, &callFeature, sizeof(session_feature_t), CCAPP_CCPROVIER) == CPR_FAILURE) {
CCAPP_DEBUG(DEB_F_PREFIX"ccappTaskSendMsg failed\n",
DEB_F_PREFIX_ARGS("cc_call_feature", "cc_invokeFeatureSDPMode"));
return CC_FAILURE;
}
return CC_SUCCESS;
}
/***********************************Basic Call Feature Control Methods************************************
* This section defines all the call related methods that an upper layer can use to control
* a call in progress.
*/
/**
* Used to create any outgoing call regular call. The incoming/reverting/consultation call will be
* created by the stack. It creates a call place holder and initialize the memory for a call. An user needs
* other methods to start the call, such as the method OriginateCall, etc
* @param line line number that is invoked and is assigned
* @return call handle wich includes the assigned line and call id
*/
cc_call_handle_t CC_createCall(cc_lineid_t line) {
static const char fname[] = "CC_CreateCall";
//Create call handle to initialize the memory.
cc_call_handle_t call_handle = CC_EMPTY_CALL_HANDLE;
cc_lineid_t lineid = line;
cc_callid_t callid = CC_NO_CALL_ID;
//Assign line and call id.
cc_getLineIdAndCallId(&lineid, &callid);
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, callid, lineid, fname));
if (lineid == CC_NO_LINE) {
lsm_ui_display_notify_str_index(STR_INDEX_ERROR_PASS_LIMIT);
return call_handle;
}
call_handle = cc_createCallHandle(lineid, callid);
return call_handle;
}
/**
* Start the call that was created.
* @param the call handle
* @return SUCCESS or FAILURE
*/
/*move it up...*/
cc_return_t CC_CallFeature_originateCall(cc_call_handle_t call_handle, cc_sdp_direction_t video_pref) {
static const char fname[] = "CC_CallFeature_originateCall:";
//CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
// GET_LINE_ID(call_handle), fname));
CCAPP_DEBUG(DEB_F_PREFIX"CC_CallFeature_originateCall:cHandle=%d\n",
DEB_F_PREFIX_ARGS("cc_call_feature", fname),
call_handle);
return cc_invokeFeature(call_handle, CC_FEATURE_OFFHOOK, video_pref, NULL);
}
/**
* Terminate or end a normal call.
* @param call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_terminateCall(cc_call_handle_t call_handle) {
static const char fname[] = "CC_CallFeature_TerminateCall";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return cc_invokeFeature(call_handle, CC_FEATURE_ONHOOK, CC_SDP_MAX_QOS_DIRECTIONS, NULL);
}
/**
* Answer an incoming or reverting call.
* @param call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_answerCall(cc_call_handle_t call_handle, cc_sdp_direction_t video_pref) {
static const char fname[] = "CC_CallFeature_AnswerCall";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return cc_invokeFeature(call_handle, CC_FEATURE_ANSWER, video_pref, NULL);
}
/**
* Send a keypress to a call, it could be a single digit.
* @param call handle
* @param cc_digit digit pressed
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_sendDigit(cc_call_handle_t call_handle, cc_digit_t cc_digit) {
static const char fname[] = "CC_CallFeature_SendDigit";
char digit;
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
//Demote to eliminate the endian issue
digit = cc_digit;
return cc_invokeFeature(call_handle, CC_FEATURE_KEYPRESS, CC_SDP_MAX_QOS_DIRECTIONS, (string_t)&digit);
}
/**
* Send a backspace action.
* @param call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_backSpace(cc_call_handle_t call_handle) {
static const char fname[] = "CC_CallFeature_BackSpace";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return cc_invokeFeature(call_handle, CC_FEATURE_BKSPACE, CC_SDP_MAX_QOS_DIRECTIONS, NULL);
}
/**
* Send a dial digit string on an active call, e.g."9191234567".
* @param call handle
* @param numbers dialed string
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_dial(cc_call_handle_t call_handle, cc_sdp_direction_t video_pref, const string_t numbers) {
static const char fname[] = "CC_CallFeature_Dial";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
if (cpr_strcasecmp(numbers, "DIAL") == 0) {
return cc_invokeFeature(call_handle, CC_FEATURE_DIAL, video_pref, numbers);
}
return cc_invokeFeature(call_handle, CC_FEATURE_DIALSTR, video_pref, numbers);
}
cc_return_t CC_CallFeature_CreateOffer(cc_call_handle_t call_handle, const cc_media_constraints_t *constraints) {
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), __FUNCTION__));
return cc_invokeFeatureSDPMode(call_handle, CC_FEATURE_CREATEOFFER, JSEP_NO_ACTION,
0, 0, NO_STREAM, 0, constraints, NULL, NULL);
}
cc_return_t CC_CallFeature_CreateAnswer(cc_call_handle_t call_handle, const cc_media_constraints_t *constraints) {
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), __FUNCTION__));
return cc_invokeFeatureSDPMode(call_handle, CC_FEATURE_CREATEANSWER, JSEP_NO_ACTION,
0, 0, NO_STREAM, 0, constraints, NULL, NULL);
}
cc_return_t CC_CallFeature_SetLocalDescription(cc_call_handle_t call_handle, cc_jsep_action_t action, string_t sdp) {
const cc_media_constraints_t *constraints = NULL;
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), __FUNCTION__));
return cc_invokeFeatureSDPMode(call_handle, CC_FEATURE_SETLOCALDESC, action,
0, 0, NO_STREAM, 0, constraints, sdp, NULL);
}
cc_return_t CC_CallFeature_SetRemoteDescription(cc_call_handle_t call_handle, cc_jsep_action_t action, string_t sdp) {
const cc_media_constraints_t *constraints = NULL;
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), __FUNCTION__));
return cc_invokeFeatureSDPMode(call_handle, CC_FEATURE_SETREMOTEDESC, action,
0, 0, NO_STREAM, 0, constraints, sdp, NULL);
}
cc_return_t CC_CallFeature_SetPeerConnection(cc_call_handle_t call_handle, cc_peerconnection_t pc) {
const cc_media_constraints_t *constraints = NULL;
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), __FUNCTION__));
return cc_invokeFeatureSDPMode(call_handle, CC_FEATURE_SETPEERCONNECTION, JSEP_NO_ACTION,
0, 0, NO_STREAM, 0, constraints, pc, NULL);
}
cc_return_t CC_CallFeature_AddStream(cc_call_handle_t call_handle, cc_media_stream_id_t stream_id,
cc_media_track_id_t track_id, cc_media_type_t media_type) {
const cc_media_constraints_t *constraints = NULL;
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), __FUNCTION__));
return cc_invokeFeatureSDPMode(call_handle, CC_FEATURE_ADDSTREAM, JSEP_NO_ACTION,
stream_id, track_id, media_type, 0, constraints, NULL, NULL);
}
cc_return_t CC_CallFeature_RemoveStream(cc_call_handle_t call_handle, cc_media_stream_id_t stream_id,
cc_media_track_id_t track_id, cc_media_type_t media_type) {
const cc_media_constraints_t *constraints = NULL;
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), __FUNCTION__));
return cc_invokeFeatureSDPMode(call_handle, CC_FEATURE_REMOVESTREAM, JSEP_NO_ACTION,
stream_id, track_id, media_type, 0, constraints, NULL, NULL);
}
cc_return_t CC_CallFeature_AddICECandidate(cc_call_handle_t call_handle, const char* candidate, const char *mid, cc_level_t level) {
const cc_media_constraints_t *constraints = NULL;
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), __FUNCTION__));
return cc_invokeFeatureSDPMode(call_handle, CC_FEATURE_ADDICECANDIDATE, JSEP_NO_ACTION,
0, 0, NO_STREAM, (uint16_t)level, constraints, candidate, mid);
}
/**
* Initiate a speed dial.
* @param call handle
* @param callid call id
* @param speed dial numbers.
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_speedDial(cc_call_handle_t call_handle, cc_sdp_direction_t video_pref, const string_t speed_dial_number) {
static const char fname[] = "CC_CallFeature_SpeedDial";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return cc_invokeFeature(call_handle, CC_FEATURE_SPEEDDIAL, video_pref, speed_dial_number);
}
/**
* Initiate a BLF call pickup.
* @param call handle
* @param speed dial number configured.
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_blfCallPickup(cc_call_handle_t call_handle, cc_sdp_direction_t video_pref, const string_t speed_dial_number) {
static const char fname[] = "CC_CallFeature_BLFCallPickup";
cc_return_t ret = CC_SUCCESS;
string_t blf_sd = strlib_malloc(CISCO_BLFPICKUP_STRING, sizeof(CISCO_BLFPICKUP_STRING));
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
blf_sd = strlib_append(blf_sd, "-");
blf_sd = strlib_append(blf_sd, speed_dial_number);
ret = cc_invokeFeature(call_handle, CC_FEATURE_SPEEDDIAL, video_pref, blf_sd);
//free memory
strlib_free(blf_sd);
return ret;
}
/**
* Redial the last dial numbers.
* @param call handle
* @param video_pref the sdp direction
* @return SUCCESS or FAILURE
* @Notice: if there is no active dial made, this method should not be called.
*/
cc_return_t CC_CallFeature_redial(cc_call_handle_t call_handle, cc_sdp_direction_t video_pref) {
static const char fname[] = "CC_CallFeature_Redial";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return cc_invokeFeature(call_handle, CC_FEATURE_REDIAL, video_pref, NULL);
}
/**
* Update a media capability for a call.
* @param call_handle
* @param video_pref the sdp direction
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_updateCallMediaCapability(cc_call_handle_t call_handle, cc_sdp_direction_t video_pref) {
static const char fname[] = "CC_CallFeature_updateCallMediaCapability";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return cc_invokeFeature(call_handle, CC_FEATURE_UPD_SESSION_MEDIA_CAP, video_pref, NULL);
}
/**
* Make a call forward all on particular line
* @param call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_callForwardAll(cc_call_handle_t call_handle) {
static const char fname[] = "CC_CallFeature_CallForwardAll";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return cc_invokeFeature(call_handle, CC_FEATURE_CFWD_ALL, CC_SDP_MAX_QOS_DIRECTIONS, NULL);
}
/**
* Resume a held call.
* @param call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_resume(cc_call_handle_t call_handle, cc_sdp_direction_t video_pref) {
static const char fname[] = "CC_CallFeature_Resume";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return cc_invokeFeature(call_handle, CC_FEATURE_RESUME, video_pref, NULL);
}
/**
* End a consultation call.
* @param call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_endConsultativeCall(cc_call_handle_t call_handle) {
static const char fname[] = "CC_CallFeature_EndConsultativeCall";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return cc_invokeFeature(call_handle, CC_FEATURE_END_CALL, CC_SDP_MAX_QOS_DIRECTIONS, "ACTIVECALLS");
}
/**
* Initiate a conference. Steps to make a conference or transfer:
* 1. Create a call handle, e.g. chandle1.
* 2. Start the call on this call handle.
* 3. When the call is answered, invoke:
* CC_CallFeature_Conference(chandle1, FALSE, CC_EMPTY_CALL_HANDLE) to start a conference operation.
* 4. Upon receiving the consultative call (cHandle2) created from pSipcc system,
* invoke:
* CC_CallFeature_Dial(cHandle2)
* to dial the consultative call.
* 5. When the consultative call is in ringout or connected state, invoke:
* CC_CallFeature_Conference(cHandle2, FALSE, CC_EMPTY_CALL_HANDLE) to
* finish the conference.
* Note: 1. in the step 4, a user could kill the consultative call and pickup a hold call (not the parent call that
* initiated the conference). In this scenario, a parent call handle should be supplied.
* For instance,
* CC_CallFeature_Conference(cHandle2, FALSE, cHandle1)
* 2. If it's a B2bConf, substitute the "FALSE" with "TRUE"
*
* @param call_handle the call handle for
* 1. the original connected call.
* 2. the consultative call or a held call besides the parent call initiated the transfer. This is used
* on the second time to finish the transfer.
* @param is locall conference or not. If it's a local conference, it's a b2bconf.
* @param parent_call_handle if supplied, it will be the targeted parent call handle, which initiated the conference.
* @param video_pref the sdp direction
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_conference(cc_call_handle_t call_handle,
boolean is_local,
cc_call_handle_t parent_call_handle, cc_sdp_direction_t video_pref) {
static const char fname[] = "CC_CallFeature_Conference";
char call_handle_str[10];
cc_return_t ret = CC_SUCCESS;
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
if (parent_call_handle == CC_EMPTY_CALL_HANDLE) {
if (is_local == FALSE) {
return cc_invokeFeature(call_handle, CC_FEATURE_B2BCONF, video_pref, "");
} else {
return cc_invokeFeature(call_handle, CC_FEATURE_CONF, video_pref, "");
}
} else {
cc_call_handle_t parent = (SESSIONTYPE_CALLCONTROL << CC_SID_TYPE_SHIFT) + parent_call_handle;
string_t parent_call_handle_str;
snprintf(call_handle_str, sizeof(call_handle_str), "%d", parent);
parent_call_handle_str = strlib_malloc(call_handle_str, strlen(call_handle_str));
if (is_local == FALSE) {
ret = cc_invokeFeature(call_handle, CC_FEATURE_B2BCONF, video_pref, parent_call_handle_str);
} else {
ret = cc_invokeFeature(call_handle, CC_FEATURE_CONF, video_pref, parent_call_handle_str);
}
strlib_free(parent_call_handle_str);
return ret;
}
}
/**
* Initiate a call transfer. Please refer to Conference feature.
* @param call_handle the call handle for
* 1. the original connected call.
* 2. the consultative call or a held call besides the parent call initiated the transfer. This is used
* on the second time to finish the transfer.
* @param parent_call_handle if supplied, it will be the parent call handle, which initiated the transfer.
* @param video_pref the sdp direction
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_transfer(cc_call_handle_t call_handle, cc_call_handle_t parent_call_handle, cc_sdp_direction_t video_pref) {
static const char fname[] = "CC_CallFeature_transfer";
char call_handle_str[10];
cc_return_t ret = CC_SUCCESS;
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
if (parent_call_handle == CC_EMPTY_CALL_HANDLE) {
return cc_invokeFeature(call_handle, CC_FEATURE_XFER, video_pref, "");
} else {
cc_call_handle_t parent = (SESSIONTYPE_CALLCONTROL << CC_SID_TYPE_SHIFT) + parent_call_handle;
string_t parent_call_handle_str;
snprintf(call_handle_str, sizeof(call_handle_str), "%d", parent);
parent_call_handle_str = strlib_malloc(call_handle_str, strlen(call_handle_str));
ret = cc_invokeFeature(call_handle, CC_FEATURE_XFER, video_pref, parent_call_handle_str);
strlib_free(parent_call_handle_str);
return ret;
}
}
/**
* Put a connected call on hold.
* @param call handle
* @param reason the reason to hold. The following values should be used.
* CC_HOLD_REASON_NONE,
* CC_HOLD_REASON_XFER, //Hold for transfer
* CC_HOLD_REASON_CONF, //Hold for conference
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_holdCall(cc_call_handle_t call_handle, cc_hold_reason_t reason) {
static const char fname[] = "CC_CallFeature_HoldCall";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
switch (reason) {
case CC_HOLD_REASON_XFER:
return cc_invokeFeature(call_handle, CC_FEATURE_HOLD, CC_SDP_MAX_QOS_DIRECTIONS, "TRANSFER");
case CC_HOLD_REASON_CONF:
return cc_invokeFeature(call_handle, CC_FEATURE_HOLD, CC_SDP_MAX_QOS_DIRECTIONS, "CONFERENCE");
case CC_HOLD_REASON_SWAP:
return cc_invokeFeature(call_handle, CC_FEATURE_HOLD, CC_SDP_MAX_QOS_DIRECTIONS, "SWAP");
default:
break;
}
return cc_invokeFeature(call_handle, CC_FEATURE_HOLD, CC_SDP_MAX_QOS_DIRECTIONS, "");
}
/********************************End of basic call feature methods******************************************/
/*************************************Additional call feature methods***************************************
*
*/
/**
* Join a call.
* @param call_handle call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_b2bJoin(cc_call_handle_t call_handle) {
static const char fname[] = "CC_CallFeature_b2bJoin";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return cc_invokeFeature(call_handle, CC_FEATURE_B2B_JOIN, CC_SDP_MAX_QOS_DIRECTIONS, NULL);
}
/**
* Initiate a direct transfer
* @param call_handle the call handle for the call to initialize a transfer
* @param target_call_handle the call handle for the target transfer call.
* @retrun SUCCESS or FAILURE. If the target call handle is empty, a FAILURE will be returned.
*/
cc_return_t CC_CallFeature_directTransfer(cc_call_handle_t call_handle,
cc_call_handle_t target_call_handle) {
static const char fname[] = "CC_CallFeature_directTransfer";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
if (target_call_handle == CC_EMPTY_CALL_HANDLE) {
CCAPP_DEBUG(DEB_L_C_F_PREFIX"target call handle is empty.\n", DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return CC_FAILURE;
}
return CC_CallFeature_transfer(call_handle, target_call_handle, CC_SDP_MAX_QOS_DIRECTIONS);
}
/**
* Initiate a join across line
* @param call_handle the call handle for the call that initializes a join across line (conference).
* @param target_call_handle the call handle for the call will be joined.
*/
cc_return_t CC_CallFeature_joinAcrossLine(cc_call_handle_t call_handle, cc_call_handle_t target_call_handle) {
static const char fname[] = "CC_CallFeature_joinAcrossLine";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
if (target_call_handle == CC_EMPTY_CALL_HANDLE) {
CCAPP_DEBUG(DEB_L_C_F_PREFIX"target call handle is empty.\n", DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return CC_FAILURE;
}
return CC_CallFeature_conference(call_handle, TRUE, target_call_handle, CC_SDP_MAX_QOS_DIRECTIONS);
}
/**
* Select or locked a call.
* @param call_handle call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_select(cc_call_handle_t call_handle) {
static const char fname[] = "CC_CallFeature_select";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return cc_invokeFeature(call_handle, CC_FEATURE_SELECT, CC_SDP_MAX_QOS_DIRECTIONS, NULL);
}
/**
* Cancel a call feature, e.g. when the consultative call is connected and the
* user wishes not to make the conference, thie method can be invoked.
* @param call_handle call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CC_CallFeature_cancelXfrerCnf(cc_call_handle_t call_handle) {
static const char fname[] = "CC_CallFeature_cancelXfrerCnf";
CCAPP_DEBUG(DEB_L_C_F_PREFIX, DEB_L_C_F_PREFIX_ARGS(SIP_CC_PROV, GET_CALL_ID(call_handle),
GET_LINE_ID(call_handle), fname));
return cc_invokeFeature(call_handle, CC_FEATURE_CANCEL, CC_SDP_MAX_QOS_DIRECTIONS, NULL);
}
void CC_CallFeature_mute(boolean mute) {
}
void CC_CallFeature_speaker(boolean mute) {
}
cc_call_handle_t CC_CallFeature_getConnectedCall() {
return ccappGetConnectedCall();
}

View File

@ -1,154 +0,0 @@
/* 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 "cc_config.h"
#include "CCProvider.h"
#include "phone_debug.h"
#include "cpr_types.h"
#include "dialplan.h"
#include "capability_set.h"
#include "configmgr.h"
#include "dialplanint.h"
#include "ccapp_task.h"
#include "cc_device_manager.h"
#include "config_api.h"
extern int config_parser_main( char *config, int complete_config);
/**
* Set the maximum line available for registration
* @param lines the maximum line could be configured.
* @return
*/
int CC_Config_SetAvailableLines(cc_lineid_t lines) {
ccappTaskPostMsg(CCAPP_UPDATELINES, &lines, sizeof(unsigned short), CCAPP_CCPROVIER);
return CC_SUCCESS;
}
/**
* The following section defines the configuration methods.
*/
/**
* Defines the CFGID parameter setting methods.
* see cfgid.h for all possible configuration parameters
* @todo
*/
void CC_Config_setIntValue(int cfgid, int value) {
config_set_value(cfgid, &value, sizeof(int));
return;
}
void CC_Config_setBooleanValue(int cfgid, cc_boolean value) {
int temp = (int) value;
// For Now, convert all numeric parameters to Integer. This simplifies
// the required SIP and GSM code changes. We will go to the right size
// when we implement the "full" JNI.
// config_set_value(cfg_id, &bool_value, sizeof(boolean));
config_set_value(cfgid, &temp, sizeof(int));
return;
}
void CC_Config_setStringValue(int cfgid, const char* value) {
config_set_string(cfgid, (char *) value);
return;
}
void CC_Config_setByteValue(int cfgid, unsigned char value) {
int temp = (int) value;
// For Now, convert all numeric parameters to Integer. This simplifies
// the required SIP and GSM code changes. We will go to the right size
// when we implement the "full" JNI.
// config_set_value(cfg_id, &byte_value, sizeof(unsigned char));
config_set_value(cfgid, &temp, sizeof(int));
return;
}
void CC_Config_setArrayValue(int cfgid, char *byte_array, int length) {
unsigned char *byte_ptr;
int i;
byte_ptr = cpr_malloc(length);
if (byte_ptr == NULL) {
TNP_DEBUG(DEB_F_PREFIX"setPropertyCacheByteArray():malloc failed.\n", DEB_F_PREFIX_ARGS(JNI, "nSetPropertyCacheByteArray"));
return;
}
for (i = 0; i < length; i++) {
byte_ptr[i] = (unsigned char) byte_array[i];
}
config_set_value(cfgid, byte_ptr, length);
cpr_free(byte_ptr);
return;
}
/**
* Set the dialplan file
* @param dial_plan_string the dial plan content string
* @param length the length of dial plan string, the maximum size will be 0x2000.
* @return string dial plan version stamp
*/
char* CC_Config_setDialPlan(const char *dial_plan_string, int length) {
const char fname[] = "CC_Config_setDialPlan";
int ret;
/**
* If the string is null, empty or oversized, we will reset the dial
* plan by setting the length to 0.
*/
if (dial_plan_string == NULL || length == 0 || length >= DIALPLAN_MAX_SIZE) {
TNP_DEBUG(DEB_F_PREFIX"Setting NULL dialplan string (length [%d] is 0, or length is larger than maximum [%d])\n",
DEB_F_PREFIX_ARGS(JNI, fname), length, DIALPLAN_MAX_SIZE);
dp_init_template (NULL, 0);
return (NULL);
}
ret = dp_init_template(dial_plan_string, length);
TNP_DEBUG(DEB_F_PREFIX"Parsed dial_plan_string. Version=[%s], Length=[%d]\n", DEB_F_PREFIX_ARGS(JNI, fname), g_dp_version_stamp, length);
if (ret != 0)
{
return (NULL);
}
return (g_dp_version_stamp);
}
/**
* Set the feature control plan
* @param fcp plan string
* @param length the length of fcp string
* @return string feature version stamp
*/
char* CC_Config_setFcp(const char *fcp_plan_string, int len) {
const char fname[] = "CC_Config_setFcp";
int ret = 0;
/**
* If the string is null, return null (version)
*/
TNP_DEBUG(DEB_F_PREFIX"FCP Parsing FCP doc\n", DEB_F_PREFIX_ARGS(JNI, fname));
if (fcp_plan_string == NULL)
{
TNP_DEBUG(DEB_F_PREFIX"Null FCP xml document\n",
DEB_F_PREFIX_ARGS(JNI, fname));
fcp_init_template (NULL);
return (NULL);
}
ret = fcp_init_template (fcp_plan_string);
TNP_DEBUG(DEB_F_PREFIX"Parsed FCP xml. Version=[%s]\n", DEB_F_PREFIX_ARGS(JNI, fname), g_fp_version_stamp);
if (ret != 0)
{
return (NULL);
}
return (g_fp_version_stamp);
}

View File

@ -1,62 +0,0 @@
/* 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 "cc_device_feature.h"
#include "sessionConstants.h"
#include "sessionTypes.h"
#include "CCProvider.h"
#include "phone_debug.h"
#include "ccapp_task.h"
/**
* Internal method
*/
void cc_invokeDeviceFeature(session_feature_t *feature) {
if (ccappTaskPostMsg(CCAPP_INVOKEPROVIDER_FEATURE, feature,
sizeof(session_feature_t), CCAPP_CCPROVIER) == CPR_FAILURE) {
CCAPP_DEBUG(DEB_F_PREFIX"cc_invokeDeviceFeature failed\n",
DEB_F_PREFIX_ARGS("cc_device_feature", "cc_invokeDeviceFeature"));
}
}
void CC_DeviceFeature_supportsVideo(boolean enable) {
session_feature_t feat;
feat.session_id = (SESSIONTYPE_CALLCONTROL << CC_SID_TYPE_SHIFT);
feat.featureID = DEVICE_SUPPORTS_NATIVE_VIDEO;
feat.featData.ccData.info = NULL;
feat.featData.ccData.info1 = NULL;
feat.featData.ccData.state = enable;
cc_invokeDeviceFeature(&feat);
}
/**
* Enable video/camera.
* @param enable true or false
* @return void
*/
void CC_DeviceFeature_enableVideo(boolean enable) {
session_feature_t feat;
feat.session_id = (SESSIONTYPE_CALLCONTROL << CC_SID_TYPE_SHIFT);
feat.featureID = DEVICE_ENABLE_VIDEO;
feat.featData.ccData.info = NULL;
feat.featData.ccData.info1 = NULL;
feat.featData.ccData.state = enable;
cc_invokeDeviceFeature(&feat);
}
void CC_DeviceFeature_enableCamera(boolean enable) {
session_feature_t feat;
feat.session_id = (SESSIONTYPE_CALLCONTROL << CC_SID_TYPE_SHIFT);
feat.featureID = DEVICE_ENABLE_CAMERA;
feat.featData.ccData.info = NULL;
feat.featData.ccData.info1 = NULL;
feat.featData.ccData.state = enable;
cc_invokeDeviceFeature(&feat);
}

View File

@ -1,593 +0,0 @@
/* 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 "cc_constants.h"
#include "session.h"
#include "ccSession.h"
#include "scSession.h"
#include "cpr_types.h"
#include "cpr_string.h"
#include "phone_debug.h"
#include "sessuri.h"
#include "config_api.h"
#include "CCProvider.h"
#include "ccapp_task.h"
#include "cc_device_manager.h"
#include "ccapi_service.h"
#include "cc_service.h"
#include "subscription_handler.h"
#include "ccapi_snapshot.h"
#include "util_string.h"
#define STARTUP_NORMAL 0
#define STARTUP_UNSPECIFIED 1
#define SHUTDOWN_NORMAL 2
#define SHUTDOWN_UNSPECIFIED 3
#define SHUTDOWN_VERMISMATHC 4
#define RSP_TYPE_COMPLETE 5
mgmt_state_t mgmtState = MGMT_STATE_IDLE;
//int parse_config_properties (int device_handle, const char *device_name, const char *cfg, int from_memory);
static boolean isStartRequestPending = FALSE;
static boolean isServiceStopped = TRUE;
extern cc_boolean is_action_to_be_deferred(cc_action_t action);
char *mgmt_event_to_str (int evt) {
switch (evt) {
case EV_CC_CREATE:
return "EV_CC_CREATE";
case EV_CC_START:
return "EV_CC_START";
case EV_CC_CONFIG_RECEIVED:
return "EV_CC_CONFIG_RECEIVED";
case EV_CC_DO_SOFT_RESET:
return "EV_CC_DO_SOFT_RESET";
case EV_CC_INSERVICE:
return "EV_CC_INSERVICE";
case EV_CC_OOS_FAILOVER:
return "EV_CC_OOS_FAILOVER";
case EV_CC_OOS_FALLBACK:
return "EV_CC_OOS_FALLBACK";
case EV_CC_OOS_REG_ALL_FAILED:
return "EV_CC_OOS_REG_ALL_FAILED";
case EV_CC_OOS_SHUTDOWN_ACK:
return "EV_CC_OOS_SHUTDOWN_ACK";
case EV_CC_RE_REGISTER:
return "EV_CC_RE_REGISTER";
case EV_CC_STOP:
return "EV_CC_STOP";
case EV_CC_DESTROY:
return "EV_CC_DESTROY";
case EV_CC_IP_VALID:
return "EV_CC_IP_VALID";
case EV_CC_IP_INVALID:
return "EV_CC_IP_INVALID";
}
return "EV_INVALID";
}
char *mgmt_state_to_str (int state) {
switch (state) {
case MGMT_STATE_IDLE:
return "MGMT_STATE_IDLE";
case MGMT_STATE_CREATED:
return "MGMT_STATE_CREATED";
case MGMT_STATE_REGISTERING:
return "MGMT_STATE_REGISTERING";
case MGMT_STATE_REGISTERED:
return "MGMT_STATE_REGISTERED";
case MGMT_STATE_OOS:
return "MGMT_STATE_OOS";
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
return "MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK";
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
return "MGMT_STATE_WAITING_FOR_CONFIG_FILE";
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
return "MGMT_STATE_OOS_AWAIT_UN_REG_ACK";
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
return "MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK";
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
return "MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK";
}
return "MGMT_STATE_INVALID";
}
void updateMediaConfigProperties( void )
{
//TODO: check Java code
}
void updateVideoConfigProperties( void )
{
//TODO: check Java code
}
/*
* action for handled events for device manager
*/
int action(int cmd)
{
int retVal = 0;
sessionProvider_cmd_t proCmd;
memset ( &proCmd, 0, sizeof(sessionProvider_cmd_t));
proCmd.sessionType = SESSIONTYPE_CALLCONTROL;
proCmd.cmd = cmd;
if (cmd == CMD_INSERVICE ) {
CCAPP_DEBUG("CC_device_manager_action: CMD_INSERVICE \n");
updateMediaConfigProperties();
updateVideoConfigProperties();
proCmd.cmdData.ccData.reason = STARTUP_NORMAL;
if (ccappTaskPostMsg(CCAPP_SERVICE_CMD, (cprBuffer_t)&proCmd,
sizeof(sessionProvider_cmd_t), CCAPP_CCPROVIER) == CPR_FAILURE) {
CCAPP_DEBUG("ccInvokeFeature: ccappTaskSendMsg failed\n");
}
} else if (cmd == CMD_INIT) {
CCAPP_DEBUG("CC_device_manager_action: CMD_INIT \n");
proCmd.cmdData.ccData.reason = STARTUP_NORMAL;
if (ccappTaskPostMsg(CCAPP_SERVICE_CMD, (cprBuffer_t)&proCmd,
sizeof(sessionProvider_cmd_t), CCAPP_CCPROVIER) == CPR_FAILURE) {
CCAPP_DEBUG("ccInvokeFeature: ccappTaskSendMsg failed\n");
}
} else if (cmd == CMD_RESTART) {
CCAPP_DEBUG("CC_device_manager_action: CMD_RESTART \n");
updateMediaConfigProperties();
proCmd.cmdData.ccData.reason = STARTUP_NORMAL;
if (ccappTaskPostMsg(CCAPP_SERVICE_CMD, (cprBuffer_t)&proCmd,
sizeof(sessionProvider_cmd_t), CCAPP_CCPROVIER) == CPR_FAILURE) {
CCAPP_DEBUG("ccInvokeFeature: ccappTaskSendMsg failed\n");
}
} else if (cmd == CMD_SHUTDOWN) {
CCAPP_DEBUG("CC_device_manager_action: CMD_SHUTDOWN \n");
proCmd.cmdData.ccData.reason = CC_CAUSE_REG_ALL_FAILED;
if (ccappTaskPostMsg(CCAPP_SERVICE_CMD, (cprBuffer_t)&proCmd,
sizeof(sessionProvider_cmd_t), CCAPP_CCPROVIER) == CPR_FAILURE) {
CCAPP_DEBUG("ccInvokeFeature: ccappTaskSendMsg failed\n");
}
} else {
proCmd.cmdData.ccData.reason = STARTUP_NORMAL;
CCAPP_DEBUG("CC_device_manager_action: Default \n");
if (ccappTaskPostMsg(CCAPP_SERVICE_CMD, (cprBuffer_t)&proCmd,
sizeof(sessionProvider_cmd_t), CCAPP_CCPROVIER) == CPR_FAILURE) {
CCAPP_DEBUG("ccInvokeFeature: ccappTaskSendMsg failed\n");
}
}
return retVal;
}
cc_boolean is_phone_registered() {
if (mgmtState == MGMT_STATE_REGISTERED) {
return TRUE;
} else {
return FALSE;
}
}
/*
* Wrapper function for settting state for handled events for device manager
*/
void setState(int st) {
DEF_DEBUG("setState: new registration state= %s\n", mgmt_state_to_str(st));
mgmtState = st;
}
void processInsToOos (void )
{
//CCAPP_DEBUG("CC_device_manager: processInsToOoS \n");
DEF_DEBUG("CC_device_manager: processInsToOoS \n");
sub_hndlr_stop();
}
void prepareForSoftReset()
{
CCAPP_DEBUG("CC_device_manager: prepareForSoftReset\n");
}
void processInserviceEvent( void)
{
CCAPP_DEBUG("CC_device_manager: process Inservice Event\n");
if (g_deviceInfo.cucm_mode == CC_MODE_CCM ) {
if (sub_hndlr_isAvailable() == FALSE) {
sub_hndlr_start();
}
}
setState(MGMT_STATE_REGISTERED);
//TODO: check Java code
}
/*
* Event handler for device manager
*/
void registration_processEvent(int event) {
boolean ignored=0;
DEF_DEBUG("registration_processEvent: Event %s, current State %s \n",
mgmt_event_to_str(event) , mgmt_state_to_str(mgmtState));
switch (event) {
case EV_CC_CREATE:
switch ( mgmtState) {
case MGMT_STATE_IDLE:
setState(MGMT_STATE_CREATED);
init_empty_str(g_cfg_p);
CC_Service_create();
CC_Service_init();
break;
case MGMT_STATE_REGISTERED:
case MGMT_STATE_REGISTERING:
case MGMT_STATE_OOS:
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
case MGMT_STATE_CREATED:
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
default:
ignored = 1;
break;
}
break;
case EV_CC_START:
isServiceStopped = FALSE;
switch ( mgmtState) {
case MGMT_STATE_CREATED:
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
configFetchReq(0);
break;
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
DEF_DEBUG("registration_processEvent: delaying start until SHUTDOWN_ACK is received.");
isStartRequestPending = TRUE;
break;
case MGMT_STATE_IDLE:
case MGMT_STATE_REGISTERED:
case MGMT_STATE_REGISTERING:
case MGMT_STATE_OOS:
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
default:
ignored = 1;
break;
}
break;
case EV_CC_IP_INVALID:
switch ( mgmtState) {
case MGMT_STATE_REGISTERED:
processInsToOos();
case MGMT_STATE_REGISTERING:
case MGMT_STATE_OOS:
setState(MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK);
action(CMD_UNREGISTER_ALL_LINES);
break;
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
setState(MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK);
break;
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_CREATED:
case MGMT_STATE_IDLE:
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
default:
ignored = 1;
break;
}
break;
case EV_CC_IP_VALID:
if (isServiceStopped == TRUE) {
ignored = 1;
DEF_DEBUG("registration_processEvent: "\
"Ignoring IP_VALID as service was not Started ");
break;
}
switch ( mgmtState) {
case MGMT_STATE_REGISTERED:
if (is_action_to_be_deferred(RE_REGISTER_ACTION)
== FALSE) {
processInsToOos();
prepareForSoftReset();
setState(MGMT_STATE_OOS_AWAIT_UN_REG_ACK);
action(CMD_SHUTDOWN);
}
break;
case MGMT_STATE_REGISTERING:
case MGMT_STATE_OOS:
if (is_action_to_be_deferred(RE_REGISTER_ACTION)
== FALSE) {
prepareForSoftReset();
setState(MGMT_STATE_OOS_AWAIT_UN_REG_ACK);
action(CMD_SHUTDOWN);
}
break;
case MGMT_STATE_IDLE:
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
case MGMT_STATE_CREATED:
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
default:
ignored = 1;
break;
}
break;
case EV_CC_DO_SOFT_RESET:
switch ( mgmtState) {
case MGMT_STATE_REGISTERED:
processInsToOos(); /* FALL THROUGH */
case MGMT_STATE_REGISTERING:
case MGMT_STATE_OOS:
prepareForSoftReset();
setState(MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK);
action(CMD_SHUTDOWN);
break;
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
case MGMT_STATE_CREATED:
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
case MGMT_STATE_IDLE:
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
default:
ignored = 1;
break;
}
break;
case EV_CC_CONFIG_RECEIVED:
switch ( mgmtState) {
case MGMT_STATE_CREATED: // This state is only at init
// needs handler to be added on receiving message
setState(MGMT_STATE_REGISTERING);
action(CMD_INSERVICE);
break;
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
setState(MGMT_STATE_REGISTERING);
action(CMD_RESTART);
break;
case MGMT_STATE_REGISTERING:
case MGMT_STATE_REGISTERED:
case MGMT_STATE_OOS:
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
case MGMT_STATE_IDLE:
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
default:
ignored = 1;
break;
}
break;
case EV_CC_INSERVICE:
switch (mgmtState) {
case MGMT_STATE_OOS:
case MGMT_STATE_REGISTERING:
setState(MGMT_STATE_REGISTERED);
case MGMT_STATE_REGISTERED:
processInserviceEvent();
break;
case MGMT_STATE_CREATED:
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
case MGMT_STATE_IDLE:
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
default:
ignored = 1;
break;
}
break;
case EV_CC_OOS_FAILOVER:
case EV_CC_OOS_FALLBACK:
switch ( mgmtState) {
case MGMT_STATE_REGISTERED:
processInsToOos();
case MGMT_STATE_REGISTERING:
setState(MGMT_STATE_OOS);
break;
case MGMT_STATE_OOS:
case MGMT_STATE_CREATED:
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
case MGMT_STATE_IDLE:
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
default:
ignored = 1;
break;
}
break;
case EV_CC_OOS_REG_ALL_FAILED:
switch ( mgmtState) {
case MGMT_STATE_REGISTERED:
processInsToOos(); /* FALL THROUGH */
case MGMT_STATE_OOS:
case MGMT_STATE_REGISTERING:
setState(MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK);
action(CMD_SHUTDOWN);
break;
case MGMT_STATE_CREATED:
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
case MGMT_STATE_IDLE:
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
default:
ignored = 1;
break;
}
break;
/*
*This event shutdown sip stack to facilitate re-registration of
* all lines.
*/
case EV_CC_RE_REGISTER:
switch ( mgmtState) {
case MGMT_STATE_REGISTERED:
processInsToOos();
setState(MGMT_STATE_OOS_AWAIT_UN_REG_ACK);
action(CMD_UNREGISTER_ALL_LINES);
break;
case MGMT_STATE_OOS:
case MGMT_STATE_REGISTERING:
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
case MGMT_STATE_CREATED:
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
case MGMT_STATE_IDLE:
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
default:
ignored = 1;
break;
}
break;
case EV_CC_DESTROY:
isStartRequestPending = FALSE;
isServiceStopped = TRUE;
switch ( mgmtState) {
case MGMT_STATE_REGISTERED:
CC_Service_destroy();
processInsToOos();
case MGMT_STATE_REGISTERING:
case MGMT_STATE_OOS:
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
setState(MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK);
action(CMD_UNREGISTER_ALL_LINES);
break;
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
//setState(MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK);
setState(MGMT_STATE_IDLE);
CC_Service_destroy();
break;
case MGMT_STATE_CREATED:
CC_Service_destroy();
break;
case MGMT_STATE_IDLE:
CC_Service_destroy();
break;
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
setState(MGMT_STATE_IDLE);
default:
ignored = 1;
break;
}
break;
case EV_CC_STOP:
isStartRequestPending = FALSE;
isServiceStopped = TRUE;
switch ( mgmtState) {
case MGMT_STATE_REGISTERED:
processInsToOos();
case MGMT_STATE_REGISTERING:
case MGMT_STATE_OOS:
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
setState(MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK);
action(CMD_UNREGISTER_ALL_LINES);
break;
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
setState(MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK);
break;
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
case MGMT_STATE_CREATED:
case MGMT_STATE_IDLE:
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
setState(MGMT_STATE_IDLE);
//action(CMD_SHUTDOWN);
CC_Service_destroy();
default:
ignored = 1;
break;
}
break;
case EV_CC_OOS_SHUTDOWN_ACK:
switch ( mgmtState) {
case MGMT_STATE_OOS_AWAIT_UN_REG_ACK:
setState(MGMT_STATE_REGISTERING);
action(CMD_RESTART);
break;
case MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK:
setState(MGMT_STATE_WAITING_FOR_CONFIG_FILE);
configFetchReq(0);
setState(MGMT_STATE_IDLE);
break;
case MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK:
setState(MGMT_STATE_WAITING_FOR_CONFIG_FILE);
if (isStartRequestPending == TRUE) {
isStartRequestPending = FALSE;
configFetchReq(0);
}
setState(MGMT_STATE_IDLE);
break;
case MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK:
CC_Service_destroy();
break;
case MGMT_STATE_REGISTERED:
case MGMT_STATE_WAITING_FOR_CONFIG_FILE:
case MGMT_STATE_OOS:
case MGMT_STATE_REGISTERING:
case MGMT_STATE_CREATED:
case MGMT_STATE_IDLE:
default:
ignored = 1;
break;
}
break;
default:
break;
}
if (ignored) {
DEF_DEBUG("registration_processEvent: IGNORED Event %s in State %s \n",
mgmt_event_to_str(event) , mgmt_state_to_str(mgmtState));
}
}

View File

@ -1,43 +0,0 @@
/* 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/. */
/**
* Management Events
*/
typedef enum {
EV_CC_CREATE=0,
EV_CC_START,
EV_CC_CONFIG_RECEIVED ,
EV_CC_DO_SOFT_RESET ,
EV_CC_INSERVICE,
EV_CC_OOS_FAILOVER,
EV_CC_OOS_FALLBACK,
EV_CC_OOS_REG_ALL_FAILED,
EV_CC_OOS_SHUTDOWN_ACK,
EV_CC_RE_REGISTER,
EV_CC_STOP,
EV_CC_DESTROY,
EV_CC_IP_VALID,
EV_CC_IP_INVALID
} mgmt_event_t;
/**
* Management states
*/
typedef enum {
MGMT_STATE_CREATED=0,
MGMT_STATE_IDLE,
MGMT_STATE_REGISTERING,
MGMT_STATE_REGISTERED,
MGMT_STATE_OOS,
MGMT_STATE_OOS_AWAIT_SHUTDOWN_ACK,
MGMT_STATE_WAITING_FOR_CONFIG_FILE,
MGMT_STATE_OOS_AWAIT_UN_REG_ACK,
MGMT_STATE_STOP_AWAIT_SHUTDOWN_ACK,
MGMT_STATE_DESTROY_AWAIT_SHUTDOWN_ACK
} mgmt_state_t;
extern void registration_processEvent(int event);
cc_boolean is_phone_registered();

View File

@ -1,43 +0,0 @@
/* 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 "cc_info.h"
#include "sessionTypes.h"
#include "phone_debug.h"
#include "CCProvider.h"
#include "sessionConstants.h"
#include "ccapp_task.h"
/**
* Send call information.
* @param call_handle call handle
* @param info_package the Info-Package header of the Info Package
* @param info_type the Content-Type header of the Info Package
* @param info_body the message body of the Info Package
* @return void
*/
void CC_Info_sendInfo(cc_call_handle_t call_handle,
string_t info_package,
string_t info_type,
string_t info_body) {
static const char *fname = "CC_Info_sendInfo";
session_send_info_t send_info;
CCAPP_DEBUG(DEB_F_PREFIX"entry... call_handle=0x%x\n",
DEB_F_PREFIX_ARGS(SIP_CC_SES, fname), call_handle);
send_info.sessionID= (SESSIONTYPE_CALLCONTROL << CC_SID_TYPE_SHIFT) + call_handle;;
send_info.generic_raw.info_package = strlib_malloc(info_package, strlen(info_package));
send_info.generic_raw.content_type = strlib_malloc(info_type, strlen(info_type));
send_info.generic_raw.message_body = strlib_malloc(info_body, strlen(info_body));
/* Once the msg is posted to ccapp_msgq, ccapp 'owns' these strings */
// ccappTaskPostMsg does a shallow copy of *send_info
if (ccappTaskPostMsg(CCAPP_SEND_INFO, &send_info,
sizeof(session_send_info_t), CCAPP_CCPROVIER) != CPR_SUCCESS) {
CCAPP_ERROR(DEB_F_PREFIX"ccappTaskPostMsg failed\n",
DEB_F_PREFIX_ARGS(SIP_CC_SES, fname));
}
}

View File

@ -1,229 +0,0 @@
/* 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 "cc_service.h"
#include "phone_debug.h"
#include "CCProvider.h"
#include "sessionConstants.h"
#include "ccsip_messaging.h"
#include "ccapp_task.h"
/**
* External init.c methods
*/
extern int ccPreInit ();
extern int ccInit ();
extern int ccUnload ();
extern void protCfgTblInit();
extern cc_int32_t SipDebugMessage;
extern cc_int32_t SipDebugState;
extern cc_int32_t SipDebugTask;
extern cc_int32_t SipDebugRegState;
extern cc_int32_t GSMDebug;
extern cc_int32_t FIMDebug;
extern cc_int32_t LSMDebug;
extern cc_int32_t FSMDebugSM;
extern int32_t CSMDebugSM;
extern cc_int32_t CCDebug;
extern cc_int32_t CCDebugMsg;
extern cc_int32_t AuthDebug;
extern cc_int32_t ConfigDebug;
extern cc_int32_t DpintDebug;
extern cc_int32_t KpmlDebug;
extern cc_int32_t VCMDebug;
extern cc_int32_t PLATDebug;
extern cc_int32_t CCEVENTDebug;
extern cc_int32_t g_CCAppDebug;
extern cc_int32_t g_CCLogDebug;
extern cc_int32_t TNPDebug;
/**
* Initialize all the debug variables
*/
void dbg_init(void)
{
/* This is for the RT/TNP products */
SipDebugMessage = 1;
SipDebugState = 1;
SipDebugTask = 1;
SipDebugRegState = 1;
GSMDebug = 1;
FIMDebug = 1;
LSMDebug = 1;
FSMDebugSM = 1;
CSMDebugSM = 0;
VCMDebug = 1;
PLATDebug = 1;
CCEVENTDebug = 0;
CCDebug = 0;
CCDebugMsg = 0;
AuthDebug = 1;
TNPDebug = 1;
ConfigDebug = 1;
DpintDebug = 0;
KpmlDebug = 0;
g_CCAppDebug = 1;
g_CCLogDebug = 1;
TNPDebug = 1;
g_NotifyCallDebug = 0;
g_NotifyLineDebug = 0;
}
/**
* Defines the management methods.
*/
/**
* The following methods are defined to bring up the pSipcc stack
*/
/**
* Initialize the pSipcc stack.
* @return
*/
cc_return_t CC_Service_init() {
//Initialize stack
return ccInit();
}
/**
* Pre-initialize the pSipcc stack.
* @return
*/
cc_return_t CC_Service_create() {
//Preinitialize memory
ccPreInit();
//Initialize debug settings
dbg_init();
//Prepopulate the Configuration data table
protCfgTblInit();
return CC_SUCCESS;
}
/**
* Gracefully unload the pSipcc stack
* @return
*/
cc_return_t CC_Service_destroy() {
ccUnload();
return CC_SUCCESS;
}
/**
* Bring up the pSipcc stack in service
* @return
*/
cc_return_t CC_Service_start() {
sessionProvider_cmd_t proCmd;
CCAPP_DEBUG("CC_Service_start \n");
memset ( &proCmd, 0, sizeof(sessionProvider_cmd_t));
proCmd.sessionType = SESSIONTYPE_CALLCONTROL; //Not used
proCmd.cmd = CMD_INSERVICE;
if (ccappTaskPostMsg(CCAPP_SERVICE_CMD, (cprBuffer_t)&proCmd,
sizeof(sessionProvider_cmd_t), CCAPP_CCPROVIER) == CPR_FAILURE) {
CCAPP_DEBUG("CC_Service_start: ccappTaskSendMsg failed\n");
return CC_FAILURE;
}
return CC_SUCCESS;
}
/**
* Shutdown pSipcc stack for restarting
* @param mgmt_reason the reason to shutdown pSipcc stack
* @param reason_string literal string for shutdown
* @return
*/
cc_return_t CC_Service_shutdown(cc_shutdown_reason_t mgmt_reason, string_t reason_string) {
sessionProvider_cmd_t proCmd;
CCAPP_DEBUG("CC_Service_shutdown \n");
memset ( &proCmd, 0, sizeof(sessionProvider_cmd_t));
proCmd.sessionType = SESSIONTYPE_CALLCONTROL; //Not used
proCmd.cmd = CMD_SHUTDOWN;
if (ccappTaskPostMsg(CCAPP_SERVICE_CMD, (cprBuffer_t)&proCmd,
sizeof(sessionProvider_cmd_t), CCAPP_CCPROVIER) == CPR_FAILURE) {
CCAPP_DEBUG("CC_Service_shutdown: ccappTaskSendMsg failed\n");
return CC_FAILURE;
}
return CC_SUCCESS;
}
/**
* Unregister all lines of a phone
* @param mgmt_reason the reason to bring down the registration
* @param reason_string the literal string for unregistration
* @return
*/
cc_return_t CC_Service_unregisterAllLines(cc_shutdown_reason_t mgmt_reason, string_t reason_string) {
sessionProvider_cmd_t proCmd;
CCAPP_DEBUG("CC_Service_shutdown \n");
memset ( &proCmd, 0, sizeof(sessionProvider_cmd_t));
proCmd.sessionType = SESSIONTYPE_CALLCONTROL; //Not used
proCmd.cmd = CMD_SHUTDOWN;
proCmd.cmdData.ccData.reason = mgmt_reason;
proCmd.cmdData.ccData.reason_info = reason_string;
if (ccappTaskPostMsg(CCAPP_SERVICE_CMD, (cprBuffer_t)&proCmd,
sizeof(sessionProvider_cmd_t), CCAPP_CCPROVIER) == CPR_FAILURE) {
CCAPP_DEBUG("CC_Service_shutdown: ccappTaskSendMsg failed\n");
return CC_FAILURE;
}
return CC_SUCCESS;
}
/**
* Register all lines for a phone.
* @param mgmt_reason the reason of registration
* @param reason_string the literal string of the registration
* @return
*/
cc_return_t CC_Service_registerAllLines(cc_shutdown_reason_t mgmt_reason, string_t reason_string) {
sessionProvider_cmd_t proCmd;
CCAPP_DEBUG("CC_Service_registerAllLines \n");
memset ( &proCmd, 0, sizeof(sessionProvider_cmd_t));
proCmd.sessionType = SESSIONTYPE_CALLCONTROL; //Not used
proCmd.cmd = CMD_REGISTER_ALL_LINES;
proCmd.cmdData.ccData.reason = mgmt_reason;
proCmd.cmdData.ccData.reason_info = reason_string;
if (ccappTaskPostMsg(CCAPP_SERVICE_CMD, (cprBuffer_t)&proCmd,
sizeof(sessionProvider_cmd_t), CCAPP_CCPROVIER) == CPR_FAILURE) {
CCAPP_DEBUG("CC_Service_registerAllLines: ccappTaskSendMsg failed\n");
return CC_FAILURE;
}
return CC_SUCCESS;
}
/**
* Restart pSipcc stack
* @return
*/
cc_return_t CC_Service_restart() {
sessionProvider_cmd_t proCmd;
CCAPP_DEBUG("CC_Service_restart \n");
memset ( &proCmd, 0, sizeof(sessionProvider_cmd_t));
proCmd.sessionType = SESSIONTYPE_CALLCONTROL; //Not used
proCmd.cmd = CMD_RESTART;
if (ccappTaskPostMsg(CCAPP_SERVICE_CMD, (cprBuffer_t)&proCmd,
sizeof(sessionProvider_cmd_t), CCAPP_CCPROVIER) == CPR_FAILURE) {
CCAPP_DEBUG("CC_Service_restart: ccappTaskSendMsg failed\n");
return CC_FAILURE;
}
return CC_SUCCESS;
}

View File

@ -1,375 +0,0 @@
/* 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 "cpr_stdio.h"
#include "ccapi_call.h"
#include "sessionHash.h"
#include "CCProvider.h"
#include "cc_call_feature.h"
#include "cc_info.h"
#include "lsm.h"
#include "prot_configmgr.h"
#include "ccapi_call_info.h"
#include "util_string.h"
/**
* Get call info snapshot
* @param [in] handle - call handle
* @return cc_call_info_snap_t
*/
cc_callinfo_ref_t CCAPI_Call_getCallInfo(cc_call_handle_t handle) {
unsigned int session_id = ccpro_get_sessionId_by_callid(GET_CALL_ID(handle));
cc_callinfo_ref_t snapshot=NULL;
session_data_t * data;
if ( session_id != 0 ) {
data = findhash(session_id);
if ( data != NULL ) {
snapshot = getDeepCopyOfSessionData(data);
if (snapshot == NULL) {
return NULL;
}
snapshot->ref_count = 1;
}
}
return snapshot;
}
/**
* Retain the snapshot
* @param cc_callinfo_ref_t - refrence to the block to be retained
* @return void
*/
void CCAPI_Call_retainCallInfo(cc_callinfo_ref_t ref) {
if (ref != NULL ) {
ref->ref_count++;
}
}
/**
* Free the snapshot
* @param cc_callinfo_ref_t - refrence to the block to be freed
* @return void
*/
void CCAPI_Call_releaseCallInfo(cc_callinfo_ref_t ref) {
if (ref != NULL ) {
DEF_DEBUG(DEB_F_PREFIX"ref=0x%x: count=%d",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI_Call_releaseCallInfo"), ref, ref->ref_count);
ref->ref_count--;
if ( ref->ref_count == 0 ) {
cleanSessionData(ref);
cpr_free(ref);
}
}
}
/**
* get the line associated with this call
* @param [in] handle - call handle
* @return cc_lineid_t
*/
cc_lineid_t CCAPI_Call_getLine(cc_call_handle_t call_handle){
static const char *fname="CCAPI_Call_getLine";
if ( call_handle != 0 ) {
cc_lineid_t lineid = GET_LINE_ID(call_handle);
CCAPP_DEBUG(DEB_F_PREFIX"returned %u\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), lineid);
return lineid;
}
return 0;
}
/**
* Originate call
* Goes offhook and dials digits if specified
* @param [in] handle - call handle
* @param [in] video_pref - video direction desired on call
* @param [in] digits - digits to be dialed
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_originateCall(cc_call_handle_t handle, cc_sdp_direction_t video_pref, cc_string_t digits){
return CC_CallFeature_dial(handle, video_pref, digits);
}
cc_return_t CCAPI_CreateOffer(cc_call_handle_t handle, const cc_media_constraints_t *constraints) {
return CC_CallFeature_CreateOffer(handle, constraints);
}
cc_return_t CCAPI_CreateAnswer(cc_call_handle_t handle, const cc_media_constraints_t *constraints) {
return CC_CallFeature_CreateAnswer(handle, constraints);
}
cc_return_t CCAPI_SetLocalDescription(cc_call_handle_t handle, cc_jsep_action_t action, cc_string_t sdp) {
return CC_CallFeature_SetLocalDescription(handle, action, sdp);
}
cc_return_t CCAPI_SetRemoteDescription(cc_call_handle_t handle, cc_jsep_action_t action, cc_string_t sdp) {
return CC_CallFeature_SetRemoteDescription(handle, action, sdp);
}
cc_return_t CCAPI_SetPeerConnection(cc_call_handle_t handle, cc_peerconnection_t pc) {
return CC_CallFeature_SetPeerConnection(handle, pc);
}
cc_return_t CCAPI_AddStream(cc_call_handle_t handle, cc_media_stream_id_t stream_id, cc_media_track_id_t track_id, cc_media_type_t media_type) {
return CC_CallFeature_AddStream(handle, stream_id, track_id, media_type);
}
cc_return_t CCAPI_RemoveStream(cc_call_handle_t handle, cc_media_stream_id_t stream_id, cc_media_track_id_t track_id, cc_media_type_t media_type) {
return CC_CallFeature_RemoveStream(handle, stream_id, track_id, media_type);
}
cc_return_t CCAPI_AddICECandidate(cc_call_handle_t handle, cc_string_t candidate, cc_string_t mid, cc_level_t level) {
return CC_CallFeature_AddICECandidate(handle, candidate, mid, level);
}
/**
* Dial digits on the call
* @param [in] handle - call handle
* @paraqm [in] digits - digits to be dialed
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_sendDigit(cc_call_handle_t handle, cc_digit_t digit){
return CC_CallFeature_sendDigit(handle, digit);
}
/**
* Send Backspace
* @param [in] handle - call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_backspace(cc_call_handle_t handle){
return CC_CallFeature_backSpace(handle);
}
/**
* Answer Call
* @param [in] handle - call handle
* @param [in] video_pref - video direction desired on call
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_answerCall(cc_call_handle_t handle, cc_sdp_direction_t video_pref) {
return CC_CallFeature_answerCall(handle, video_pref);
}
/**
* Redial
* @param [in] handle - call handle
* @param [in] video_pref - video direction desired on call
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_redial(cc_call_handle_t handle, cc_sdp_direction_t video_pref){
return CC_CallFeature_redial(handle, video_pref);
}
/**
* Initiate Call Forward All
* @param [in] handle - call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_initiateCallForwardAll(cc_call_handle_t handle){
return CC_CallFeature_callForwardAll(handle);
}
/**
* Hold
* @param [in] handle - call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_hold(cc_call_handle_t handle, cc_hold_reason_t reason){
return CC_CallFeature_holdCall(handle, reason);
}
/**
* Resume
* @param [in] handle - call handle
* @param [in] video_pref - video direction desired on call
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_resume(cc_call_handle_t handle, cc_sdp_direction_t video_pref) {
return CC_CallFeature_resume(handle, video_pref);
}
/**
* end Consult leg
* @param [in] handle - call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_endConsultativeCall(cc_call_handle_t handle){
cc_callinfo_ref_t info_handle = CCAPI_Call_getCallInfo(handle);
cc_call_attr_t attr = CCAPI_CallInfo_getCallAttr(info_handle);
if (attr != CC_ATTR_CONF_CONSULT &&
attr != CC_ATTR_XFR_CONSULT &&
attr != CC_ATTR_LOCAL_CONF_CONSULT &&
attr != CC_ATTR_LOCAL_XFER_CONSULT) {
DEF_DEBUG(DEB_F_PREFIX"This method only calls on a consultative call",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI_Call_endConsultativeCall"), handle);
return CC_FAILURE;
}
return CC_CallFeature_endConsultativeCall(handle);
}
/**
* end Call
* @param [in] handle - call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_endCall(cc_call_handle_t handle){
return CC_CallFeature_terminateCall(handle);
}
/**
* Initiate a conference
* @param [in] handle - call handle
* @param [in] video_pref - video direction desired on consult call
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_conferenceStart(cc_call_handle_t handle, cc_sdp_direction_t video_pref){
return CC_CallFeature_conference(handle, TRUE,//not used
CC_EMPTY_CALL_HANDLE, video_pref);
}
/**
* complete conference
* @param [in] handle - call handle
* @param [in] phandle - call handle of the other leg
* @param [in] video_pref - video direction desired on consult call
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_conferenceComplete(cc_call_handle_t handle, cc_call_handle_t phandle,
cc_sdp_direction_t video_pref){
return CC_CallFeature_conference(handle, TRUE,//not used
phandle, video_pref);
}
/**
* start transfer
* @param [in] handle - call handle
* @param [in] video_pref - video direction desired on consult call
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_transferStart(cc_call_handle_t handle, cc_sdp_direction_t video_pref){
return CC_CallFeature_transfer(handle, CC_EMPTY_CALL_HANDLE, video_pref);
}
/**
* complete transfer
* @param [in] handle - call handle
* @param [in] phandle - call handle of the other leg
* @param [in] video_pref - video direction desired on consult call
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_transferComplete(cc_call_handle_t handle, cc_call_handle_t phandle,
cc_sdp_direction_t video_pref){
return CC_CallFeature_transfer(handle, phandle, video_pref);
}
/**
* cancel conference or transfer
* @param [in] handle - call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_cancelTransferOrConferenceFeature(cc_call_handle_t handle){
return CC_CallFeature_cancelXfrerCnf(handle);
}
/**
* direct Transfer
* @param [in] handle - call handle
* @param [in] handle - transfer target call
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_directTransfer(cc_call_handle_t handle, cc_call_handle_t target){
return CC_CallFeature_directTransfer(handle, target);
}
/**
* Join Across line
* @param [in] handle - call handle
* @param [in] handle - join target
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_joinAcrossLine(cc_call_handle_t handle, cc_call_handle_t target){
return CC_CallFeature_joinAcrossLine(handle, target);
}
/**
* BLF Call Pickup
* @param [in] handle - call handle
* @param [in] speed - speedDial Number
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_blfCallPickup(cc_call_handle_t handle,
cc_sdp_direction_t video_pref, cc_string_t speed){
return CC_CallFeature_blfCallPickup(handle, video_pref, speed);
}
/**
* Select a call
* @param [in] handle - call handle
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_select(cc_call_handle_t handle){
return CC_CallFeature_select(handle);
}
/**
* Update Video Media Cap for the call
* @param [in] handle - call handle
* @param [in] video_pref - video direction desired on call
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_updateVideoMediaCap (cc_call_handle_t handle, cc_sdp_direction_t video_pref) {
return CC_CallFeature_updateCallMediaCapability(handle, video_pref);
}
/**
* send INFO method for the call
* @param [in] handle - call handle
* @param [in] infopackage - Info-Package header value
* @param [in] infotype - Content-Type header val
* @param [in] infobody - Body of the INFO message
* @return SUCCESS or FAILURE
*/
cc_return_t CCAPI_Call_sendInfo (cc_call_handle_t handle, cc_string_t infopackage, cc_string_t infotype, cc_string_t infobody)
{
CC_Info_sendInfo(handle, infopackage, infotype, infobody);
return CC_SUCCESS;
}
/**
* API to mute/unmute audio
* @param [in] val - TRUE=> mute FALSE => unmute
* @return SUCCESS or FAILURE
* NOTE: The mute state is persisted within the stack and shall be remembered across hold/resume.
* This API doesn't perform the mute operation but simply caches the mute state of the session.
*/
cc_return_t CCAPI_Call_setAudioMute (cc_call_handle_t handle, cc_boolean val) {
unsigned int session_id = ccpro_get_sessionId_by_callid(GET_CALL_ID(handle));
session_data_t * sess_data_p = (session_data_t *)findhash(session_id);
DEF_DEBUG(DEB_F_PREFIX": val=%d, handle=%d datap=%x",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI_Call_setAudioMute"), val, handle, sess_data_p);
if ( sess_data_p != NULL ) {
sess_data_p->audio_mute = val;
}
return CC_SUCCESS;
}
/**
* API to mute/unmute Video
* @param [in] val - TRUE=> mute FALSE => unmute
* @return SUCCESS or FAILURE
* NOTE: The mute state is persisted within the stack and shall be remembered across hold/resume
* This API doesn't perform the mute operation but simply caches the mute state of the session.
*/
cc_return_t CCAPI_Call_setVideoMute (cc_call_handle_t handle, cc_boolean val){
unsigned int session_id = ccpro_get_sessionId_by_callid(GET_CALL_ID(handle));
session_data_t * sess_data_p = (session_data_t *)findhash(session_id);
DEF_DEBUG(DEB_F_PREFIX": val=%d, handle=%d datap=%x",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI_Call_setVideoMute"), val, handle, sess_data_p);
if ( sess_data_p != NULL ) {
sess_data_p->video_mute = val;
lsm_set_video_mute(GET_CALL_ID(handle), val);
}
return CC_SUCCESS;
}

View File

@ -1,784 +0,0 @@
/* 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 "cpr_stdio.h"
#include "ccapi_call.h"
#include "sessionHash.h"
#include "CCProvider.h"
#include "text_strings.h"
#include "phone_debug.h"
#include "peer_connection_types.h"
/**
* get Line on which this call is
* @param [in] handle - call handle
* @return cc_line_id_t - line ID
*/
cc_lineid_t CCAPI_CallInfo_getLine(cc_callinfo_ref_t handle)
{
static const char *fname="CCAPI_CallInfo_getLine";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %u\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), GET_LINE_ID(CREATE_CALL_HANDLE_FROM_SESSION_ID(data->sess_id)));
return GET_LINE_ID(CREATE_CALL_HANDLE_FROM_SESSION_ID(data->sess_id));
}
return 0;
}
/**
* get Call state
* @param handle - call handle
* @return call state
*/
cc_call_state_t CCAPI_CallInfo_getCallState(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getCallState";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->state);
return data->state;
}
return ONHOOK;
}
/**
* get call attributes
* @param handle - call handle
* @return call attributes
*/
cc_call_attr_t CCAPI_CallInfo_getCallAttr(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getCallAttr";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->attr);
return data->attr;
}
return 0;
}
/**
* get Call Type
* @param handle - call handle
* @return call type
*/
cc_call_type_t CCAPI_CallInfo_getCallType(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getCallType";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->type);
return data->type;
}
return 0;
}
/**
* get Called party name
* @param handle - call handle
* @return called party name
*/
cc_string_t CCAPI_CallInfo_getCalledPartyName(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getCalledPartyName";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->cld_name);
return data->cld_name;
}
return strlib_empty();
}
/**
* get Called party number
* @param handle - call handle
* @return called party number
*/
cc_string_t CCAPI_CallInfo_getCalledPartyNumber(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getCalledPartyNumber";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->cld_number);
return data->cld_number;
}
return strlib_empty();
}
/**
* get Calling party name
* @param handle - call handle
* @return calling party name
*/
cc_string_t CCAPI_CallInfo_getCallingPartyName(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getCallingPartyName";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->clg_name);
return data->clg_name;
}
return strlib_empty();
}
/**
* get Calling party number
* @param handle - call handle
* @return calling party number
*/
cc_string_t CCAPI_CallInfo_getCallingPartyNumber(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getCallingPartyNumber";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->clg_number);
return data->clg_number;
}
return strlib_empty();
}
/**
* get alternate number
* @param handle - call handle
* @return calling party number
*/
cc_string_t CCAPI_CallInfo_getAlternateNumber(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getAlternateNumber";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->alt_number);
return data->alt_number;
}
return strlib_empty();
}
/**
* get Original Called party name
* @param handle - call handle
* @return original called party name
*/
cc_string_t CCAPI_CallInfo_getOriginalCalledPartyName(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getOriginalCalledPartyName";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->orig_called_name);
return data->orig_called_name;
}
return strlib_empty();
}
/**
* get Original Called party number
* @param handle - call handle
* @return original called party number
*/
cc_string_t CCAPI_CallInfo_getOriginalCalledPartyNumber(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getOriginalCalledPartyNumber";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->orig_called_number);
return data->orig_called_number;
}
return strlib_empty();
}
/**
* get last redirecting party name
* @param handle - call handle
* @return last redirecting party name
*/
cc_string_t CCAPI_CallInfo_getLastRedirectingPartyName(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getLastRedirectingPartyName";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->last_redir_name);
return data->last_redir_name;
}
return strlib_empty();
}
/**
* get past redirecting party number
* @param handle - call handle
* @return last redirecting party number
*/
cc_string_t CCAPI_CallInfo_getLastRedirectingPartyNumber(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getLastRedirectingPartyNumber";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->last_redir_number);
return data->last_redir_number;
}
return strlib_empty();
}
/**
* get placed call party name
* @param handle - call handle
* @return placed party name
*/
cc_string_t CCAPI_CallInfo_getPlacedCallPartyName(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getPlacedCallPartyName";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->plcd_name);
return data->plcd_name;
}
return strlib_empty();
}
/**
* get placed call party number
* @param handle - call handle
* @return placed party number
*/
cc_string_t CCAPI_CallInfo_getPlacedCallPartyNumber(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getPlacedCallPartyNumber";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->plcd_number);
return data->plcd_number;
}
return strlib_empty();
}
/**
* get call instance number
* @param handle - call handle
* @return
*/
cc_int32_t CCAPI_CallInfo_getCallInstance(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getCallInstance";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->inst);
return data->inst;
}
return 0;
}
/**
* get call status prompt
* @param handle - call handle
* @return call status
*/
cc_string_t CCAPI_CallInfo_getStatus(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getStatus";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->status);
return data->status;
}
return strlib_empty();
}
/**
* get call security
* @param handle - call handle
* @return call security status
*/
cc_call_security_t CCAPI_CallInfo_getSecurity(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getSecurity";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->security);
return data->security;
}
return CC_SECURITY_NONE;
}
/**
* * get Call Selection Status
* * @param [in] handle - call info handle
* * @return cc_boolean - TRUE => selected
* */
cc_boolean CCAPI_CallInfo_getSelectionStatus(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getSelectionStatus";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->isSelected);
return data->isSelected;
}
return FALSE;
}
/**
* get call policy
* @param handle - call handle
* @return call policy
*/
cc_call_policy_t CCAPI_CallInfo_getPolicy(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getPolicy";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->policy);
return data->policy;
}
return CC_POLICY_NONE;
}
/**
* get GCID
* @param handle - call handle
* @return GCID
*/
cc_string_t CCAPI_CallInfo_getGCID(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getGCID";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->gci);
return data->gci;
}
return strlib_empty();
}
/**
* get ringer state.
* @param handle - call handle
* @return ringer state
*/
cc_boolean CCAPI_CallInfo_getRingerState(cc_callinfo_ref_t handle)
{
static const char *fname="CCAPI_CallInfo_getRingerState";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->ringer_start);
return data->ringer_start;
}
return FALSE;
}
/**
* get ringer mode
* @param handle - call handle
* @return ringer mode
*/
int CCAPI_CallInfo_getRingerMode(cc_callinfo_ref_t handle)
{
static const char *fname="CCAPI_CallInfo_getRingerMode";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->ringer_mode);
return (int)(data->ringer_mode);
}
return -1;
}
/**
* get ringer loop count
* @param handle - call handle
* @return once Vs continuous
*/
cc_boolean CCAPI_CallInfo_getIsRingOnce(cc_callinfo_ref_t handle)
{
static const char *fname="CCAPI_CallInfo_getIsRingOnce";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->ringer_once);
return (int)(data->ringer_once);
}
return TRUE;
}
/**
* get onhook reason
* @param handle - call handle
* @return onhook reason
*/
cc_int32_t CCAPI_CallInfo_getOnhookReason(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getOnhookReason";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->cause);
return data->cause;
}
return CC_CAUSE_NORMAL;
}
/**
* is Conference Call?
* @param handle - call handle
* @return boolean - is Conference
*/
cc_boolean CCAPI_CallInfo_getIsConference(cc_callinfo_ref_t handle){
session_data_t *data = (session_data_t *)handle;
char isConf[32];
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, __FUNCTION__));
memset(isConf, 0, sizeof(isConf));
if(platGetPhraseText(CONFERENCE_LOCALE_CODE, isConf, sizeof(isConf)) == CC_FAILURE){
return FALSE;
}
if( data != NULL){
if( (strcasecmp(data->cld_name, isConf) == 0 && strcasecmp(data->cld_number, "") == 0) ||
(strcasecmp(data->clg_name, isConf) == 0 && strcasecmp(data->clg_number, "") == 0) )
{
return TRUE;
}
}
return FALSE;
}
/**
* getStream Statistics
* @param handle - call handle
* @return stream stats
*/
cc_return_t CCAPI_CallInfo_getStreamStatistics(cc_callinfo_ref_t handle, cc_int32_t stats[], cc_int32_t *count)
{
static const char *fname="CCAPI_CallInfo_getStreamStatistics";
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
CCAPP_DEBUG(DEB_F_PREFIX"returned CC_SUCCESS (default)\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
// todo
return CC_SUCCESS;
}
/**
* has capability - is the feature allowed
* @param handle - call handle
* @param feat_id - feature id
* @return boolean - is Allowed
*/
cc_boolean CCAPI_CallInfo_hasCapability(cc_callinfo_ref_t handle, cc_int32_t feat_id){
static const char *fname="CCAPI_CallInfo_hasCapability";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"feature id: %d , value returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),feat_id, data->allowed_features[feat_id]);
return data->allowed_features[feat_id];
}
return FALSE;
}
/**
* get Allowed Feature set
* @param handle - call handle
* @return boolean array that can be indexed using CCAPI_CALL_CAP_XXXX to check if feature is enabled
*/
cc_boolean CCAPI_CallInfo_getCapabilitySet(cc_callinfo_ref_t handle, cc_int32_t feat_set[]){
static const char *fname="CCAPI_CallInfo_getCapabilitySet";
session_data_t *data = (session_data_t *)handle;
int feat_id;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
for (feat_id = 0; feat_id < CCAPI_CALL_CAP_MAX; feat_id++) {
feat_set[feat_id] = data->allowed_features[feat_id];
CCAPP_DEBUG(DEB_F_PREFIX"feature id: %d , value %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),feat_id, feat_set[feat_id]);
}
CCAPP_DEBUG(DEB_F_PREFIX"returned CC_SUCCESS\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
return CC_SUCCESS;
}
return CC_FAILURE;
}
/**
* Call selection status
* @param [in] handle - call handle
* @return cc_boolean - selection status
*/
cc_boolean CCAPI_CallInfo_isCallSelected(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_isCallSelected";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->isSelected);
return data->isSelected;
}
return FALSE;
}
/**
* Call negotiated video direction
* @param [in] handle - call handle
* @return cc_sdp_direction_t - video direction
*/
cc_sdp_direction_t CCAPI_CallInfo_getVideoDirection(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getVideoDirection";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->vid_dir);
return (data->vid_dir);
}
return CC_SDP_DIRECTION_INACTIVE;
}
/**
* INFO Package for RECEIVED_INFO event
* @param [in] handle - call info handle
* @return cc_string_t - Info package header
*/
cc_string_t CCAPI_CallInfo_getINFOPack (cc_callinfo_ref_t handle)
{
static const char *fname="CCAPI_CallInfo_getINFOPackage";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->info_package);
return data->info_package;
}
return strlib_empty();
}
/**
* INFO type for RECEIVED_INFO event
* @param [in] handle - call info handle
* @return cc_string_t - content-type header
*/
cc_string_t CCAPI_CallInfo_getINFOType (cc_callinfo_ref_t handle)
{
static const char *fname="CCAPI_CallInfo_getINFOType";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->info_type);
return data->info_type;
}
return strlib_empty();
}
/**
* INFO body for RECEIVED_INFO event
* @param [in] handle - call info handle
* @return cc_string_t - INFO body
*/
cc_string_t CCAPI_CallInfo_getINFOBody (cc_callinfo_ref_t handle)
{
static const char *fname="CCAPI_CallInfo_getINFOBody";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->info_body);
return data->info_body;
}
return strlib_empty();
}
/**
* Get the call log reference
* @param [in] handle - call info handle
* @return cc_string_t - INFO body
* NOTE: Memory associated with the call log is tied to the cc_callinfo_ref_t handle
* this would be freed when the callinfo ref is freed.
*/
cc_calllog_ref_t CCAPI_CallInfo_getCallLogRef(cc_callinfo_ref_t handle)
{
static const char *fname="CCAPI_CallInfo_getCallLogRef";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %x\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), &data->call_log);
return &data->call_log;
}
return NULL;
}
/**
* Returns the Audio mute state for this call
* @return boolean true=muted false=not muted
*/
cc_boolean CCAPI_CallInfo_isAudioMuted (cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_isAudioMuted";
session_data_t *data = (session_data_t *)handle;
session_data_t * sess_data_p;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
sess_data_p = (session_data_t *)findhash(data->sess_id);
if ( sess_data_p != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), sess_data_p->audio_mute);
return sess_data_p->audio_mute;
}
}
return FALSE;
}
/**
* Returns the Video mute state for this call
* @return boolean true=muted false=not muted
*/
cc_boolean CCAPI_CallInfo_isVideoMuted (cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_isVideoMuted";
session_data_t *data = (session_data_t *)handle;
session_data_t * sess_data_p;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
sess_data_p = (session_data_t *)findhash(data->sess_id);
if ( sess_data_p != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), sess_data_p->video_mute);
return sess_data_p->video_mute;
}
}
return FALSE;
}
/**
* get SDP for CreateOffer\Create answer success callback
* @param handle - call handle
* @return sdp
*/
cc_string_t CCAPI_CallInfo_getSDP(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getSDP";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if (data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->sdp);
return data->sdp;
}
return strlib_empty();
}
/**
* get status code from internal JSEP functions
* @param handle - call handle
* @return status code
*/
cc_int32_t CCAPI_CallInfo_getStatusCode(cc_callinfo_ref_t handle){
static const char *fname="CCAPI_CallInfo_getStatusCode";
session_data_t *data = (session_data_t *)handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( data != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), data->cause);
return data->cause;
}
return CC_CAUSE_NORMAL;
}
/**
* get media stream table
* @param handle - call handle
* @return status MediaStreamTable
*/
MediaStreamTable* CCAPI_CallInfo_getMediaStreams(cc_callinfo_ref_t handle) {
static const char *fname="CCAPI_CallInfo_getMediaStreams";
session_data_t *data = (session_data_t *)handle;
MediaTrack track;
MediaStreamTable* table = cpr_malloc(sizeof(MediaStreamTable));
if (!table)
return NULL;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if (data != NULL) {
table->media_stream_id = data->media_stream_id;
table->num_tracks = 1; /* this will change when we have multiple tracks per stream */
track.media_stream_track_id = data->media_stream_track_id;
track.video = FALSE;
table->track[0] = track;
/*
* Partly implemented multi-track handling
cc_table = data->media_tracks;
table->stream_id = (unsigned int)cc_table->stream_id;
table->num_tracks = (unsigned int)cc_table->num_tracks;
track.track_id = cc_table->track[0].ref_id;
table->track[0] = track;
*/
return table;
}
return table;
}

View File

@ -1,108 +0,0 @@
/* 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 "phone_debug.h"
#include "CCProvider.h"
#include "sessionConstants.h"
#include "prot_configmgr.h"
#include "cc_types.h"
#include "config_parser.h"
#include "config_api.h"
#include "ccapi_snapshot.h"
#include "ccapi_device.h"
#include "ccapi_device_info.h"
#include "cc_device_manager.h"
#include "ccapi_service.h"
#include "util_string.h"
extern boolean apply_config;
extern cc_apply_config_result_t apply_config_result;
cc_boolean parse_setup_properties (int device_handle, const char *device_name, const char *sipUser, const char *sipPassword, const char *sipDomain);
/**
*
* @return
*/
void CCAPI_Start_response(int device_handle, const char *device_name, const char *sipUser, const char *sipPassword, const char *sipDomain) {
static const char fname[] = "CCAPI_Start_response";
if (is_empty_str((char*)sipUser) || is_empty_str((char*)sipDomain)) {
CCAPP_ERROR(DEB_F_PREFIX" invalid registration details user=%x, domain=%x\n", DEB_F_PREFIX_ARGS(CC_API, fname), sipUser, sipDomain);
return;
}
g_dev_hdl = device_handle;
sstrncpy(g_dev_name, device_name, sizeof(g_dev_name));
if (is_phone_registered() == FALSE) {
if (parse_setup_properties(device_handle, device_name, sipUser, sipPassword, sipDomain)) {
registration_processEvent(EV_CC_CONFIG_RECEIVED);
}
return;
}
}
/* New Function
Register without using config file downloaded from cucm
*/
cc_boolean parse_setup_properties (int device_handle, const char *device_name, const char *sipUser, const char *sipPassword, const char *sipDomain) {
CC_Config_setStringValue(CFGID_DEVICE_NAME, device_name);
config_setup_main(sipUser, sipPassword, sipDomain);
ccsnap_device_init();
ccsnap_line_init();
ccsnap_gen_deviceEvent(CCAPI_DEVICE_EV_CONFIG_CHANGED, CC_DEVICE_ID);
return TRUE;
}
cc_boolean CCAPI_Config_set_server_address(const char *ip_address) {
config_setup_server_address(ip_address);
return TRUE;
}
cc_boolean CCAPI_Config_set_transport_udp(const cc_boolean is_udp) {
config_setup_transport_udp(is_udp);
return TRUE;
}
cc_boolean CCAPI_Config_set_local_voip_port(const int port) {
config_setup_local_voip_control_port(port);
return TRUE;
}
cc_boolean CCAPI_Config_set_remote_voip_port(const int port) {
config_setup_remote_voip_control_port(port);
return TRUE;
}
int CCAPI_Config_get_local_voip_port() {
return config_get_local_voip_control_port();
}
int CCAPI_Config_get_remote_voip_port() {
return config_get_remote_voip_control_port();
}
const char* CCAPI_Config_get_version() {
return config_get_version();
}
cc_boolean CCAPI_Config_set_p2p_mode(const cc_boolean is_p2p) {
config_setup_p2p_mode(is_p2p);
return TRUE;
}
cc_boolean CCAPI_Config_set_sdp_mode(const cc_boolean is_sdp) {
config_setup_sdp_mode(is_sdp);
return TRUE;
}
cc_boolean CCAPI_Config_set_avp_mode(const cc_boolean is_rtpsavpf) {
config_setup_avp_mode(is_rtpsavpf);
return TRUE;
}

View File

@ -1,290 +0,0 @@
/* 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 "cpr_stdlib.h"
#include "string_lib.h"
#include "ccapi_snapshot.h"
#include "ccapi_device.h"
#include "CCProvider.h"
#include "cc_config.h"
#include "cc_call_feature.h"
#include "cc_device_feature.h"
#include "ccsip_messaging.h"
#include "ccapi_call_info.h"
#include "cc_device_manager.h"
#include "cc_service_listener.h"
#include "platform_api.h"
#include "util_string.h"
#include "ccapi_service.h"
#include "ccapi_device_info.h"
char g_new_signaling_ip[MAX_IPADDR_STR_LEN];
dock_undock_event_t g_dock_undock_event = MEDIA_INTERFACE_UPDATE_NOT_REQUIRED;
extern accessory_cfg_info_t g_accessoryCfgInfo;
extern void escalateDeescalate();
int signaling_interface_type;
/**
* Get device reference handle
* @return cc_deviceinfo_ref_t - reference handle of the device
*/
cc_device_handle_t CCAPI_Device_getDeviceID()
{
return CC_DEVICE_ID;
}
/**
* Get device reference handle
* @param handle - device handle
* @return cc_deviceinfo_ref_t - reference handle of the device
*/
cc_deviceinfo_ref_t CCAPI_Device_getDeviceInfo(cc_device_handle_t handle)
{
cc_device_info_t *device_info = (cc_device_info_t*)cpr_malloc(sizeof(cc_device_info_t));
if (device_info) {
*device_info = g_deviceInfo;
device_info->name = strlib_copy(g_deviceInfo.name);
if (device_info->name == NULL) {
device_info->name = strlib_empty();
}
device_info->not_prompt = strlib_copy(g_deviceInfo.not_prompt);
if (device_info->not_prompt == NULL) {
device_info->not_prompt = strlib_empty();
}
device_info->ref_count = 1;
}
return device_info;
}
/**
* Retain the deviceInfo snapshot
* @param handle - device handle
* @param cc_deviceinfo_ref_t - refrence to the block to be retained
* @return void
*/
void CCAPI_Device_retainDeviceInfo(cc_deviceinfo_ref_t ref){
cc_device_info_t *device_info = ref;
if (device_info) {
device_info->ref_count++;
}
}
/**
* Set device configuration file location
* @param [in] ref - refrence to the block to be freed
* @param [in] file_path - device config file full path
* @return void
*/
void CCAPI_Device_configUpdate(cc_device_handle_t handle, file_path_t file_path) {
CC_Config_setStringValue(CFGID_CONFIG_FILE, file_path);
}
/**
* Release the deviceInfo snapshot
* @param handle - device handle
* @param cc_deviceinfo_ref_t - refrence to the block to be released
* @return void
*/
void CCAPI_Device_releaseDeviceInfo(cc_deviceinfo_ref_t ref){
cc_device_info_t *device_info = ref;
if (device_info) {
device_info->ref_count--;
if ( device_info->ref_count == 0 ) {
strlib_free(device_info->name);
strlib_free(device_info->not_prompt);
cpr_free(device_info);
}
}
}
/**
* Create a call on the device
* @param handle - device handle
* @return cc_call_handle_t - handle of the call created
*/
cc_call_handle_t CCAPI_Device_CreateCall(cc_device_handle_t handle)
{
return CC_createCall(0);
}
/**
* Enable or disable video capability of the device.
* @param handle - device handle
* @param enable - a flag to indicate that application wants to enable of
* disable video capability of the device.
* @return void
*/
void CCAPI_Device_enableVideo(cc_device_handle_t handle, cc_boolean enable)
{
CC_DeviceFeature_enableVideo(enable);
g_accessoryCfgInfo.video = ACCSRY_CFGD_APK;
}
/**
* Enable or disable camera capability of the device.
* @param handle - device handle
* @param enable - a flag to indicate that application wants to enable of
* disable camera capability of the device.
* @return void
*/
void CCAPI_Device_enableCamera(cc_device_handle_t handle, cc_boolean enable)
{
CC_DeviceFeature_enableCamera(enable);
g_accessoryCfgInfo.camera = ACCSRY_CFGD_APK;
}
/**
* CCAPI_Device_setDigestNamePasswd
*
* @param handle - device handle
* @param name - The Digest auth name
* @param passwd - The password for that name for the line
* @return void
*/
void CCAPI_Device_setDigestNamePasswd (cc_device_handle_t handle,
char *name, char *pw)
{
int line;
for(line = 0; line < MAX_CONFIG_LINES; line++) {
CC_Config_setStringValue(CFGID_LINE_AUTHNAME + line, name);
CC_Config_setStringValue(CFGID_LINE_PASSWORD + line, pw);
}
}
/**
* CCAPI_Device_IP_Update
*
* There is a change in the IP address and the values of new set
* of signaling and media IP addresses are provided.
* These value are compared with the current IP address values
* and depending on what changed, restart and/or re-invite
* action is taken.
*
* The case being addressed.
* 1) If the signaling IP change happens during a call,
* the change is deferred till phone is idle.
* 2)If media IP change happens during a call, it is applied immediately.
* 3) If both change, and call is active, that is treated same
* combination of case 1) and 2).
* 4) If no call is present, and signaling IP change,
* sipcc will re-register with new IP.
*
* @param handle - device handle
* @param signaling_ip - IP address that Must be used for signalling
* @param signaling_interface - Interface Name associaed with signaling IP
* @param signaling_int_type - Interface type associaed with signaling IP
* @param media_ip - IP address that Must be used for media
* @param media_interface - Interface nmae associaed with media IP
* @param media_interface - Interface Type associaed with media IP
* @return void
*/
void CCAPI_Device_IP_Update (cc_device_handle_t handle,
const char *signaling_ip,
const char *signaling_interface,
int signaling_int_type,
const char *media_ip,
const char *media_interface,
int media_int_type)
{
static const char fname[] = "CCAPI_Device_IP_Update";
char curr_signaling_ip[MAX_IPADDR_STR_LEN];
char curr_media_ip[MAX_IPADDR_STR_LEN];
cpr_ip_addr_t sig_ip;
signaling_interface_type = signaling_int_type;
// init the ip addr string to empty string
init_empty_str(curr_signaling_ip);
init_empty_str(curr_media_ip);
init_empty_str(g_new_signaling_ip);
config_get_value(CFGID_MY_IP_ADDR, &sig_ip, sizeof(cpr_ip_addr_t));
sig_ip.type = CPR_IP_ADDR_IPV4;
util_ntohl(&sig_ip, &sig_ip);
ipaddr2dotted(curr_signaling_ip, &sig_ip);
config_get_string(CFGID_MEDIA_IP_ADDR, curr_media_ip,
MAX_IPADDR_STR_LEN);
DEF_DEBUG(DEB_F_PREFIX"New sig_ip=%s media_ip=%s Current: sig_ip: %s,"\
"media_ip: %s \n",
DEB_F_PREFIX_ARGS(CC_API, fname),
signaling_ip,
media_ip,
curr_signaling_ip,
curr_media_ip);
/*
* If signaling and media IP are empty, stop the
* SIP service and return;
*/
if ((is_empty_str((char *)signaling_ip) ||
(strncmp(signaling_ip, "0.0.0.0", MAX_IPADDR_STR_LEN) == 0))
&& (is_empty_str((char *)media_ip) ||
(strncmp(media_ip, "0.0.0.0", MAX_IPADDR_STR_LEN) == 0))) {
CC_Config_setStringValue(CFGID_MY_IP_ADDR, "0.0.0.0");
CC_Config_setStringValue(CFGID_MEDIA_IP_ADDR, EMPTY_STR);
DEF_DEBUG(DEB_F_PREFIX"Media and Signaling IP Not provided."\
"Shutdown sip stack", DEB_F_PREFIX_ARGS(CC_API, fname));
if ((strncmp(curr_signaling_ip, signaling_ip,
MAX_IPADDR_STR_LEN) != 0)) {
registration_processEvent(EV_CC_IP_INVALID);
return;
}
}
/*
* There is a change in the signaling IP, set the
* new IP as the platform signaling IP and re-register
*/
if ((signaling_ip != NULL) &&
(strncmp(curr_signaling_ip, signaling_ip, MAX_IPADDR_STR_LEN) != 0)) {
CC_Config_setStringValue(CFGID_MY_IP_ADDR, signaling_ip);
DEF_DEBUG(DEB_F_PREFIX"Signaling IP changed. Re-register, if needed.",
DEB_F_PREFIX_ARGS(CC_API, fname));
registration_processEvent(EV_CC_IP_VALID);
}
/*
* There is a change in the media IP, set the
* new IP as the platform media IP and post the call to GSM
* to initiate re-inivite for all relevane calls
*/
if ((media_ip != NULL) &&
(strncmp(curr_media_ip, media_ip, MAX_IPADDR_STR_LEN) != 0)) {
CC_Config_setStringValue(CFGID_MEDIA_IP_ADDR, media_ip);
if (g_dock_undock_event != MEDIA_INTERFACE_UPDATE_IN_PROCESS) {
g_dock_undock_event = MEDIA_INTERFACE_UPDATE_STARTED;
DEF_DEBUG(DEB_F_PREFIX" MEDIA_INTERFACE_UPDATE received. escalateDeescalate.",
DEB_F_PREFIX_ARGS(CC_API, fname));
escalateDeescalate();
}else {
DEF_DEBUG(DEB_F_PREFIX"MEDIA_INTERFACE_UPDATE received but escalateDeescalate already in progress:%d",
DEB_F_PREFIX_ARGS(CC_API, fname), g_dock_undock_event);
}
}
}
/**
* CCAPI_Device_setVideoAutoTxPreference
*
* @param handle - device handle
* @param txPref - TRUE=> auto Tx Video prefered
* @return void
*/
void CCAPI_Device_setVideoAutoTxPreference (cc_device_handle_t handle, cc_boolean txPref)
{
CCAPP_DEBUG("CCAPI_Device_setVideoAutoTxPreference: updated to %d\n", txPref);
cc_media_setVideoAutoTxPref(txPref);
}

View File

@ -1,475 +0,0 @@
/* 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 "string_lib.h"
#include "cc_constants.h"
#include "ccapi_snapshot.h"
#include "ccapi_device_info.h"
#include "sessionHash.h"
#include "CCProvider.h"
#include "phone_debug.h"
#include "ccapi_snapshot.h"
#include "ccapi_device_info.h"
#include "util_string.h"
/**
* gets the device name
* @returns - a pointer to the device name
*/
cc_deviceinfo_ref_t CCAPI_DeviceInfo_getDeviceHandle ()
{
static const char *fname="CCAPI_DeviceInfo_getDeviceHandle";
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
CCAPP_DEBUG(DEB_F_PREFIX"returned 0 (default)\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
return 0;
}
/**
* gets the device name
* @returns - a pointer to the device name
*/
cc_string_t CCAPI_DeviceInfo_getDeviceName (cc_deviceinfo_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_getDeviceName";
cc_device_info_t *device = handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( device != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device->name);
return device->name;
}
return strlib_empty();
}
/**
* gets the device idle status
* @param [in] handle - reference to device info
* @returns boolean - idle status
*/
cc_boolean CCAPI_DeviceInfo_isPhoneIdle(cc_deviceinfo_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_isPhoneIdle";
boolean ret = TRUE;
hashItr_t itr;
session_data_t * session_data;
cc_call_state_t call_state;
hashItrInit(&itr);
while ((session_data = hashItrNext(&itr)) != NULL) {
call_state = session_data->state;
if (call_state != ONHOOK &&
call_state != REMINUSE) {
ret = FALSE;
break;
}
}
CCAPP_DEBUG(DEB_F_PREFIX"idle state=%d session_id=0x%x call-state=%d handle=%x\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), ret,
(session_data != NULL)? session_data->sess_id: 0,
(session_data != NULL)? session_data->state: 0,
(handle)? handle:0);
return ret;
}
/**
* gets the service state
* @param [in] handle - reference to device info
* @returns cc_service_state_t - INS/OOS
*/
cc_service_state_t CCAPI_DeviceInfo_getServiceState (cc_deviceinfo_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_getServiceState";
cc_device_info_t *device = handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( device != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device->ins_state);
return device->ins_state;
}
return CC_STATE_IDLE;
}
/**
* gets the service cause
* @param [in] handle - reference to device info
* @returns cc_service_cause_t - reason for service state
*/
cc_service_cause_t CCAPI_DeviceInfo_getServiceCause (cc_deviceinfo_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_getServiceCause";
cc_device_info_t *device = handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( device != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device->ins_cause);
return device->ins_cause;
}
return CC_CAUSE_NONE;
}
/**
* gets the cucm mode
* @returns cc_cucm_mode_t - CUCM mode
*/
cc_cucm_mode_t CCAPI_DeviceInfo_getCUCMMode (cc_deviceinfo_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_getCUCMMode";
cc_device_info_t *device = handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( device != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device->cucm_mode);
return device->cucm_mode;
}
return CC_MODE_INVALID;
}
/**
* gets list of handles to calls on the device
* @param handle - device handle
* @param handles - array of call handle to be returned
* @param count[in/out] number allocated in array/elements returned
* @returns
*/
void CCAPI_DeviceInfo_getCalls (cc_deviceinfo_ref_t handle, cc_call_handle_t handles[], cc_uint16_t *count)
{
static const char *fname="CCAPI_DeviceInfo_getCalls";
hashItr_t itr;
session_data_t *data;
int i=0;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
hashItrInit(&itr);
while ( (data = (session_data_t*)hashItrNext(&itr)) != NULL &&
i<*count ) {
handles[i++] = CREATE_CALL_HANDLE_FROM_SESSION_ID(data->sess_id);
}
*count=i;
CCAPP_DEBUG(DEB_F_PREFIX"Finished (no return) \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
}
/**
* gets list of handles to calls on the device by State
* @param handle - device handle
* @param state - state for whcih calls are requested
* @param handles - array of call handle to be returned
* @param count[in/out] number allocated in array/elements returned
* @returns
*/
void CCAPI_DeviceInfo_getCallsByState (cc_deviceinfo_ref_t handle, cc_call_state_t state,
cc_call_handle_t handles[], cc_uint16_t *count)
{
static const char *fname="CCAPI_DeviceInfo_getCallsByState";
hashItr_t itr;
session_data_t *data;
int i=0;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
hashItrInit(&itr);
while ( (data = (session_data_t*)hashItrNext(&itr)) != NULL &&
i<*count ) {
if ( data->state == state ) {
handles[i++] = CREATE_CALL_HANDLE_FROM_SESSION_ID(data->sess_id);
}
}
*count=i;
CCAPP_DEBUG(DEB_F_PREFIX"Finished (no return) \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
}
/**
* gets list of handles to lines on the device
* @param handles[in,out] - array of line handle to be returned
* @param count[in/out] number allocated in array/elements returned
* @returns
*/
void CCAPI_DeviceInfo_getLines (cc_deviceinfo_ref_t handle, cc_lineid_t handles[], cc_uint16_t *count)
{
static const char *fname="CCAPI_DeviceInfo_getLines";
cc_line_info_t *line;
int i=1, j=0;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
CCAPP_DEBUG(" LINES Start ");
while ( (line = ccsnap_getLineInfo(i++)) != NULL &&
j<*count ) {
CCAPP_DEBUG(" LINE handle[%d]=%d", j, line->button );
/* We will use button as line handles */
handles[j++] = line->button;
}
*count=j;
CCAPP_DEBUG(DEB_F_PREFIX"Finished (no return) \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
}
/**
* gets list of handles to features on the device
* @param handles[in,out] - array of feature handle to be returned
* @param count[in/out] number allocated in array/elements returned
* @returns
*/
void CCAPI_DeviceInfo_getFeatures (cc_deviceinfo_ref_t handle, cc_featureinfo_ref_t handles[], cc_uint16_t *count)
{
static const char *fname="CCAPI_DeviceInfo_getFeatures";
cc_featureinfo_ref_t feature;
int i=0, j=0;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
for (i=1;i<=MAX_CONFIG_LINES && j<*count;i++) {
feature = (cc_featureinfo_ref_t) ccsnap_getFeatureInfo(i);
if(feature != NULL){
handles[j++] = feature;
}
}
*count=j;
CCAPP_DEBUG(DEB_F_PREFIX"Finished (no return) \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
}
/**
* gets handles of call agent servers
* @param handles - array of handles to call agent servers
* @param count[in/out] number allocated in array/elements returned
* @returns
*/
void CCAPI_DeviceInfo_getCallServers (cc_deviceinfo_ref_t handle, cc_callserver_ref_t handles[], cc_uint16_t *count)
{
static const char *fname="CCAPI_DeviceInfo_getCallServers";
int i, j=0;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
for (i=0;i<CCAPI_MAX_SERVERS && i< *count; i++) {
if (g_deviceInfo.ucm[i].name != 0 && strlen(g_deviceInfo.ucm[i].name)) {
handles[j++] = &g_deviceInfo.ucm[i];
}
}
*count = j;
CCAPP_DEBUG(DEB_F_PREFIX"Finished (no return) \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
}
/**
* gets call server name
* @param handle - handle of call server
* @returns name of the call server
* NOTE: The memory for the string will be freed once the device info reference is freed. No need to free this memory explicitly.
*/
cc_string_t CCAPI_DeviceInfo_getCallServerName (cc_callserver_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_getCallServerName";
cc_call_server_t *ref = (cc_call_server_t *) handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if (ref != NULL && ref->name != 0) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), ref->name);
return ref->name;
}
return strlib_empty();
}
/**
* gets call server mode
* @param handle - handle of call server
* @returns - mode of the call server
*/
cc_cucm_mode_t CCAPI_DeviceInfo_getCallServerMode (cc_callserver_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_getCallServerMode";
cc_call_server_t *ref = (cc_call_server_t *) handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if (ref != NULL) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), ref->type);
return ref->type;
}
return CC_MODE_INVALID;
}
/**
* gets calls erver name
* @param handle - handle of call server
* @returns status of the call server
*/
cc_ccm_status_t CCAPI_DeviceInfo_getCallServerStatus (cc_callserver_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_getCallServerStatus";
cc_call_server_t *ref = (cc_call_server_t *) handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if (ref != NULL) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), (ref->status));
return ref->status;
}
return CC_CCM_STATUS_NONE;
}
/**
* get the NOTIFICATION PROMPT
* @param [in] handle - reference to device info
* @returns
*/
cc_string_t CCAPI_DeviceInfo_getNotifyPrompt (cc_deviceinfo_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_getNotifyPrompt";
cc_device_info_t *ref = (cc_device_info_t *) handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if (ref != NULL) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), (ref->not_prompt));
return ref->not_prompt;
}
return strlib_empty();
}
/**
* get the NOTIFICATION PROMPT PRIORITY
* @param [in] handle - reference to device info
* @returns
*/
cc_uint32_t CCAPI_DeviceInfo_getNotifyPromptPriority (cc_deviceinfo_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_getNotifyPromptPriority";
cc_device_info_t *ref = (cc_device_info_t *) handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if (ref != NULL) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), (ref->not_prompt_prio));
return ref->not_prompt_prio;
}
return 0;
}
/**
* get the NOTIFICATION PROMPT PROGRESS
* @param [in] handle - reference to device info
* @returns
*/
cc_uint32_t CCAPI_DeviceInfo_getNotifyPromptProgress (cc_deviceinfo_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_getNotifyPromptProgress";
cc_device_info_t *ref = (cc_device_info_t *) handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if (ref != NULL) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %02X\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), (ref->not_prompt_prog));
return ref->not_prompt_prog;
}
return 0;
}
/**
* gets provisioing for missed call logging
* @param [in] handle - reference to device info
* @returns boolean - false => disabled true => enabled
*/
cc_boolean CCAPI_DeviceInfo_isMissedCallLoggingEnabled (cc_deviceinfo_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_isMissedCallLoggingEnabled";
CCAPP_DEBUG(DEB_F_PREFIX" return val %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), ccsnap_isMissedCallLoggingEnabled());
return ccsnap_isMissedCallLoggingEnabled();
}
/**
* gets provisioing for placed call logging
* @param [in] handle - reference to device info
* @returns boolean - false => disabled true => enabled
*/
cc_boolean CCAPI_DeviceInfo_isPlacedCallLoggingEnabled (cc_deviceinfo_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_isPlacedCallLoggingEnabled";
CCAPP_DEBUG(DEB_F_PREFIX" return val %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), ccsnap_isPlacedCallLoggingEnabled());
return ccsnap_isPlacedCallLoggingEnabled();
}
/**
* gets provisioing for received call logging
* @param [in] handle - reference to device info
* @returns boolean - false => disabled true => enabled
*/
cc_boolean CCAPI_DeviceInfo_isReceivedCallLoggingEnabled (cc_deviceinfo_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_isReceivedCallLoggingEnabled";
CCAPP_DEBUG(DEB_F_PREFIX" return val %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), ccsnap_isReceivedCallLoggingEnabled());
return ccsnap_isReceivedCallLoggingEnabled();
}
/**
* gets time registration completed successfully
* @param [in] handle - reference to device info
* @returns long - the time registration completed successfully
*/
long long CCAPI_DeviceInfo_getRegTime (cc_deviceinfo_ref_t handle)
{
return (g_deviceInfo.reg_time);
}
/**
* Returns dot notation IP address phone used for registration purpose. If phone is not
* registered, then "0.0.0.0" is returned.
* @return char IP address used to register phone.
*/
cc_string_t CCAPI_DeviceInfo_getSignalingIPAddress(cc_deviceinfo_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_getSignalingIPAddress";
cpr_ip_addr_t ip_addr = {0,{0}};
sip_config_get_net_device_ipaddr(&ip_addr);
ipaddr2dotted(g_deviceInfo.registration_ip_addr, &ip_addr);
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), g_deviceInfo.registration_ip_addr);
return g_deviceInfo.registration_ip_addr;
}
/**
* Returns camera admin enable/disable status
* @param [in] handle - reference to device info
* @return cc_boolean - TRUE => enabled
*/
cc_boolean CCAPI_DeviceInfo_isCameraEnabled(cc_deviceinfo_ref_t handle) {
// returns the current status not the snapshot status
return cc_media_isTxCapEnabled();
}
/**
* Returns Video Capability admin enable/disable status
* @param [in] handle - reference to device info
* @return cc_boolean - TRUE => enabled
*/
cc_boolean CCAPI_DeviceInfo_isVideoCapEnabled(cc_deviceinfo_ref_t handle) {
// returns the current status not the snapshot status
return cc_media_isVideoCapEnabled();
}
/**
* gets the device mwi_lamp state
* @param [in] handle - reference to device info
* @returns boolean - mwi_lamp state
*/
cc_boolean CCAPI_DeviceInfo_getMWILampState(cc_deviceinfo_ref_t handle)
{
static const char *fname="CCAPI_DeviceInfo_getMWILampState";
cc_device_info_t *device = handle;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( device != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device->mwi_lamp);
return device->mwi_lamp;
}
return FALSE;
}

View File

@ -1,154 +0,0 @@
/* 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 "ccapi_snapshot.h"
#include "sessionHash.h"
#include "CCProvider.h"
#include "phone_debug.h"
/**
* Get the physical button number on which this feature is configured
* @param feature - feature reference handle
* @return cc_int32_t - button assigned to the feature
*/
cc_int32_t CCAPI_featureInfo_getButton(cc_featureinfo_ref_t feature)
{
static const char *fname="CCAPI_featureInfo_getButton";
cc_feature_info_t *info;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
info = (cc_feature_info_t *) feature;
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->button);
return info->button;
}
return -1;
}
/**
* Get the featureID
* @param feature - feature reference handle
* @return cc_int32_t - type of to the feature
*/
cc_int32_t CCAPI_featureInfo_getFeatureID(cc_featureinfo_ref_t feature)
{
static const char *fname="CCAPI_featureInfo_getFeatureID";
cc_feature_info_t *info;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
info = (cc_feature_info_t *) feature;
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->feature_id);
return info->feature_id;
}
return -1;
}
/**
* Get the feature Label Name
* @param feature - feature reference handle
* @return cc_string_t - name of the feature created
*/
cc_string_t CCAPI_featureInfo_getDisplayName(cc_featureinfo_ref_t feature) {
static const char *fname="CCAPI_featureInfo_getDisplayName";
cc_feature_info_t *info;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
info = (cc_feature_info_t *) feature;
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->name);
return ccsnap_get_line_label(info->button);
}
return NULL;
}
/**
* Get the speeddial Number
* @param feature - feature reference handle
* @return cc_string_t - speeddial number of the feature created
*/
cc_string_t CCAPI_featureInfo_getSpeedDialNumber(cc_featureinfo_ref_t feature) {
static const char *fname="CCAPI_featureInfo_getSpeedDialNumber";
cc_feature_info_t *info;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
info = (cc_feature_info_t *) feature;
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->speedDialNumber);
return info->speedDialNumber;
}
return NULL;
}
/**
* Get the contact
* @param feature - feature reference handle
* @return cc_string_t - contact of the feature created
*/
cc_string_t CCAPI_featureInfo_getContact(cc_featureinfo_ref_t feature) {
static const char *fname="CCAPI_featureInfo_getContact";
cc_feature_info_t *info;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
info = (cc_feature_info_t *) feature;
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->contact);
return info->contact;
}
return NULL;
}
/**
* Get the retrieval prefix
* @param feature - feature reference handle
* @return cc_string_t - retrieval prefix of the feature created
*/
cc_string_t CCAPI_featureInfo_getRetrievalPrefix(cc_featureinfo_ref_t feature) {
static const char *fname="CCAPI_featureInfo_getRetrievalPrefix";
cc_feature_info_t *info;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
info = (cc_feature_info_t *) feature;
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->retrievalPrefix);
return info->retrievalPrefix;
}
return NULL;
}
/**
* Get BLF state
* @param feature - feature reference handle
* @return cc_string_t - handle of the feature created
*/
cc_blf_state_t CCAPI_featureInfo_getBLFState(cc_featureinfo_ref_t feature) {
static const char *fname="CCAPI_featureInfo_getBLFState";
cc_feature_info_t *info = (cc_feature_info_t *)feature;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->blf_state);
return info->blf_state;
}
return CC_SIP_BLF_UNKNOWN;
}
/**
* Get the feature option mask
* @param feature - feature reference handle
* @return cc_int32_t - feature option mask for the feature
*/
cc_int32_t CCAPI_featureInfo_getFeatureOptionMask(cc_featureinfo_ref_t feature)
{
static const char *fname="CCAPI_featureInfo_getFeatureOptionMask";
cc_feature_info_t *info;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
info = (cc_feature_info_t *) feature;
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->featureOptionMask);
return info->featureOptionMask;
}
return -1;
}

View File

@ -1,81 +0,0 @@
/* 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 "cpr_stdlib.h"
#include "string_lib.h"
#include "cc_call_feature.h"
#include "ccapi_snapshot.h"
#include "ccapi_line.h"
extern cc_line_info_t lineInfo[MAX_CONFIG_LINES+1];
/**
* Get reference handle for the line
* @return cc_call_handle_t - handle of the call created
*/
cc_lineinfo_ref_t CCAPI_Line_getLineInfo(cc_uint32_t lineID)
{
cc_line_info_t *line_info = NULL;
int i;
for (i=1;i<=MAX_CONFIG_LINES;i++) {
if ( (cc_uint32_t)lineInfo[i].button == lineID ) {
line_info = (cc_line_info_t*)cpr_malloc(sizeof(cc_line_info_t));
if (line_info) {
*line_info = lineInfo[i];
line_info->ref_count = 1;
line_info->name = strlib_copy(lineInfo[i].name);
line_info->dn = strlib_copy(lineInfo[i].dn);
line_info->cfwd_dest = strlib_copy(lineInfo[i].cfwd_dest);
line_info->externalNumber =
strlib_copy(lineInfo[i].externalNumber);
}
}
}
return line_info;
}
/**
* Create a call on the line
* @param [in] line - lineID
* @return cc_call_handle_t - handle of the call created
*/
cc_call_handle_t CCAPI_Line_CreateCall(cc_lineid_t line)
{
// do we need to check the line on which this gets created?
return CC_createCall(line);
}
/**
* Reatin the lineInfo snapshot
* @param cc_callinfo_ref_t - refrence to the block to be retained
* @return void
*/
void CCAPI_Line_retainLineInfo(cc_lineinfo_ref_t ref){
cc_line_info_t *line_info = ref;
line_info->ref_count++;
}
/**
* Free the lineInfo snapshot
* @param cc_callinfo_ref_t - refrence to the block to be freed
* @return void
*/
void CCAPI_Line_releaseLineInfo(cc_lineinfo_ref_t ref){
cc_line_info_t *line_info = ref;
if (line_info) {
line_info->ref_count--;
if ( line_info->ref_count == 0) {
strlib_free(line_info->name);
strlib_free(line_info->dn);
strlib_free(line_info->cfwd_dest);
strlib_free(line_info->externalNumber);
cpr_free(line_info);
}
}
}

View File

@ -1,425 +0,0 @@
/* 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 "ccapi_snapshot.h"
#include "ccapi_line.h"
#include "sessionHash.h"
#include "CCProvider.h"
#include "phone_debug.h"
/**
* Get the line ID
* @param line - line reference handle
* @return line ID
*/
cc_int32_t CCAPI_lineInfo_getID(cc_lineinfo_ref_t line)
{
static const char *fname="CCAPI_lineInfo_getID";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
/* We will use button as line ID */
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->button);
return info->button;
}
return -1;
}
/**
* Get the line Name
* @param line - line reference handle
* @return cc_string_t - handle of the call created
*/
cc_string_t CCAPI_lineInfo_getName(cc_lineinfo_ref_t line) {
static const char *fname="CCAPI_lineInfo_getName";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->dn);
return info->dn;
}
return NULL;
}
/**
* Get the line Label
* @param [in] line - line reference handle
* @return cc_string_t - line Label
* NOTE: The memory for return string doesn't need to be freed it will be freed when the info reference is freed
*/
cc_string_t CCAPI_lineInfo_getLabel(cc_lineinfo_ref_t line) {
static const char *fname="CCAPI_lineInfo_getLabel";
cc_line_info_t *info = (cc_line_info_t *) line;
cc_string_t label = strlib_empty();
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
label = ccsnap_get_line_label(info->button);
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), label);
}
return label;
}
/**
* Get the line DN Number
* @param line - line reference handle
* @return cc_string_t - handle of the call created
*/
cc_string_t CCAPI_lineInfo_getNumber(cc_lineinfo_ref_t line) {
static const char *fname="CCAPI_lineInfo_getNumber";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->name);
return info->name;
}
return NULL;
}
/**
* Get the line External Number
* @param line - line reference handle
* @return cc_string_t - handle of the call created
*/
cc_string_t CCAPI_lineInfo_getExternalNumber(cc_lineinfo_ref_t line) {
static const char *fname="CCAPI_lineInfo_getExternalNumber";
cc_line_info_t *info = (cc_line_info_t *) line;
char externalNumberMask[MAX_EXTERNAL_NUMBER_MASK_SIZE];
memset(externalNumberMask, 0, sizeof(externalNumberMask));
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
config_get_string(CFGID_CCM_EXTERNAL_NUMBER_MASK, externalNumberMask, MAX_EXTERNAL_NUMBER_MASK_SIZE);
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->name);
if (strlen(externalNumberMask) > 0) {
CCAPP_DEBUG(DEB_F_PREFIX"number with mask applied == %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->externalNumber);
return info->externalNumber;
} else {
CCAPP_DEBUG(DEB_F_PREFIX"number without mask == %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->name);
return info->name;
}
}
return NULL;
}
/**
* Get the physical button number on which this line is configured
* @param line - line reference handle
* @return cc_uint32_t - button number
*/
cc_uint32_t CCAPI_lineInfo_getButton(cc_lineinfo_ref_t line){
static const char *fname="CCAPI_lineInfo_getButton";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->button);
return info->button;
}
return 0;
}
/**
* Get the Line Type
* @param [in] line - line reference handle
* @return cc_uint32_t - line featureID ( Line )
*/
cc_line_feature_t CCAPI_lineInfo_getLineType(cc_lineinfo_ref_t line){
static const char *fname="CCAPI_lineInfo_getLineType";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->line_type);
return info->line_type;
}
return 0;
}
/**
* Get the CFWDAll status for the line
* @param line - line reference handle
* @return cc_boolean - isForwarded
*/
cc_boolean CCAPI_lineInfo_isCFWDActive(cc_lineinfo_ref_t line)
{
static const char *fname="CCAPI_lineInfo_isCFWDActive";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->isCFWD);
return info->isCFWD;
}
return FALSE;
}
/**
* Get the CFWDAll destination
* @param line - line reference handle
* @return cc_string_t - cfwd target
*/
cc_string_t CCAPI_lineInfo_getCFWDName(cc_lineinfo_ref_t line)
{
static const char *fname="CCAPI_lineInfo_getCFWDName";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->cfwd_dest);
return info->cfwd_dest;
}
return NULL;
}
/**
* Get the MWI Status
* @param line - line reference handle
* @return cc_uint32_t - MWI status (boolean 0 => no MWI)
*/
cc_uint32_t CCAPI_lineInfo_getMWIStatus(cc_lineinfo_ref_t line)
{
static const char *fname="CCAPI_lineInfo_getMWIStatus";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d, status %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->mwi, info->mwi.status);
return info->mwi.status;
}
return 0;
}
/**
* Get the MWI Type
* @param line - line reference handle
* @return cc_uint32_t - MWI Type
*/
cc_uint32_t CCAPI_lineInfo_getMWIType(cc_lineinfo_ref_t line)
{
static const char *fname="CCAPI_lineInfo_getMWIType";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d, type %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->mwi, info->mwi.type);
return info->mwi.type;
}
return 0;
}
/**
* Get the MWI new msg count
* @param line - line reference handle
* @return cc_uint32_t - MWI new msg count
*/
cc_uint32_t CCAPI_lineInfo_getMWINewMsgCount(cc_lineinfo_ref_t line)
{
static const char *fname="CCAPI_lineInfo_getMWINewMsgCount";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d, new count %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->mwi, info->mwi.new_count);
return info->mwi.new_count;
}
return 0;
}
/**
* Get the MWI old msg count
* @param line - line reference handle
* @return cc_uint32_t - MWI old msg count
*/
cc_uint32_t CCAPI_lineInfo_getMWIOldMsgCount(cc_lineinfo_ref_t line)
{
static const char *fname="CCAPI_lineInfo_getMWIOldMsgCount";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d, old_count %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->mwi, info->mwi.old_count);
return info->mwi.old_count;
}
return 0;
}
/**
* Get the MWI high priority new msg count
* @param line - line reference handle
* @return cc_uint32_t - MWI new msg count
*/
cc_uint32_t CCAPI_lineInfo_getMWIPrioNewMsgCount(cc_lineinfo_ref_t line)
{
static const char *fname="CCAPI_lineInfo_getMWIPrioNewMsgCount";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d , pri_new count %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->mwi, info->mwi.pri_new_count);
return info->mwi.pri_new_count;
}
return 0;
}
/**
* Get the MWI high priority old msg count
* @param line - line reference handle
* @return cc_uint32_t - MWI old msg count
*/
cc_uint32_t CCAPI_lineInfo_getMWIPrioOldMsgCount(cc_lineinfo_ref_t line)
{
static const char *fname="CCAPI_lineInfo_getMWIPrioOldMsgCount";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d, pri old_count %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->mwi, info->mwi.pri_old_count);
return info->mwi.pri_old_count;
}
return 0;
}
/**
* Get calls on line
* @param [in] line - lineID
* @param [out] callref[] - Array of callinfo references
* @param [in/out] count - count of call references populated
* @return void
*/
void CCAPI_LineInfo_getCalls(cc_lineid_t line, cc_call_handle_t handles[], int *count)
{
static const char *fname="CCAPI_Line_getCalls";
hashItr_t itr;
session_data_t *data;
int i=0;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
hashItrInit(&itr);
while ( (data = (session_data_t*)hashItrNext(&itr)) != NULL &&
i<*count ) {
if ( GET_LINE_ID(data->sess_id) == line ){
handles[i++] = CREATE_CALL_HANDLE_FROM_SESSION_ID(data->sess_id);
}
}
*count=i;
CCAPP_DEBUG(DEB_F_PREFIX"Finished (no return) \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
}
/**
* Get calls on line
* @param [in] line - lineID
* @param [out] callref[] - Array of callinfo references
* @param [in/out] count - count of call references populated
* @return void
*/
void CCAPI_LineInfo_getCallsByState(cc_lineid_t line, cc_call_state_t state,
cc_call_handle_t handles[], int *count)
{
static const char *fname="CCAPI_Line_getCallsByState";
hashItr_t itr;
session_data_t *data;
int i=0;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
hashItrInit(&itr);
while ( (data = (session_data_t*)hashItrNext(&itr)) != NULL &&
i<*count ) {
if ( GET_LINE_ID(data->sess_id) == line && data->state ==state ){
handles[i++] = CREATE_CALL_HANDLE_FROM_SESSION_ID(data->sess_id);
}
}
*count=i;
CCAPP_DEBUG(DEB_F_PREFIX"Finished (no return) \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
}
/**
* Get the physical button number on which this line is configured
* @param [in] line - line reference handle
* @return cc_uint32_t - button number
*/
cc_boolean CCAPI_lineInfo_getRegState(cc_lineinfo_ref_t line)
{
static const char *fname="CCAPI_lineInfo_getRegState";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->reg_state);
return info->reg_state;
}
return 0;
}
/**
* has capability - is the feature allowed
* @param [in] line - line reference handle
* @param [in] feat_id - feature id
* @return boolean - is Allowed
*/
cc_boolean CCAPI_LineInfo_hasCapability (cc_lineinfo_ref_t line, cc_int32_t feat_id){
static const char *fname="CCAPI_LineInfo_hasCapability";
cc_line_info_t *info = (cc_line_info_t *) line;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL){
CCAPP_DEBUG(DEB_F_PREFIX"feature id: %d , value returned %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),feat_id, info->allowed_features[feat_id]);
return info->allowed_features[feat_id];
}
return FALSE;
}
/**
* get Allowed Feature set
* @param [in] line - line reference handle
* @param [in,out] feat_set - array of len CC_CALL_CAP_MAX
* @return cc_return_t - CC_SUCCESS or CC_FAILURE
*/
cc_return_t CCAPI_LineInfo_getCapabilitySet (cc_lineinfo_ref_t line, cc_int32_t feat_set[]){
static const char *fname="CCAPI_LineInfo_getCapabilitySet";
cc_line_info_t *info = (cc_line_info_t *) line;
int feat_id;
CCAPP_DEBUG(DEB_F_PREFIX"Entering\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
if ( info != NULL){
for (feat_id = 0; feat_id < CCAPI_CALL_CAP_MAX; feat_id++) {
feat_set[feat_id] = info->allowed_features[feat_id];
CCAPP_DEBUG(DEB_F_PREFIX"feature id: %d , value %d\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),feat_id, feat_set[feat_id]);
}
CCAPP_DEBUG(DEB_F_PREFIX"returned CC_SUCCESS\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
return CC_SUCCESS;
}
return CC_FAILURE;
}

View File

@ -1,166 +0,0 @@
/* 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 "ccapi_service.h"
#include "cc_device_manager.h"
#include "cc_service.h"
#include "phone_debug.h"
#include "CCProvider.h"
#include "sessionConstants.h"
#include "ccsip_messaging.h"
#include "ccapp_task.h"
#include "config_api.h"
#include "ccapi_device.h"
#include "ccapi_device_info.h"
#include "cc_device_listener.h"
#include "cc_service_listener.h"
#include "plat_api.h"
#include "util_string.h"
int sendResetUpdates = 0; // default is not to send updates
// Global Variables
int g_dev_hdl;
char g_dev_name[G_DEV_NAME_SIZE];
char g_cfg_p[G_CFG_P_SIZE];
int g_compl_cfg;
// Externs
extern void setState();
extern void resetReady();
extern void resetNotReady();
extern void ccpro_handleserviceControlNotify();
extern cc_srv_ctrl_cmd_t reset_type;
boolean isServiceStartRequestPending = FALSE;
cc_boolean is_action_to_be_deferred(cc_action_t action);
extern cc_action_t pending_action_type;
//cc_boolean parse_config_properties (int device_handle, const char *device_name, const char *cfg, int from_memory);
/**
* Defines the management methods.
*/
/**
* Pre-initialize the Sipcc stack.
* @return
*/
cc_return_t CCAPI_Service_create() {
CCAPP_ERROR("CCAPI_Service_create - calling CC_Service_create \n");
registration_processEvent(EV_CC_CREATE);
return (CC_SUCCESS);
//return (service_processEvent(EV_SRVC_CREATE));
}
/**
* Gracefully unload the Sipcc stack
* @return
*/
cc_return_t CCAPI_Service_destroy() {
CCAPP_ERROR("CCAPI_Service_destroy - calling CC_Service_destroy \n");
// if (is_action_to_be_deferred(STOP_ACTION) == TRUE) {
// return CC_SUCCESS;
// }
// initialize the config to empty
init_empty_str(g_cfg_p);
isServiceStartRequestPending = FALSE;
registration_processEvent(EV_CC_DESTROY);
return (CC_SUCCESS);
}
/**
* Bring up the Sipcc stack in service
* @return
*/
cc_return_t CCAPI_Service_start() {
if (isServiceStartRequestPending == TRUE) {
DEF_DEBUG("CCAPI_Service_start request is already pending. Ignoring this.\n");
return CC_SUCCESS;
}
DEF_DEBUG("CCAPI_Service_start - \n");
isServiceStartRequestPending = TRUE;
registration_processEvent(EV_CC_START);
return (CC_SUCCESS);
}
/**
* Stop Sipcc stack service
* @return
*/
cc_return_t CCAPI_Service_stop() {
int sdpmode = 0;
CCAPP_ERROR("CCAPI_Service_stop - calling registration stop \n");
config_get_value(CFGID_SDPMODE, &sdpmode, sizeof(sdpmode));
if (!sdpmode) {
if (is_action_to_be_deferred(STOP_ACTION) == TRUE) {
return CC_SUCCESS;
}
}
sendResetUpdates = 0; // reset to default is not to send updates
isServiceStartRequestPending = FALSE;
registration_processEvent(EV_CC_STOP);
return CC_SUCCESS;
}
/**
* reregister the Sipcc stack service, without downloading the config file
*
*/
cc_return_t CCAPI_Service_reregister(int device_handle, const char *device_name,
const char *cfg,
int complete_config)
{
CCAPP_ERROR("CCAPI_Service_reregister - initiate reregister \n");
if (is_action_to_be_deferred(RE_REGISTER_ACTION) == TRUE) {
return CC_SUCCESS;
}
if (pending_action_type != NO_ACTION) {
CCAPP_ERROR("Reset/Restart is pending, reregister Ignored! \n");
return CC_FAILURE;
}
if (is_empty_str((char*)cfg)) {
CCAPP_ERROR("Reregister request with empty config. Exiting.\n");
return CC_FAILURE;
}
g_dev_hdl = device_handle;
sstrncpy(g_dev_name, device_name, sizeof(g_dev_name));
sstrncpy(g_cfg_p, cfg, sizeof(g_cfg_p));
CCAPP_DEBUG("CCAPI_Service_reregister - devce name [%s], cfg [%s] \n", g_dev_name, g_cfg_p);
g_compl_cfg = complete_config;
registration_processEvent(EV_CC_RE_REGISTER);
return (CC_SUCCESS);
}
/**
* Reset Manager has request a reset, send the current state and
* start sending updates.
*/
void CCAPI_Service_reset_request() {
cc_deviceinfo_ref_t handle = 0;
sendResetUpdates = 1;
if (CCAPI_DeviceInfo_isPhoneIdle(handle) == TRUE) {
resetReady();
} else {
resetNotReady();
}
}

View File

@ -1,715 +0,0 @@
/* 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 "string.h"
#include "string_lib.h"
#include "text_strings.h"
#include "ccapi_snapshot.h"
#include "ccapi_device.h"
#include "ccapi_device_listener.h"
#include "ccapi_line.h"
#include "ccapi_line_listener.h"
#include "ccapi_line_info.h"
#include "ccapi_call.h"
#include "ccapi_call_listener.h"
#include "CCProvider.h"
#include "capability_set.h"
#include "phone_debug.h"
cc_device_info_t g_deviceInfo;
accessory_cfg_info_t g_accessoryCfgInfo;
cc_line_info_t lineInfo[MAX_CONFIG_LINES+1];
cc_feature_info_t featureInfo[MAX_CONFIG_LINES+1];
static void printCallInfo(cc_callinfo_ref_t info, const char* fname);
static void printFeatureInfo (ccapi_device_event_e type, cc_featureinfo_ref_t feature_info, const char* fname);
cc_string_t lineLabels[MAX_CONFIG_LINES+1] = {0};
void ccsnap_set_line_label(int btn, cc_string_t label) {
CCAPP_ERROR(DEB_F_PREFIX"btn=%d label=%s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "ccsnap_set_line_label"), btn, label);
if ( btn > 0 && btn <= MAX_CONFIG_LINES+1 ) {
if ( label == NULL ) {
label = strlib_empty();
}
if ( lineLabels[btn] == NULL ) {
lineLabels[btn] = strlib_empty();
}
lineLabels[btn] = strlib_update(lineLabels[btn], label);
}
}
cc_string_t ccsnap_get_line_label(int btn) {
if ( btn > 0 && btn <= MAX_CONFIG_LINES+1 ) {
return lineLabels[btn];
}
return strlib_empty();
}
/*
* The below two functions are borrowed from CUCM/CUP as they both perform
* identical functions. That is, taking a DN 1555 and
* a mask 919476XXXX to build a true external number 9194761555.
*/
static void stringInsert(char *string, int num, char ch)
{
int len = strlen(string);
int k, j;
char tempString[100];
sstrncpy(tempString, string, 100);
for (k = 0; k < num; k++)
string[k] = ch;
for (j = 0; j < len; j++)
string[k++] = tempString[j];
string[k] = 0;
}
/*
* Taken from CUCM/CUP code as they have done this already.
*/
cc_string_t CCAPI_ApplyTranslationMask (const char *ext, const char *mask)
{
char translationMask[100] = {'\0'};
char dn[100] = {'\0'};
char translatedString[100] = {'\0'};
cc_string_t result;
unsigned int maskLen,
dnLen,
i, j = 0;
if ((ext == NULL) || (mask == NULL)) {
return NULL;
}
maskLen = strlen(mask);
dnLen = strlen(ext);
if ((dnLen == 0) || (maskLen == 0)) {
CCAPP_DEBUG(DEB_F_PREFIX"CCAPI_ApplyTranslationMask DN or mask has len=0\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI_ApplyTranslationMask"));
return NULL;
}
/* make sure there's enough space in the buffer to
* hold the translated string.
*/
if (dnLen + maskLen > 99) {
CCAPP_DEBUG(DEB_F_PREFIX"CCAPI_ApplyTranslationMask length overflow\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI_ApplyTranslationMask"));
return NULL;
}
sstrncpy(translationMask, mask, 100);
sstrncpy(dn, ext, 100);
/* make sure DN is numeric only */
for (i=0; i< dnLen; i++) {
if (isalpha(dn[i])) {
return 0;
}
}
if (maskLen > dnLen) {
stringInsert(dn, maskLen - dnLen, '?');
}
/* if the digit string is longer than the translation mask
* prepad the translation mask with '%'.
*/
if (dnLen > maskLen) {
stringInsert(translationMask, dnLen - maskLen, '%');
}
dnLen = strlen(dn);
for (i=0; i < dnLen; i++) {
if (translationMask[i] == '%')
continue;
else if (translationMask[i] == 'X')
translatedString[j++] = dn[i];
else
translatedString[j++] = translationMask[i];
}
translatedString[j] = 0;
result = strlib_malloc(translatedString, strlen(translatedString));
return result;
}
/**
* Before initing the line_info release any memory which has been used
* so we do not leak any here.
*/
void ccsnap_line_pre_init () {
int i;
CCAPP_DEBUG(DEB_F_PREFIX"Entering line_pre_init to clear it out to avoid mem leaks\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "ccsnap_line_pre_init"));
for (i=1;i<MAX_CONFIG_LINES;i++) {
if ((lineInfo[i].name) && (strlen(lineInfo[i].name) > 0)) {
strlib_free(lineInfo[i].name);
}
if ((lineInfo[i].dn) && (strlen(lineInfo[i].dn) > 0)) {
strlib_free(lineInfo[i].dn);
}
if ((lineInfo[i].cfwd_dest) && (strlen(lineInfo[i].cfwd_dest) > 0)) {
strlib_free(lineInfo[i].cfwd_dest);
}
if ((lineInfo[i].externalNumber) &&
(strlen(lineInfo[i].externalNumber) > 0)) {
strlib_free(lineInfo[i].externalNumber);
}
if ((featureInfo[i].speedDialNumber) &&
(strlen(featureInfo[i].speedDialNumber) > 0)) {
strlib_free(featureInfo[i].speedDialNumber);
}
if ((featureInfo[i].contact) && (strlen(featureInfo[i].contact) > 0)) {
strlib_free(featureInfo[i].contact);
}
if ((featureInfo[i].name) && (strlen(featureInfo[i].name) > 0)) {
strlib_free(featureInfo[i].name);
}
if ((featureInfo[i].retrievalPrefix) &&
(strlen(featureInfo[i].retrievalPrefix) > 0)) {
strlib_free(featureInfo[i].retrievalPrefix);
}
}
}
/**
* Initialize lineinfo and featureinfo arrays
*/
void ccsnap_line_init() {
int i;
cc_uint32_t tmpInt;
char tempStr[MAX_URL_LENGTH];
char maskStr[MAX_EXTERNAL_NUMBER_MASK_SIZE];
/* clean up structure if need be */
ccsnap_line_pre_init();
memset(lineInfo, 0, MAX_CONFIG_LINES*sizeof(cc_line_info_t));
memset(featureInfo, 0, MAX_CONFIG_LINES*sizeof(cc_feature_info_t));
for (i=1;i<=MAX_CONFIG_LINES;i++) {
config_get_line_value(CFGID_LINE_FEATURE, &tmpInt, sizeof(tmpInt), i);
if ( tmpInt == cfgLineFeatureDN ) {
lineInfo[i].button = i;
lineInfo[i].line_type = tmpInt;
config_get_line_value(CFGID_LINE_INDEX, &tmpInt, sizeof(tmpInt), i);
lineInfo[i].line_id = tmpInt;
config_get_line_value(CFGID_LINE_DISPLAYNAME_STRING, tempStr,
MAX_URL_LENGTH, i);
lineInfo[i].dn = strlib_malloc(tempStr, strlen(tempStr));
config_get_line_value(CFGID_LINE_NAME_STRING, tempStr,
MAX_URL_LENGTH, i);
lineInfo[i].name = strlib_malloc(tempStr, strlen(tempStr));
config_get_line_value(CFGID_LINE_CFWDALL, tempStr,
MAX_URL_LENGTH, i);
lineInfo[i].cfwd_dest = strlib_malloc(tempStr, strlen(tempStr));
config_get_line_value(CFGID_LINE_SPEEDDIAL_NUMBER_STRING, tempStr,
MAX_URL_LENGTH, i);
memset(maskStr, 0, sizeof(maskStr));
config_get_string(CFGID_CCM_EXTERNAL_NUMBER_MASK, maskStr, MAX_EXTERNAL_NUMBER_MASK_SIZE);
if (strlen(maskStr) > 0) {
lineInfo[i].externalNumber = CCAPI_ApplyTranslationMask(lineInfo[i].name, maskStr);
CCAPP_DEBUG("Setting lineInfo[i].externalNumber to %s\n", lineInfo[i].externalNumber);
} else {
lineInfo[i].externalNumber = strlib_empty();
}
} else {
lineInfo[i].line_id = MAX_CONFIG_LINES+1; // invalid line id
lineInfo[i].button = i;
lineInfo[i].dn = strlib_empty();
lineInfo[i].name = strlib_empty();
lineInfo[i].cfwd_dest = strlib_empty();
lineInfo[i].externalNumber = strlib_empty();
}
capset_get_idleset(CC_MODE_CCM, lineInfo[i].allowed_features);
// get feature again because it might have been changed if it is a DN
// and the tmpInt might have a different value
config_get_line_value(CFGID_LINE_FEATURE, &tmpInt, sizeof(tmpInt), i);
// features which have no properties
if ( tmpInt == cfgLineFeatureAllCalls ||
tmpInt == cfgLineFeatureMaliciousCallID ||
tmpInt == cfgLineFeatureRedial || tmpInt == cfgLineFeatureAnswerOldest || tmpInt == cfgLineFeatureServices ) {
featureInfo[i].feature_id = tmpInt;
featureInfo[i].button = i;
featureInfo[i].speedDialNumber = strlib_empty();
featureInfo[i].contact = strlib_empty();
featureInfo[i].name = strlib_empty();
featureInfo[i].retrievalPrefix = strlib_empty();
featureInfo[i].featureOptionMask = 0;
} else if ( tmpInt == cfgLineFeatureSpeedDialBLF || tmpInt == cfgLineFeatureSpeedDial){
featureInfo[i].feature_id = tmpInt;
featureInfo[i].button = i;
config_get_line_value(CFGID_LINE_SPEEDDIAL_NUMBER_STRING, tempStr,
MAX_URL_LENGTH, i);
featureInfo[i].speedDialNumber = strlib_malloc(tempStr, strlen(tempStr));
featureInfo[i].contact = strlib_empty();
config_get_line_value(CFGID_LINE_NAME_STRING, tempStr,
MAX_URL_LENGTH, i);
featureInfo[i].name = strlib_malloc(tempStr, strlen(tempStr));
featureInfo[i].retrievalPrefix = strlib_empty();
config_get_line_value(CFGID_LINE_FEATURE_OPTION_MASK, &tmpInt, sizeof(tmpInt), i);
featureInfo[i].featureOptionMask = tmpInt;
featureInfo[i].blf_state = CC_SIP_BLF_UNKNOWN;
} else {
featureInfo[i].feature_id = 0;
featureInfo[i].button = MAX_CONFIG_LINES+1; // invalid button value
featureInfo[i].speedDialNumber = strlib_empty();
featureInfo[i].contact = strlib_empty();
featureInfo[i].name = strlib_empty();
featureInfo[i].retrievalPrefix = strlib_empty();
featureInfo[i].featureOptionMask = 0;
}
}
}
cc_line_info_t* ccsnap_getLineInfo(int lineID)
{
int i;
cc_lineid_t line = (cc_lineid_t)lineID;
for (i=1;i<=MAX_CONFIG_LINES;i++) {
if ( lineInfo[i].line_id == line ) {
return &lineInfo[i];
}
}
return NULL;
}
cc_line_info_t* ccsnap_getLineInfoFromBtn(int btnID)
{
int i;
for (i=1;i<=MAX_CONFIG_LINES;i++) {
if ( lineInfo[i].button == btnID ) {
return &lineInfo[i];
}
}
return NULL;
}
cc_boolean allowedFeature(int fid){
return TRUE;
}
cc_feature_info_t* ccsnap_getFeatureInfo(int featureIndex)
{
if ( ( featureIndex<=MAX_CONFIG_LINES ) &&
( featureIndex>= 1 ) &&
( featureInfo[featureIndex].button == featureIndex ) ) {
if ( allowedFeature(featureInfo[featureIndex].feature_id) ){
return &featureInfo[featureIndex];
}
}
return NULL;
}
/**
* Release any used mem to avoid a leak.
*/
void ccsnap_device_pre_init () {
int i = 0;
CCAPP_DEBUG(DEB_F_PREFIX"Entering device_pre_init to clear it out to avoid mem leaks\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "ccsnap_device_pre_init"));
if ((g_deviceInfo.name) && (strlen(g_deviceInfo.name) > 0)) {
strlib_free(g_deviceInfo.name);
}
if ((g_deviceInfo.not_prompt) && (strlen(g_deviceInfo.not_prompt) > 0)) {
strlib_free(g_deviceInfo.not_prompt);
}
i = 0;
while (i < CCAPI_MAX_SERVERS) {
if ((g_deviceInfo.ucm[i].name) &&
(strlen(g_deviceInfo.ucm[i].name) > 0)) {
strlib_free(g_deviceInfo.ucm[i].name);
}
i++;
}
}
void ccsnap_device_init() {
char temp[MAX_SIP_URL_LENGTH];
/* clean up structure if need be */
ccsnap_device_pre_init();
memset (&g_deviceInfo, 0, sizeof(g_deviceInfo));
g_deviceInfo.name =strlib_empty();
g_deviceInfo.not_prompt =strlib_empty();
g_deviceInfo.not_prompt_prio = 0;
g_deviceInfo.not_prompt_prog = 0;
g_deviceInfo.mwi_lamp = FALSE;
g_deviceInfo.cucm_mode = CC_MODE_CCM;
g_deviceInfo.ins_state = CC_STATE_IDLE;
g_deviceInfo.ins_cause = CC_CAUSE_NONE;
g_deviceInfo.reg_time = 0;
config_get_string(CFGID_CCM1_ADDRESS, temp, MAX_SIP_URL_LENGTH);
g_deviceInfo.ucm[0].name = strlib_malloc(temp, strlen(temp));
g_deviceInfo.ucm[0].type = CC_MODE_CCM;
g_deviceInfo.ucm[0].status = CC_CCM_STATUS_NONE;
config_get_string(CFGID_CCM2_ADDRESS, temp, MAX_SIP_URL_LENGTH);
g_deviceInfo.ucm[1].name = strlib_malloc(temp, strlen(temp));
g_deviceInfo.ucm[1].type = CC_MODE_CCM;
g_deviceInfo.ucm[1].status = CC_CCM_STATUS_NONE;
config_get_string(CFGID_CCM3_ADDRESS, temp, MAX_SIP_URL_LENGTH);
g_deviceInfo.ucm[2].name = strlib_malloc(temp, strlen(temp));
g_deviceInfo.ucm[2].type = CC_MODE_CCM;
g_deviceInfo.ucm[2].status = CC_CCM_STATUS_NONE;
config_get_string(CFGID_CCM_TFTP_IP_ADDR, temp, MAX_SIP_URL_LENGTH);
g_deviceInfo.ucm[3].name = strlib_malloc(temp, strlen(temp));
g_deviceInfo.ucm[3].type = CC_MODE_CCM;
g_deviceInfo.ucm[3].status = CC_CCM_STATUS_NONE;
g_accessoryCfgInfo.camera = ACCSRY_CFGD_CFG;
g_accessoryCfgInfo.video = ACCSRY_CFGD_CFG;
}
void ccsnap_gen_deviceEvent(ccapi_device_event_e event, cc_device_handle_t handle){
const char* fname = "ccsnap_gen_deviceEvent";
cc_device_info_t *device_info = CCAPI_Device_getDeviceInfo(handle);
if ( device_info != NULL ) {
CCAPP_DEBUG(DEB_F_PREFIX"data->ref_count=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device_info->ref_count);
switch (event) {
case CCAPI_DEVICE_EV_NOTIFYPROMPT:
CCAPP_DEBUG(DEB_F_PREFIX"data->not_prompt=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device_info->not_prompt);
CCAPP_DEBUG(DEB_F_PREFIX"data->not_prompt_prio=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device_info->not_prompt_prio);
CCAPP_DEBUG(DEB_F_PREFIX"data->not_prompt_prog=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device_info->not_prompt_prog);
break;
case CCAPI_DEVICE_EV_STATE:
CCAPP_DEBUG(DEB_F_PREFIX"setting property %s to %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), "FullyRegistered", ((device_info->ins_state == CC_STATE_INS) ? "1" : "0"));
//intentional follow through to let the debugs get printed.
default:
CCAPP_DEBUG(DEB_F_PREFIX"data->name=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device_info->name);
CCAPP_DEBUG(DEB_F_PREFIX"data->mwi_lamp=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device_info->mwi_lamp);
CCAPP_DEBUG(DEB_F_PREFIX"data->ins_state=%02X \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device_info->ins_state);
CCAPP_DEBUG(DEB_F_PREFIX"data->cucm_mode=%02X \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device_info->cucm_mode);
CCAPP_DEBUG(DEB_F_PREFIX"data->ins_cause=%02X \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), device_info->ins_cause);
break;
}
CCAPI_DeviceListener_onDeviceEvent(event, handle, device_info);
}
CCAPI_Device_releaseDeviceInfo(device_info);
}
void ccsnap_gen_lineEvent(ccapi_line_event_e event, cc_lineid_t handle){
const char* fname = "ccsnap_gen_lineEvent";
cc_line_info_t *line_info = CCAPI_Line_getLineInfo(handle);
if ( line_info != NULL ) {
if (g_CCAppDebug) {
CCAPP_DEBUG(DEB_F_PREFIX"data->ref_count=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), line_info->ref_count);
CCAPP_DEBUG(DEB_F_PREFIX"data->line_id=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), line_info->line_id);
CCAPP_DEBUG(DEB_F_PREFIX"data->button=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), line_info->button);
CCAPP_DEBUG(DEB_F_PREFIX"data->reg_state=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), line_info->reg_state);
CCAPP_DEBUG(DEB_F_PREFIX"data->isCFWD=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), line_info->isCFWD);
CCAPP_DEBUG(DEB_F_PREFIX"data->isLocalCFWD=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), line_info->isLocalCFWD);
CCAPP_DEBUG(DEB_F_PREFIX"data->mwi=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), line_info->mwi);
CCAPP_DEBUG(DEB_F_PREFIX"data->name=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), line_info->name);
CCAPP_DEBUG(DEB_F_PREFIX"data->dn=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), line_info->dn);
CCAPP_DEBUG(DEB_F_PREFIX"data->cfwd_dest=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), line_info->cfwd_dest);
}
CCAPI_LineListener_onLineEvent(event, handle, line_info);
}
CCAPI_Line_releaseLineInfo(line_info);
}
void ccsnap_gen_callEvent(ccapi_call_event_e event, cc_call_handle_t handle){
session_data_t *call_info = CCAPI_Call_getCallInfo(handle);
if ( call_info == NULL ) {
call_info = getDeepCopyOfSessionData(NULL);
}
//print all info
if (g_CCAppDebug) {
printCallInfo(call_info, "ccsnap_gen_callEvent");
}
CCAPI_CallListener_onCallEvent(event, handle, call_info);
CCAPI_Call_releaseCallInfo(call_info);
}
void ccsnap_update_ccm_status(cc_string_t addr, cc_ccm_status_t status)
{
int i;
CCAPP_DEBUG(DEB_F_PREFIX"entry ccm %s status=%d\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, "ccsnap_update_ccm_status"), addr, status);
for (i=0;i< CCAPI_MAX_SERVERS;i++) {
if ( g_deviceInfo.ucm[i].status == status ) {
//move the status to the new addr
g_deviceInfo.ucm[i].status = CC_CCM_STATUS_NONE;
}
if ( !strcmp(addr, g_deviceInfo.ucm[i].name) ) {
g_deviceInfo.ucm[i].status = status;
CCAPP_DEBUG(DEB_F_PREFIX"server %s is now status=%d\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, "ccsnap_update_ccm_status"),
g_deviceInfo.ucm[i].name, status);
}
}
}
void ccsnap_handle_mnc_reached (cc_line_info_t *line_info, cc_boolean mnc_reached, cc_cucm_mode_t mode)
{
cc_call_handle_t handles[MAX_CALLS];
int count = MAX_CALLS, i;
session_data_t *cinfo;
if (mnc_reached) {
line_info->allowed_features[CCAPI_CALL_CAP_NEWCALL] = FALSE;
line_info->allowed_features[CCAPI_CALL_CAP_REDIAL] = FALSE;
line_info->allowed_features[CCAPI_CALL_CAP_CALLFWD] = FALSE;
} else {
capset_get_idleset(mode, line_info->allowed_features);
}
// update connected calls caps on this line
CCAPI_LineInfo_getCallsByState(line_info->line_id, CONNECTED, handles, &count);
for ( i=0; i<count; i++) {
cinfo = CCAPI_Call_getCallInfo(handles[i]);
if (cinfo) {
if ( cinfo->attr == (cc_call_attr_t) CONF_CONSULT ||
cinfo->attr == (cc_call_attr_t) XFR_CONSULT ) {
CCAPI_Call_releaseCallInfo(cinfo);
continue;
}
cinfo->allowed_features[CCAPI_CALL_CAP_TRANSFER] = mnc_reached?FALSE:TRUE;
cinfo->allowed_features[CCAPI_CALL_CAP_CONFERENCE] = mnc_reached?FALSE:TRUE;
//print call info
if (g_CCAppDebug) {
printCallInfo(cinfo, "ccsnap_handle_mnc_reached");
}
CCAPI_CallListener_onCallEvent(CCAPI_CALL_EV_CAPABILITY, handles[i], cinfo);
}
}
// update RIU call caps on this line
CCAPI_LineInfo_getCallsByState(line_info->line_id, REMINUSE, handles, &count);
for ( i=0; i<count; i++) {
cinfo = CCAPI_Call_getCallInfo(handles[i]);
if (cinfo) {
cinfo->allowed_features[CCAPI_CALL_CAP_BARGE] = mnc_reached?FALSE:TRUE;
//print call info
if (g_CCAppDebug) {
printCallInfo(cinfo, "ccsnap_handle_mnc_reached");
}
CCAPI_CallListener_onCallEvent(CCAPI_CALL_EV_CAPABILITY, handles[i], cinfo);
}
}
}
void ccsnap_gen_blfFeatureEvent(cc_blf_state_t state, int appId)
{
cc_feature_info_t *feature_info = NULL;
feature_info = ccsnap_getFeatureInfo(appId);
// if the feature exists
if (feature_info != NULL) {
feature_info->blf_state = state;
printFeatureInfo(CCAPI_DEVICE_EV_BLF, feature_info, "ccsnap_gen_blfFeatureEvent");
CCAPI_DeviceListener_onFeatureEvent(CCAPI_DEVICE_EV_BLF, CC_DEVICE_ID, feature_info);
}
}
/**
* Inserts localized strings into existing strings with escape characters.
* @param destination the return phrase holder
* @param source the phrase with escape characters.
* @param len the input length to cap the maximum value
* @return pointer to the new string
*/
cc_string_t ccsnap_EscapeStrToLocaleStr(cc_string_t destination, cc_string_t source, int len)
{
static const char *fname="ccsnap_EscapeStrToLocaleStr";
char phrase_collector[MAX_LOCALE_STRING_LEN] = { '\0' };
char* phrase_collector_ptr = phrase_collector;
char* esc_string_itr = (char*)source;
int remaining_length = 0;
cc_string_t ret_str = strlib_empty();
if(destination == NULL){
CCAPP_DEBUG(DEB_F_PREFIX"Error: destination is NULL\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
return NULL;
}
if(source == NULL){
CCAPP_DEBUG(DEB_F_PREFIX"Error: source is NULL\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
strlib_free(destination);
return strlib_empty();
}
if(source[0] == '\0'){
strlib_free(destination);
return strlib_empty();
}
if (len == LEN_UNKNOWN) {
len = strlen(source) + MAX_LOCALE_PHRASE_LEN;
}
if (len <= 0){
CCAPP_DEBUG(DEB_F_PREFIX"Error: cannot write string of length <= 0\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
strlib_free(destination);
return strlib_empty();
}
if (len > MAX_LOCALE_STRING_LEN){
len = MAX_LOCALE_STRING_LEN;
}
remaining_length = len;
while( *esc_string_itr != NUL &&
remaining_length > 0 &&
strlen(phrase_collector_ptr) < (size_t)(len-1))
{
int rtn = CC_SUCCESS;
int phrase_index = 0;
char* phrase_bucket_ptr = (char*)cpr_malloc(remaining_length * sizeof(char));
if (phrase_bucket_ptr == NULL) {
CCAPP_ERROR(DEB_F_PREFIX"Error: phrase_bucket_ptr is NULL\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
strlib_free(destination);
return NULL;
}
phrase_bucket_ptr[0] = '\0';
switch(*esc_string_itr){
case OLD_CUCM_DICTIONARY_ESCAPE_TAG:
phrase_index += CALL_CONTROL_PHRASE_OFFSET;
// Do not set break to combine common code
case NEW_CUCM_DICTIONARY_ESCAPE_TAG:
esc_string_itr++;
phrase_index += (int)(*esc_string_itr);
rtn = platGetPhraseText(phrase_index, phrase_bucket_ptr, remaining_length-1);
if(rtn == CC_FAILURE) break;
sstrncat(phrase_collector_ptr, (cc_string_t)phrase_bucket_ptr, remaining_length);
remaining_length--;
break;
default:
// We need length 2 to concat 1 char and a terminating char
sstrncat(phrase_collector_ptr, esc_string_itr, 1 + sizeof(char));
remaining_length--;
break;
}
esc_string_itr++;
cpr_free(phrase_bucket_ptr);
}
ret_str = strlib_malloc(phrase_collector_ptr, len);
if (!ret_str) {
/*
* If a malloc error occurred, give them back what they had.
* It's not right, but it's better than nothing.
*/
ret_str = destination;
} else {
strlib_free(destination);
}
CCAPP_DEBUG(DEB_F_PREFIX"Localization String returning %s\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), ret_str);
return (ret_str);
}
static boolean missed, placed, received;
void ccsnap_set_phone_services_provisioning(boolean misd, boolean plcd, boolean rcvd) {
CCAPP_ERROR(DEB_F_PREFIX"missed=%d placed=%d received=%d\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, "ccsnap_set_phone_services_provisioning"), misd, plcd, rcvd);
missed = misd;
placed = plcd;
received = rcvd;
}
boolean ccsnap_isMissedCallLoggingEnabled()
{
return missed;
}
boolean ccsnap_isReceivedCallLoggingEnabled()
{
return received;
}
boolean ccsnap_isPlacedCallLoggingEnabled()
{
return placed;
}
/**
* Helper method
*/
static void printCallInfo(cc_callinfo_ref_t info, const char* fname) {
CCAPP_DEBUG(DEB_F_PREFIX"data->ref_count=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->ref_count);
CCAPP_DEBUG(DEB_F_PREFIX"data->sess_id=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->sess_id);
CCAPP_DEBUG(DEB_F_PREFIX"data->line=%02X \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->line);
CCAPP_DEBUG(DEB_F_PREFIX"data->id=%u \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->id);
CCAPP_DEBUG(DEB_F_PREFIX"data->inst=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->inst);
CCAPP_DEBUG(DEB_F_PREFIX"data->state=%02X \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->state);
CCAPP_DEBUG(DEB_F_PREFIX"data->attr=%02X \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->attr);
CCAPP_DEBUG(DEB_F_PREFIX"data->type=%02X \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->type);
CCAPP_DEBUG(DEB_F_PREFIX"data->security=%02X \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->security);
CCAPP_DEBUG(DEB_F_PREFIX"data->policy=%02X \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->policy);
CCAPP_DEBUG(DEB_F_PREFIX"data->isSelected=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->isSelected);
CCAPP_DEBUG(DEB_F_PREFIX"data->log_disp=%u \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->log_disp);
CCAPP_DEBUG(DEB_F_PREFIX"data->clg_name=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->clg_name);
CCAPP_DEBUG(DEB_F_PREFIX"data->clg_number=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->clg_number);
CCAPP_DEBUG(DEB_F_PREFIX"data->alt_number=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->alt_number);
CCAPP_DEBUG(DEB_F_PREFIX"data->cld_name=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->cld_name);
CCAPP_DEBUG(DEB_F_PREFIX"data->cld_number=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->cld_number);
CCAPP_DEBUG(DEB_F_PREFIX"data->orig_called_name=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->orig_called_name);
CCAPP_DEBUG(DEB_F_PREFIX"data->orig_called_number=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->orig_called_number);
CCAPP_DEBUG(DEB_F_PREFIX"data->last_redir_name=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->last_redir_name);
CCAPP_DEBUG(DEB_F_PREFIX"data->last_redir_number=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->last_redir_number);
CCAPP_DEBUG(DEB_F_PREFIX"data->plcd_name=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->plcd_name);
CCAPP_DEBUG(DEB_F_PREFIX"data->plcd_number=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->plcd_number);
CCAPP_DEBUG(DEB_F_PREFIX"data->status=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->status);
CCAPP_DEBUG(DEB_F_PREFIX"data->gci=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->gci);
CCAPP_DEBUG(DEB_F_PREFIX"data->cause=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->cause);
CCAPP_DEBUG(DEB_F_PREFIX"data->vid_dir=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->vid_dir);
CCAPP_DEBUG(DEB_F_PREFIX"data->vid_offer=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->vid_offer);
CCAPP_DEBUG(DEB_F_PREFIX"data->is_conf=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->is_conf);
CCAPP_DEBUG(DEB_F_PREFIX"data->ringer_start=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->ringer_start);
CCAPP_DEBUG(DEB_F_PREFIX"data->ringer_mode=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->ringer_mode);
CCAPP_DEBUG(DEB_F_PREFIX"data->ringer_once=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), info->ringer_once);
}
static void printFeatureInfo (ccapi_device_event_e type, cc_featureinfo_ref_t feature_info, const char* fname) {
CCAPP_DEBUG(DEB_F_PREFIX"data->button=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), feature_info->button);
CCAPP_DEBUG(DEB_F_PREFIX"data->contact=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), feature_info->contact);
CCAPP_DEBUG(DEB_F_PREFIX"data->featureOptionMask=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), feature_info->featureOptionMask);
CCAPP_DEBUG(DEB_F_PREFIX"data->feature_id=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), feature_info->feature_id);
CCAPP_DEBUG(DEB_F_PREFIX"data->name=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), feature_info->name);
CCAPP_DEBUG(DEB_F_PREFIX"data->retrievalPrefix=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), feature_info->retrievalPrefix);
CCAPP_DEBUG(DEB_F_PREFIX"data->speedDialNumber=%s \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), feature_info->speedDialNumber);
if (type == CCAPI_DEVICE_EV_BLF) {
CCAPP_DEBUG(DEB_F_PREFIX"data->blf_state=%d \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname), feature_info->blf_state);
}
}

View File

@ -1,114 +0,0 @@
/* 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/. */
#ifndef _CCAPI_SNAPSHOT_H_
#define _CCAPI_SNAPSHOT_H_
#include "ccsip_platform.h"
#include "prot_configmgr.h"
#include "ccapi_line.h"
/*
* MWI info
*/
typedef struct cc_mwi_info_t_ {
cc_uint32_t status;
cc_uint32_t type;
cc_uint32_t new_count;
cc_uint32_t old_count;
cc_uint32_t pri_new_count;
cc_uint32_t pri_old_count;
} cc_mwi_info_t;
/*
* line reference data structure
*/
typedef struct cc_line_info_t_ {
cc_uint32_t ref_count;
cc_uint32_t line_id;
cc_uint32_t line_type;
cc_int32_t button;
cc_boolean reg_state;
cc_boolean isCFWD;
cc_boolean isLocalCFWD;
cc_mwi_info_t mwi;
cc_string_t name;
cc_string_t dn;
cc_string_t cfwd_dest;
cc_boolean allowed_features[CCAPI_CALL_CAP_MAX];
cc_string_t externalNumber;
cc_boolean fwd_caller_name_display;
cc_boolean fwd_caller_number_display;
cc_boolean fwd_redirected_number_display;
cc_boolean fwd_dialed_number_display;
} cc_line_info_t;
typedef struct cc_feature_info_t_ {
cc_int32_t feature_id;
cc_int32_t button;
cc_string_t speedDialNumber;
cc_string_t contact;
cc_string_t name;
cc_string_t retrievalPrefix;
cc_uint32_t featureOptionMask;
cc_blf_state_t blf_state;
} cc_feature_info_t;
typedef struct cc_call_server_t_ {
cc_string_t name;
cc_ccm_status_t status;
cc_int32_t type;
} cc_call_server_t;
typedef struct cc_device_info_t_ {
cc_uint32_t ref_count;
cc_string_t name;
cc_string_t not_prompt;
char registration_ip_addr[MAX_IPADDR_STR_LEN];
cc_int32_t not_prompt_prio;
cc_boolean not_prompt_prog;
cc_boolean mwi_lamp;
cc_cucm_mode_t cucm_mode;
cc_service_state_t ins_state;
cc_service_cause_t ins_cause;
long long reg_time;
cc_call_server_t ucm[CCAPI_MAX_SERVERS];
} cc_device_info_t;
typedef enum {
ACCSRY_CFGD_CFG, //accessory last configured by configuration file.
ACCSRY_CFGD_APK, //accessory last configured by another application.
} accsry_cfgd_by_t;
typedef struct accessory_cfg_info_t_ {
accsry_cfgd_by_t camera;
accsry_cfgd_by_t video;
} accessory_cfg_info_t;
extern accessory_cfg_info_t g_accessoryCfgInfo;
extern cc_device_info_t g_deviceInfo;
extern cc_line_info_t lineInfo[MAX_CONFIG_LINES+1];
cc_line_info_t* ccsnap_getLineInfo(int lineID);
cc_line_info_t* ccsnap_getLineInfoFromBtn(int btnID);
void ccsnap_line_init();
void ccsnap_device_init();
void ccsnap_gen_deviceEvent(ccapi_device_event_e event, cc_device_handle_t handle);
void ccsnap_gen_lineEvent(ccapi_line_event_e event, cc_lineid_t handle);
void ccsnap_gen_callEvent(ccapi_call_event_e event, cc_call_handle_t handle);
void ccsnap_update_ccm_status(cc_string_t addr, cc_ccm_status_t status);
void ccsnap_handle_mnc_reached (cc_line_info_t *line_info,
cc_boolean mnc_reached, cc_cucm_mode_t mode);
cc_feature_info_t* ccsnap_getFeatureInfo(int featureIndex);
void ccsnap_gen_blfFeatureEvent(cc_blf_state_t state, int appId);
cc_string_t ccsnap_EscapeStrToLocaleStr(cc_string_t destination, cc_string_t source, int len);
void ccsnap_set_phone_services_provisioning(boolean misd, boolean plcd, boolean rcvd);
boolean ccsnap_isMissedCallLoggingEnabled();
boolean ccsnap_isReceivedCallLoggingEnabled();
boolean ccsnap_isPlacedCallLoggingEnabled();
void ccsnap_set_line_label(int btn, cc_string_t label);
cc_string_t ccsnap_get_line_label(int btn);
#endif

View File

@ -1,177 +0,0 @@
/* 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);
}
}
}

View File

@ -1,20 +0,0 @@
/* 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 "sll_lite.h"
//Define app id for ccapp task
#define CCAPP_CCPROVIER 1
#define CCAPP_MSPROVIDER 2
typedef void(* appListener) (void *message, int type);
typedef struct {
sll_lite_node_t node;
int type;
appListener *listener_p;
} listener_t;
extern void addCcappListener(appListener* listener, int type);
appListener *getCcappListener(int type);
cpr_status_e ccappTaskSendMsg (uint32_t cmd, void *msg, uint16_t len, uint32_t usrInfo);

File diff suppressed because it is too large Load Diff

View File

@ -1,401 +0,0 @@
/* 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 <stdio.h>
#include "sll_lite.h"
#include "cc_constants.h"
#include "cc_types.h"
#include "cc_config.h"
#include "phone_debug.h"
#include "debug.h"
#include "CCProvider.h"
#include "ccapi_call_info.h"
#include "conf_roster.h"
#include "ccapi.h"
#include "ccapp_task.h"
cc_conf_participant_status_t
convertStringToParticipantStatus(const char *data)
{
if (strcmp(data, "connected") == 0) {
return CCAPI_CONFPARTICIPANT_CONNECTED;
} else if (strcmp(data, "alerting") == 0) {
return CCAPI_CONFPARTICIPANT_ALERTING;
} else if (strcmp(data, "dialing-out") == 0) {
return CCAPI_CONFPARTICIPANT_DIALING_OUT;
} else if (strcmp(data, "on-hold") == 0) {
return CCAPI_CONFPARTICIPANT_ON_HOLD;
} else if (strcmp(data, "disconnected") == 0) {
return CCAPI_CONFPARTICIPANT_DISCONNECTED;
} else {
return CCAPI_CONFPARTICIPANT_UNKNOWN;
}
}
cc_call_security_t
convertStringToParticipantSecurity(const char *data)
{
if (strcmp(data, "NotAuthenticated") == 0) {
return CC_SECURITY_NOT_AUTHENTICATED;
} else if (strcmp(data, "Authenticated") == 0) {
return CC_SECURITY_AUTHENTICATED;
} else if (strcmp(data, "Encrypted") == 0) {
return CC_SECURITY_ENCRYPTED;
} else if (strcmp(data, "Unknown") == 0) {
return CC_SECURITY_UNKNOWN;
} else {
return CC_SECURITY_NONE;
}
}
void conf_roster_init_call_conference (cc_call_conference_Info_t *info)
{
CCAPP_DEBUG(DEB_F_PREFIX"in init_call_conference \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONFPARSE"));
info->participantMax = 0;
info->participantCount = 0;
info->myParticipantId = strlib_empty();
sll_lite_init(&info->currentParticipantsList);
}
void conf_roster_free_call_conference (cc_call_conference_Info_t *confInfo)
{
cc_call_conferenceParticipant_Info_t *participant;
CCAPP_DEBUG(DEB_F_PREFIX"in free_call_confrerence \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONFPARSE"));
while((participant=(cc_call_conferenceParticipant_Info_t *)
sll_lite_unlink_head(&confInfo->currentParticipantsList)) != NULL)
{
strlib_free(participant->participantName);
strlib_free(participant->endpointUri);
strlib_free(participant->callid);
strlib_free(participant->participantNumber);
participant->participantSecurity = CC_SECURITY_NONE;
participant->participantStatus = CCAPI_CONFPARTICIPANT_UNKNOWN;
participant->canRemoveOtherParticipants = FALSE;
cpr_free(participant);
participant = NULL;
}
strlib_free(confInfo->myParticipantId);
conf_roster_init_call_conference(confInfo);
}
void conf_roster_copy_call_conferance (cc_call_conference_Info_t *dest, cc_call_conference_Info_t * src)
{
cc_call_conferenceParticipant_Info_t *destParticipant;
cc_call_conferenceParticipant_Info_t *srcParticipant;
sll_lite_node_t *iterator;
sll_lite_return_e sll_ret_val;
CCAPP_DEBUG(DEB_F_PREFIX"in copy_call_confrerence \n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONFPARSE"));
iterator = src->currentParticipantsList.head_p;
conf_roster_init_call_conference(dest);
dest->participantMax = src->participantMax;
dest->participantCount = src->participantCount;
dest->myParticipantId = strlib_copy(src->myParticipantId);
while (iterator) {
srcParticipant = (cc_call_conferenceParticipant_Info_t *)iterator;
destParticipant = cpr_malloc(sizeof(cc_call_conferenceParticipant_Info_t));
if (destParticipant == NULL) {
CCAPP_ERROR(DEB_F_PREFIX" Malloc failure for participant\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONFPARSE"));
return;
} else {
destParticipant->participantName = strlib_copy(srcParticipant->participantName);
destParticipant->endpointUri = strlib_copy(srcParticipant->endpointUri);
destParticipant->callid = strlib_copy(srcParticipant->callid);
destParticipant->participantNumber = strlib_copy(srcParticipant->participantNumber);
destParticipant->participantSecurity = srcParticipant->participantSecurity;
destParticipant->participantStatus = srcParticipant->participantStatus;
destParticipant->canRemoveOtherParticipants = srcParticipant->canRemoveOtherParticipants;
}
sll_ret_val = sll_lite_link_tail(&dest->currentParticipantsList, (sll_lite_node_t *)destParticipant);
if (sll_ret_val != SLL_LITE_RET_SUCCESS) {
CCAPP_ERROR(DEB_F_PREFIX" Error while trying to insert in the linked list\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONFPARSE"));
cpr_free(destParticipant);
return;
}
iterator = iterator->next_p;
}
}
// -------------------
// API Implementation
// -------------------
/**
* Get Conference Participants
* @param [in] handle - call handle
* @param [in/out] participantHandles - array of participant handles to be returned
* @param [in/out] count - in: size of array provided in participantHandles; out: number of entries populated (up to original value provided)
* @return void
*/
void CCAPI_CallInfo_getConfParticipants (cc_callinfo_ref_t handle, cc_participant_ref_t participantHandles[], int* count)
{
cc_call_conference_ref_t callConference = NULL; // conference reference (from call info)
cc_call_conference_participant_ref_t participant = NULL; // participant reference
cc_uint16_t participantIndex = 0; // participant index
cc_uint16_t nodeCount = 0; // linked list node count
CCAPP_DEBUG(DEB_F_PREFIX"Entering: CCAPI_CallInfo_getConfParticipants\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"));
// get conference reference from the call info
callConference = getCallConferenceRef(handle);
if (callConference == NULL)
{
CCAPP_ERROR(DEB_F_PREFIX"Unable to get conference handle\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"));
*count = 0;
return;
}
nodeCount = SLL_LITE_NODE_COUNT(&(callConference->currentParticipantsList));
CCAPP_DEBUG(DEB_F_PREFIX"SLL NODE COUNT = [%d]\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"), nodeCount);
if (nodeCount <= 0)
{
*count = 0;
return;
}
participant = (cc_call_conference_participant_ref_t)SLL_LITE_LINK_HEAD(&callConference->currentParticipantsList);
while (participant != NULL)
{
if (participantIndex >= *count)
{
CCAPP_ERROR(DEB_F_PREFIX"Not Enough Room Provided To List All Participants. Listed [%d] of [%d]\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"), count, nodeCount);
return;
}
// add this participant to our list of particpiants
participantHandles[participantIndex] = (participant->callid);
// step to the next stored participant in the list
participant = (cc_call_conference_participant_ref_t)SLL_LITE_LINK_NEXT_NODE(participant);
participantIndex++;
}
// sanity check
if (participantIndex != nodeCount)
{ // did not find the expected number of participants!
CCAPP_ERROR(DEB_F_PREFIX"Detected mismatch between counted participants [%d] and SLL returned nodecount [%d]\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"),
participantIndex, nodeCount);
*count = 0;
return;
}
// return number of participants
*count = nodeCount;
return;
}
/**
* Get Maximum Number of Conference Participants ( in case gui wants to show %full conference info )
* @param [in] handle - call handle
* @return maximum number of conference participants
*/
cc_uint16_t CCAPI_CallInfo_getConfParticipantMax (cc_callinfo_ref_t handle)
{ //
cc_call_conference_ref_t callConference; // conference reference (from call info)
CCAPP_DEBUG(DEB_F_PREFIX"Entering: CCAPI_CallInfo_getConfParticipantMax\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"));
// get conference reference from the call info
callConference = getCallConferenceRef(handle);
if (callConference == NULL)
{
// no conference reference available
CCAPP_ERROR(DEB_F_PREFIX"Unable to get conference reference\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"));
return (0);
}
// return the max
return (callConference->participantMax);
}
/**
* Get Participant Name
* @param [in] handle - call info handle
* @param [in] participantHandle - specific handle for conference participant
* @return display name of the conference participant
*/
cc_string_t CCAPI_CallInfo_getConfParticipantName (cc_callinfo_ref_t handle, cc_participant_ref_t participantHandle)
{
cc_call_conference_participant_ref_t participant = getConferenceParticipantRef (handle, participantHandle);
if (participant == NULL)
{
return strlib_empty();
}
return (participant->participantName);
}
/**
* Get Participant Number
* @param [in] handle - handle of call
* @param [in] participantHandle - handle of conference participant
* @return display number of the conference participant
*/
cc_string_t CCAPI_CallInfo_getConfParticipantNumber (cc_callinfo_ref_t handle, cc_participant_ref_t participantHandle)
{
cc_call_conference_participant_ref_t participant = getConferenceParticipantRef (handle, participantHandle);
if (participant == NULL)
{
return strlib_empty();
}
return (participant->participantNumber);
}
/**
* Get Conference Participant Status
* @param [in] handle - call handle
* @param [in] participantHandle - handle of conference participant
* @return conference participant status
*/
cc_conf_participant_status_t CCAPI_CallInfo_getConfParticipantStatus (cc_callinfo_ref_t handle, cc_participant_ref_t participantHandle)
{
cc_call_conference_participant_ref_t participant = getConferenceParticipantRef (handle, participantHandle);
if (participant == NULL)
{
return (CCAPI_CONFPARTICIPANT_UNKNOWN);
}
return (participant->participantStatus);
}
/**
* Get Participant Security
* @param [in] handle - call handle
* @param [in] participantHandle - handle of conference participant
* @return security setting of the specific conference participant
*/
cc_call_security_t CCAPI_CallInfo_getConfParticipantSecurity (cc_callinfo_ref_t handle, cc_participant_ref_t participantHandle)
{
cc_call_conference_participant_ref_t participant = getConferenceParticipantRef (handle, participantHandle);
if (participant == NULL)
{
return (CC_SECURITY_NONE);
}
return (participant->participantSecurity);
}
/**
*/
cc_boolean CCAPI_CallInfo_isConfSelfParticipant (cc_callinfo_ref_t handle, cc_participant_ref_t participantHandle)
{
cc_call_conference_ref_t callConference; // conference reference (from call info)
// get conference reference from the call info
callConference = getCallConferenceRef(handle);
if (callConference == NULL)
{
// error - log
CCAPP_ERROR(DEB_F_PREFIX"Unable to get conference reference\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"));
return (FALSE);
}
return (strcmp((callConference->myParticipantId), participantHandle) == 0);
}
/**
*/
cc_participant_ref_t CCAPI_CallInfo_getConfSelfParticipant (cc_callinfo_ref_t handle)
{
cc_call_conference_ref_t callConference; // conference reference (from call info)
// get conference reference from the call info
callConference = getCallConferenceRef(handle);
if (callConference == NULL)
{
// unexpected error
CCAPP_ERROR(DEB_F_PREFIX"Unable to get conference reference\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"));
return strlib_empty();
}
return (callConference->myParticipantId);
}
// -----
/**
* Get the call conference reference
* @param [in] handle - call info handle
* @return cc_call_conference_Info_t
*/
cc_call_conference_ref_t getCallConferenceRef(cc_callinfo_ref_t handle)
{
session_data_t *data = (session_data_t *)handle;
if (!CCAPI_CallInfo_getIsConference(handle))
{
CCAPP_ERROR(DEB_F_PREFIX"Conference API Invoked, but Not In Conference Call\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"));
return (NULL);
};
if (data == NULL)
{
return (NULL);
}
return (&data->call_conference);
}
// ------------------------------------------------------------------------------------------------------------------
// getConferenceParticipantRef: returns participant ref (pointer) to a specific participant handle
// ------------------------------------------------------------------------------------------------------------------
cc_call_conference_participant_ref_t getConferenceParticipantRef(cc_callinfo_ref_t handle, cc_participant_ref_t participantHandle)
{
cc_call_conference_ref_t callConference; // conference reference (from call info)
cc_call_conference_participant_ref_t participant;
// get conference reference from the call info
callConference = getCallConferenceRef(handle);
if (callConference == NULL)
{
// no conference reference available
CCAPP_ERROR(DEB_F_PREFIX"Unable to get conference reference\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"));
return (NULL);
}
// see if participantHandle is legit...
if (participantHandle == NULL)
{
CCAPP_DEBUG(DEB_F_PREFIX"Received query for null participant\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"));
return (NULL);
}
if (SLL_LITE_NODE_COUNT(&(callConference->currentParticipantsList)) <= 0)
{
CCAPP_ERROR(DEB_F_PREFIX"Participant list node count is 0, returning NULL\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"));
return (NULL);
}
participant = (cc_call_conference_participant_ref_t)SLL_LITE_LINK_HEAD(&callConference->currentParticipantsList);
while (participant != NULL)
{
// see if we've found the participant we're looking for
if (strcmp(participant->callid, participantHandle) == 0)
{
return (participant);
}
// no match so far, so look at the next item in the list...
participant = (cc_call_conference_participant_ref_t)SLL_LITE_LINK_NEXT_NODE(participant);
}
CCAPP_ERROR(DEB_F_PREFIX" Did Not Find participant!\n", DEB_F_PREFIX_ARGS(SIP_CC_PROV, "CCAPI-CONF"));
return (NULL);
}

View File

@ -1,49 +0,0 @@
/* 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/. */
#ifndef __CONFROSTER_H__
#define __CONFROSTER_H__
#include "sll_lite.h"
#include "cpr_string.h"
#include "cc_constants.h"
#include "cpr_stdio.h"
#include "ccapi_conf_roster.h"
// structure for individual participant/user info
typedef struct cc_call_conferenceParticipant_Info_t_ {
sll_lite_node_t node;
cc_participant_ref_t callid;
string_t participantName;
string_t participantNumber;
cc_conf_participant_status_t participantStatus;
cc_call_security_t participantSecurity;
string_t endpointUri;
cc_boolean canRemoveOtherParticipants;
} cc_call_conferenceParticipant_Info_t;
// reference to above structure
typedef struct cc_call_conferenceParticipant_Info_t_* cc_call_conference_participant_ref_t;
// main structure (one instance kept per conference (per call))
typedef struct cc_call_conference_Info_t_ {
int32_t participantMax;
int32_t participantCount;
cc_participant_ref_t myParticipantId;
sll_lite_list_t currentParticipantsList;
} cc_call_conference_Info_t;
// reference to above structure
typedef struct cc_call_conference_Info_t_* cc_call_conference_ref_t;
void conf_roster_init_call_conference (cc_call_conference_Info_t *info);
cc_call_conference_ref_t getCallConferenceRef(cc_callinfo_ref_t handle);
cc_call_conference_participant_ref_t getConferenceParticipantRef(cc_callinfo_ref_t handle, cc_participant_ref_t participantHandle);
void conf_roster_free_call_conference (cc_call_conference_Info_t *confInfo);
void conf_roster_copy_call_conferance (cc_call_conference_Info_t *dest, cc_call_conference_Info_t * src);
#endif

View File

@ -1,305 +0,0 @@
/* 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/. */
#ifdef UNIT_TEST
#define cpr_malloc malloc
#define cpr_free free
#define CCAPP_DEBUG printf
#else
#include "cpr_stdlib.h"
#endif
#include "sessionHash.h"
#define HASHBUCKETS 67
hash_table_t *hashtable[HASHBUCKETS]={0};
void hashItrInit(hashItr_t *itr)
{
itr->bucket = 0;
itr->node = NULL;
}
void * hashItrNext(hashItr_t *itr)
{
int i;
if ( itr->node != NULL ) {
if ( itr->node->next != NULL ) {
itr->node = itr->node->next;
return itr->node->data;
}
// We just iterated to the end of the list.
// Increment the bucket to search next
itr->bucket++;
}
for(i=itr->bucket; i< HASHBUCKETS; i++) {
if (hashtable[i] != NULL) {
itr->bucket = i;
itr->node = hashtable[i];
return itr->node->data;
}
}
return NULL;
}
/**
* sessionHash
* function to add generate hash given the key
*
* @param key -
*
* @return the hash index
*/
unsigned int sessionHash (unsigned int key)
{
// since the key is session_id create the hashval to be line_id + call_id
unsigned int hashval = key + ((key & 0xFFFF0000)>>16);
return hashval%67;
}
/**
* addhash
* function to add data for a given key in the table
*
* @param key
* @param data - pointer to data stored
*
* @return - 0 for success
*/
int addhash (unsigned int key, void *data)
{
hash_table_t *newhash;
hash_table_t *cur_hash;
unsigned int hashval;
newhash = (hash_table_t *)(cpr_malloc(sizeof(hash_table_t)));
if (newhash == NULL) {
return -1;
}
newhash->key = key;
newhash->data = data;
hashval = sessionHash(key);
if (hashtable[hashval] == NULL) {
hashtable[hashval] = newhash;
hashtable[hashval]->prev = NULL;
hashtable[hashval]->next = NULL;
}
else {
cur_hash=hashtable[hashval];
while(cur_hash->next != NULL) {
cur_hash=cur_hash->next;
}
cur_hash->next = newhash;
newhash->next = NULL;
newhash->prev = cur_hash;
}
return 0;
}
/**
* returns the session id given a callid
* @param call_id
* @return sessionID or 0
*/
unsigned int ccpro_get_sessionId_by_callid(unsigned short call_id) {
int i;
hash_table_t *cur_hash;
for ( i=0; i<HASHBUCKETS ;i++){
cur_hash = hashtable[i];
while ( cur_hash) {
if ( (cur_hash->key & 0xffff) == call_id ) {
return cur_hash->key;
}
cur_hash = cur_hash->next;
}
}
return 0;
}
/**
* findhash
* function retrieve the data for the given key
*
* @param key
*
* @return the data ptr or NULL
*/
void *findhash(unsigned int key)
{
unsigned int hashval;
hash_table_t *cur_hash;
hashval = 0;
hashval = sessionHash(key);
cur_hash = hashtable[hashval];
while ( cur_hash != NULL ) {
if ( cur_hash->key == key) {
return cur_hash->data;
}
cur_hash = cur_hash->next;
}
return NULL;
}
/**
* delhash
* function to remove the hash entry for a given key
*
* @param key
*
* @return - 0 for success
*/
int delhash(unsigned int key)
{
unsigned int hashval;
hash_table_t *cur_hash;
hashval = 0;
hashval = sessionHash(key);
if (hashtable[hashval] == NULL) {
return -1;
}
if (hashtable[hashval]->key == key) {
cur_hash = hashtable[hashval];
hashtable[hashval] = cur_hash->next;
if ( hashtable[hashval] != NULL ) {
hashtable[hashval]->prev = NULL;
}
cpr_free(cur_hash);
return 0;
}
else {
cur_hash = hashtable[hashval]->next;
while (cur_hash != NULL) {
if (cur_hash->key == key) {
cur_hash->prev->next = cur_hash->next;
if (cur_hash->next != NULL) {
cur_hash->next->prev = cur_hash->prev;
}
cpr_free(cur_hash);
return 0;
}
cur_hash = cur_hash->next;
}
}
return -1;
}
#ifdef UNIT_TEST
void hashstats(int detail)
{
static const char *fname="hashstats";
int max, total, i, nodes, used;
double avg;
hash_table_t *cur_hash;
max = total = i = nodes = used = 0;
avg = 0;
if (detail > 0) {
for (i = 0; i < HASHBUCKETS; i++) {
if (hashtable[i] != NULL) {
used++;
nodes = 0;
cur_hash = hashtable[i];
while(cur_hash != NULL) {
nodes++;
if (detail > 3) {
CCAPPDEBUG(DEB_F_PREFIX"%lx -> %lx: (%lx) (%lx) -> %lx\n",
DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname),
cur_hash->prev, cur_hash, cur_hash->key, cur_hash->data, cur_hash->next);
}
cur_hash = cur_hash->next;
}
if (nodes != 0) total += nodes;
if (nodes > max) {
max = nodes;
}
if (detail > 1) {
CCAPPDEBUG(DEB_F_PREFIX"i: %d\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), i);
}
}
}
avg = (double)(total) / (double)(used);
CCAPPDEBUG(DEB_F_PREFIX"total: %d\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), total);
CCAPPDEBUG(DEB_F_PREFIX"max: %d\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), max);
CCAPPDEBUG(DEB_F_PREFIX"used: %lf\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), 100 * ((double)(used) / (double)(HASHBUCKETS)));
CCAPPDEBUG(DEB_F_PREFIX"average: %lf\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), avg);
}
}
int main()
{
static const char *fname="main";
hashItr_t itr;
void * data;
addhash(0x01010001,0x1234);
addhash(0x01060001,0x4567);
addhash(0x01060002,0x9324);
addhash(0x01070002,0x4321);
addhash(0x01070004,0x2134);
addhash(0x01080005,0x1324);
addhash(0x01030001,0x1243);
hashstats(7);
hashItrInit(&itr);
while ( data = hashItrNext(&itr) ) {
CCAPPDEBUG(DEB_F_PREFIX"Itr found %lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), data);
}
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01010001));
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01060001));
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01060002));
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01070002));
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01070004));
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01080005));
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01030001));
delhash(0x01030001);
delhash(0x01060001);
hashstats(7);
hashItrInit(&itr);
while ( data = hashItrNext(&itr) ) {
CCAPPDEBUG(DEB_F_PREFIX"Itr found %lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HAS, fname), data);
}
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01010001));
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01060001));
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01060002));
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01070002));
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01070004));
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01080005));
CCAPPDEBUG(DEB_F_PREFIX"%lx\n", DEB_F_PREFIX_ARGS(SIP_SES_HASH, fname), findhash(0x01030001));
}
#endif

View File

@ -1,23 +0,0 @@
/* 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/. */
typedef struct hash_table {
struct hash_table *next;
struct hash_table *prev;
unsigned int key;
void *data;
} hash_table_t;
typedef struct {
unsigned int bucket;
hash_table_t *node;
} hashItr_t;
extern void hashItrInit(hashItr_t *itr) ;
extern void * hashItrNext(hashItr_t *itr);
extern int addhash (unsigned int key, void *data) ;
extern int delhash(unsigned int key);
extern void *findhash(unsigned int key);
extern unsigned int ccpro_get_sessionId_by_callid(unsigned short call_id);

View File

@ -1,415 +0,0 @@
/* 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 "cpr_types.h"
#include "cpr_stdio.h"
#include "cpr_stdlib.h"
#include "cpr_string.h"
#include "cpr_socket.h"
#include "cpr_in.h"
#include <text_strings.h>
#include <cfgfile_utils.h>
#include <config.h>
#include <phone_debug.h>
#include "util_string.h"
#define IN6ADDRSZ 16
#define INT16SZ 2
#define INADDRSZ 4
#define IS_DIGIT(ch) ((ch >= '0') && (ch <= '9'))
/*
* Parse ascii dotted ip address notation into binary representation
* only parses and makes sure the address is in the form:
* digits.digits.digits.digits
* Requires minimum of 1 digit per each section and digits cannot
* exceed 255. It does NOT attempt to validate if the end result
* is a valid ip address or not (eg. 0.0.0.0) is accepted.
* The parsed address is returned in the Telecaster "byte reversed"
* order. Eg. 0xf8332ca1 = 161.44.51.248
*/
int
str2ip (const char *str, cpr_ip_addr_t *cpr_addr)
{
uint32_t ip_addr;
unsigned int num;
int dot_cnt;
char ch;
int digit_flag;
uint32_t *addr = (uint32_t *)&(cpr_addr->u.ip4);
dot_cnt = 0;
num = 0;
ip_addr = 0;
digit_flag = 0;
cpr_addr->type = CPR_IP_ADDR_INVALID;
while (1) {
ch = *str++;
if (!ch)
break; /* end of string */
/*
* Check for digits 0 through 9
*/
if (IS_DIGIT(ch)) {
digit_flag = 1;
num = num * 10 + (ch - '0');
if (num > 255) {
return (1);
}
continue;
} else if (ch == ':') {
//must be ipv6 address
cpr_addr->type = CPR_IP_ADDR_IPV6;
return(cpr_inet_pton(AF_INET6, str, addr));
}
/*
* Check for DOT. Must also have seen at least 1 digit prior
*/
if ((ch == '.') && (digit_flag)) {
dot_cnt++;
ip_addr = ((ip_addr << 8) | num);
num = 0;
digit_flag = 0;
continue;
}
/* if get here invalid dotted IP character or missing digit */
return (1);
}
/*
* Must have seen 3 dots exactly and at least 1 trailing digit
*/
if ((dot_cnt != 3) || (!digit_flag)) {
return (1);
}
ip_addr = ((ip_addr << 8) | num);
ip_addr = ntohl(ip_addr); /* convert to Telecaster format */
cpr_addr->type = CPR_IP_ADDR_IPV4;
*addr = ip_addr;
return (0);
}
/*
* Parse an IP address.
* If the IP address value is set to "" or to "UNPROVISIONED" it
* is set to its' default value.
*/
int
cfgfile_parse_ip (const var_t *entry, const char *value)
{
// RAC - Defaults will need to be handled on the Java Side.
// if ((*value == NUL) || (cpr_strcasecmp(value, "UNPROVISIONED") == 0)) {
// cfgfile_set_default(entry);
// return (0);
// } else {
return (str2ip(value, (cpr_ip_addr_t *) entry->addr));
// }
}
/*
* Print (format) an IP address.
* The IP address to be printed is in the Telecaster "byte reversed"
* order. Eg. 0xf8332ca1 = 248.51.44.161
*/
int
cfgfile_print_ip (const var_t *entry, char *buf, int len)
{
// RT phones receive the IP address in this order: 0xf8332ca1 = 161.44.51.248
cpr_ip_addr_t *cprIpAddrPtr = (cpr_ip_addr_t *)entry->addr;
if (cprIpAddrPtr->type == CPR_IP_ADDR_IPV4) {
sprint_ip(buf, cprIpAddrPtr->u.ip4);
return 1;
}
return 0;
}
/*
* Print (format) an IP address.
* The IP address to be printed is in the non-Telecaster "byte reversed"
* order - which is really network order. Eg. 0xa12c33f8 = 161.44.51.248
*/
int
cfgfile_print_ip_ntohl (const var_t *entry, char *buf, int len)
{
uint32_t ip;
ip = *(uint32_t *) entry->addr;
return (snprintf(buf, len, get_debug_string(DEBUG_IP_PRINT),
((ip >> 24) & (0xff)), ((ip >> 16) & (0xff)),
((ip >> 8) & (0xff)), ((ip >> 0) & (0xff))));
}
/*
* parse (copy) an ascii string
*/
int
cfgfile_parse_str (const var_t *entry, const char *value)
{
int str_len;
/* fixme: this could use malloc, or offer a different */
/* fixme: parser routine that does like parse_str_ptr */
/* fixme: in that case, free the old string and */
/* fixme: strdup the new string */
str_len = strlen(value);
if (str_len + 1 > entry->length) {
err_msg(get_debug_string(DEBUG_PARSER_STRING_TOO_LARGE),
entry->length, str_len);
return (1);
}
/*
* Copy string into config block
*/
sstrncpy((char *)entry->addr, value, entry->length);
return (0);
}
/*
* Print (format) at string
*/
int
cfgfile_print_str (const var_t *entry, char *buf, int len)
{
return (snprintf(buf, len, "%s", (char *)entry->addr));
}
/*
* Parse an ascii integer into binary
*/
int
cfgfile_parse_int (const var_t *entry, const char *value)
{
unsigned int num;
char ch;
num = 0;
if (strcmp(value, "UNPROVISIONED") == 0) {
num = 0;
} else {
while (1) {
ch = *value++;
if (!ch)
break; /* end of string */
/*
* Check for digits 0 through 9
*/
if (IS_DIGIT(ch)) {
num = num * 10 + (ch - '0');
continue;
}
/* if get here invalid decimal character */
return (1);
}
}
switch (entry->length) {
case 1:
*(uint8_t *) entry->addr = (uint8_t) num;
break;
case 2:
*(uint16_t *) entry->addr = (uint16_t) num;
break;
case 4:
*(uint32_t *) entry->addr = num;
break;
default:
*(unsigned int *) entry->addr = num;
break;
}
return (0);
}
/*
* print (format) an Integer
*/
int
cfgfile_print_int (const var_t *entry, char *buf, int len)
{
unsigned int value;
switch (entry->length) {
case 1:
value = *(uint8_t *) entry->addr;
break;
case 2:
value = *(uint16_t *) entry->addr;
break;
case 4:
value = *(uint32_t *) entry->addr;
break;
default:
value = *(unsigned int *) entry->addr;
break;
}
return (snprintf(buf, len, "%u", value));
}
/*
* Parse a keytable. A key table is a list of keywords. For each
* keyword there is an associated enum value (key value).
* search the keyword table for a matching keyword, and if found
* set the variable to the matching emum value.
*/
int
cfgfile_parse_key (const var_t *entry, const char *value)
{
const key_table_entry_t *keytable;
keytable = entry->key_table;
if (keytable == NULL) {
err_msg(get_debug_string(DEBUG_PARSER_NULL_KEY_TABLE));
return (1);
}
// RAC - This (If Needed) Will need to be moved to the Java Side.
// /* check for nulled out keys and set to the default value */
// if ((cpr_strcasecmp(value,"UNPROVISIONED") == 0) ||
// (value[0] == 0)) {
// err_msg(get_debug_string(DEBUG_PARSER_SET_DEFAULT),
// entry->name, entry->default_value);
// cfgfile_set_default(entry);
// return(0);
// }
while (keytable->name) {
if (cpr_strcasecmp(value, keytable->name) == 0) {
*(unsigned int *) entry->addr = keytable->value;
return (0);
}
keytable++;
}
err_msg(get_debug_string(DEBUG_PARSER_UNKNOWN_KEY), value);
return (1);
}
/*
* print (format) a key value. Search the table for the matching
* enum type, then format as output the keyname associated with it.
*/
int
cfgfile_print_key (const var_t *entry, char *buf, int len)
{
const key_table_entry_t *keytable;
int value;
keytable = entry->key_table;
value = *(int *) entry->addr;
while (keytable->name) {
if (value == keytable->value) {
return (snprintf(buf, len, "%s", keytable->name));
}
keytable++;
}
err_msg(get_debug_string(DEBUG_PARSER_UNKNOWN_KEY_ENUM), value);
return (0);
}
/*
* Sprintf an IP address in dotted notation.
*/
int
sprint_ip (char *buf, uint32_t ip)
{
return (sprintf(buf, get_debug_string(DEBUG_IP_PRINT),
((ip >> 0) & (0xff)), ((ip >> 8) & (0xff)),
((ip >> 16) & (0xff)), ((ip >> 24) & (0xff))));
}
/*
* print (format) a MAC address
*/
int
cfgfile_print_mac (const var_t *entry, char *buf, int len)
{
return (snprintf(buf, len, get_debug_string(DEBUG_MAC_PRINT),
((uint8_t *) entry->addr)[0] * 256 +
((uint8_t *) entry->addr)[1],
((uint8_t *) entry->addr)[2] * 256 +
((uint8_t *) entry->addr)[3],
((uint8_t *) entry->addr)[4] * 256 +
((uint8_t *) entry->addr)[5]));
}
/**
* Parse a keytable. A key table is a list of keywords. For each
* keyword there is an associated enum value (key value).
* search the keyword table for a matching keyword, and if found
* save the entire key etnry into the table.
*
* @param[in] entry - pointer ot var_t.
* @param[in] value - pointer to const. string of configuration value.
*
* @return 1 - failed to parsed the configuration.
* 0 - succesfull parsed the configuration value.
*
* @pre (entry != NULL)
* @pre (value != NULL)
*/
int
cfgfile_parse_key_entry (const var_t *entry, const char *value)
{
const key_table_entry_t *keytable;
keytable = entry->key_table;
if (keytable == NULL) {
err_msg(get_debug_string(DEBUG_PARSER_NULL_KEY_TABLE));
return (1);
}
while (keytable->name) {
if (cpr_strcasecmp(value, keytable->name) == 0) {
/* keep the entire entry */
*(key_table_entry_t *)entry->addr = *keytable;
return (0);
}
keytable++;
}
err_msg(get_debug_string(DEBUG_PARSER_UNKNOWN_KEY), value);
return (1);
}
/**
* print (format) a key value. Print the name of the key out.
*
* @param[in] entry - pointer ot var_t.
* @param[in] value - pointer to const. string of configuration value.
*
* @return always return 0.
*
* @pre (entry != NULL)
* @pre (value != NULL)
*/
int
cfgfile_print_key_entry (const var_t *entry, char *buf, int len)
{
key_table_entry_t *key;
key = (key_table_entry_t *) entry->addr;
if (key->name != NULL) {
return (snprintf(buf, len, "%s", key->name));
} else {
/* the entry is not even configured */
return (0);
}
}

View File

@ -1,96 +0,0 @@
/* 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/. */
#ifndef _CFGFILE_UTILS_H_
#define _CFGFILE_UTILS_H_
#include "cpr_types.h"
//=============================================================================
//
// Structure/Type definitions
//
//-----------------------------------------------------------------------------
struct var_struct;
typedef int (*parse_func_t)(const struct var_struct *, const char *);
typedef int (*print_func_t)(const struct var_struct *, char *, int);
typedef struct {
const char *name;
int value;
} key_table_entry_t;
#define NULL_KEY (-1)
typedef struct var_struct {
const char *name;
void *addr;
int length;
parse_func_t parse_func;
print_func_t print_func;
const key_table_entry_t *key_table;
} var_t;
/*********************************************************
*
* Config Table "Helper" Routines
*
* These #defines are routines that are called from the
* config table entries to parse (PA), print (PR),
* and export (XP), different config entries. These are the
* "common" helper routines. Protocol-specific routines
* are located in prot_configmgr_private.h
*
*********************************************************/
#define PA_IP cfgfile_parse_ip
#define PR_IP cfgfile_print_ip
#define PR_IPN cfgfile_print_ip_ntohl
#define PA_STR cfgfile_parse_str
#define PR_STR cfgfile_print_str
#define PA_INT cfgfile_parse_int
#define PR_INT cfgfile_print_int
#define PA_KEY cfgfile_parse_key
#define PA_KEYE cfgfile_parse_key_entry
#define PR_KEY cfgfile_print_key
#define PR_KEYE cfgfile_print_key_entry
#define PR_MAC cfgfile_print_mac
#define XP_NONE 0
/*********************************************************
*
* Config Table "Helper" Macros
*
* These macros are used to help build the actual config
* table. They provide the address and length of the
* entries. They also tell which table the entry is
* stored in.
*
*********************************************************/
#define CFGADDR(field) ((void*)&(prot_cfg_block.field))
#define CFGLEN(field) (sizeof(prot_cfg_block.field))
#define CFGVAR(field) CFGADDR(field),CFGLEN(field)
/* generic config file parsing functions */
int cfgfile_parse_ip(const var_t *, const char *value);
int cfgfile_parse_str(const var_t *, const char *value);
int cfgfile_parse_int(const var_t *, const char *value);
int cfgfile_parse_key(const var_t *, const char *value);
int cfgfile_parse_key_entry(const var_t *, const char *value);
/* generic config file printing functions */
int cfgfile_print_ip(const var_t *, char *buf, int);
int cfgfile_print_ip_ntohl(const var_t *, char *buf, int);
int cfgfile_print_str(const var_t *, char *buf, int);
int cfgfile_print_int(const var_t *, char *buf, int);
int cfgfile_print_key(const var_t *, char *buf, int);
int cfgfile_print_key_entry(const var_t *, char *buf, int);
/* generic config file export (print) functions */
int sprint_ip(char *, uint32_t ip);
int sprint_mac(char *, const unsigned char *ptr);
int cfgfile_print_mac(const var_t *entry, char *buf, int);
#endif /* _CFGFILE_UTILS_H_ */

View File

@ -1,498 +0,0 @@
/* 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 "cpr_types.h"
#include "cpr_stdio.h"
#include "cpr_string.h"
#include "config.h"
#include "dns_utils.h"
#include "phone_debug.h"
#include "ccapi.h"
#include "debug.h"
cc_int32_t ConfigDebug;
/*
* This file contains the API routines that are used to
* access the config table.
*
* Avoid writing more of these routines.
* Try and reuse these routines as much as possible.
*
* We should be able to set and retrieve any type of value
* using one of these routines.
*/
/*
* Function: config_get_string()
*
* Description: Get any arbitrary config entry as a string
*
* Parameters: id - The id of the config string to get
* buffer - Empty buffer where string will be copied
* buffer_len - length of the buffer where string will be copied
*
* Returns: None
*/
void
config_get_string (int id, char *buffer, int buffer_len)
{
const var_t *entry;
char *buf_start;
/*
* Set the result to be empty in case we can't find anything
*/
buffer[0] = 0;
if ((id >= 0) && (id < CFGID_PROTOCOL_MAX)) {
entry = &prot_cfg_table[id];
if (entry->length > buffer_len) {
CONFIG_ERROR(CFG_F_PREFIX"insufficient buffer: %d\n", "config_get_string",
id);
} else {
buf_start = buffer;
entry->print_func(entry, buffer, buffer_len);
CONFIG_DEBUG(DEB_F_PREFIX"CFGID %d: get str: %s = %s\n", DEB_F_PREFIX_ARGS(CONFIG_API, "config_get_string"), id, entry->name,
buf_start);
}
} else {
CONFIG_ERROR(CFG_F_PREFIX"Invalid ID: %d\n", "config_get_string", id);
}
}
/*
* Function: config_set_string()
*
* Parameters: id - The id of the config string to set
* buffer - The new value for the string
*
* Description: Set any arbitrary config entry as a string
*
* Returns: None
*/
void
config_set_string (int id, char *buffer)
{
const var_t *entry;
if ((id >= 0) && (id < CFGID_PROTOCOL_MAX)) {
entry = &prot_cfg_table[id];
if (entry->parse_func(entry, buffer)) {
/* Parse function returned an error */
CONFIG_ERROR(CFG_F_PREFIX"Parse function failed. ID: %d %s:%s\n", "config_set_string", id, entry->name, buffer);
} else {
CONFIG_DEBUG(DEB_F_PREFIX"CFGID %d: %s set str to %s\n", DEB_F_PREFIX_ARGS(CONFIG_API, "config_set_string"), id, entry->name,
buffer);
}
} else {
CONFIG_ERROR(CFG_F_PREFIX"Invalid ID: %d\n", "config_set_string", id);
}
}
#define MAX_CONFIG_VAL_PRINT_LEN 256
/*
* Function: print_config_value()
*
* Description: If debug is enabled then print value contained in
* the buffer. Cast and dereference the buffer ptr
* according to length. If no match to char, short,
* int or long then just print each byte (ex: MacAddr).
* Called by config_set/get_value() function.
*
* Parameters: id - the id of the config value to get
* get_set - config action (get val or set val)
* entry_name - config id name
* buffer - buffer containing the value
* length - number of bytes in the buffer
*
* Returns: none
*/
/*
* Some logical upper limit to avoid long print out in case
* of large length value
*/
void
print_config_value (int id, char *get_set, const char *entry_name,
void *buffer, int length)
{
long long_val = 0;
int int_val = 0;
short short_val = 0;
char char_val = 0;
char str[MAX_CONFIG_VAL_PRINT_LEN];
char *in_ptr;
char *str_ptr;
if (length == sizeof(char)) {
char_val = *(char *) buffer;
long_val = (long) char_val;
CONFIG_DEBUG(DEB_F_PREFIX"CFGID %d: %s: %s = %ld\n", DEB_F_PREFIX_ARGS(CONFIG_API, "print_config_value"), id, get_set, entry_name,
long_val);
} else if (length == sizeof(short)) {
short_val = *(short *) buffer;
long_val = (long) short_val;
CONFIG_DEBUG(DEB_F_PREFIX"CFGID %d: %s: %s = %ld\n", DEB_F_PREFIX_ARGS(CONFIG_API, "print_config_value"), id, get_set, entry_name,
long_val);
} else if (length == sizeof(int)) {
int_val = *(int *) buffer;
long_val = (long) int_val;
CONFIG_DEBUG(DEB_F_PREFIX"CFGID %d: %s: %s = %ld\n", DEB_F_PREFIX_ARGS(CONFIG_API, "print_config_value"), id, get_set, entry_name,
long_val);
} else if (length == sizeof(long)) {
long_val = *(long *) buffer;
CONFIG_DEBUG(DEB_F_PREFIX"CFGID %d: %s: %s = %ld\n", DEB_F_PREFIX_ARGS(CONFIG_API, "print_config_value"), id, get_set, entry_name,
long_val);
} else if (length < MAX_CONFIG_VAL_PRINT_LEN / 2) {
in_ptr = (char *) buffer;
str_ptr = &str[0];
while (length--) {
sprintf(str_ptr++, "%02x", *in_ptr++);
str_ptr++;
}
*str_ptr = '\0';
CONFIG_DEBUG(DEB_F_PREFIX"CFGID %d: %s: %s = %s\n", DEB_F_PREFIX_ARGS(CONFIG_API, "print_config_value"), id, get_set, entry_name, str);
} else {
CONFIG_ERROR(CFG_F_PREFIX"cfg_id = %d length too long -> %d\n", "print_config_value",
id, length);
}
}
/*
* Function: config_get_value()
*
* Description: Get any arbitrary config entry as a raw data value.
* If the length doesn't match the actual length of the field,
* nothing will be copied.
*
* Parameters: id - The id of the config value to get
* buffer - Empty buffer where value will be copied
* length - The number of bytes to get
*
* Returns: None
*/
void
config_get_value (int id, void *buffer, int length)
{
const var_t *entry;
/*
* Retrieve raw entry from table.....
*/
if ((id >= 0) && (id < CFGID_PROTOCOL_MAX)) {
entry = &prot_cfg_table[id];
if (length == entry->length) {
memcpy(buffer, entry->addr, entry->length);
if (ConfigDebug) {
print_config_value(id, "Get Val", entry->name, buffer, length);
}
} else {
CONFIG_ERROR(CFG_F_PREFIX"%s size error\n", "config_get_value",
entry->name);
}
} else {
CONFIG_ERROR(CFG_F_PREFIX"Invalid ID: %d\n", "config_get_value", id);
}
}
/*
* Function: config_set_value()
*
* Description: Set arbitrary config entry as a raw data value.
* If the length doesn't match the actual length of the field,
* nothing will be copied.
*
* Parameters: id - The id of the config value to set
* buffer - The new value to be set
* length - The number of bytes to set
*
* Returns: None
*/
void
config_set_value (int id, void *buffer, int length)
{
const var_t *entry;
/*
* Retrieve entry from table.....
*/
if ((id >= 0) && (id < CFGID_PROTOCOL_MAX)) {
entry = &prot_cfg_table[id];
if (entry->length != length) {
CONFIG_ERROR(CFG_F_PREFIX" %s size error entry size=%d, len=%d\n",
"config_set_value", entry->name, entry->length, length);
return;
}
memcpy(entry->addr, buffer, entry->length);
if (ConfigDebug) {
print_config_value(id, "Set Val", entry->name, buffer, length);
}
} else {
CONFIG_ERROR(CFG_F_PREFIX"Invalid ID: %d\n", "config_set_value", id);
}
}
/* Function: get_printable_cfg()
*
* Description: prints the config value in the buf
*
* Parameters: indx, buf, len
*
* Returns: buf
*/
char *
get_printable_cfg(unsigned int indx, char *buf, unsigned int len)
{
const var_t *table;
buf[0]=0;
table = &prot_cfg_table[indx];
// If this field has a password, print the param name, but NOT the
// real password
if (indx>=CFGID_LINE_PASSWORD && indx < CFGID_LINE_PASSWORD+MAX_CONFIG_LINES) {
// and add an invisible one
sstrncpy(buf, "**********", MAX_CONFIG_VAL_PRINT_LEN);
} else if ( table->print_func ) {
table->print_func(table, buf, len);
}
if ( buf[0] == 0 ) {
sstrncpy(buf,"EMPTY", len);
}
return buf;
}
/*
* Function: show_config_cmd()
*
* Description: Callback passed in the config init routine for show config
*
* Parameters: argc, argv
*
* Returns: zero(0)
*/
cc_int32_t
show_config_cmd (cc_int32_t argc, const char *argv[])
{
const var_t *table;
char buf[MAX_CONFIG_VAL_PRINT_LEN];
int i, feat;
debugif_printf("\n%s\n", "------ Current *Cache* Configuration ------");
table = prot_cfg_table;
for ( i=0; i < CFGID_LINE_FEATURE; i++ ) {
if (table->print_func) {
table->print_func(table, buf, sizeof(buf));
// If this field has a password, print the param name, but NOT the
// real password
if (strstr(table->name, "Password") != 0) {
// and add an invisible one
sstrncpy(buf, "**********", sizeof(buf));
}
debugif_printf("%s : %s\n", table->name, buf);
}
table++;
}
debugif_printf("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\n",
prot_cfg_table[CFGID_LINE_INDEX].name,
prot_cfg_table[CFGID_LINE_FEATURE].name,
prot_cfg_table[CFGID_LINE_MAXNUMCALLS].name,
prot_cfg_table[CFGID_LINE_BUSY_TRIGGER].name,
prot_cfg_table[CFGID_PROXY_ADDRESS].name,
prot_cfg_table[CFGID_PROXY_PORT].name,
prot_cfg_table[CFGID_LINE_CALL_WAITING].name,
prot_cfg_table[CFGID_LINE_MSG_WAITING_LAMP].name,
prot_cfg_table[CFGID_LINE_MESSAGE_WAITING_AMWI].name,
prot_cfg_table[CFGID_LINE_RING_SETTING_IDLE].name,
prot_cfg_table[CFGID_LINE_RING_SETTING_ACTIVE].name,
prot_cfg_table[CFGID_LINE_NAME].name,
prot_cfg_table[CFGID_LINE_AUTOANSWER_ENABLED].name,
prot_cfg_table[CFGID_LINE_AUTOANSWER_MODE].name,
prot_cfg_table[CFGID_LINE_AUTHNAME].name,
prot_cfg_table[CFGID_LINE_PASSWORD].name,
prot_cfg_table[CFGID_LINE_DISPLAYNAME].name,
prot_cfg_table[CFGID_LINE_CONTACT].name);
for (i=0; i< MAX_CONFIG_LINES; i++) {
config_get_value(CFGID_LINE_FEATURE+i, &feat, sizeof(feat));
if ( feat != CC_FEATURE_NONE ){
debugif_printf("%3s ", get_printable_cfg(CFGID_LINE_INDEX+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%4s ", get_printable_cfg(CFGID_LINE_FEATURE+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%3s ", get_printable_cfg(CFGID_LINE_MAXNUMCALLS+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%3s ", get_printable_cfg(CFGID_LINE_BUSY_TRIGGER+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%12s ", get_printable_cfg(CFGID_PROXY_ADDRESS+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%s ", get_printable_cfg(CFGID_PROXY_PORT+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%3s ", get_printable_cfg(CFGID_LINE_CALL_WAITING+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%6s ", get_printable_cfg(CFGID_LINE_MSG_WAITING_LAMP+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%6s ", get_printable_cfg(CFGID_LINE_MESSAGE_WAITING_AMWI+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%6s ", get_printable_cfg(CFGID_LINE_RING_SETTING_IDLE+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%6s ", get_printable_cfg(CFGID_LINE_RING_SETTING_ACTIVE+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf(" %s ", get_printable_cfg(CFGID_LINE_NAME+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%s ", get_printable_cfg(CFGID_LINE_AUTOANSWER_ENABLED+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%s ", get_printable_cfg(CFGID_LINE_AUTOANSWER_MODE+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%s ", get_printable_cfg(CFGID_LINE_AUTHNAME+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%s ", get_printable_cfg(CFGID_LINE_PASSWORD+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%s ", get_printable_cfg(CFGID_LINE_DISPLAYNAME+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
debugif_printf("%s\n", get_printable_cfg(CFGID_LINE_CONTACT+i, buf, MAX_CONFIG_VAL_PRINT_LEN));
}
}
return (0);
}
/**********************************************
* Line-Based Config API
**********************************************/
/*
* Function: config_get_line_id()
*
* Description: Given the line and the line-specific ID, this function
* will return the actual ID used to access the value in the
* config table.
*
* Parameters: id - The id config value to get
* line - The line that the ID is associated with
*
* Returns: TRUE if the entry is found
* FALSE otherwise.
*/
static int
config_get_line_id (int id, int line)
{
int line_id = 0;
const var_t *entry;
if ((line == 0) || (line > MAX_REG_LINES)) {
entry = &prot_cfg_table[id]; // XXX set but not used
(void) entry;
CONFIG_ERROR(CFG_F_PREFIX"ID=%d- line %d out of range\n", "config_get_line_id", id, line);
return (0);
}
line_id = id + line - 1;
return (line_id);
}
/*
* Function: config_get_line_string()
*
* Description: Get any arbitrary line config entry as a string
*
* Parameters: id - The id of the config string to get
* buffer - Empty buffer where string will be copied
* line - The line that the ID is associated with
* buffer_len - length of the output buffer
*
* Returns: None
*/
void
config_get_line_string (int id, char *buffer, int line, int buffer_len)
{
int line_id = 0;
line_id = config_get_line_id(id, line);
if (line_id) {
config_get_string(line_id, buffer, buffer_len);
}
}
/*
* Function: config_set_line_string()
*
* Description: Set any arbitrary line config entry as a string
*
* Parameters: id - The id of the config string to set
* buffer - The new value for the string
* line - The line that the ID is associated with
*
* Returns: None
*/
void
config_set_line_string (int id, char *buffer, int line)
{
int line_id = 0;
line_id = config_get_line_id(id, line);
if (line_id) {
config_set_string(line_id, buffer);
}
}
/*
* Function: config_get_line_value()
*
* Parameters: id - The id of the config value to get
* *buffer - Empty buffer where value will be copied
* length - The number of bytes to get
* line - The line that the ID is associated with
*
* Description: Get any arbitrary line config entry as a raw data value.
* If the length doesn't match the actual length of the field,
* nothing will be copied.
*
* Returns: None
*/
void
config_get_line_value (int id, void *buffer, int length, int line)
{
int line_id = 0;
line_id = config_get_line_id(id, line);
if (line_id) {
config_get_value(line_id, buffer, length);
}
}
/*
* Function: config_set_line_value()
*
* Description: Set arbitrary config entry as a raw data value.
* If the length doesn't match the actual length of the field,
* nothing will be copied.
*
* Parameters: id - The id of the config value to set
* buffer - The new value to be set
* length - The number of bytes to set
* line - The line that the ID is associated with
*
* Returns: None
*/
void
config_set_line_value (int id, void *buffer, int length, int line)
{
int line_id = 0;
line_id = config_get_line_id(id, line);
if (line_id) {
config_set_value(line_id, buffer, length);
}
}
/*
* Function: config_init()
*
* Description: Initialize the Config Debug command
*
* Parameters: none
*
* Returns: none
*
*/
void
config_init (void)
{
/* Place holder for future init related actions */
}

View File

@ -1,641 +0,0 @@
/* 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 <stdio.h>
#include "cc_constants.h"
#include "cc_types.h"
#include "cc_config.h"
#include "phone_debug.h"
#include "debug.h"
#include "ccapi.h"
#include "prot_configmgr.h"
#include "call_logger.h"
#include "sip_common_transport.h"
#include "sip_ccm_transport.h"
#include "config_parser.h"
#include "cc_device_feature.h"
#include "ccapi_snapshot.h"
#include "config_api.h"
#include "capability_set.h"
#include "util_string.h"
#define MAC_ADDR_SIZE 6
#define FILE_PATH 256
#define MAX_MULTI_LEVEL_CONFIG 2
#define MLCFG_VIDEO_CAPABILITY 0
#define MLCFG_CISCO_CAMERA 1
#define MLCFG_CAPABILITY_MAX 2
#define MLCFG_NOT_SET -1
#define VERSION_LENGTH_MAX 100
#define ID_BLOCK_PREF1 1
#define ID_BLOCK_PREF3 3
/*
* File location is hardcoded for getting mac and IP addr
*/
#define IP_ADDR_FILE "/sdcard/myip.txt"
static char autoreg_name[MAX_LINE_NAME_SIZE];
static char fcpTemplateFile[FILE_PATH] = "";
char g_cfg_version_stamp[MAX_CFG_VERSION_STAMP_LEN + 1] = {0};
int line = -1; //initialize line to -1, as 0 is valid line
boolean apply_config = FALSE;
cc_apply_config_result_t apply_config_result = APPLY_CONFIG_NONE;
extern var_t prot_cfg_table[];
void print_config_value (int id, char *get_set, const char *entry_name, void *buffer, int length);
static int sip_port[MAX_CCM];
static int secured_sip_port[MAX_CCM];
static int security_mode = 3; /*SECURE*/
extern accessory_cfg_info_t g_accessoryCfgInfo;
// Configurable settings
static int gTransportLayerProtocol = 4; // 4 = tcp, 2 = udp
static boolean gP2PSIP = FALSE;
static boolean gSDPMODE = FALSE;
static boolean gRTPSAVPF = TRUE; /* TRUE = RTP/SAVPF , FALSE = RTP/SAVP */
static int gVoipControlPort = 5060;
static int gCcm1_sip_port = 5060;
/*
* This function determine whether the passed config parameter should be used
* in comparing the new and old config value for apply-config purpose. Only
* those config ids on whose change phone needs to restart are part of this
* function. For remaining parameters, it is assumed that any change can be
* applied dynamically.
*
*/
boolean is_cfgid_in_restart_list(int cfgid) {
if ((cfgid >= CFGID_LINE_FEATURE && cfgid < (CFGID_LINE_FEATURE + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_INDEX && cfgid < (CFGID_LINE_INDEX + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_PROXY_ADDRESS && cfgid < (CFGID_PROXY_ADDRESS + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_PROXY_PORT && cfgid < (CFGID_PROXY_PORT + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_NAME && cfgid < (CFGID_LINE_NAME + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_DISPLAYNAME && cfgid < (CFGID_LINE_DISPLAYNAME + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_SPEEDDIAL_NUMBER && cfgid < (CFGID_LINE_SPEEDDIAL_NUMBER + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_MESSAGES_NUMBER && cfgid < (CFGID_LINE_MESSAGES_NUMBER + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_FWD_CALLER_NAME_DIPLAY && cfgid < (CFGID_LINE_FWD_CALLER_NAME_DIPLAY + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_FWD_CALLER_NUMBER_DIPLAY && cfgid < (CFGID_LINE_FWD_CALLER_NUMBER_DIPLAY + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_FWD_REDIRECTED_NUMBER_DIPLAY && cfgid < (CFGID_LINE_FWD_REDIRECTED_NUMBER_DIPLAY + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_FWD_DIALED_NUMBER_DIPLAY && cfgid < (CFGID_LINE_FWD_DIALED_NUMBER_DIPLAY + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_CALL_WAITING && cfgid < (CFGID_LINE_CALL_WAITING + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_AUTHNAME && cfgid < (CFGID_LINE_AUTHNAME + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_PASSWORD && cfgid < (CFGID_LINE_PASSWORD + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_FEATURE_OPTION_MASK && cfgid < (CFGID_LINE_FEATURE_OPTION_MASK + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_MSG_WAITING_LAMP && cfgid < (CFGID_LINE_MSG_WAITING_LAMP + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_MESSAGE_WAITING_AMWI && cfgid < (CFGID_LINE_MESSAGE_WAITING_AMWI + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_RING_SETTING_IDLE && cfgid < (CFGID_LINE_RING_SETTING_IDLE + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_RING_SETTING_ACTIVE && cfgid < (CFGID_LINE_RING_SETTING_ACTIVE + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_CONTACT && cfgid < (CFGID_LINE_CONTACT + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_MAXNUMCALLS && cfgid < (CFGID_LINE_MAXNUMCALLS + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_BUSY_TRIGGER && cfgid < (CFGID_LINE_BUSY_TRIGGER + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_AUTOANSWER_ENABLED && cfgid < (CFGID_LINE_AUTOANSWER_ENABLED + MAX_CONFIG_LINES)) ||
(cfgid >= CFGID_LINE_AUTOANSWER_MODE && cfgid < (CFGID_LINE_AUTOANSWER_MODE + MAX_CONFIG_LINES))
)
{
return TRUE;
}
switch (cfgid) {
case CFGID_CCM1_ADDRESS:
case CFGID_CCM2_ADDRESS:
case CFGID_CCM3_ADDRESS:
case CFGID_CCM1_SIP_PORT:
case CFGID_CCM2_SIP_PORT:
case CFGID_CCM3_SIP_PORT:
case CFGID_PROXY_BACKUP:
case CFGID_PROXY_BACKUP_PORT:
case CFGID_PROXY_EMERGENCY:
case CFGID_PROXY_EMERGENCY_PORT:
case CFGID_OUTBOUND_PROXY:
case CFGID_OUTBOUND_PROXY_PORT:
case CFGID_PROXY_REGISTER:
case CFGID_REMOTE_CC_ENABLED:
case CFGID_SIP_INVITE_RETX:
case CFGID_SIP_RETX:
case CFGID_TIMER_INVITE_EXPIRES:
case CFGID_TIMER_KEEPALIVE_EXPIRES:
case CFGID_TIMER_SUBSCRIBE_EXPIRES:
case CFGID_TIMER_SUBSCRIBE_DELTA:
case CFGID_TIMER_T1:
case CFGID_TIMER_T2:
case CFGID_SIP_MAX_FORWARDS:
case CFGID_REMOTE_PARTY_ID:
case CFGID_REG_USER_INFO:
case CFGID_PREFERRED_CODEC:
case CFGID_VOIP_CONTROL_PORT:
case CFGID_NAT_ENABLE:
case CFGID_NAT_ADDRESS:
case CFGID_NAT_RECEIVED_PROCESSING:
case CFGID_DTMF_AVT_PAYLOAD:
case CFGID_DTMF_DB_LEVEL:
case CFGID_DTMF_OUTOFBAND:
case CFGID_KPML_ENABLED:
case CFGID_MEDIA_PORT_RANGE_START:
case CFGID_TRANSPORT_LAYER_PROT:
case CFGID_TIMER_REGISTER_EXPIRES:
case CFGID_TIMER_REGISTER_DELTA:
case CFGID_DSCP_FOR_CALL_CONTROL:
return TRUE;
default:
return FALSE;
}
}
/*
* This function either compare the new and old config value or set the value
* for the config_id passed depending upon whether apply-config is true or not.
*/
void compare_or_set_byte_value(int cfgid, unsigned char value, const unsigned char * config_name) {
int temp_value ;
const var_t *entry;
if (apply_config == TRUE) {
if (is_cfgid_in_restart_list(cfgid) == TRUE) {
config_get_value(cfgid, &temp_value, sizeof(temp_value));
if (((int)value) != temp_value) {
apply_config_result = RESTART_NEEDED;
entry = &prot_cfg_table[cfgid];
print_config_value(cfgid, "changed Get Val", entry->name, &temp_value, sizeof(temp_value));
DEF_DEBUG(CFG_F_PREFIX "config %s[%d] changed. Old value=%d new value=%d\n", "compare_or_set_byte_value", config_name, cfgid, temp_value, value);
}
}
} else {
CC_Config_setByteValue(cfgid, value);
}
}
/*
* This function either compare the new and old config value or set the value
* for the config_id passed depending upon whether apply-config is true or not.
*/
void compare_or_set_boolean_value(int cfgid, cc_boolean value, const unsigned char * config_name) {
int temp_value ;
const var_t *entry;
if (apply_config == TRUE) {
if (is_cfgid_in_restart_list(cfgid) == TRUE) {
config_get_value(cfgid, &temp_value, sizeof(temp_value));
if (((int)value) != temp_value) {
apply_config_result = RESTART_NEEDED;
entry = &prot_cfg_table[cfgid];
print_config_value(cfgid, "changed Get Val", entry->name, &temp_value, sizeof(temp_value));
DEF_DEBUG(CFG_F_PREFIX "config %s[%d] changed. Old value=%d new value=%d\n", "compare_or_set_boolean_value", config_name, cfgid, temp_value, value);
}
}
} else {
CC_Config_setBooleanValue(cfgid, value);
}
}
/*
* This function either compare the new and old config value or set the value
* for the config_id passed depending upon whether apply-config is true or not.
*/
void compare_or_set_int_value(int cfgid, int value, const unsigned char * config_name) {
int temp_value;
const var_t *entry;
if (apply_config == TRUE) {
if (is_cfgid_in_restart_list(cfgid) == TRUE) {
config_get_value(cfgid, &temp_value, sizeof(temp_value));
if (value != temp_value) {
apply_config_result = RESTART_NEEDED;
entry = &prot_cfg_table[cfgid];
print_config_value(cfgid, "changed Get Val", entry->name, &temp_value, sizeof(temp_value));
DEF_DEBUG(CFG_F_PREFIX "config %s[%d] changed. new value=%d Old value=%d\n", "compare_or_set_int_value", config_name, cfgid, value, temp_value);
}
}
} else {
CC_Config_setIntValue(cfgid, value);
}
}
/*
* This function either compare the new and old config value or set the value
* for the config_id passed depending upon whether apply-config is true or not.
*/
void compare_or_set_string_value (int cfgid, const char* value, const unsigned char * config_name) {
static char temp_value[MAX_SIP_URL_LENGTH];
const var_t *entry;
if (apply_config == TRUE ) {
if (is_cfgid_in_restart_list(cfgid) == TRUE) {
config_get_string(cfgid, temp_value, MAX_SIP_URL_LENGTH);
if (strcmp(value, temp_value) != 0) {
apply_config_result = RESTART_NEEDED;
entry = &prot_cfg_table[cfgid];
print_config_value(cfgid, "changed Get Val", entry->name, &temp_value, sizeof(temp_value));
DEF_DEBUG(CFG_F_PREFIX "config %s[%d] changed. new value=%s Old value=%s\n", "compare_or_set_string_value", config_name, cfgid, value, temp_value);
}
}
} else {
CC_Config_setStringValue(cfgid, value);
}
}
int lineConfig = 0;
int portConfig = 0;
int proxyConfig = 0;
/*
* config_set_autoreg_properties
*
*/
void config_set_autoreg_properties ()
{
CC_Config_setIntValue(CFGID_LINE_INDEX + 0, 1);
CC_Config_setIntValue(CFGID_LINE_FEATURE + 0, 9);
CC_Config_setStringValue(CFGID_PROXY_ADDRESS + 0, "USECALLMANAGER");
CC_Config_setIntValue(CFGID_PROXY_PORT + 0, 5060);
CC_Config_setStringValue(CFGID_LINE_NAME + 0, autoreg_name);
CC_Config_setBooleanValue(CFGID_PROXY_REGISTER, 1);
CC_Config_setIntValue(CFGID_TRANSPORT_LAYER_PROT, 2);
/* timerRegisterExpires = 3600 */
CC_Config_setIntValue(CFGID_TIMER_REGISTER_EXPIRES, 3600);
/* sipRetx = 10 */
CC_Config_setIntValue(CFGID_SIP_RETX, 10);
/* sipInviteRetx = 6 */
CC_Config_setIntValue(CFGID_SIP_INVITE_RETX, 6);
/* timerRegisterDelta = 5 */
CC_Config_setIntValue(CFGID_TIMER_REGISTER_DELTA, 5);
/* MaxRedirects = 70 */
CC_Config_setIntValue(CFGID_SIP_MAX_FORWARDS, 70);
/* timerInviteExpires = 180 */
CC_Config_setIntValue(CFGID_TIMER_INVITE_EXPIRES, 180);
/* timerSubscribeDelta = 5 */
CC_Config_setIntValue(CFGID_TIMER_SUBSCRIBE_DELTA, 5);
/* timerSubscribeExpires = 120 */
CC_Config_setIntValue(CFGID_TIMER_SUBSCRIBE_EXPIRES, 120);
CC_Config_setIntValue(CFGID_REMOTE_CC_ENABLED, 1);
CC_Config_setIntValue(CFGID_VOIP_CONTROL_PORT, 5060);
}
/*
* update_security_mode_and_ports
*
*/
void update_security_mode_and_ports(void) {
sec_level_t sec_level = NON_SECURE;
// convert security mode (from UCM xml) into internal enum
switch (security_mode)
{
case 1: sec_level = NON_SECURE; break;
case 2: sec_level = AUTHENTICATED; break;
case 3: sec_level = ENCRYPTED; break;
default:
CONFIG_ERROR(CFG_F_PREFIX "unable to translate securite mode [%d]\n", "update_security_mode_and_ports", (int)security_mode);
break;
}
compare_or_set_int_value(CFGID_CCM1_SEC_LEVEL, sec_level,
(const unsigned char *)"deviceSecurityMode");
compare_or_set_int_value(CFGID_CCM2_SEC_LEVEL, sec_level,
(const unsigned char *)"deviceSecurityMode");
compare_or_set_int_value(CFGID_CCM3_SEC_LEVEL, sec_level,
(const unsigned char *)"deviceSecurityMode");
if (sec_level == NON_SECURE) {
compare_or_set_int_value(CFGID_CCM1_SIP_PORT, sip_port[0],
(const unsigned char *)"ccm1_sip_port");
compare_or_set_int_value(CFGID_CCM2_SIP_PORT, sip_port[1],
(const unsigned char *)"ccm2_sip_port");
compare_or_set_int_value(CFGID_CCM3_SIP_PORT, sip_port[2],
(const unsigned char *)"ccm3_sip_port");
} else {
compare_or_set_int_value(CFGID_CCM1_SIP_PORT, secured_sip_port[0],
(const unsigned char *)"ccm1_secured_sip_port");
compare_or_set_int_value(CFGID_CCM2_SIP_PORT, secured_sip_port[1],
(const unsigned char *)"ccm2_secured_sip_port");
compare_or_set_int_value(CFGID_CCM3_SIP_PORT, secured_sip_port[2],
(const unsigned char *)"ccm3_secured_sip_port");
}
}
#define MISSEDCALLS "Application:Cisco/MissedCalls"
#define PLACEDCALLS "Application:Cisco/PlacedCalls"
#define RECEIVEDCALLS "Application:Cisco/ReceivedCalls"
/*
* config_get_mac_addr
*
* Get the filename that has the mac address and parse the string
* convert it into an mac address stored in the bytearray maddr
*/
void config_get_mac_addr (char *maddr)
{
platGetMacAddr(maddr);
}
/*
* Set the MAC address in the config table
*/
void config_set_ccm_ip_mac ()
{
char macaddr[MAC_ADDR_SIZE];
compare_or_set_int_value(CFGID_DSCP_FOR_CALL_CONTROL , 1, (const unsigned char *) "DscpCallControl");
compare_or_set_int_value(CFGID_SPEAKER_ENABLED, 1, (const unsigned char *) "speakerEnabled");
if (apply_config == FALSE) {
config_get_mac_addr(macaddr);
CONFIG_DEBUG(CFG_F_PREFIX ": MAC Address IS: %x:%x:%x:%x:%x:%x \n",
"config_get_mac_addr", macaddr[0], macaddr[1],
macaddr[2], macaddr[3], macaddr[4], macaddr[5]);
CC_Config_setArrayValue(CFGID_MY_MAC_ADDR, macaddr, MAC_ADDR_SIZE);
CC_Config_setArrayValue(CFGID_MY_ACTIVE_MAC_ADDR, macaddr, MAC_ADDR_SIZE);
}
}
/*
* config_setup_element
* Setup elements that once were downloaded from CUCM in an XML file.
* Settings are stored in config.h
*/
void config_setup_elements (const char *sipUser, const char *sipPassword, const char *sipDomain)
{
unsigned int i;
// char buf[MAX_SIP_URL_LENGTH] = {'\0'};
char ip[MAX_SIP_URL_LENGTH] = {'\0'};
char option[MAX_SIP_URL_LENGTH] = {'\0'};
int line = 0;
cc_boolean isSecure = FALSE, isValid = TRUE;
char macaddr[MAC_ADDR_SIZE];
compare_or_set_int_value(CFGID_MEDIA_PORT_RANGE_START, gStartMediaPort, (const unsigned char *) "startMediaPort");
compare_or_set_int_value(CFGID_MEDIA_PORT_RANGE_END, gStopMediaPort, (const unsigned char *) "stopMediaPort");
compare_or_set_boolean_value(CFGID_CALLERID_BLOCKING, gCallerIdBlocking, (const unsigned char *) "callerIdBlocking");
compare_or_set_boolean_value(CFGID_ANONYMOUS_CALL_BLOCK, gAnonblock, (const unsigned char *) "anonymousCallBlock");
compare_or_set_string_value(CFGID_PREFERRED_CODEC, gPreferredCodec, (const unsigned char *) "preferredCodec");
compare_or_set_string_value(CFGID_DTMF_OUTOFBAND, gDtmfOutOfBand, (const unsigned char *) "dtmfOutofBand");
compare_or_set_int_value(CFGID_DTMF_AVT_PAYLOAD, gDtmfAvtPayload, (const unsigned char *) "dtmfAvtPayload");
compare_or_set_int_value(CFGID_DTMF_DB_LEVEL, gDtmfDbLevel, (const unsigned char *) "dtmfDbLevel");
compare_or_set_int_value(CFGID_SIP_RETX, gSipRetx, (const unsigned char *) "sipRetx");
compare_or_set_int_value(CFGID_SIP_INVITE_RETX, gSipInviteRetx, (const unsigned char *) "sipInviteRetx");
compare_or_set_int_value(CFGID_TIMER_T1, gTimerT1, (const unsigned char *) "timerT1");
compare_or_set_int_value(CFGID_TIMER_T2, gTimerT2, (const unsigned char *) "timerT2");
compare_or_set_int_value(CFGID_TIMER_INVITE_EXPIRES, gTimerInviteExpires, (const unsigned char *) "timerInviteExpires");
compare_or_set_int_value(CFGID_TIMER_REGISTER_EXPIRES, gTimerRegisterExpires, (const unsigned char *) "timerRegisterExpires");
compare_or_set_boolean_value(CFGID_PROXY_REGISTER, gRegisterWithProxy, (const unsigned char *) "registerWithProxy");
compare_or_set_string_value(CFGID_PROXY_BACKUP, gBackupProxy, (const unsigned char *) "backupProxy");
compare_or_set_int_value(CFGID_PROXY_BACKUP_PORT, gBackupProxyPort, (const unsigned char *) "backupProxyPort");
compare_or_set_string_value(CFGID_PROXY_EMERGENCY, gEmergencyProxy, (const unsigned char *) "emergencyProxy");
compare_or_set_int_value(CFGID_PROXY_EMERGENCY_PORT, gEmergencyProxyPort, (const unsigned char *) "emergencyProxyPort");
compare_or_set_string_value(CFGID_OUTBOUND_PROXY, gOutboundProxy, (const unsigned char *) "outboundProxy");
compare_or_set_int_value(CFGID_OUTBOUND_PROXY_PORT, gOutboundProxyPort, (const unsigned char *) "outboundProxyPort");
compare_or_set_boolean_value(CFGID_NAT_RECEIVED_PROCESSING, gNatRecievedProcessing, (const unsigned char *) "natRecievedProcessing");
compare_or_set_string_value(CFGID_REG_USER_INFO, gUserInfo, (const unsigned char *) "userInfo");
compare_or_set_boolean_value(CFGID_REMOTE_PARTY_ID, gRemotePartyID, (const unsigned char *) "remotePartyID");
compare_or_set_boolean_value (CFGID_SEMI_XFER, gSemiAttendedTransfer, (const unsigned char *) "semiAttendedTransfer");
compare_or_set_int_value(CFGID_CALL_HOLD_RINGBACK, gCallHoldRingback, (const unsigned char *) "callHoldRingback");
compare_or_set_boolean_value(CFGID_STUTTER_MSG_WAITING, gStutterMsgWaiting, (const unsigned char *) "stutterMsgWaiting");
compare_or_set_string_value(CFGID_CALL_FORWARD_URI, gCallForwardURI, (const unsigned char *) "callForwardURI");
compare_or_set_boolean_value(CFGID_CALL_STATS, gCallStats, (const unsigned char *) "callStats");
compare_or_set_int_value(CFGID_TIMER_REGISTER_DELTA, gTimerRegisterDelta, (const unsigned char *) "timerRegisterDelta");
compare_or_set_int_value(CFGID_SIP_MAX_FORWARDS, gMaxRedirects, (const unsigned char *) "maxRedirects");
compare_or_set_boolean_value(CFGID_2543_HOLD, gRfc2543Hold, (const unsigned char *) "rfc2543Hold");
compare_or_set_boolean_value(CFGID_LOCAL_CFWD_ENABLE, gLocalCfwdEnable, (const unsigned char *) "localCfwdEnable");
compare_or_set_int_value(CFGID_CONN_MONITOR_DURATION, gConnectionMonitorDuration, (const unsigned char *) "connectionMonitorDuration");
compare_or_set_int_value(CFGID_CALL_LOG_BLF_ENABLED, gCallLogBlfEnabled, (const unsigned char *) "callLogBlfEnabled");
compare_or_set_boolean_value(CFGID_RETAIN_FORWARD_INFORMATION, gRetainForwardInformation, (const unsigned char *) "retainForwardInformation");
compare_or_set_int_value(CFGID_REMOTE_CC_ENABLED, gRemoteCcEnable, (const unsigned char *) "remoteCcEnable");
compare_or_set_int_value(CFGID_TIMER_KEEPALIVE_EXPIRES, gTimerKeepAliveExpires, (const unsigned char *) "timerKeepAliveExpires");
compare_or_set_int_value(CFGID_TIMER_SUBSCRIBE_EXPIRES, gTimerSubscribeExpires, (const unsigned char *) "timerSubscribeExpires");
compare_or_set_int_value(CFGID_TIMER_SUBSCRIBE_DELTA, gTimerSubscribeDelta, (const unsigned char *) "timerSubscribeDelta");
compare_or_set_int_value(CFGID_TRANSPORT_LAYER_PROT, gTransportLayerProtocol, (const unsigned char *) "transportLayerProtocol");
compare_or_set_int_value(CFGID_KPML_ENABLED, gKpml, (const unsigned char *) "kpml");
compare_or_set_boolean_value(CFGID_NAT_ENABLE, gNatEnabled, (const unsigned char *) "natEnabled");
compare_or_set_string_value(CFGID_NAT_ADDRESS, gNatAddress, (const unsigned char *) "natAddress");
compare_or_set_int_value(CFGID_VOIP_CONTROL_PORT, gVoipControlPort, (const unsigned char *) "voipControlPort");
compare_or_set_boolean_value(CFGID_ENABLE_VAD, gAnableVad, (const unsigned char *) "enableVad");
compare_or_set_boolean_value(CFGID_AUTOANSWER_IDLE_ALTERNATE, gAutoAnswerAltBehavior, (const unsigned char *) "autoAnswerAltBehavior");
compare_or_set_int_value(CFGID_AUTOANSWER_TIMER, gAutoAnswerTimer, (const unsigned char *) "autoAnswerTimer");
compare_or_set_boolean_value(CFGID_AUTOANSWER_OVERRIDE, gAutoAnswerOverride, (const unsigned char *) "autoAnswerOverride");
compare_or_set_int_value(CFGID_OFFHOOK_TO_FIRST_DIGIT_TIMER, gOffhookToFirstDigitTimer, (const unsigned char *) "offhookToFirstDigitTimer");
compare_or_set_int_value(CFGID_CALL_WAITING_SILENT_PERIOD, gSilentPeriodBetweenCallWaitingBursts, (const unsigned char *) "silentPeriodBetweenCallWaitingBursts");
compare_or_set_int_value(CFGID_RING_SETTING_BUSY_POLICY, gRingSettingBusyStationPolicy, (const unsigned char *) "ringSettingBusyStationPolicy");
compare_or_set_int_value (CFGID_BLF_ALERT_TONE_IDLE, gBlfAudibleAlertSettingOfIdleStation, (const unsigned char *) "blfAudibleAlertSettingOfIdleStation");
compare_or_set_int_value (CFGID_BLF_ALERT_TONE_BUSY, gBlfAudibleAlertSettingOfBusyStation, (const unsigned char *) "blfAudibleAlertSettingOfBusyStation");
compare_or_set_int_value (CFGID_JOIN_ACROSS_LINES, gJoinAcrossLines, (const unsigned char *) "joinAcrossLines");
compare_or_set_boolean_value(CFGID_CNF_JOIN_ENABLE, gCnfJoinEnabled, (const unsigned char *) "cnfJoinEnabled");
compare_or_set_int_value (CFGID_ROLLOVER, gRollover, (const unsigned char *) "rollover");
compare_or_set_boolean_value(CFGID_XFR_ONHOOK_ENABLED, gTransferOnhookEnabled, (const unsigned char *) "transferOnhookEnabled");
compare_or_set_int_value(CFGID_DSCP_AUDIO, gDscpForAudio, (const unsigned char *) "dscpForAudio");
compare_or_set_int_value(CFGID_DSCP_VIDEO, gDscpVideo, (const unsigned char *) "dscpVideo");
compare_or_set_int_value(CFGID_INTER_DIGIT_TIMER, gT302Timer, (const unsigned char *) "T302Timer");
// TODO(emannion): You had line=1; line<= ....
// Debugging suggests that alghouth *line* is 1-indexed, the config entries
// are 1-indexed. See. config_get_line_id().
// You may want to rewrite this in terms of config_get_line_id().
// Please check -- EKR
for(line = 0; line < MAX_REG_LINES; line++) {
compare_or_set_int_value(CFGID_LINE_INDEX + line, gLineIndex, (const unsigned char *)"lineIndex");
compare_or_set_int_value(CFGID_LINE_FEATURE + line, gFeatureID, (const unsigned char *) "featureID");
compare_or_set_string_value(CFGID_PROXY_ADDRESS + line, gProxy, (const unsigned char *) "proxy");
compare_or_set_int_value(CFGID_PROXY_PORT + line, gPort, (const unsigned char *) "port");
if ( apply_config == FALSE ) {
ccsnap_set_line_label(line+1, "LINELABEL");
}
compare_or_set_string_value(CFGID_LINE_NAME + line, sipUser, (const unsigned char *) "name");
compare_or_set_string_value(CFGID_LINE_DISPLAYNAME + line, gDisplayName, (const unsigned char *) "displayName");
compare_or_set_string_value(CFGID_LINE_MESSAGES_NUMBER + line, gMessagesNumber, (const unsigned char *) "messagesNumber");
compare_or_set_boolean_value(CFGID_LINE_FWD_CALLER_NAME_DIPLAY + line, gCallerName, (const unsigned char *) "callerName");
compare_or_set_boolean_value(CFGID_LINE_FWD_CALLER_NUMBER_DIPLAY + line, gCallerNumber, (const unsigned char *) "callerNumber");
compare_or_set_boolean_value(CFGID_LINE_FWD_REDIRECTED_NUMBER_DIPLAY + line, gRedirectedNumber, (const unsigned char *) "redirectedNumber");
compare_or_set_boolean_value(CFGID_LINE_FWD_DIALED_NUMBER_DIPLAY + line, gDialedNumber, (const unsigned char *) "dialedNumber");
compare_or_set_byte_value(CFGID_LINE_MSG_WAITING_LAMP + line, gMessageWaitingLampPolicy, (const unsigned char *) "messageWaitingLampPolicy");
compare_or_set_byte_value(CFGID_LINE_MESSAGE_WAITING_AMWI + line, gMessageWaitingAMWI, (const unsigned char *) "messageWaitingAMWI");
compare_or_set_byte_value(CFGID_LINE_RING_SETTING_IDLE + line, gRingSettingIdle, (const unsigned char *) "ringSettingIdle");
compare_or_set_byte_value(CFGID_LINE_RING_SETTING_ACTIVE + line, gRingSettingActive, (const unsigned char *) "ringSettingActive");
compare_or_set_string_value(CFGID_LINE_CONTACT + line, sipUser, (const unsigned char *) "contact");
compare_or_set_int_value(CFGID_LINE_MAXNUMCALLS + line, gMaxNumCalls, (const unsigned char *) "maxNumCalls");
compare_or_set_int_value(CFGID_LINE_BUSY_TRIGGER + line, gBusyTrigger, (const unsigned char *) "busyTrigger");
compare_or_set_byte_value(CFGID_LINE_AUTOANSWER_ENABLED + line, gAutoAnswerEnabled, (const unsigned char *) "autoAnswerEnabled");
compare_or_set_byte_value(CFGID_LINE_CALL_WAITING + line, gCallWaiting, (const unsigned char *) "callWaiting");
compare_or_set_string_value(CFGID_LINE_AUTHNAME + line, sipUser, (const unsigned char *)"authName");
compare_or_set_string_value(CFGID_LINE_PASSWORD + line, sipPassword, (const unsigned char *)"authPassword");
}
compare_or_set_int_value(CFGID_CCM1_SEC_LEVEL, gDeviceSecurityMode,(const unsigned char *)"deviceSecurityMode");
compare_or_set_int_value(CFGID_CCM1_SIP_PORT, gCcm1_sip_port,(const unsigned char *)"ccm1_sip_port");
compare_or_set_int_value(CFGID_CCM2_SIP_PORT, gCcm2_sip_port,(const unsigned char *)"ccm2_sip_port");
compare_or_set_int_value(CFGID_CCM3_SIP_PORT, gCcm3_sip_port, (const unsigned char *)"ccm3_sip_port");
isSecure = FALSE;
sstrncpy(ip, "", MAX_SIP_URL_LENGTH);
sstrncpy(option, "User Specific", MAX_SIP_URL_LENGTH);
compare_or_set_string_value(CFGID_CCM1_ADDRESS+0, sipDomain, (const unsigned char *) "ccm1_addr");
compare_or_set_boolean_value(CFGID_CCM1_IS_VALID + 0, gCcm1_isvalid, (const unsigned char *)"ccm1_isvalid");
compare_or_set_int_value(CFGID_DSCP_FOR_CALL_CONTROL , gDscpCallControl, (const unsigned char *) "DscpCallControl");
compare_or_set_int_value(CFGID_SPEAKER_ENABLED, gSpeakerEnabled, (const unsigned char *) "speakerEnabled");
if (apply_config == FALSE) {
config_get_mac_addr(macaddr);
CONFIG_DEBUG(CFG_F_PREFIX ": MAC Address IS: %x:%x:%x:%x:%x:%x \n",
"config_get_mac_addr", macaddr[0], macaddr[1],
macaddr[2], macaddr[3], macaddr[4], macaddr[5]);
CC_Config_setArrayValue(CFGID_MY_MAC_ADDR, macaddr, MAC_ADDR_SIZE);
CC_Config_setArrayValue(CFGID_MY_ACTIVE_MAC_ADDR, macaddr, MAC_ADDR_SIZE);
}
CONFIG_DEBUG(CFG_F_PREFIX "%s \n", "config_parse_element", "phoneServices");
CONFIG_DEBUG(CFG_F_PREFIX "%s \n", "config_parse_element", "versionStamp");
CONFIG_ERROR(CFG_F_PREFIX "%s new=%s old=%s \n", "config_parser_element", "versionStamp",
"1284570837-bbc096ed-7392-427d-9694-5ce49d5c3acb", g_cfg_version_stamp);
if (apply_config == FALSE) {
memset(g_cfg_version_stamp, 0, sizeof(g_cfg_version_stamp));
i = strlen("1284570837-bbc096ed-7392-427d-9694-5ce49d5c3acb");
if (i > MAX_CFG_VERSION_STAMP_LEN) {
CONFIG_ERROR(CFG_F_PREFIX "config version %d, bigger than allocated space %d\n", "config_parser_element", i, MAX_CFG_VERSION_STAMP_LEN);
}
sstrncpy(g_cfg_version_stamp, "1284570837-bbc096ed-7392-427d-9694-5ce49d5c3acb", sizeof(g_cfg_version_stamp));
}
else {
CONFIG_ERROR(CFG_F_PREFIX "got NULL value for %s\n", "config_parser_element", "versionStamp");
}
CONFIG_DEBUG(CFG_F_PREFIX "%s \n", "config_parser_element", "externalNumberMask");
compare_or_set_string_value(CFGID_CCM_EXTERNAL_NUMBER_MASK, gExternalNumberMask, (const unsigned char *) "externalNumberMask");
/* Set SIP P2P boolean */
compare_or_set_boolean_value(CFGID_P2PSIP, gP2PSIP, (const unsigned char *) "p2psip");
/* Set product version */
compare_or_set_string_value(CFGID_VERSION, gVersion, (const unsigned char *) "version");
/* Set rtcp-mux, right now to always true */
compare_or_set_boolean_value(CFGID_RTCPMUX, gRTCPMUX, (const unsigned char *) "rtcpmux");
/* Set RTP/SAVPF, right now to always true */
compare_or_set_boolean_value(CFGID_RTPSAVPF, gRTPSAVPF, (const unsigned char *) "rtpsavpf");
compare_or_set_boolean_value(CFGID_MAXAVBITRATE, gMAXAVBITRATE, (const unsigned char *) "maxavbitrate");
compare_or_set_boolean_value(CFGID_MAXCODEDAUDIOBW, gMAXCODEDAUDIOBW, (const unsigned char *) "maxcodedaudiobw");
compare_or_set_boolean_value(CFGID_USEDTX, gUSEDTX, (const unsigned char *) "usedtx");
compare_or_set_boolean_value(CFGID_STEREO, gSTEREO, (const unsigned char *) "stereo");
compare_or_set_boolean_value(CFGID_USEINBANDFEC, gUSEINBANDFEC, (const unsigned char *) "useinbandfec");
compare_or_set_boolean_value(CFGID_CBR, gCBR, (const unsigned char *) "cbr");
compare_or_set_boolean_value(CFGID_MAXPTIME, gMAXPTIME, (const unsigned char *) "maxptime");
compare_or_set_int_value(CFGID_SCTP_PORT, gSCTPPort, (const unsigned char *) "sctp_port");
compare_or_set_int_value(CFGID_NUM_DATA_STREAMS, gNumDataStreams, (const unsigned char *) "num_data_streams");
(void) isSecure; // XXX set but not used
(void) isValid; // XXX set but not used
}
void config_setup_server_address (const char *sipDomain) {
compare_or_set_string_value(CFGID_CCM1_ADDRESS+0, sipDomain, (const unsigned char *) "ccm1_addr");
}
void config_setup_transport_udp(const cc_boolean is_udp) {
gTransportLayerProtocol = is_udp ? 2 : 4;
compare_or_set_int_value(CFGID_TRANSPORT_LAYER_PROT, gTransportLayerProtocol, (const unsigned char *) "transportLayerProtocol");
}
void config_setup_local_voip_control_port(const int voipControlPort) {
gVoipControlPort = voipControlPort;
compare_or_set_int_value(CFGID_VOIP_CONTROL_PORT, voipControlPort, (const unsigned char *) "voipControlPort");
}
void config_setup_remote_voip_control_port(const int voipControlPort) {
gCcm1_sip_port = voipControlPort;
compare_or_set_int_value(CFGID_CCM1_SIP_PORT, voipControlPort,(const unsigned char *)"ccm1_sip_port");
}
int config_get_local_voip_control_port() {
return gVoipControlPort;
}
int config_get_remote_voip_control_port() {
return gCcm1_sip_port;
}
const char* config_get_version() {
return gVersion;
}
void config_setup_p2p_mode(const cc_boolean is_p2p) {
gP2PSIP = is_p2p;
compare_or_set_boolean_value(CFGID_P2PSIP, is_p2p, (const unsigned char *) "p2psip");
}
void config_setup_sdp_mode(const cc_boolean is_sdp) {
gSDPMODE = is_sdp;
compare_or_set_boolean_value(CFGID_SDPMODE, is_sdp, (const unsigned char *) "sdpsip");
}
void config_setup_avp_mode(const cc_boolean is_rtpsavpf) {
gRTPSAVPF = is_rtpsavpf;
compare_or_set_boolean_value(CFGID_RTPSAVPF, is_rtpsavpf, (const unsigned char *) "rtpsavpf");
}
/**
* Process/Parse the FCP file if specified in the master config file.
*/
void config_parser_handle_fcp_file (char* fcpTemplateFile)
{
// if no fcp file specified in master config file, then set the default dialplan
if (strcmp (fcpTemplateFile, "") == 0)
{
CC_Config_setFcp(NULL, 0);
ccsnap_gen_deviceEvent(CCAPI_DEVICE_EV_CONFIG_CHANGED, CC_DEVICE_ID);
return;
}
ccsnap_gen_deviceEvent(CCAPI_DEVICE_EV_CONFIG_CHANGED, CC_DEVICE_ID);
}
/**
* Function called as part of registration without using cnf device file download.
*/
int config_setup_main( const char *sipUser, const char *sipPassword, const char *sipDomain)
{
config_setup_elements(sipUser, sipPassword, sipDomain);
update_security_mode_and_ports();
// Take care of Fetch and apply of FCP and DialPlan if configured and necessary
if (apply_config == FALSE) {
config_parser_handle_fcp_file (fcpTemplateFile);
}
return 0;
}

View File

@ -1,173 +0,0 @@
/* 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/. */
#ifndef CONFIG_PARSER_H_
#define CONFIG_PARSER_H_
#include "cc_constants.h"
#include "cc_types.h"
#include "cc_config.h"
#include "ccapi.h"
#include "phone_debug.h"
#include "debug.h"
#include "prot_configmgr.h"
#include "call_logger.h"
#include "sip_common_transport.h"
#include "sip_ccm_transport.h"
#define MAX_CFG_VERSION_STAMP_LEN 80
/*
* This function determine whether the passed config parameter should be used
* in comparing the new and old config value for apply-config purpose. Only
* those config ids on whose change phone needs to restart are part of this
* function. For remaining parameters, it is assumed that any change can be
* applied dynamically.
*
*/
boolean is_cfgid_in_restart_list(int cfgid);
/*
* This function either compare the new and old config value or set the value
* for the config_id passed depending upon whether apply-config is true or not.
*/
void compare_or_set_byte_value(int cfgid, unsigned char value, const unsigned char * config_name);
/*
* This function either compare the new and old config value or set the value
* for the config_id passed depending upon whether apply-config is true or not.
*/
void compare_or_set_boolean_value(int cfgid, cc_boolean value, const unsigned char * config_name);
/*
* This function either compare the new and old config value or set the value
* for the config_id passed depending upon whether apply-config is true or not.
*/
void compare_or_set_int_value(int cfgid, int value, const unsigned char * config_name);
/*
* This function either compare the new and old config value or set the value
* for the config_id passed depending upon whether apply-config is true or not.
*/
void compare_or_set_string_value (int cfgid, const char* value, const unsigned char * config_name);
/*
* config_fetch_dialplan() called to retrieve the dialplan
*
*/
void config_fetch_dialplan(char *filename);
/*
* config_fetch_fcp() called to retrieve the fcp
*
*/
void config_fetch_fcp(char *filename);
/*
* config_set_autoreg_properties
*
*/
void config_set_autoreg_properties ();
/*
* update_security_mode_and_ports
*
*/
void update_security_mode_and_ports(void);
/*
* config_get_mac_addr
*
* Get the filename that has the mac address and parse the string
* convert it into an mac address stored in the bytearray maddr
*/
void config_get_mac_addr (char *maddr);
/*
* Set the IP and MAC address in the config table
*/
void config_set_ccm_ip_mac ();
/*
* Set up configuration without XML config file.
*/
void config_setup_elements ( const char *sipUser, const char *sipPassword, const char *sipDomain);
/*
* Set server ip address into config
* Same ip address is also used to make a P2P call
*/
void config_setup_server_address (const char *sipDomain);
/*
* set transport protocol, limited to udp or tcp for now
*/
void config_setup_transport_udp(const cc_boolean is_udp);
/*
* set local voip port defaults to 5060
*/
void config_setup_local_voip_control_port(const int voipControlPort);
/*
* set remote voip port defaults to 5060
*/
void config_setup_remote_voip_control_port(const int voipControlPort);
/*
* get local voip port defaults to 5060
*/
int config_get_local_voip_control_port();
/*
* get remote voip port defaults to 5060
*/
int config_get_remote_voip_control_port();
/*
* get ikran version
*/
const char* config_get_version();
/*
* set p2p mode on or off
*/
void config_setup_p2p_mode(const cc_boolean is_p2p);
/*
* set sdp mode on or off
*/
void config_setup_sdp_mode(const cc_boolean is_sdp);
/*
* set avp mode (true == RTP/SAVPF, false = RTP/SAVP)
*/
void config_setup_avp_mode(const cc_boolean is_rtpsavpf);
/**
* config_minimum_check:
*
* @a_node: the initial xml node to consider.
* @doc: The DOM tree of the xml file
*
* Check if minimum set of elements are present in the config file and
* have values that can be used by sipstack
*
*/
/**
* Parse the file that is passed in,
* walk down the DOM that is created , and get the
* xml elements nodes.
*/
int config_parser_main( char *config, int complete_config);
/*
* Set up configuration without XML config file.
*/
int config_setup_main( const char *sipUser, const char *sipPassword, const char *sipDomain);
#endif /* CONFIG_PARSER_H_ */

View File

@ -1,576 +0,0 @@
/* 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 "cpr.h"
#include "cpr_in.h"
#include "cpr_stdlib.h"
#include "cpr_ipc.h"
#include "phntask.h"
#include <stdarg.h>
#include "configmgr.h"
#include "debug.h"
#include "config.h"
#include "vcm.h"
#include "dialplan.h"
#include "debug.h"
#include "phone_debug.h"
#include "CCProvider.h"
#include "ccsip_task.h"
#include "gsm.h"
#include "misc_apps_task.h"
#include "plat_api.h"
#include "ccapp_task.h"
#include "phone_platform_constants.h"
/** The following defines are used to tune the total memory that pSIPCC
* allocates and uses. */
/** Block size for emulated heap space, i.e. 1kB */
#define BLK_SZ 1024
/** 5 MB Heap Based on 0.5 MB initial use + 4 MB for calls (20K * 200) + 0.5 MB misc */
/** The number of supported blocks for the emulated heap space */
#define MEM_BASE_BLK 500 //500 blocks, ~ 0.5M
#define MEM_MISC_BLK 500 //500 blocks, ~ 0.5M
/** Size of the emulated heap space. This is the value passed to the memory
* management pre-init procedure. The total memory allocated is
* "PRIVATE_SYS_MEM_SIZE + 2*64" where the additional numbers are for a gaurd
* band. */
#define MEM_PER_CALL_BLK 20 //20 block, ~20k
#define PRIVATE_SYS_MEM_SIZE ((MEM_BASE_BLK + MEM_MISC_BLK + (MEM_PER_CALL_BLK) * MAX_CALLS) * BLK_SZ)
// used in early init code where config has not been setup
const boolean gHardCodeSDPMode = TRUE;
boolean gStopTickTask = FALSE;
/*--------------------------------------------------------------------------
* Local definitions
*--------------------------------------------------------------------------
*/
#define GSMSTKSZ 61440
/*
* CNU thread queue sizes.
*
* On CNU, the message queue size can hold up to 31 entries only.
* This is too small for a phone that can support the MAX_CALLS that
* is close to or higher than 31 calls simultaneously. In a scenario when
* the number of active calls on the phone reaches its MAC_CALLS then
* there can be a potential MAX_CALLS that is great ther than 31 events on
* a queue to GSM or SIP thread.
*
* One known scenario is a 7970 phone having 50 held calls where all
* calls are not from the same CCM that this phone registers with but
* still within the same cluster. If that CCM is restarted, the CCM that
* this phone registers with will terminate these calls on the phone by
* sending BYEs, SUBSCRIBE (to terminate) DTMF digi collection and etc. to
* all these calls very quickly together. Handling these SIP messages
* can generate many internal events between SIP and GSM threads including
* events that are sent to self (such as GSM which includes applications
* that runs as part of GSM). The amount of the events posted on the queues
* during this time can be far exceeding than 31 and MAX_CALLS entries.
*
* The followings define queue sizes for GSM, SIP and the other threads.
* The GSM's queue size is defined to be larger than SIP's queue size to
* account for self sending event. The formular below is based on the
* testing with the above scenario and with 8-3-x phone load. The maximum
* queue depth observed for GSM under
* this condition is 129 entries and the maximum queue depth of
* SIP under the same condition is about 67 entries. Therefore, the queue
* depth of GSM thread is given to 3 times MAX_CALLS (or 153) and
* 2 times (or 102) for SIP thread for 7970 case.
*
*/
#define GSMQSZ (MAX_CALLS*3) /* GSM message queue size */
#define SIPQSZ (MAX_CALLS*2) /* SIP message queue size */
#define DEFQSZ 0 /* default message queue size */
#define DEFAPPQSZ MAX_REG_LINES
/*--------------------------------------------------------------------------
* Global data
*--------------------------------------------------------------------------
*/
cprMsgQueue_t ccapp_msgq;
cprThread_t ccapp_thread;
cprMsgQueue_t sip_msgq;
cprThread_t sip_thread;
#ifdef NO_SOCKET_POLLING
cprThread_t sip_msgqwait_thread;
#endif
cprMsgQueue_t gsm_msgq;
cprThread_t gsm_thread;
cprMsgQueue_t misc_app_msgq;
cprThread_t misc_app_thread;
#ifdef JINDO_DEBUG_SUPPORTED
cprMsgQueue_t debug_msgq;
cprThread_t debug_thread;
#endif
#ifdef EXTERNAL_TICK_REQUIRED
cprMsgQueue_t ticker_msgq;
cprThread_t ticker_thread;
#endif
/* Platform initialized flag */
boolean platform_initialized = FALSE;
static int thread_init(void);
/*--------------------------------------------------------------------------
* External data references
* -------------------------------------------------------------------------
*/
/*--------------------------------------------------------------------------
* External function prototypes
*--------------------------------------------------------------------------
*/
extern void gsm_set_initialized(void);
extern void vcm_init(void);
extern void dp_init(void *);
extern cprBuffer_t SIPTaskGetBuffer(uint16_t size);
extern void sip_platform_task_loop(void *arg);
#ifdef NO_SOCKET_POLLING
extern void sip_platform_task_msgqwait(void *arg);
#endif
extern void GSMTask(void *);
#ifndef VENDOR_BUILD
extern void debug_task(void *);
#endif
extern void MiscAppTask(void *);
extern void cpr_timer_tick(void);
extern void cprTimerSystemInit(void);
extern int32_t ui_clear_mwi(int32_t argc, const char *argv[]);
void gsm_shutdown(void);
void dp_shutdown(void);
void MiscAppTaskShutdown(void);
void CCAppShutdown(void);
cprBuffer_t gsm_get_buffer (uint16_t size);
/*--------------------------------------------------------------------------
* Local scope function prototypes
*--------------------------------------------------------------------------
*/
#ifdef EXTERNAL_TICK_REQUIRED
int TickerTask(void *);
#endif
void send_protocol_config_msg(void);
/**
* ccMemInit()
*/
extern
int ccMemInit(size_t size) {
return CPR_SUCCESS;
}
/**
* ccPreInit
*
* Initialization routine to call before any application level
* code initializes.
*
* Parameters: None
*
* Return Value: CPR_SUCCESS or CPR_FAILURE
*/
int
ccPreInit ()
{
static boolean ccPreInit_called = FALSE;
if (ccPreInit_called == FALSE) {
ccPreInit_called = TRUE;
//Initializes the memory first
ccMemInit(PRIVATE_SYS_MEM_SIZE);
cprPreInit();
}
return CPR_SUCCESS;
}
int
ccInit ()
{
TNP_DEBUG(DEB_F_PREFIX"started init of SIP call control\n", DEB_F_PREFIX_ARGS(SIP_CC_INIT, "ccInit"));
platInit();
strlib_init();
/*
* below should move to cprPreInit. keep it here until then
*/
#ifdef _WIN32
cprTimerSystemInit();
#endif
/* Initialize threads, queues etc. */
(void) thread_init();
platform_initialized = TRUE;
return 0;
}
static int
thread_init ()
{
gStopTickTask = FALSE;
/*
* This will have already been called for CPR CNU code,
* but may be called here for Windows emulation.
*/
(void) cprPreInit();
PHNChangeState(STATE_FILE_CFG);
/* initialize message queues */
sip_msgq = cprCreateMessageQueue("SIPQ", SIPQSZ);
gsm_msgq = cprCreateMessageQueue("GSMQ", GSMQSZ);
if (FALSE == gHardCodeSDPMode) {
misc_app_msgq = cprCreateMessageQueue("MISCAPPQ", DEFQSZ);
}
ccapp_msgq = cprCreateMessageQueue("CCAPPQ", DEFQSZ);
#ifdef JINDO_DEBUG_SUPPORTED
debug_msgq = cprCreateMessageQueue("DEBUGAPPQ", DEFQSZ);
#endif
#ifdef EXTERNAL_TICK_REQUIRED
ticker_msgq = cprCreateMessageQueue("Ticker", DEFQSZ);
#endif
/*
* Initialize the command parser and debug infrastructure
*/
debugInit();
/* create threads */
ccapp_thread = cprCreateThread("CCAPP Task",
(cprThreadStartRoutine) CCApp_task,
GSMSTKSZ, CCPROVIDER_THREAD_RELATIVE_PRIORITY /* pri */, ccapp_msgq);
if (ccapp_thread == NULL) {
err_msg("failed to create CCAPP task \n");
}
#ifdef JINDO_DEBUG_SUPPORTED
#ifndef VENDOR_BUILD
debug_thread = cprCreateThread("Debug Task",
(cprThreadStartRoutine) debug_task, STKSZ,
0 /*pri */ , debug_msgq);
if (debug_thread == NULL) {
err_msg("failed to create debug task\n");
}
#endif
#endif
/* SIP main thread */
sip_thread = cprCreateThread("SIPStack task",
(cprThreadStartRoutine) sip_platform_task_loop,
STKSZ, SIP_THREAD_RELATIVE_PRIORITY /* pri */, sip_msgq);
if (sip_thread == NULL) {
err_msg("failed to create sip task \n");
}
#ifdef NO_SOCKET_POLLING
/* SIP message wait queue task */
sip_msgqwait_thread = cprCreateThread("SIP MsgQueueWait task",
(cprThreadStartRoutine)
sip_platform_task_msgqwait,
STKSZ, SIP_THREAD_RELATIVE_PRIORITY /* pri */, sip_msgq);
if (sip_msgqwait_thread == NULL) {
err_msg("failed to create sip message queue wait task\n");
}
#endif
gsm_thread = cprCreateThread("GSM Task",
(cprThreadStartRoutine) GSMTask,
GSMSTKSZ, GSM_THREAD_RELATIVE_PRIORITY /* pri */, gsm_msgq);
if (gsm_thread == NULL) {
err_msg("failed to create gsm task \n");
}
if (FALSE == gHardCodeSDPMode) {
misc_app_thread = cprCreateThread("MiscApp Task",
(cprThreadStartRoutine) MiscAppTask,
STKSZ, 0 /* pri */, misc_app_msgq);
if (misc_app_thread == NULL) {
err_msg("failed to create MiscApp task \n");
}
}
#ifdef EXTERNAL_TICK_REQUIRED
ticker_thread = cprCreateThread("Ticker task",
(cprThreadStartRoutine) TickerTask,
STKSZ, 0, ticker_msgq);
if (ticker_thread == NULL) {
err_msg("failed to create ticker task \n");
}
#endif
/* Associate the threads with the message queues */
(void) cprSetMessageQueueThread(sip_msgq, sip_thread);
(void) cprSetMessageQueueThread(gsm_msgq, gsm_thread);
if (FALSE == gHardCodeSDPMode) {
(void) cprSetMessageQueueThread(misc_app_msgq, misc_app_thread);
}
(void) cprSetMessageQueueThread(ccapp_msgq, ccapp_thread);
#ifdef JINDO_DEBUG_SUPPORTED
(void) cprSetMessageQueueThread(debug_msgq, debug_thread);
#endif
#ifdef EXTERNAL_TICK_REQUIRED
(void) cprSetMessageQueueThread(ticker_msgq, ticker_thread);
#endif
/*
* initialize debugs of other modules.
*
* dp_init needs the gsm_msgq id. This
* is set in a global variable by the
* GSM task running. However due to timing
* issues dp_init is sometimes run before
* the GSM task has set this variable resulting
* in a NULL msgqueue ptr being passed to CPR
* which returns an error and does not create
* the dialplan timer. Thus pass is the same
* data to dp_init that is passed into the
* cprCreateThread call for GSM above.
*/
config_init();
vcmInit();
dp_init(gsm_msgq);
if (sip_minimum_config_check() != 0) {
PHNChangeState(STATE_UNPROVISIONED);
} else {
PHNChangeState(STATE_CONNECTED);
}
(void) cprPostInit();
if ( vcmGetVideoCodecList(VCM_DSP_FULLDUPLEX) ) {
cc_media_update_native_video_support(TRUE);
}
return (0);
}
#ifdef EXTERNAL_TICK_REQUIRED
uint16_t SecTimer = 50;
unsigned long timeofday_in_seconds = 0;
void
MAIN0Timer (void)
{
if (SecTimer-- == 0) {
SecTimer = 50;
timeofday_in_seconds++;
}
//gtick +=2;
cpr_timer_tick();
}
int
TickerTask (void *a)
{
TNP_DEBUG(DEB_F_PREFIX"Ticker Task initialized..\n", DEB_F_PREFIX_ARGS(SIP_CC_INIT, "TickerTask"));
while (FALSE == gStopTickTask) {
cprSleep(20);
MAIN0Timer();
}
return 0;
}
#endif
void
send_protocol_config_msg (void)
{
const char *fname = "send_protocol_config_msg";
char *msg;
TNP_DEBUG(DEB_F_PREFIX"send TCP_DONE message to sip thread..\n", DEB_F_PREFIX_ARGS(SIP_CC_INIT, fname));
msg = (char *) SIPTaskGetBuffer(4);
if (msg == NULL) {
TNP_DEBUG(DEB_F_PREFIX"failed to allocate message..\n", DEB_F_PREFIX_ARGS(SIP_CC_INIT, fname));
return;
}
/* send a config done message to the SIP Task */
if (SIPTaskSendMsg(TCP_PHN_CFG_TCP_DONE, msg, 0, NULL) == CPR_FAILURE) {
err_msg("%s: notify SIP stack ready failed", fname);
cpr_free(msg);
}
gsm_set_initialized();
PHNChangeState(STATE_CONNECTED);
}
/*
* Function: send_task_unload_msg
*
* Description:
* - send shutdown and thread destroy msg to sip, gsm, ccapp, misc
* threads
* Parameters: destination thread
*
* Returns: none
*
*/
void
send_task_unload_msg(cc_srcs_t dest_id)
{
const char *fname = "send_task_unload_msg";
uint16_t len = 4;
cprBuffer_t msg = gsm_get_buffer(len);
int sdpmode = 0;
config_get_value(CFGID_SDPMODE, &sdpmode, sizeof(sdpmode));
if (msg == NULL) {
err_msg("%s: failed to allocate msg cprBuffer_t\n", fname);
return;
}
DEF_DEBUG(DEB_F_PREFIX"send Unload message to %s task ..\n",
DEB_F_PREFIX_ARGS(SIP_CC_INIT, fname),
dest_id == CC_SRC_SIP ? "SIP" :
dest_id == CC_SRC_GSM ? "GSM" :
dest_id == CC_SRC_MISC_APP ? "Misc App" :
dest_id == CC_SRC_CCAPP ? "CCApp" : "Unknown");
switch(dest_id) {
case CC_SRC_SIP:
{
/* send this msg so phone can send unRegister msg */
SIPTaskPostShutdown(SIP_EXTERNAL, CC_CAUSE_SHUTDOWN, "");
/* allow unRegister msg to sent out and shutdown to complete */
if (!sdpmode) {
cprSleep(2000);
}
/* send a unload message to the SIP Task to kill sip thread*/
msg = SIPTaskGetBuffer(len);
if (msg == NULL) {
err_msg("%s:%d: failed to allocate sip msg buffer\n", fname);
return;
}
if (SIPTaskSendMsg(THREAD_UNLOAD, (cprBuffer_t)msg, len, NULL) == CPR_FAILURE)
{
cpr_free(msg);
err_msg("%s: Unable to send THREAD_UNLOAD msg to sip thread", fname);
}
}
break;
case CC_SRC_GSM:
{
msg = gsm_get_buffer(len);
if (msg == NULL) {
err_msg("%s: failed to allocate gsm msg cprBuffer_t\n", fname);
return;
}
if (CPR_FAILURE == gsm_send_msg(THREAD_UNLOAD, msg, len)) {
err_msg("%s: Unable to send THREAD_UNLOAD msg to gsm thread", fname);
}
}
break;
case CC_SRC_MISC_APP:
{
msg = cpr_malloc(len);
if (msg == NULL) {
err_msg("%s: failed to allocate misc msg cprBuffer_t\n", fname);
return;
}
if (CPR_FAILURE == MiscAppTaskSendMsg(THREAD_UNLOAD, msg, len)) {
err_msg("%s: Unable to send THREAD_UNLOAD msg to Misc App thread", fname);
}
}
break;
case CC_SRC_CCAPP:
{
msg = cpr_malloc(len);
if (msg == NULL) {
err_msg("%s: failed to allocate ccapp msg cprBuffer_t\n", fname);
return;
}
if (ccappTaskPostMsg(CCAPP_THREAD_UNLOAD, msg, len, CCAPP_CCPROVIER) == CPR_FAILURE )
{
err_msg("%s: Unable to send THREAD_UNLOAD msg to CCapp thread", fname);
}
err_msg("%s: send UNLOAD msg to CCapp thread good", fname);
}
break;
default:
err_msg("%s: Unknown destination task passed=%d.", fname, dest_id);
break;
}
}
/*
* Function: ccUnload
*
* Description:
* - deinit portable runtime.
* - Cleanup call control modules, GSM and SIp Stack
*
* Parameters: none
*
* Returns: none
*
*/
void
ccUnload (void)
{
static const char fname[] = "ccUnload";
DEF_DEBUG(DEB_F_PREFIX"ccUnload called..\n", DEB_F_PREFIX_ARGS(SIP_CC_INIT, fname));
if (platform_initialized == FALSE)
{
TNP_DEBUG(DEB_F_PREFIX"system is not loaded, ignore unload\n", DEB_F_PREFIX_ARGS(SIP_CC_INIT, fname));
return;
}
/*
* We are going to send an unload msg to each of the thread, which on
* receiving the msg, will kill itself.
*/
send_task_unload_msg(CC_SRC_SIP);
send_task_unload_msg(CC_SRC_GSM);
if (FALSE == gHardCodeSDPMode) {
send_task_unload_msg(CC_SRC_MISC_APP);
}
send_task_unload_msg(CC_SRC_CCAPP);
cprSleep(200);
gStopTickTask = TRUE;
}

View File

@ -1,87 +0,0 @@
/* 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 "cpr_types.h"
#include "cpr_string.h"
#include "cpr_stdio.h"
#include "cpr_stdlib.h"
#include "stdarg.h"
#include "logger.h"
#include "logmsg.h"
#include "phone_debug.h"
#include "text_strings.h"
#include "uiapi.h"
#include "platform_api.h"
#include "prot_configmgr.h"
#define MAX_LOG_CACHE_ENTRIES 20
/*
* Log a message.
* Cause the message to be printed to the console port
* as well, the log is stored in a local data area for
* later viewing
*/
void
log_msg (int phrase_index, ...)
{
char phrase_buf[LOG_MAX_LEN * 4];
char status_msg[LOG_MAX_LEN * 4];
va_list ap;
/*
* Make sure that the phrase index is valid.
*/
if (phrase_index == 0) {
return;
}
/*
* Get the translated phrase index from the Java code.
*/
if (platGetPhraseText(phrase_index, phrase_buf, (LOG_MAX_LEN * 4)) == CPR_FAILURE) {
return;
}
/*
* If extra data is required, sprintf this into the status message buffer
*/
va_start(ap, phrase_index);
vsprintf(status_msg, phrase_buf, ap);
va_end(ap);
err_msg("%%%s\n", status_msg);
/*
* For now, do not send the Registration messages over to the Java Status
* Logs. They come out too fast and will overwhelm the existing logging
* mechanism. We will need to implement a new mechanism in order to put
* these in the phone's status menu.
*/
switch (phrase_index) {
case LOG_REG_MSG:
case LOG_REG_RED_MSG:
case LOG_REG_AUTH_MSG:
case LOG_REG_AUTH_HDR_MSG:
case LOG_REG_AUTH_SCH_MSG:
case LOG_REG_CANCEL_MSG:
case LOG_REG_AUTH:
case LOG_REG_AUTH_ACK_TMR:
case LOG_REG_AUTH_NO_CRED:
case LOG_REG_AUTH_UNREG_TMR:
case LOG_REG_RETRY:
case LOG_REG_UNSUPPORTED:
case LOG_REG_AUTH_SERVER_ERR:
case LOG_REG_AUTH_GLOBAL_ERR:
case LOG_REG_AUTH_UNKN_ERR:
return;
default:
break;
}
ui_log_status_msg(status_msg);
}

View File

@ -1,17 +0,0 @@
/* 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/. */
#ifndef _LOGGER_INCLUDED_H
#define _LOGGER_INCLUDED_H
#define LOG_MAX_LEN 64
/*
* short form helper macros
*/
void log_msg(int log, ...);
void log_clear(int msg);
char *get_device_name();
#endif /* _LOGGER_INCLUDED_H */

View File

@ -1,42 +0,0 @@
/* 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/. */
#ifndef _LOGMSG_INCLUDED_H
#define _LOGMSG_INCLUDED_H
#include "logger.h"
/*
* Config messages
* The number denotes the string location in the Phone dictionary file
*/
#define LOG_CFG_PARSE_DIAL 1074 //"%d Error(s) Parsing: %s"
/*
* SIP messages
* The number denotes the string location in the Phone dictionary file
*/
#define LOG_REG_MSG 1058 //"REG send failure: REGISTER"
#define LOG_REG_RED_MSG 1059 //"REG send failure: REGISTER Redirected"
#define LOG_REG_AUTH_MSG 1060 //"REG send failure: REGISTER auth"
#define LOG_REG_AUTH_HDR_MSG 1061 //"REG send failure: REGISTER auth hdr"
#define LOG_REG_AUTH_SCH_MSG 1062 //"REG send failure: REGISTER auth scheme"
#define LOG_REG_CANCEL_MSG 1063 //"REG send failure: CANCEL REGISTER"
#define LOG_REG_AUTH 1064 //"REG auth failed: %s"
#define LOG_REG_AUTH_ACK_TMR 1065 //"REG auth failed: ack timer"
#define LOG_REG_AUTH_NO_CRED 1066 //"REG auth failed: no more credentials"
#define LOG_REG_AUTH_UNREG_TMR 1067 //"REG auth failed: unreg ack timer"
#define LOG_REG_RETRY 1068 //"REG retries exceeded"
#define LOG_REG_UNSUPPORTED 1069 //"REG msg unsupported: %s"
#define LOG_REG_AUTH_SERVER_ERR 1070 //"REG auth failed: in %d, server error"
#define LOG_REG_AUTH_GLOBAL_ERR 1071 //"REG auth failed: in %d, global error"
#define LOG_REG_AUTH_UNKN_ERR 1072 //"REG auth failed: in %d, ??? error"
#define LOG_REG_BACKUP 1073 //"REG Not Registered to Backup Proxy"
#define LOG_REG_EXPIRE 1076 //"REG Expires time too small"
#endif /* _LOGMSG_INCLUDED_H */

View File

@ -1,391 +0,0 @@
/* 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 <time.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include "cpr.h"
#include "phone_debug.h"
#include "cc_debug.h"
#include "phone.h"
#include "cpr_socket.h"
#include "prot_configmgr.h"
#include "debug.h"
#include "cpr_string.h"
#include "cpr_stdlib.h"
/*--------------------------------------------------------------------------
* Local definitions
*--------------------------------------------------------------------------
*/
/* NTP related local data */
#define MAX_NTP_MONTH_STR_LEN 4
#define MAX_NTP_MONTH_ARRAY_SIZE 12
#define MAX_NTP_DATE_HDR_STR_LEN 128
#define MAX_NTP_TOKEN_BUF_LEN 16
/* The number of arguments (argc) used in the show command */
#define NUM_OF_SHOW_ARGUMENTS 2
#if 0
static int last_month = 99;
static char last_month_str[MAX_NTP_MONTH_STR_LEN] = "";
static const char *month_ar[MAX_NTP_MONTH_ARRAY_SIZE] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
#endif
/*--------------------------------------------------------------------------
* External function prototypes
*--------------------------------------------------------------------------
*/
extern void platform_set_time(int32_t gmt_time);
void SipNtpUpdateClockFromCCM(void);
/*--------------------------------------------------------------------------
* Local scope function prototypes
*--------------------------------------------------------------------------
*/
#if 0
/*
* This function finds month (0 to 11) from month name
* listed above in month_ar[]. This is used to convert the
* date header from CCM to derive time/date.
*/
static boolean
set_month_from_str (char *month_str)
{
boolean ret_val = FALSE;
const char * fname = "set_month_from_str";
int i;
if (month_str) {
if (strncmp(month_str, last_month_str, 3) != 0) {
for (i = 0; i < 12; i++) {
if (strncmp(month_str, month_ar[i], 3) == 0) {
sstrncpy(last_month_str, month_str, sizeof(last_month_str));
last_month = i;
ret_val = TRUE;
break;
}
}
} else {
ret_val = TRUE;
}
} else {
TNP_DEBUG(DEB_F_PREFIX "Input month_str is NULL!!!! \n", DEB_F_PREFIX_ARGS(PLAT_API, fname));
}
return (ret_val);
}
#endif
/*
* MISC platform stubs
* These stubs are mostly NOPs for TNP but they are referred from common code
* and this avoids ifdefs in the code.
*
*/
static uint16_t PHNState = STATE_CONNECTED;
/* ccsip_core.o */
uint16_t
PHNGetState (void)
{
return (PHNState);
}
void
PHNChangeState (uint16_t state)
{
PHNState = state;
}
/* ccsip_platform.o */
void
phone_reset (DeviceResetType resetType)
{
return;
}
/*
* Methods below should be moved to plat as they are exported as an external API.
* For now keeping all miscellaneous methods here.
*/
extern void config_get_value (int id, void *buffer, int length);
/*logger.c */
/*
* Clear an entry or multiple entries in the
* log table. The passed in log message is used
* for partial matching, in order to figure out
* what logs need to be cleared.
*
* The TNP Status Message screen does not have any
* facility to "clear" log messages.
*/
void
log_clear (int msg)
{
}
/**
*
* Indicates if the (preferred) network interface has changed (e.g., dock/undock)
*
* @param none
*
*
* @return true if the (preferred) network interface has changed since last query
* @return false if the (preferred) network interface has not changed
*/
boolean plat_is_network_interface_changed (void)
{
return(FALSE);
}
/**
* give the platform IPV6 IP address.
*
* @param[in/out] ip_addr - pointer to the cpr_ip_addr_t. The
* result IP address will be populated in this
* structure.
*
* @return None.
*/
void
platform_get_ipv6_address (cpr_ip_addr_t *ip_addr)
{
//config_get_value(CFGID_IP_ADDR_MODE, &ip_mode, sizeof(ip_mode));
//Todo IPv6: Hack to get the IPV6 address
//if (ip_mode == CPR_IP_MODE_IPV6 || ip_mode == CPR_IP_MODE_DUAL) {
//}
ip_addr->type = CPR_IP_ADDR_IPV6;
ip_addr->u.ip6.addr.base8[15] = 0x65;
ip_addr->u.ip6.addr.base8[14] = 0xfb;
ip_addr->u.ip6.addr.base8[13] = 0xb1;
ip_addr->u.ip6.addr.base8[12] = 0xfe;
ip_addr->u.ip6.addr.base8[11] = 0xff;
ip_addr->u.ip6.addr.base8[10] = 0x11;
ip_addr->u.ip6.addr.base8[9] = 0x11;
ip_addr->u.ip6.addr.base8[8] = 0x02;
ip_addr->u.ip6.addr.base8[7] = 0x01;
ip_addr->u.ip6.addr.base8[6] = 0x00;
ip_addr->u.ip6.addr.base8[5] = 0x18;
ip_addr->u.ip6.addr.base8[4] = 0x0c;
ip_addr->u.ip6.addr.base8[3] = 0xb8;
ip_addr->u.ip6.addr.base8[2] = 0x0d;
ip_addr->u.ip6.addr.base8[1] = 0x01;
ip_addr->u.ip6.addr.base8[0] = 0x20;
return;
}
/**
* give the mac address string
*
* @param addr - mac address string (OUTPUT)
*
* @return none
*/
void
platform_get_wired_mac_address (unsigned char *addr)
{
config_get_value(CFGID_MY_MAC_ADDR, addr, 6);
TNP_DEBUG(DEB_F_PREFIX"Wired MacAddr:from Get Val: %04x:%04x:%04x",
DEB_F_PREFIX_ARGS(PLAT_API, "platform_get_wired_mac_address"),
addr[0] * 256 + addr[1], addr[2] * 256 + addr[3],
addr[4] * 256 + addr[5]);
}
/**
* Get active mac address if required
*
* @param addr - mac address string (OUTPUT)
*
* @return none
*/
void
platform_get_active_mac_address (unsigned char *addr)
{
config_get_value(CFGID_MY_ACTIVE_MAC_ADDR, addr, 6);
TNP_DEBUG(DEB_F_PREFIX"ActiveMacAddr:from Get Val: %04x:%04x:%04x",
DEB_F_PREFIX_ARGS(PLAT_API, "platform_get_mac_address"),
addr[0] * 256 + addr[1], addr[2] * 256 + addr[3],
addr[4] * 256 + addr[5]);
}
/**
* give the platform IPV4 IP address.
*
* @param[in/out] ip_addr - pointer to the cpr_ip_addr_t. The
* result IP address will be populated in this
* structure.
*
* @return None.
*/
void
platform_get_ipv4_address (cpr_ip_addr_t *ip_addr)
{
config_get_value(CFGID_MY_IP_ADDR, ip_addr, sizeof(cpr_ip_addr_t));
ip_addr->type = CPR_IP_ADDR_IPV4;
return;
}
uint32_t
IPNameCk (char *name, char *addr_error)
{
char *namePtr = name;
char string[4] = { 0, 0, 0, 0 };
int x = 0;
int i = 0;
uint32_t temp, ip_addr = 0;
char ip_addr_out[MAX_IPADDR_STR_LEN];
unsigned long strtoul_result;
char *strtoul_end;
/* Check if valid IPv6 address */
if (cpr_inet_pton(AF_INET6, name, ip_addr_out)) {
*addr_error = FALSE;
return TRUE;
}
*addr_error = TRUE;
while (*namePtr != 0) {
if ((*namePtr >= 0x30) && (*namePtr <= 0x39)) {
if (x > 2)
return (0);
string[x++] = *namePtr++;
} else {
if (*namePtr == 0x2e) {
if (i > 3)
return (0);
namePtr++;
x = 0;
errno = 0;
strtoul_result = strtoul(string, &strtoul_end, 10);
if (errno || string == strtoul_end || strtoul_result > 255) {
return 0;
}
temp = (uint32_t) strtoul_result;
ip_addr |= temp << (24 - (i * 8));
string[0] = 0;
string[1] = 0;
string[2] = 0;
i++;
} else
return (0); // not an IP address
}
}
if (i == 3) {
errno = 0;
strtoul_result = strtoul(string, &strtoul_end, 10);
if (errno || string == strtoul_end || strtoul_result > 255) {
return 0;
}
temp = (uint32_t) strtoul_result;
ip_addr |= temp;
*addr_error = FALSE;
return (ntohl(ip_addr));
} else {
return 0;
}
}
/**
* @brief Given a msg buffer, returns a pointer to the buffer's header
*
* The cprGetSysHeader function retrieves the system header buffer for the
* passed in message buffer.
*
* @param[in] buffer pointer to the buffer whose sysHdr to return
*
* @return Abstract pointer to the msg buffer's system header
* or #NULL if failure
*/
void *
cprGetSysHeader (void *buffer)
{
phn_syshdr_t *syshdr;
/*
* Stinks that an external structure is necessary,
* but this is a side-effect of porting from IRX.
*/
syshdr = cpr_calloc(1, sizeof(phn_syshdr_t));
if (syshdr) {
syshdr->Data = buffer;
}
return (void *)syshdr;
}
/**
* @brief Called when the application is done with this system header
*
* The cprReleaseSysHeader function returns the system header buffer to the
* system.
* @param[in] syshdr pointer to the sysHdr to be released
*
* @return none
*/
void
cprReleaseSysHeader (void *syshdr)
{
if (syshdr == NULL) {
CPR_ERROR("cprReleaseSysHeader: Sys header pointer is NULL\n");
return;
}
cpr_free(syshdr);
}
/**
* @brief An internal function to update the system header
*
* A CPR-only function. Given a sysHeader and data, this function fills
* in the data. The purpose for this function is to help prevent CPR
* code from having to know about the phn_syshdr_t layout.
*
* @param[in] buffer pointer to a syshdr from a successful call to
* cprGetSysHeader
* @param[in] cmd command to place in the syshdr buffer
* @param[in] len length to place in the syshdr buffer
* @param[in] timerMsg msg being sent to the calling thread
*
* @return none
*
* @pre (buffer != NULL)
*/
void
fillInSysHeader (void *buffer, uint16_t cmd, uint16_t len, void *timerMsg)
{
phn_syshdr_t *syshdr;
syshdr = (phn_syshdr_t *) buffer;
syshdr->Cmd = cmd;
syshdr->Len = len;
syshdr->Usr.UsrPtr = timerMsg;
return;
}

View File

@ -1,89 +0,0 @@
/* 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 <string.h>
#include "cpr.h"
#include "phone_debug.h"
#include "CCProvider.h"
#include "ccsip_pmh.h"
#include "sessionTypes.h"
#include "ccapp_task.h"
// Why don't we modify strlib_malloc to handle NULL?
#define STRLIB_CREATE(str) (str)?strlib_malloc((str), strlen((str))):strlib_empty()
void
platform_apply_config (char * configVersionStamp,
char * dialplanVersionStamp,
char * fcpVersionStamp,
char * cucmResult,
char * loadId,
char * inactiveLoadId,
char * loadServer,
char * logServer,
boolean ppid);
/**
* This function calls the JNI function to sends the information received
* in apply-config NOTIFY message to Java side.
*
* @param configVersionStamp - version stamp for config file
* @param dialplanVersionStamp - version stamp for the dialplan file
* @param fcpVersionStamp - version stamp for the softkey file (?)
* @param cucmResult - CUCM result after applying config by CUCM
* @param loadId - loadId to upgrade as requested by CUCM
* @param inactiveLoadId - inactive loadId for inactive partition as requested by CUCM
* @param loadServer - load server form where to pick loadId
* @param logServer - log server for logging output of peer to peer upgrade.
* @param ppid - specify whether peer to peer upgrade is enabled/disabled.
*
* @return none
*/
void
platform_apply_config (char * configVersionStamp,
char * dialplanVersionStamp,
char * fcpVersionStamp,
char * cucmResult,
char * loadId,
char * inactiveLoadId,
char * loadServer,
char * logServer,
boolean ppid)
{
static const char fname[] = "platform_apply_config";
session_mgmt_t msg;
fcpVersionStamp = (fcpVersionStamp != NULL) ? fcpVersionStamp : "";
/// Print the arguments
CCAPP_DEBUG(DEB_F_PREFIX" configVersionStamp=%s \ndialplanVersionStamp=%s"
"\nfcpVersionStamp=%s \ncucmResult=%s "
"\nloadId=%s \ninactiveLoadId=%s \nloadServer=%s \nlogServer=%s "
"\nppid=%s\n", DEB_F_PREFIX_ARGS(PLAT_API, fname),
(configVersionStamp != NULL) ? configVersionStamp : "",
(dialplanVersionStamp != NULL) ? dialplanVersionStamp:"",
fcpVersionStamp,
cucmResult != NULL ? cucmResult: "",
(loadId != NULL) ? loadId : "",
(inactiveLoadId != NULL) ? inactiveLoadId : "",
(loadServer != NULL) ? loadServer : "",
(logServer != NULL) ? logServer : "",
ppid == TRUE? "True": "False");
// following data is freed in function freeSessionMgmtData()
msg.func_id = SESSION_MGMT_APPLY_CONFIG;
msg.data.config.config_version_stamp = STRLIB_CREATE(configVersionStamp);
msg.data.config.dialplan_version_stamp = STRLIB_CREATE(dialplanVersionStamp);
msg.data.config.fcp_version_stamp = STRLIB_CREATE(fcpVersionStamp);
msg.data.config.cucm_result = STRLIB_CREATE(cucmResult);
msg.data.config.load_id = STRLIB_CREATE(loadId);
msg.data.config.inactive_load_id = STRLIB_CREATE(inactiveLoadId);
msg.data.config.load_server = STRLIB_CREATE(loadServer);
msg.data.config.log_server = STRLIB_CREATE(logServer);
msg.data.config.ppid = ppid;
if ( ccappTaskPostMsg(CCAPP_SESSION_MGMT, &msg, sizeof(session_mgmt_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_DEBUG(DEB_F_PREFIX"failed to send platform_apply_config msg\n", DEB_F_PREFIX_ARGS(PLAT_API, fname));
}
}

View File

@ -1,396 +0,0 @@
/* 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 <time.h>
#include <string.h>
#include "cpr.h"
#include "cpr_string.h"
#include "phone_debug.h"
#include "prot_configmgr.h"
#include "phone.h"
#include "CCProvider.h"
#include "cpr_stdlib.h"
#include "ccsip_pmh.h"
#include "platform_api.h"
#include <fcntl.h>
#include "ccapp_task.h"
/*--------------------------------------------------------------------------
* Local definitions
*--------------------------------------------------------------------------
*/
#define PLT_F_PREFIX "PLT : %s : " // requires 1 arg: fname
// Why don't we modify strlib_malloc to handle NULL?
#define STRLIB_CREATE(str) (str)?strlib_malloc((str), strlen((str))):strlib_empty()
/*--------------------------------------------------------------------------
* Global data
*--------------------------------------------------------------------------
*/
/*--------------------------------------------------------------------------
* External function prototypes
*--------------------------------------------------------------------------
*/
void platform_sync_cfg_vers(char *cfg_ver, char *dp_ver, char *softkey_ver);
void platform_reg_fallback_ind(int fallback_to);
void platform_reg_failover_ind(int failover_to);
/*--------------------------------------------------------------------------
* Local scope function prototypes
*--------------------------------------------------------------------------
*/
/**
* give the platform IP address mode. This is a temporary function
* until config_get_value(CFGID_IP_ADDR_MODE, &ip_mode, sizeof(ip_mode))
* is fully implemented (P2).
*
* @param none
*
* @return CPR_IP_MODE_IPV4,
* CPR_IP_MODE_IPV6,
* CPR_IP_MODE_DUAL
*/
cpr_ip_mode_e
platform_get_ip_address_mode (void)
{
cpr_ip_mode_e ip_mode;
//config_get_value(CFGID_IP_ADDR_MODE, &ip_mode, sizeof(ip_mode));
/* fake mode to what ever mode under test here */
ip_mode = CPR_IP_MODE_IPV4;
return (ip_mode);
}
/**
* Send a reset or restart request to the adapter
*
* @param action - reset or restart
* @return none
*
*/
void
platform_reset_req (DeviceResetType action)
{
static const char fname[] = "platform_reset_req";
feature_update_t msg;
DEF_DEBUG(DEB_F_PREFIX"***********%s, requested***********\n",
DEB_F_PREFIX_ARGS(PLAT_API, fname),
(action==1)? "RESET":"RESTART");
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = DEVICE_SERVICE_CONTROL_REQ;
msg.update.ccFeatUpd.data.reset_type = action;
if ( ccappTaskPostMsg(CCAPP_FEATURE_UPDATE, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_DEBUG(DEB_F_PREFIX"failed to send platform_reset_req(%d) msg \n", DEB_F_PREFIX_ARGS(PLAT_API, fname), action);
}
}
/**
* Ask the platform to sync with versions got from call control
* or outside entity. As part of the sync, platform downloads
* the files if required.
*
* @param cfg_ver - version stamp for config file
* @param dp_ver - version stamp for the dialplan file
* @param softkey_ver - version stamp for the softkey file.
*
* @return none
*/
void
platform_sync_cfg_vers (char *cfg_ver, char *dp_ver, char *softkey_ver)
{
static const char fname[] = "platform_sync_cfg_vers";
char empty_string[] = "";
feature_update_t msg;
if (cfg_ver == NULL) {
cfg_ver = empty_string;
}
if (dp_ver == NULL) {
dp_ver = empty_string;
}
if (softkey_ver == NULL) {
softkey_ver = empty_string;
}
CCAPP_DEBUG(DEB_F_PREFIX"cfg_ver=%s dp_ver=%s sk_ver=%s\n", DEB_F_PREFIX_ARGS(PLAT_API, fname),
cfg_ver, dp_ver, softkey_ver);
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = DEVICE_SYNC_CONFIG_VERSION;
msg.update.ccFeatUpd.data.cfg_ver_data.cfg_ver = strlib_malloc(cfg_ver, strlen(cfg_ver));
msg.update.ccFeatUpd.data.cfg_ver_data.dp_ver = strlib_malloc(dp_ver, strlen(dp_ver));
msg.update.ccFeatUpd.data.cfg_ver_data.softkey_ver = strlib_malloc(softkey_ver, strlen(softkey_ver));
if ( ccappTaskPostMsg(CCAPP_FEATURE_UPDATE, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_DEBUG(DEB_F_PREFIX"failed to send platform_sync_cfg_vers msg \n",
DEB_F_PREFIX_ARGS(PLAT_API, fname));
}
}
/**
*
* Tell platform to adjust the time to the gmt_time received from outside
* For sip the "outside" is from the "Date" header coming from a CCM or
* any other Server
*
* @param gmt_time - GMT time in seconds
*
* @return none
*/
void
platform_set_time (long gmt_time)
{
static const char fname[] = "platform_set_time";
session_mgmt_t msg;
CCAPP_DEBUG(DEB_F_PREFIX"setting time to=%ld", DEB_F_PREFIX_ARGS(PLAT_API, fname), gmt_time);
msg.func_id = SESSION_MGMT_SET_TIME;
msg.data.time.gmt_time = gmt_time;
if ( ccappTaskPostMsg(CCAPP_SESSION_MGMT, &msg, sizeof(session_mgmt_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_DEBUG(DEB_F_PREFIX"failed to send platform_set_time msg\n", DEB_F_PREFIX_ARGS(PLAT_API, fname));
}
}
/**
*
* Indicate to the platform that reg manager wants to failover to a Call
* control indicated in failover_to. A corresponding ccRegFailoverRsp()
* will be issued by the platform once the failover indication is processed.
*
* @param failover_to - type of call control,
* e.g. cip_sipcc_CcMgmtConst_CC_TYPE_CCM
* @return none
*/
void
platform_reg_failover_ind (int failover_to)
{
static const char fname[] = "platform_reg_failover_ind";
feature_update_t msg;
DEF_DEBUG(DEB_F_PREFIX"***********Failover to %s=%d ***********\n",
DEB_F_PREFIX_ARGS(PLAT_API, fname),
failover_to == CC_TYPE_CCM ? "CC_TYPE_CCM" :
"Other", failover_to);
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = CCAPP_FAILOVER_IND;
msg.update.ccFeatUpd.data.line_info.info = failover_to;
if ( ccappTaskPostMsg(CCAPP_FAILOVER_IND, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(PLT_F_PREFIX"failed to send platform_reg_failover_ind(%d) msg \n", fname, failover_to);
}
}
/**
* Indicate to the platform that reg manager intends to fallback to
* primary CCM. Currently the fallback_to is always to CC_TYPE_CCM.
*
* @param fallback_to - type of call control,
* e.g. cip_sipcc_CcMgmtConst_CC_TYPE_CCM
*
* @return none
*/
void
platform_reg_fallback_ind (int fallback_to)
{
static const char fname[] = "platform_reg_fallback_ind";
feature_update_t msg;
DEF_DEBUG(DEB_F_PREFIX"***********Fallback to %d CUCM.***********\n",
DEB_F_PREFIX_ARGS(PLAT_API, fname),
fallback_to);
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = CCAPP_FALLBACK_IND;
msg.update.ccFeatUpd.data.line_info.info = fallback_to;
if ( ccappTaskPostMsg(CCAPP_FALLBACK_IND, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(PLT_F_PREFIX"failed to send platform_reg_fallback_ind(%d) msg \n", fname, fallback_to);
}
}
/**
*
* Indicate to the platform that current fallback activity
* is complete i.e. either success or encountered an error
* and that the platform should put the User interaction back
* in service.
*
* @param none
*
* @return none
*/
void
platform_reg_fallback_cfm (void)
{
static const char fname[] = "platform_reg_fallback_cfm";
DEF_DEBUG(DEB_F_PREFIX"***********Fallback completed.***********\n",
DEB_F_PREFIX_ARGS(PLAT_API, fname));
}
/**
*
* Indicate to the platform that current failover activity
* is complete i.e. either success or encountered an error
* and that the platform should put the User interaction back
* in service.
*
* @param none
*
* @return none
*/
void
platform_reg_failover_cfm (void)
{
static const char fname[] = "platform_reg_failover_cfm";
DEF_DEBUG(DEB_F_PREFIX"***********Failover completed.***********\n",
DEB_F_PREFIX_ARGS(PLAT_API, fname));
}
/**
*
* Notify the platform that call control has shut down.
*
* @param none
*
* @return none
*/
void
shutdownCCAck (void)
{
static const char fname[] = "shutdownCCAck";
feature_update_t msg;
CCAPP_DEBUG(DEB_F_PREFIX"\n", DEB_F_PREFIX_ARGS(PLAT_API, fname));
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = CCAPP_SHUTDOWN_ACK;
if ( ccappTaskPostMsg(CCAPP_SHUTDOWN_ACK, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(PLT_F_PREFIX"failed to send shutdownCCAck(%d) msg \n", fname);
}
}
/**
* Notify the platform about the change in call control mode.
*
* @param mode - the call control mode.
* cip_sipcc_CcMgmtConst_CC_TYPE_CCM
* or cip_sipcc_CcMgmtConst_CC_TYPE_OTHER
*
* @return none
*/
void
platform_cc_mode_notify (int mode)
{
static const char fname[] = "platform_cc_mode_notify";
feature_update_t msg;
CCAPP_DEBUG(DEB_F_PREFIX"mode =%d\n", DEB_F_PREFIX_ARGS(PLAT_API, fname), mode);
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = CCAPP_MODE_NOTIFY;
msg.update.ccFeatUpd.data.line_info.info = mode;
if ( ccappTaskPostMsg(CCAPP_MODE_NOTIFY, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(PLT_F_PREFIX"failed to send platform_cc_mode_notify(%d) msg \n", fname, mode);
}
}
int
platform_get_phrase_text (int ndx, char *outstr, uint32_t len)
{
static const char fname[] = "platform_get_phrase_text";
session_mgmt_t msg;
CCAPP_DEBUG(DEB_F_PREFIX "index=%d\n", DEB_F_PREFIX_ARGS(PLAT_API, fname), ndx);
msg.func_id = SESSION_MGMT_GET_PHRASE_TEXT;
msg.data.phrase_text.ndx = ndx;
msg.data.phrase_text.outstr = outstr;
msg.data.phrase_text.len = len;
ccappSyncSessionMgmt(&msg);
return msg.data.phrase_text.ret_val;
}
/*called from configapp.c. This routine will set the kpml
value on the java side and trigger it down to c-side.
Also, it will reinitialize the dialplan. */
void
update_kpmlconfig(int kpmlVal)
{
static const char fname[] = "update_kpmlconfig";
session_mgmt_t msg;
CCAPP_DEBUG(DEB_F_PREFIX "kpml=%d\n", DEB_F_PREFIX_ARGS(PLAT_API, fname), kpmlVal);
msg.func_id = SESSION_MGMT_UPDATE_KPMLCONFIG;
msg.data.kpmlconfig.kpml_val = kpmlVal;
if ( ccappTaskPostMsg(CCAPP_SESSION_MGMT, &msg, sizeof(session_mgmt_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_DEBUG(DEB_F_PREFIX"failed to send update_kpmlconfig msg\n", DEB_F_PREFIX_ARGS(PLAT_API, fname));
}
}
boolean
check_speaker_headset_mode()
{
static const char fname[] = "check_speaker_headset_mode";
CCAPP_DEBUG(DEB_F_PREFIX "checking SPEAKER and HEADSET active or not\n", DEB_F_PREFIX_ARGS(PLAT_API, fname));
return platGetSpeakerHeadsetMode();
}
/**
*
* Notify the platform to logout and reset.
*
* @param none
*
* @return none
*/
void
platform_logout_reset_req(void){
static const char fname[] = "platform_logout_reset_req";
feature_update_t msg;
CCAPP_DEBUG(DEB_F_PREFIX"\n", DEB_F_PREFIX_ARGS(PLAT_API, fname));
msg.sessionType = SESSIONTYPE_CALLCONTROL;
msg.featureID = CCAPP_LOGOUT_RESET;
if ( ccappTaskPostMsg(CCAPP_FALLBACK_IND, &msg, sizeof(feature_update_t), CCAPP_CCPROVIER) != CPR_SUCCESS ) {
CCAPP_ERROR(PLT_F_PREFIX"failed to send Logout_Reset(%d) msg \n", fname);
}
return;
}

View File

@ -1,431 +0,0 @@
/* 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/. */
#ifndef _PROT_CFGMGR_PRIVATE_H_
#define _PROT_CFGMGR_PRIVATE_H_
#include "cpr_types.h"
#include "ccapi.h"
#include "ccsip_protocol.h"
//TEMPORARY REMOVAL #include "sntp.h"
#include "configmgr.h"
#include "dtmf.h"
#include "phone_platform_constants.h"
#ifdef SAPP_SAPP_GSM
#define DEFAULT_PROTOCOL "sip"
#define SCCP_WELL_KNOWN_PORT_STR "2000"
#endif
#define SIP_PLATFORM_CONFIG_DATE_TEMPLATE_24HOUR "M/D/Y"
#define SIP_PLATFORM_CONFIG_DATE_TEMPLATE_12HOUR "M/D/YA"
#define DYNAMIC_DTMF_PAYLOAD_MIN 96
#define DYNAMIC_DTMF_PAYLOAD_MAX 127
// Includes 3 CCMS
#define MAX_CCMS 4
#define MAX_CODEC_ENTRIES 10
// updated MAX_LOAD_FILE_NAME to be in sync with XmlDefaultConfigParmObject
#define MAX_LOAD_FILE_NAME 65
/*********************************************************
*
* Config Block Definition
* This structure holds all of the parsed configuration
* information obtained from the TFTP config file
*
* To add new entries to the config table, please see
* the instructions in configmgr.h and prot_configmgr.h
*
* note: IP addresses are internally stored in the
* Telecaster "Byte Reversed" order.
* Eg. 0xf8332ca1 = 161.44.51.248
*
********************************************************/
typedef struct
{
int feature;
int index;
int maxnumcalls;
int busy_trigger;
char name[MAX_LINE_NAME_SIZE];
char authname[AUTH_NAME_SIZE];
char password[MAX_LINE_PASSWORD_SIZE];
char displayname[MAX_LINE_NAME_SIZE]; // Actually we allow upto 32 UTF-8 chars which typically needs 32*3 octets.
char contact[MAX_LINE_CONTACT_SIZE];
int autoanswer;
char autoanswer_mode[MAX_LINE_AUTO_ANS_MODE_SIZE];
int call_waiting;
int msg_waiting_lamp;
int msg_waiting_amwi;
int ring_setting_idle;
int ring_setting_active;
char proxy_address[MAX_IPADDR_STR_LEN];
int proxy_port;
char cfwdall[MAX_URL_LENGTH];
char speeddial_number[MAX_LINE_NAME_SIZE];
char retrieval_prefix[MAX_LINE_NAME_SIZE];
char messages_number[MAX_LINE_NAME_SIZE];
int fwd_caller_name_display;
int fwd_caller_number_display;
int fwd_redirected_number_display;
int fwd_dialed_number_display;
int feature_option_mask;
} line_cfg_t;
typedef struct
{
char address[MAX_IPADDR_STR_LEN];
char ipv6address[MAX_IPADDR_STR_LEN];
int sip_port;
int sec_level;
int is_valid;
} ccm_cfg_t;
typedef struct
{
cpr_ip_addr_t my_ip_addr;
uint8_t my_mac_addr[6];
line_cfg_t line[MAX_CONFIG_LINES];
ccm_cfg_t ccm[MAX_CCMS];
int proxy_register;
int sip_retx; /* SIP retransmission count */
int sip_invite_retx; /* SIP INVITE request retransmission count */
int timer_t1; /* SIP T1 timer value */
int timer_t2; /* SIP T2 timer value */
int timer_invite_expires; /* SIP Expires timer value */
int timer_register_expires;
/*
* preferred codec is kept as key_table_entry structure. The
* name field of the key is a primary indication whether the
* parameter is configured or not. This is because the
* zero value is a designated value for G711 and the -1 is
* for no codec. The -1 is not natural value of uninitialized
* variable therefore keep the codec as name and value pair.
* The missing of the name indiates there the parameter is not
* configured.
*/
key_table_entry_t preferred_codec;
int dtmf_db_level;
DtmfOutOfBandTransport_t dtmf_outofband;
int dtmf_avt_payload;
int callerid_blocking;
int dnd_call_alert;
int dnd_reminder_timer;
int blf_alert_tone_idle;
int blf_alert_tone_busy;
int auto_pickup_enabled;
int call_hold_ringback;
int stutter_msg_waiting;
int call_stats;
int auto_answer;
int anonymous_call_block;
int nat_enable;
char nat_address[MAX_IPADDR_STR_LEN];
int voip_control_port;
unsigned int media_port_start;
unsigned int media_port_end;
char sync[MAX_SYNC_LEN];
char proxy_backup[MAX_IPADDR_STR_LEN];
char proxy_emergency[MAX_IPADDR_STR_LEN];
int proxy_backup_port;
int proxy_emergency_port;
int nat_received_processing;
char proxy_outbound[MAX_IPADDR_STR_LEN];
int proxy_outbound_port;
char reg_user_info[MAX_REG_USER_INFO_LEN];
int cnf_join_enable;
int remote_party_id;
int semi_xfer;
char cfwd_uri[MAX_URL_LENGTH];
int local_cfwd_enable;
int timer_register_delta;
int rfc_2543_hold;
int sip_max_forwards;
int conn_monitor_duration;
char call_pickup_uri[MAX_URL_LENGTH];
char call_pickup_list_uri[MAX_URL_LENGTH];
char call_pickup_group_uri[MAX_URL_LENGTH];
char meet_me_service_uri[MAX_URL_LENGTH];
char call_forward_uri[MAX_URL_LENGTH];
char abbreviated_dial_uri[MAX_URL_LENGTH];
int call_log_blf_enabled;
int remote_cc_enabled;
int timer_keepalive_expires;
int timer_subscribe_expires;
int timer_subscribe_delta;
int transport_layer_prot;
int kpml;
int enable_vad;
int autoanswer_idle_alt;
int autoanswer_timer;
int autoanswer_override;
int offhook_to_first_digit;
int call_waiting_period;
int ring_setting_busy_pol;
int dscp_for_call_control;
int speaker_enabled;
int xfr_onhook_enabled;
int retain_forward_information;
int rollover;
int join_across_lines;
int emcc_mode;
int visiting_em_port;
char visiting_em_ip[MAX_IPADDR_STR_LEN];
int ip_addr_mode;
char load_file[MAX_LOAD_FILE_NAME];
int inter_digit_timer;
int dscp_audio;
int dscp_video;
char deviceName[MAX_REG_USER_INFO_LEN];
uint8_t my_active_mac_addr[6];
char userAgent[MAX_REG_USER_INFO_LEN];
char modelNumber[MAX_REG_USER_INFO_LEN];
int srst_is_secure;
char join_dxfer_policy[MAX_JOIN_DXFER_POLICY_SIZE];
char external_number_mask[MAX_EXTERNAL_NUMBER_MASK_SIZE];
char media_ip_addr[MAX_IPADDR_STR_LEN];
int p2psip;
int sdpmode;
char version[4];
int rtcpmux;
int rtpsavpf;
int maxavbitrate;
int maxcodedaudiobw;
int usedtx;
int stereo;
int useinbandfec;
int cbr;
int maxptime;
int sctp_port;
int num_data_streams;
} prot_cfg_t;
static prot_cfg_t prot_cfg_block;
/*********************************************************
* return (1);
* Config Table Keytable Structures
*
* Some config table entries can only contain special return (1);
* values. Those entries must specify a key table
* that contains valid values for the entry.
*
*********************************************************/
/*
* codec_table table is used for parsing configured preferred
* codec, J-side caches string and it is converted to the enumerated
* value during reset/restart. The "none" value is currently used
* by CUCM' TFTP when there is no preferred codec configured and
* therefore the "none" is included in the table.
*/
static const key_table_entry_t codec_table[] = {
{"g711ulaw", RTP_PCMU},
{"g711alaw", RTP_PCMA},
{"g729a", RTP_G729},
{"L16", RTP_L16},
#ifdef CISCOWB_SUPPORTED
{"CiscoWb", RTP_CISCOWB},
#endif
{"g722", RTP_G722},
{"iLBC", RTP_ILBC},
{"iSAC", RTP_ISAC},
{"opus", RTP_OPUS},
{"none", RTP_NONE},
{0, RTP_NONE}
};
static const key_table_entry_t dtmf_outofband_table[] = {
{"none", DTMF_OUTOFBAND_NONE},
{"avt", DTMF_OUTOFBAND_AVT},
{"avt_always", DTMF_OUTOFBAND_AVT_ALWAYS},
{0, 0}
};
static const key_table_entry_t user_info_table[] = {
{"none", 0,},
{"phone", 1,},
{"ip", 2,},
{0, 0,}
};
/*********************************************************
*!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
* SIP Protocol Config table Variable Name and Type Definitions
*
* This table defines all the possible variables that can
* be set in the TFTP config file (if used).
* var: Is the name as it is defined in the ascii
* configuration file.
* addr: Is the address of where the parsed variable
* is stored into memory
* len: Is the length of the item in kazoo memory.
* (Important for things like strings)
* parser: Is a function pointer to a routine that is
* used to parse (convert) this particular
* variable from ascii form to internal form.
* print: Is a function pointer to a routine that is
* used to print (convert) this particular
* variable from internal form to ascii form.
* keytable: Defines the table of values that this entry
* can have.
*
*!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!
* Before changing any these, please read the following:
*
* This table MUST be kept in sync with the configuration
* ID enums located in the prot_configmgr.h
* file. There is a one-to-one correspondence between those
* enums and this table.
*
* To add or remove config properties, please refer to the
* file prot_configmgr.h.
*
*!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!
*********************************************************/
/*********************************************************
*
* Platform-Specific Configuration Section
* (Common across all IP Phone protocols.)
*
********************************************************/
/* name {addr & len} parser print */
/* ------------------------ ----------------- ------ ------ */
var_t prot_cfg_table[CFGID_PROTOCOL_MAX+1] = {
/* 0 */{"startMediaPort",CFGVAR(media_port_start), PA_INT, PR_INT, 0},
{"endMediaPort", CFGVAR(media_port_end), PA_INT, PR_INT, 0},
{"callerIdBlocking", CFGVAR(callerid_blocking), PA_INT, PR_INT, 0},
{"anonymousCallBlock", CFGVAR(anonymous_call_block), PA_INT, PR_INT, 0},
{"dndCallAlert", CFGVAR(dnd_call_alert), PA_INT, PR_INT, 0},
{"dndReminderTimer", CFGVAR(dnd_reminder_timer), PA_INT, PR_INT, 0},
{"preferredCode", CFGVAR(preferred_codec), PA_KEYE, PR_KEYE, codec_table},
{"dtmfOutofBand",CFGVAR(dtmf_outofband), PA_KEY, PR_KEY, dtmf_outofband_table},
{"dtmfAvtPayload", CFGVAR(dtmf_avt_payload), PA_INT, PR_INT, 0},
{"dtmfDbLevel", CFGVAR(dtmf_db_level), PA_INT, PR_INT, 0},
{"sipRetx", CFGVAR(sip_retx), PA_INT, PR_INT, 0},
/*11*/ {"sipInviteRetx", CFGVAR(sip_invite_retx), PA_INT, PR_INT, 0},
{"timerT1", CFGVAR(timer_t1), PA_INT, PR_INT, 0},
{"timerT2", CFGVAR(timer_t2), PA_INT, PR_INT, 0},
{"timerInviteExpires", CFGVAR(timer_invite_expires), PA_INT, PR_INT, 0},
{"timerRegisterExpires", CFGVAR(timer_register_expires), PA_INT, PR_INT, 0},
{"registerWithProxy", CFGVAR(proxy_register), PA_INT, PR_INT, 0},
{"backupProxy", CFGVAR(proxy_backup), PA_STR, PR_STR, 0},
{"backupProxyPort", CFGVAR(proxy_backup_port), PA_INT, PR_INT, 0},
{"emergencyProxy", CFGVAR(proxy_emergency), PA_STR, PR_STR, 0},
{"emergencyProxyPort", CFGVAR(proxy_emergency_port), PA_INT, PR_INT, 0},
{"outboundProxy", CFGVAR(proxy_outbound), PA_STR, PR_STR, 0},
{"outboundProxyPort", CFGVAR(proxy_outbound_port), PA_INT, PR_INT, 0},
{"natReceivedProcessing", CFGVAR(nat_received_processing),PA_INT, PR_INT, 0},
{"userInfo", CFGVAR(reg_user_info), PA_KEY, PR_KEY, user_info_table},
{"cnfJoinEnable", CFGVAR(cnf_join_enable), PA_INT, PR_INT, 0},
{"remotePartyID", CFGVAR(remote_party_id), PA_INT, PR_INT, 0},
{"semiAttendedTransfer", CFGVAR(semi_xfer), PA_INT, PR_INT, 0},
{"callHoldRingback", CFGVAR(call_hold_ringback), PA_INT, PR_INT, 0},
{"stutterMsgWaiting", CFGVAR(stutter_msg_waiting), PA_INT, PR_INT, 0},
{"callForwardUri", CFGVAR(cfwd_uri), PA_STR, PR_STR, 0},
/*31*/ {"callStats", CFGVAR(call_stats), PA_INT, PR_INT, 0},
{"autoAnswer", CFGVAR(auto_answer), PA_INT, PR_INT, 0},
{"localCfwdEnable", CFGVAR(local_cfwd_enable), PA_INT, PR_INT, 0},
{"timerRegisterDelta", CFGVAR(timer_register_delta), PA_INT, PR_INT, 0},
{"MaxRedirects", CFGVAR(sip_max_forwards), PA_INT, PR_INT, 0},
{"rfc2543Hold", CFGVAR(rfc_2543_hold), PA_INT, PR_INT, 0},
{"ccm1_address", CFGVAR(ccm[0].address), PA_STR, PR_STR, 0},
{"ccm2_address", CFGVAR(ccm[1].address), PA_STR, PR_STR, 0},
{"ccm3_address", CFGVAR(ccm[2].address), PA_STR, PR_STR, 0},
{"ccm1_ipv6address", CFGVAR(ccm[0].ipv6address), PA_STR, PR_STR, 0},
{"ccm2_ipv6address", CFGVAR(ccm[1].ipv6address), PA_STR, PR_STR, 0},
{"ccm3_ipv6address", CFGVAR(ccm[2].ipv6address), PA_STR, PR_STR, 0},
{"ccm1_sipPort", CFGVAR(ccm[0].sip_port), PA_INT, PR_INT, 0},
{"ccm2_sipPort", CFGVAR(ccm[1].sip_port), PA_INT, PR_INT, 0},
{"ccm3_sipPort", CFGVAR(ccm[2].sip_port), PA_INT, PR_INT, 0},
{"ccm1_securityLevel", CFGVAR(ccm[0].sec_level), PA_INT, PR_INT, 0},
{"ccm2_securityLevel", CFGVAR(ccm[1].sec_level), PA_INT, PR_INT, 0},
{"ccm3_securityLevel", CFGVAR(ccm[2].sec_level), PA_INT, PR_INT, 0},
{"ccm1_isValid", CFGVAR(ccm[0].is_valid), PA_INT, PR_INT, 0},
/*50*/ {"ccm2_isValid", CFGVAR(ccm[1].is_valid), PA_INT, PR_INT, 0},
{"ccm3_isValid", CFGVAR(ccm[2].is_valid), PA_INT, PR_INT, 0},
{"ccmTftp_ipAddr", CFGVAR(ccm[3].address), PA_STR, PR_STR, 0},
{"ccmTftp_port", CFGVAR(ccm[3].sip_port), PA_INT, PR_INT, 0},
{"ccmTftp_isValid", CFGVAR(ccm[3].is_valid), PA_INT, PR_INT, 0},
{"ccmTftp_securityLevel", CFGVAR(ccm[3].sec_level), PA_INT, PR_INT, 0},
{"ccmSrstIpAddr", CFGVAR(ccm[4].address), PA_STR, PR_STR, 0},
{"ccmSrst_sipPort", CFGVAR(ccm[4].sip_port), PA_INT, PR_INT, 0},
{"ccmSrst_isValid", CFGVAR(ccm[4].is_valid), PA_INT, PR_INT, 0},
{"ccmSrst_securityLevel", CFGVAR(ccm[4].sec_level), PA_INT, PR_INT, 0},
{"connectionMonitorDuration", CFGVAR(conn_monitor_duration), PA_INT, PR_INT, 0},
{"callPickupURI", CFGVAR(call_pickup_uri), PA_STR, PR_STR, 0},
{"callPickupListURI", CFGVAR(call_pickup_list_uri), PA_STR, PR_STR, 0},
{"callPickupGroupURI", CFGVAR(call_pickup_group_uri), PA_STR, PR_STR, 0},
{"meetMeServiceURI", CFGVAR(meet_me_service_uri), PA_STR, PR_STR, 0},
{"callForwardURI", CFGVAR(call_forward_uri), PA_STR, PR_STR, 0},
{"abbreviatedDialURI", CFGVAR(abbreviated_dial_uri), PA_STR, PR_STR, 0},
{"callLogBlfEnabled", CFGVAR(call_log_blf_enabled), PA_INT, PR_INT, 0},
{"remoteCcEnabled", CFGVAR(remote_cc_enabled), PA_INT, PR_INT, 0},
{"retainForwardInformation", CFGVAR(retain_forward_information), PA_INT, PR_INT, 0},
/*70*/ {"timerKeepaliveExpires", CFGVAR(timer_keepalive_expires),PA_INT, PR_INT, 0},
{"timerSubscribeExpires", CFGVAR(timer_subscribe_expires),PA_INT, PR_INT, 0},
{"timerSubscribeDelta", CFGVAR(timer_subscribe_delta), PA_INT, PR_INT, 0},
{"transportLayerProtocol", CFGVAR(transport_layer_prot), PA_INT, PR_INT, 0},
{"kpml", CFGVAR(kpml), PA_INT, PR_INT, 0},
{"natEnable", CFGVAR(nat_enable), PA_INT, PR_INT, 0},
{"natAddress", CFGVAR(nat_address), PA_STR, PR_STR, 0},
{"voipControlPort", CFGVAR(voip_control_port), PA_INT, PR_INT, 0},
{"myIpAddr", CFGVAR(my_ip_addr), PA_IP, PR_IP, 0},
{"myMacAddr", CFGVAR(my_mac_addr), PA_STR, PR_MAC, 0},
{"enableVad", CFGVAR(enable_vad), PA_INT, PR_INT, 0},
{"autoAnswerAltBehavior", CFGVAR(autoanswer_idle_alt), PA_INT, PR_INT, 0},
{"autoAnswerTimer", CFGVAR(autoanswer_timer), PA_INT, PR_INT, 0},
{"autoAnswerOverride", CFGVAR(autoanswer_override), PA_INT, PR_INT, 0},
{"offhookToFirstDigitTimer", CFGVAR(offhook_to_first_digit), PA_INT, PR_INT, 0},
{"silentPeriodBetweenCallWaitingBursts", CFGVAR(call_waiting_period), PA_INT, PR_INT, 0},
{"ringSettingBusyStationPolicy", CFGVAR(ring_setting_busy_pol), PA_INT, PR_INT, 0},
{"DscpForCm2Dvce", CFGVAR(dscp_for_call_control), PA_INT, PR_INT, 0},
{"speakerEnabled", CFGVAR(speaker_enabled), PA_INT, PR_INT, 0},
{"transferOnhookEnable", CFGVAR(xfr_onhook_enabled), PA_INT, PR_INT, 0},
/*90*/ {"rollover", CFGVAR(rollover), PA_INT, PR_INT, 0},
{"loadFileName", CFGVAR(load_file), PA_STR, PR_STR, 0},
{"blfAlertToneIdle", CFGVAR(blf_alert_tone_idle),PA_INT, PR_INT, 0},
{"blfAlertToneBusy", CFGVAR(blf_alert_tone_busy),PA_INT, PR_INT, 0},
{"autoPickupEnable", CFGVAR(auto_pickup_enabled),PA_INT, PR_INT, 0},
{"joinAcrossLines", CFGVAR(join_across_lines), PA_INT, PR_INT, 0},
/*96*/ {"myActiveMacAddr", CFGVAR(my_active_mac_addr), PA_STR, PR_MAC, 0},
/*97*/ {"DscpAudio", CFGVAR(dscp_audio), PA_INT, PR_INT, 0},
{"deviceName", CFGVAR(deviceName), PA_STR, PR_STR, 0},
{"userAgent", CFGVAR(userAgent), PA_STR, PR_STR, 0},
{"modelNumber", CFGVAR(modelNumber), PA_STR, PR_STR, 0},
{"DscpVideo", CFGVAR(dscp_video), PA_INT, PR_INT, 0},
{"IPAddrMode", CFGVAR(ip_addr_mode), PA_INT, PR_INT, 0},
{"interDigitTimer", CFGVAR(inter_digit_timer), PA_INT, PR_INT, 0},
{"emccMode", CFGVAR(emcc_mode), PA_INT, PR_INT, 0},
{"visitingEMPort", CFGVAR(visiting_em_port), PA_INT, PR_INT, 0},
{"visitingEMIpAddress", CFGVAR(visiting_em_ip), PA_STR, PR_STR, 0},
{"isSRSTSecure", CFGVAR(srst_is_secure), PA_INT, PR_INT, 0},
/*108*/ {"joinDxferPolicy", CFGVAR(join_dxfer_policy), PA_STR, PR_STR, 0},
{"externalNumberMask", CFGVAR(external_number_mask), PA_STR, PR_STR, 0},
{"mediaIpAddr", CFGVAR(media_ip_addr), PA_STR, PR_STR, 0},
{"p2psip", CFGVAR(p2psip), PA_INT, PR_INT, 0},
{"version", CFGVAR(version), PA_STR, PR_STR, 0},
{"sdpmode", CFGVAR(sdpmode), PA_INT, PR_INT, 0},
{"rtcpmux", CFGVAR(rtcpmux), PA_INT, PR_INT, 0},
{"rtpsavpf", CFGVAR(rtpsavpf), PA_INT, PR_INT, 0},
{"maxavbitrate", CFGVAR(maxavbitrate), PA_INT, PR_INT, 0},
{"maxcodedaudiobw", CFGVAR(maxcodedaudiobw), PA_INT, PR_INT, 0},
{"usedtx", CFGVAR(usedtx), PA_INT, PR_INT, 0},
{"stereo", CFGVAR(stereo), PA_INT, PR_INT, 0},
{"useinbandfec", CFGVAR(useinbandfec), PA_INT, PR_INT, 0},
{"cbr", CFGVAR(cbr), PA_INT, PR_INT, 0},
{"maxptime", CFGVAR(maxptime), PA_INT, PR_INT, 0},
{"sctp_port", CFGVAR(sctp_port), PA_INT, PR_INT, 0},
{"num_data_streams", CFGVAR(num_data_streams), PA_INT, PR_INT, 0},
{0, 0, 0, 0, 0, 0}
};
#endif /* _PROT_CFGMGR_PRIVATE_H_ */

View File

@ -1,890 +0,0 @@
/* 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 "cpr_types.h"
#include "cpr_stdio.h"
#include "cpr_string.h"
#include "cpr_in.h"
#include "util_string.h"
#include "task.h"
#include "upgrade.h"
#include "ccsip_task.h"
#include "config.h"
#include "ccsip_core.h"
#include "prot_configmgr.h"
#include "prot_cfgmgr_private.h"
#include "sip_common_transport.h"
#include "phone_debug.h"
#include "regmgrapi.h"
#include "rtp_defs.h"
#include "vcm.h"
#include "plat_api.h"
#define MAX_TOS_VALUE 5
#define MIN_VOIP_PORT_RANGE 1024
#define MAX_VOIP_PORT_RANGE 65535
#define MAX_AUTO_ANSWER_7960 63
#define MIN_KEEPALIVE_EXPIRES 120
#define MAX_KEEPALIVE_EXPIRES 7200
extern void platform_get_ipv4_address(cpr_ip_addr_t *ip_addr);
extern void platform_get_ipv6_address(cpr_ip_addr_t *ip_addr);
extern boolean Is794x;
static cpr_ip_addr_t redirected_nat_ipaddr = {0,{0}};
static void config_set_current_codec_table(int codec_mask,
rtp_ptype *codec_table);
/*********************************************************
*
* Network Configuration Settings
* Look at making these generic and moving them to the
* network library...
*
*********************************************************/
static void initCfgTblEntry(int index, const char * name, void *addr, int length,
parse_func_t parse, print_func_t print,
const key_table_entry_t *key)
{
var_t *table;
table = &prot_cfg_table[index];
table->name = name;
table->addr = addr;
table->length = length;
table->parse_func = parse;
table->print_func = print;
table->key_table = key;
}
/* Function: protCfgTblInit()
*
* Description: Initializes line specific params in prot_cfg_table
*
* Parameters:
*
* Returns:
*/
void protCfgTblInit()
{
int i;
memset(&prot_cfg_block, 0, sizeof(prot_cfg_block));
for (i=0; i< MAX_CONFIG_LINES; i++) {
initCfgTblEntry(CFGID_LINE_INDEX+i, "Index", CFGVAR(line[i].index), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_FEATURE+i, "Feat", CFGVAR(line[i].feature), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_MAXNUMCALLS+i, "MNC", CFGVAR(line[i].maxnumcalls), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_BUSY_TRIGGER+i, "BT", CFGVAR(line[i].busy_trigger), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_PROXY_ADDRESS+i, "ProxyAddr", CFGVAR(line[i].proxy_address), PA_STR, PR_STR, 0);
initCfgTblEntry(CFGID_PROXY_PORT+i, "ProxyPort", CFGVAR(line[i].proxy_port), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_CALL_WAITING+i, "CWait", CFGVAR(line[i].call_waiting), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_AUTOANSWER_ENABLED+i, "AAns", CFGVAR(line[i].autoanswer), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_AUTOANSWER_MODE+i, "AAnsMode", CFGVAR(line[i].autoanswer_mode), PA_STR, PR_STR, 0);
initCfgTblEntry(CFGID_LINE_MSG_WAITING_LAMP+i, "MWILamp", CFGVAR(line[i].msg_waiting_lamp), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_MESSAGE_WAITING_AMWI+i, "AMWI", CFGVAR(line[i].msg_waiting_amwi), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_RING_SETTING_IDLE+i, "RingIdle", CFGVAR(line[i].ring_setting_idle), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_RING_SETTING_ACTIVE+i, "RingActive", CFGVAR(line[i].ring_setting_active), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_NAME+i, "Name", CFGVAR(line[i].name), PA_STR, PR_STR, 0);
initCfgTblEntry(CFGID_LINE_AUTHNAME+i, "AuthName", CFGVAR(line[i].authname), PA_STR, PR_STR, 0);
initCfgTblEntry(CFGID_LINE_PASSWORD+i, "Passwd", CFGVAR(line[i].password), PA_STR, PR_STR, 0);
initCfgTblEntry(CFGID_LINE_DISPLAYNAME+i, "DisplayName", CFGVAR(line[i].displayname), PA_STR, PR_STR, 0);
initCfgTblEntry(CFGID_LINE_CONTACT+i, "Contact", CFGVAR(line[i].contact), PA_STR, PR_STR, 0);
initCfgTblEntry(CFGID_LINE_CFWDALL+i, "CfwdAll", CFGVAR(line[i].cfwdall), PA_STR, PR_STR, 0);
initCfgTblEntry(CFGID_LINE_SPEEDDIAL_NUMBER+i, "speedDialNumber", CFGVAR(line[i].speeddial_number), PA_STR, PR_STR, 0);
initCfgTblEntry(CFGID_LINE_RETRIEVAL_PREFIX+i, "retrievalPrefix", CFGVAR(line[i].retrieval_prefix), PA_STR, PR_STR, 0);
initCfgTblEntry(CFGID_LINE_MESSAGES_NUMBER+i, "messagesNumber", CFGVAR(line[i].messages_number), PA_STR, PR_STR, 0);
initCfgTblEntry(CFGID_LINE_FWD_CALLER_NAME_DIPLAY+i, "callerName", CFGVAR(line[i].fwd_caller_name_display), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_FWD_CALLER_NUMBER_DIPLAY+i, "callerName", CFGVAR(line[i].fwd_caller_number_display), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_FWD_REDIRECTED_NUMBER_DIPLAY+i, "redirectedNumber", CFGVAR(line[i].fwd_redirected_number_display), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_FWD_DIALED_NUMBER_DIPLAY+i, "dialedNumber", CFGVAR(line[i].fwd_dialed_number_display), PA_INT, PR_INT, 0);
initCfgTblEntry(CFGID_LINE_FEATURE_OPTION_MASK+i, "featureOptionMask", CFGVAR(line[i].feature_option_mask), PA_INT, PR_INT, 0);
}
initCfgTblEntry(CFGID_PROTOCOL_MAX, 0, 0, 0, 0, 0, 0);
}
/*
* sip_config_get_net_device_ipaddr()
*
* Get the device IP address.
* Note: the IP Address is returned in the non-Telecaster
* SIP format, which is not byte reversed.
* Eg. 0xac2c33f8 = 161.44.51.248
*/
void
sip_config_get_net_device_ipaddr (cpr_ip_addr_t *ip_addr)
{
cpr_ip_addr_t ip_addr1 = {0,{0}};
platform_get_ipv4_address(&ip_addr1);
util_ntohl(ip_addr, &ip_addr1);
}
/*
* sip_config_get_net_device_ipaddr()
*
* Get the device IP address.
* Note: the IP Address is returned in the non-Telecaster
* SIP format, which is not byte reversed.
*
*/
void
sip_config_get_net_ipv6_device_ipaddr (cpr_ip_addr_t *ip_addr)
{
cpr_ip_addr_t ip_addr1 = {0,{0}};
platform_get_ipv6_address(&ip_addr1);
util_ntohl(ip_addr, &ip_addr1);
}
/*
* sip_config_get_nat_ipaddr()
*
* Get the nat IP address.
* Note: the IP Address is returned in the non-Telecaster
* SIP format, which is not byte reversed.
* Eg. 0xac2c33f8 = 161.44.51.248
*/
void
sip_config_get_nat_ipaddr (cpr_ip_addr_t *ip_addr)
{
cpr_ip_addr_t IPAddress;
char address[MAX_IPADDR_STR_LEN];
int dnsErrorCode = 1;
if (redirected_nat_ipaddr.type == CPR_IP_ADDR_INVALID) {
config_get_string(CFGID_NAT_ADDRESS, address, sizeof(address));
if ((cpr_strcasecmp(address, UNPROVISIONED) != 0) && (address[0] != 0)) {
dnsErrorCode = dnsGetHostByName(address, &IPAddress, 100, 1);
}
if (dnsErrorCode == 0) {
util_ntohl(ip_addr, &IPAddress);
return ;
} else {
/*
* If the NAT address is not provisioned or
* unavailable, return the local address instead.
*/
sip_config_get_net_device_ipaddr(ip_addr);
return;
}
} else {
*ip_addr = redirected_nat_ipaddr;
return ;
}
}
/*
* sip_config_set_nat_ipaddr()
*
* Set the device NAT IP address.
* Note: the IP Address is returned in the non-Telecaster
* SIP format, which is not byte reversed.
* Eg. 0xac2c33f8 = 161.44.51.248
*/
void
sip_config_set_nat_ipaddr (cpr_ip_addr_t *ip_address)
{
redirected_nat_ipaddr = *ip_address;
}
/*********************************************************
*
* SIP Configuration Settings
* These should probably be turned into generic config
* table "gets/sets" or should be moved to a SIP platform
* file. Maybe ccsip_platform_ui.c since that's where we
* have the other SIP Platform code. In the long run, we
* should rename ccsip_platform_ui.c to ccsip_platform.c
*
*********************************************************/
/*
* sip_config_get_line_from_button()
* Some cases CCM sends down line number instead of button number
* that has to be mapped to correct button number. This function is
* called to get actual line number for a given button number
*
* Returns: actual line number from given button number
*
*/
line_t
sip_config_get_line_from_button (line_t button)
{
line_t max_lines_allowed;
uint32_t line = 0;
line_t button_no = 0;
if (Is794x) {
max_lines_allowed = MAX_REG_LINES_794X;
} else {
max_lines_allowed = MAX_REG_LINES;
}
if ((button < 1) || (button > max_lines_allowed)) {
return (button);
}
config_get_line_value(CFGID_LINE_INDEX, &line,
sizeof(line), button);
/* Look for the line number through the configuration
* <line button="4" lineIndex="3>. If the inddex value is not
* found then use old way of searching for button. The dolby
* release of CCM adds index to configuration but older
* ccm does not support that.
*/
if (line > 0) {
return((line_t)line);
}
/* Try old way of calculating the line number
*/
line = 0;
button_no = 0;
for (button_no = 1; button_no <= button; button_no++) {
if (sip_config_check_line(button_no) == FALSE) {
continue;
}
line++;
}
return ((line_t)line);
}
/*
* sip_config_get_button_from_line()
*
* Some cases CCM sends down line number instead of button number
* that has to be mapped to correct button number.
*
* Parameters: line - the line instance
*
* Returns: line - actual button number
*
*/
line_t
sip_config_get_button_from_line (line_t line)
{
line_t max_lines_allowed;
line_t button = 0;
uint32_t line_no = 0;
if (Is794x) {
max_lines_allowed = MAX_REG_LINES_794X;
} else {
max_lines_allowed = MAX_REG_LINES;
}
if ((line < 1) || (line > max_lines_allowed)) {
return (line);
}
/* Look for the button number through the configuration
* <line button="4" lineIndex="3>. If the inddex value is not
* found then use old way of searching for button. The dolby
* release of CCM adds index to configuration but older
* ccm does not support that.
*/
for (button = 1; button <= max_lines_allowed; button++) {
config_get_line_value(CFGID_LINE_INDEX, &line_no, sizeof(line_no), button);
if ((line_t)line_no == line) {
return(button);
}
}
button = 0;
line_no = 0;
/* Nothing has found so far, try old way of calculating the
* button number
*/
do {
if (sip_config_check_line(button) == FALSE) {
button++;
continue;
}
button++;
line_no++;
} while (((line_t)line_no < line) &&
button <= max_lines_allowed);
/* Above loop not able to find the correct button number
* so return value 0
*/
if (button > max_lines_allowed) {
return(0);
}
return (button - 1);
}
/*
* sip_config_check_line()
*
* Check to see if the indicated line is configured as a DN line
*
* Parameters: line - the line instance
*
* Returns: TRUE if the indicated line is Valid
* FALSE if the indicated line is Invalid
*
*/
boolean
sip_config_check_line (line_t line)
{
const char fname[] = "sip_config_check_line";
char temp[MAX_LINE_NAME_SIZE];
uint32_t line_feature;
line_t max_lines_allowed;
if (Is794x) {
max_lines_allowed = MAX_REG_LINES_794X;
} else {
max_lines_allowed = MAX_REG_LINES;
}
if ((line < 1) || (line > max_lines_allowed)) {
if (line != 0) {
PLAT_ERROR(PLAT_COMMON_F_PREFIX"Invalid Line: %d\n", fname, line);
}
return FALSE;
}
config_get_line_string(CFGID_LINE_NAME, temp, line, sizeof(temp));
if (temp[0] == '\0') {
return FALSE;
}
config_get_line_value(CFGID_LINE_FEATURE, &line_feature,
sizeof(line_feature), line);
if (line_feature != cfgLineFeatureDN) {
return FALSE;
}
return TRUE;
}
/*
* sip_config_local_line_get()
*
* Get the Line setting.
* Note: The UI has serious problems if there are gaps in the
* line names. Therefore, lines must be sequential. In
* other words, if lines 1, 2, and 4 have names, this routine
* will return that two lines are active. Once Line three is
* found to be unprovisioned, line 4 will be ignored.
*/
line_t
sip_config_local_line_get (void)
{
if (Is794x) {
return (MAX_REG_LINES_794X);
}
return (MAX_REG_LINES);
}
/*
* sip_config_get_keepalive_expires()
*
* Returns the keepalive expires configured.
* The minimum allowed value is returned if
* configured value is less than the minimum
* allowed value.If the configured value is
* greater than the maximum allowed then the
* maximum allowed value is returned.
*
*/
int
sip_config_get_keepalive_expires()
{
int keepalive_interval = 0;
config_get_value(CFGID_TIMER_KEEPALIVE_EXPIRES, &keepalive_interval,
sizeof(keepalive_interval));
if (keepalive_interval < MIN_KEEPALIVE_EXPIRES) {
keepalive_interval = MIN_KEEPALIVE_EXPIRES;
TNP_DEBUG(DEB_F_PREFIX"Keepalive interval less than minimum acceptable.Resetting it to %d\n",
DEB_F_PREFIX_ARGS(SIP_KA, "sip_config_get_keepalive_expires"),
keepalive_interval);
} else if (keepalive_interval > MAX_KEEPALIVE_EXPIRES) {
keepalive_interval = MAX_KEEPALIVE_EXPIRES;
TNP_DEBUG(DEB_F_PREFIX"Keepalive interval more than maximum acceptable.Resetting it to %d\n",
DEB_F_PREFIX_ARGS(SIP_KA, "sip_config_get_keepalive_expires"),
keepalive_interval);
}
return keepalive_interval;
}
/*
* sip_config_get_display_name()
*
* Get the display name
*/
void
sip_config_get_display_name (line_t line, char *buffer, int buffer_len)
{
config_get_line_string(CFGID_LINE_DISPLAYNAME, buffer, line, buffer_len);
if ((strcmp(buffer, UNPROVISIONED) == 0) || (buffer[0] == '\0')) {
config_get_line_string(CFGID_LINE_NAME, buffer, line, buffer_len);
}
}
/**
* Returns the configured value of preferred codec. The codec may
* or may not be available by the platform.
*
* @param[in] none.
*
* @return rtp_ptype of the codec.
*/
rtp_ptype
sip_config_preferred_codec (void)
{
key_table_entry_t cfg_preferred_codec;
config_get_value(CFGID_PREFERRED_CODEC, &cfg_preferred_codec,
sizeof(cfg_preferred_codec));
if ((cfg_preferred_codec.name != NULL) &&
(cfg_preferred_codec.name[0] != '\0')) {
/* The configuration has preferred codec configured */
return (cfg_preferred_codec.value);
}
/* No preferred codec configured */
return (RTP_NONE);
}
/**
* sip_config_local_supported_codecs_get()
* Get the locally supported codec list. The returned list
* of codecs will be in the ordered of preference. If there is
* preferred condec configured and it is available, the
* preferred codec will be put on the first entry of the
* returned list.
*
* @param[in,out] aSupportedCodecs - pointer to arrary fo the
* rtp_ptype to store the result of
* currenlty available codecs.
* @param[in] supportedCodecsLen - indicates the number of entry
* of the aSupportedCodecs.
*
* @return number of current codecs available.
*
* @pre (aSupportedCodecs != NULL)
* @pre (supportedCodecsLen != 0)
*/
uint16_t
sip_config_local_supported_codecs_get (rtp_ptype aSupportedCodecs[],
uint16_t supportedCodecsLen)
{
rtp_ptype current_codec_table[MAX_CODEC_ENTRIES+1];
rtp_ptype *codec;
rtp_ptype pref_codec;
uint16_t count = 0;
int codec_mask;
boolean preferred_codec_available = FALSE;
codec_mask = vcmGetAudioCodecList(VCM_DSP_FULLDUPLEX);
if (!codec_mask) {
codec_mask = VCM_CODEC_RESOURCE_G711 | VCM_CODEC_RESOURCE_OPUS;
}
/*
* convert the current available codec into the enumerated
* preferred list.
*/
current_codec_table[0] = RTP_NONE;
current_codec_table[MAX_CODEC_ENTRIES] = RTP_NONE;
config_set_current_codec_table(codec_mask, &current_codec_table[0]);
/*
* Get the configured preferred codec. If one is configured,
* check it to see if currently it can be supported by the
* platform. If it is configured and is availble to support,
* put the preferred codec in the first one of the list.
*/
pref_codec = sip_config_preferred_codec();
if (pref_codec != RTP_NONE) {
/*
* There is a configured preferred codec, check to see if
* the codec is currently avaible or not.
*/
codec = &current_codec_table[0];
while (*codec != RTP_NONE) {
if (pref_codec == *codec) {
preferred_codec_available = TRUE;
break;
}
codec++;
}
}
if (preferred_codec_available) {
/*
* The preferred codec is configured and the platform
* currently can support the preferred codec, put it in
* the first entry.
*/
aSupportedCodecs[count] = pref_codec;
count++;
} else {
/*
* Must init or comparison will be made to uninitialized memory.
* Do not increment count here since we are not adding RTP_NONE
* as a supported codec. We are only initializing memory to a
* known value.
*/
aSupportedCodecs[count] = RTP_NONE;
}
codec = &current_codec_table[0];
while (*codec != RTP_NONE) {
if (count < supportedCodecsLen) {
if (*codec != aSupportedCodecs[0]) {
aSupportedCodecs[count] = *codec;
count++;
}
}
codec++;
}
return count;
}
/*
* sip_config_local_supported_codecs_get()
*
* Get the locally supported codec list.
*/
uint16_t
sip_config_video_supported_codecs_get (rtp_ptype aSupportedCodecs[],
uint16_t supportedCodecsLen, boolean isOffer)
{
uint16_t count = 0;
int codec_mask;
cc_uint32_t major_ver, minor_ver;
if ( isOffer ) {
codec_mask = vcmGetVideoCodecList(VCM_DSP_FULLDUPLEX);
} else {
/* we are trying to match the answer then we
already have the rx stream open */
//codec_mask = vcmGetVideoCodecList(DSP_ENCODEONLY);
codec_mask = vcmGetVideoCodecList(VCM_DSP_IGNORE);
}
if ( codec_mask & VCM_CODEC_RESOURCE_VP8) {
aSupportedCodecs[count] = RTP_VP8;
count++;
}
if ( codec_mask & VCM_CODEC_RESOURCE_H264) {
/*
* include payload type for packetization mode 1 only if ucm sis version
* is equal to or greater than 5.1.0 (AngelFire).
*/
platGetSISProtocolVer(&major_ver, &minor_ver, NULL, NULL);
if ((major_ver > SIS_PROTOCOL_MAJOR_VERSION_ANGELFIRE) ||
(major_ver == SIS_PROTOCOL_MAJOR_VERSION_ANGELFIRE &&
minor_ver >= SIS_PROTOCOL_MINOR_VERSION_ANGELFIRE)) {
if (vcmGetVideoMaxSupportedPacketizationMode() == 1) {
aSupportedCodecs[count] = RTP_H264_P1;
count++;
}
}
aSupportedCodecs[count] = RTP_H264_P0;
count++;
}
if ( codec_mask & VCM_CODEC_RESOURCE_H263) {
aSupportedCodecs[count] = RTP_H263;
count++;
}
return count;
}
/**
* The function fills in the given codec array based on the
* platform bit mask of codecs. Note, that the enumerated list
* produced is also in the preferred order.
*
* @param[in] codec_mask - platform bit mask corresponding to the
* codecs.
* @param[in/out] codecs - pointer to array of for storing the
* output of the enumerated codec based on
* bit set in the codec_mask.
*
* @return None.
*
* @pre (codec_table != NULL)
* @pre storge of codec_table must be last enough to holds
* supported codec in the bit mask.
*/
static void
config_set_current_codec_table (int codec_mask, rtp_ptype *codecs)
{
int idx = 0;
if (codec_mask & VCM_CODEC_RESOURCE_OPUS) {
codecs[idx] = RTP_OPUS;
idx++;
}
if (codec_mask & VCM_CODEC_RESOURCE_G711) {
codecs[idx] = RTP_PCMU;
idx++;
codecs[idx] = RTP_PCMA;
idx++;
}
if (codec_mask & VCM_CODEC_RESOURCE_G729A) {
codecs[idx] = RTP_G729;
idx++;
}
if (codec_mask & VCM_CODEC_RESOURCE_LINEAR) {
codecs[idx] = RTP_L16;
idx++;
}
if (codec_mask & VCM_CODEC_RESOURCE_G722) {
codecs[idx] = RTP_G722;
idx++;
}
if (codec_mask & VCM_CODEC_RESOURCE_iLBC) {
codecs[idx] = RTP_ILBC;
idx++;
}
if (codec_mask & VCM_CODEC_RESOURCE_iSAC) {
codecs[idx] = RTP_ISAC;
idx++;
}
codecs[idx] = RTP_NONE;
return;
}
/*
* sip_config_local_dtmf_dblevels_get()
*
* Get the DTMF DB levels
*/
uint32_t
sip_config_local_dtmf_dblevels_get (void)
{
int value;
config_get_value(CFGID_DTMF_DB_LEVEL, &value, sizeof(value));
switch (value) {
case 0:
return 0; // Mute
case 1:
return 2900; // 6 dB down
case 2:
return 4096; // 3 dB down
case 3:
return 5786; // Nominal amplitude
// (-8.83 dBm0 to network, -11.83 dBm0 local)
case 4:
return 8173; // 3 dB up
case 5:
return 11544; // 6 dB up
default:
return 5786; // Nominal amplitude
}
}
/*
* sip_config_get_line_by_called_number
*
* Return the line by the given called_number
*/
line_t sip_config_get_line_by_called_number (line_t start_line, const char *called_number)
{
int i;
line_t max_lines;
line_t line = 0;
char line_name[MAX_LINE_NAME_SIZE];
char contact[MAX_LINE_CONTACT_SIZE];
char *name;
max_lines = sip_config_local_line_get();
/*
* Check the called number for the E.164 "+"
* and ignore it if present.
*/
if (called_number[0] == '+') {
called_number++;
}
for (i = start_line; i <= max_lines; i++) {
if (sip_config_check_line((line_t)i)) {
config_get_line_string(CFGID_LINE_NAME, line_name, i,
sizeof(line_name));
/*
* Check the configured line name for the E.164 "+"
* and ignore it if present.
*/
name = &line_name[0];
if (line_name[0] == '+') {
name++;
}
if (cpr_strcasecmp(called_number, name) == 0) {
line = (line_t)i;
break;
}
}
}
// If line not found - check with contact list
if (line == 0) {
for (i = start_line; i <= max_lines; i++) {
if (sip_config_check_line((line_t)i)) {
config_get_line_string(CFGID_LINE_CONTACT, contact, i,
sizeof(contact));
if (cpr_strcasecmp(called_number, contact) == 0) {
line = (line_t)i;
break;
}
}
}
}
return (line);
}
/*********************************************************
*
* SIP Config API
* The routines below with the "prot" prefix are called
* by the config system. The calls that start with "sip"
* are helper functions for the SIP implementation of the
* "prot" API.
*
*********************************************************/
/*
* sip_minimum_config_check()
*
* Return indication if the SIP minimum configuration
* requirements have been met.
* Returns 0 if minimum config is met
* Returns non-zero if minimum config has not been met
* (eg. missing at least 1 required parameter)
*/
int
sip_minimum_config_check (void)
{
char str_val[MAX_IPADDR_STR_LEN];
char line_name[MAX_LINE_NAME_SIZE];
int value;
/*
* Make sure that line 1 is configured
*/
config_get_line_string(CFGID_LINE_NAME, line_name, 1, sizeof(line_name));
if ((strcmp(line_name, UNPROVISIONED) == 0) || (line_name[0] == '\0')) {
return -1;
}
config_get_line_string(CFGID_PROXY_ADDRESS, str_val, 1, MAX_IPADDR_STR_LEN);
if ((strcmp(str_val, UNPROVISIONED) == 0) || (str_val[0] == '\0')) {
return -1;
}
config_get_line_value(CFGID_PROXY_PORT, &value, sizeof(value), 1);
if (value == 0) {
return -1;
}
return 0;
}
/*
* prot_config_change_notify()
* Let the SIP stack know that a config change has occurred.
*
*/
int
prot_config_change_notify (int notify_type)
{
if (SIPTaskProcessConfigChangeNotify(notify_type) < 0) {
//CPR TODO: need reference for
CCSIP_DEBUG_ERROR(PLAT_COMMON_F_PREFIX"SIPTaskProcessConfigChangeNotify() "
"returned error.\n", "prot_config_change_notify");
}
return (TRUE);
}
/*
* prot_config_check_line_name()
* Makes sure that there are no spaces in the SIP Line Names
*
* Returns: TRUE if the Name is Valid
* FALSE if the Name is Invalid
*
*/
boolean
prot_config_check_line_name (char *line_name)
{
while ((*line_name != ' ') && (*line_name != NUL)) {
line_name++;
}
if (*line_name == ' ') {
return (FALSE);
}
return (TRUE);
}
/*
* prot_sanity_check_config_settings()
*
, Louis* Checks the sanity of the protocol config block values
* and sets them to defaults if they are incorrect.
*/
int
prot_sanity_check_config_settings (void)
{
int retval = 0;
return retval;
}
/*
* prot_shutdown()
*
* Shut down the protocol stack.
*/
void
prot_shutdown (void)
{
sip_shutdown();
}

View File

@ -1,298 +0,0 @@
/* 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/. */
#ifndef _PROT_CONFIGMGR_H_
#define _PROT_CONFIGMGR_H_
#include "cpr_types.h"
#include "phone_types.h"
#include "rtp_defs.h"
#include "ccsip_platform.h"
#include "configmgr.h"
#include "cfgfile_utils.h"
#include "phone_platform_constants.h"
#include "cc_config.h"
#include "cc_constants.h"
#include "ccsdp.h"
#define UNPROVISIONED "UNPROVISIONED"
/*********************************************************
*
* The following parameters set Config system settings
* for SIP
*
*********************************************************/
#define HWTYPE "SIP"
#define MAX_LINE_NAME_SIZE 128
#define AUTH_NAME_SIZE 129
#define MAX_LINE_PASSWORD_SIZE 32
#define MAX_LINE_DISPLAY_SIZE 32
#define MAX_LINE_CONTACT_SIZE 128
#define MAX_LINE_AUTO_ANS_MODE_SIZE 32
#define MAX_REG_USER_INFO_LEN 32
#define MAX_JOIN_DXFER_POLICY_SIZE 40
#define MAX_EXTERNAL_NUMBER_MASK_SIZE 40
/*********************************************************
*!!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!
*
* TNP SIP Phone Configuration IDs
*
*!!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!
* The following macro definitions are defined in cc_config.h.
* Change should be made in the cc_config.h and add reference here.
*
* <------ Original notes ------>
* Before changing this code, please read the following:
*
* The Configuration system for the TNP phones is simply a cache
* that exists for the GSM/SIP DLL to use. The property values are
* sent from Java across the JNI to the cache. This prevents
* the SIP and GSM code from having to suffer through a JNI call
* every time they wish to retrieve a configuration parameter.
*
* These ID's need to match the definitions in JplatConfigConstants.java
*
* To add a new value to the table,
* In general, you will have to:
*
* 1) Create an index for the new CFG param below
* 2) Update prot_cfg_table either in prot_cfgmgr_private.h
* or in prot_configmgr.c (for line specific params)
* 3) Update JPlatConfigConstants.h with the new ID
* 4) Create a property on JAVA side and update it from XML config
* 5) Update show_cfg_cmd if adding a new line param
*
*!!!!!!!!!!!!!!!!!!!!!!WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!
*********************************************************/
/* Keep non line specific params here */
#define CFGID_MEDIA_PORT_RANGE_START CFGID_MEDIA_PORT_RANGE_START_INT
#define CFGID_MEDIA_PORT_RANGE_END CFGID_MEDIA_PORT_RANGE_END_INT
#define CFGID_CALLERID_BLOCKING CFGID_CALLERID_BLOCKING_BOOL
#define CFGID_ANONYMOUS_CALL_BLOCK CFGID_ANONYMOUS_CALL_BLOCK_BOOL
#define CFGID_DND_CALL_ALERT CFGID_DND_CALL_ALERT_BYTE
#define CFGID_DND_REMINDER_TIMER CFGID_DND_REMINDER_TIMER_INT
#define CFGID_PREFERRED_CODEC CFGID_PREFERRED_CODEC_STRING
#define CFGID_DTMF_OUTOFBAND CFGID_DTMF_OUTOFBAND_STRING
#define CFGID_DTMF_AVT_PAYLOAD CFGID_DTMF_AVT_PAYLOAD_INT
#define CFGID_DTMF_DB_LEVEL CFGID_DTMF_DB_LEVEL_INT
#define CFGID_SIP_RETX CFGID_SIP_RETX_INT
#define CFGID_SIP_INVITE_RETX CFGID_SIP_INVITE_RETX_INT
#define CFGID_TIMER_T1 CFGID_TIMER_T1_INT
#define CFGID_TIMER_T2 CFGID_TIMER_T2_INT
#define CFGID_TIMER_INVITE_EXPIRES CFGID_TIMER_INVITE_EXPIRES_INT
#define CFGID_TIMER_REGISTER_EXPIRES CFGID_TIMER_REGISTER_EXPIRES_INT
#define CFGID_PROXY_REGISTER CFGID_PROXY_REGISTER_BOOL
#define CFGID_PROXY_BACKUP CFGID_PROXY_BACKUP_STRING
#define CFGID_PROXY_BACKUP_PORT CFGID_PROXY_BACKUP_PORT_INT
#define CFGID_PROXY_EMERGENCY CFGID_PROXY_EMERGENCY_STRING
#define CFGID_PROXY_EMERGENCY_PORT CFGID_PROXY_EMERGENCY_PORT_INT
#define CFGID_OUTBOUND_PROXY CFGID_OUTBOUND_PROXY_STRING
#define CFGID_OUTBOUND_PROXY_PORT CFGID_OUTBOUND_PROXY_PORT_INT
#define CFGID_NAT_RECEIVED_PROCESSING CFGID_NAT_RECEIVED_PROCESSING_BOOL
#define CFGID_REG_USER_INFO CFGID_REG_USER_INFO_STRING
#define CFGID_CNF_JOIN_ENABLE CFGID_CNF_JOIN_ENABLE_BOOL
#define CFGID_REMOTE_PARTY_ID CFGID_REMOTE_PARTY_ID_BOOL
#define CFGID_SEMI_XFER CFGID_SEMI_XFER_BOOL
#define CFGID_CALL_HOLD_RINGBACK CFGID_CALL_HOLD_RINGBACK_BOOL
#define CFGID_STUTTER_MSG_WAITING CFGID_STUTTER_MSG_WAITING_BOOL
/**
* The CFGID_CFWD_URL was consolidated for RT and CIUS and should be for TNP as well.
*/
#define CFGID_CFWD_URL CFGID_CFWD_URL_STRING
#define CFGID_CALL_STATS CFGID_CALL_STATS_BOOL
#define CFGID_LOCAL_CFWD_ENABLE CFGID_LOCAL_CFWD_ENABLE_BOOL
#define CFGID_TIMER_REGISTER_DELTA CFGID_TIMER_REGISTER_DELTA_INT
#define CFGID_SIP_MAX_FORWARDS CFGID_SIP_MAX_FORWARDS_INT
#define CFGID_2543_HOLD CFGID_2543_HOLD_BOOL
#define CFGID_CCM1_ADDRESS CFGID_CCM1_ADDRESS_STRING
#define CFGID_CCM2_ADDRESS CFGID_CCM2_ADDRESS_STRING
#define CFGID_CCM3_ADDRESS CFGID_CCM3_ADDRESS_STRING
// Note: IPv6 Not currently supported on Cius
#define CFGID_CCM1_IPV6_ADDRESS CFGID_CCM1_IPV6_ADDRESS_STRING
#define CFGID_CCM2_IPV6_ADDRESS CFGID_CCM2_IPV6_ADDRESS_STRING
#define CFGID_CCM3_IPV6_ADDRESS CFGID_CCM3_IPV6_ADDRESS_STRING
#define CFGID_CCM1_SIP_PORT CFGID_CCM1_SIP_PORT_INT
#define CFGID_CCM2_SIP_PORT CFGID_CCM2_SIP_PORT_INT
#define CFGID_CCM3_SIP_PORT CFGID_CCM3_SIP_PORT_INT
#define CFGID_CCM1_SEC_LEVEL CFGID_CCM1_SEC_LEVEL_INT
#define CFGID_CCM2_SEC_LEVEL CFGID_CCM2_SEC_LEVEL_INT
#define CFGID_CCM3_SEC_LEVEL CFGID_CCM3_SEC_LEVEL_INT
#define CFGID_CCM1_IS_VALID CFGID_CCM1_IS_VALID_BOOL
#define CFGID_CCM2_IS_VALID CFGID_CCM2_IS_VALID_BOOL
#define CFGID_CCM3_IS_VALID CFGID_CCM3_IS_VALID_BOOL
#define CFGID_CCM_TFTP_IP_ADDR CFGID_CCM_TFTP_IP_ADDR_STRING
#define CFGID_CCM_TFTP_PORT CFGID_CCM_TFTP_PORT_INT
#define CFGID_CCM_TFTP_IS_VALID CFGID_CCM_TFTP_IS_VALID_BOOL
#define CFGID_CCM_TFTP_SEC_LEVEL CFGID_CCM_TFTP_SEC_LEVEL_INT
#define CFGID_CONN_MONITOR_DURATION CFGID_CONN_MONITOR_DURATION_INT
#define CFGID_CALL_PICKUP_URI CFGID_CALL_PICKUP_URI_STRING
#define CFGID_CALL_PICKUP_LIST_URI CFGID_CALL_PICKUP_LIST_URI_STRING
#define CFGID_CALL_PICKUP_GROUP_URI CFGID_CALL_PICKUP_GROUP_URI_STRING
#define CFGID_MEET_ME_SERVICE_URI CFGID_MEET_ME_SERVICE_URI_STRING
#define CFGID_CALL_FORWARD_URI CFGID_CALL_FORWARD_URI_STRING
#define CFGID_ABBREVIATED_DIAL_URI CFGID_ABBREVIATED_DIAL_URI_STRING
#define CFGID_CALL_LOG_BLF_ENABLED CFGID_CALL_LOG_BLF_ENABLED_BOOL
#define CFGID_REMOTE_CC_ENABLED CFGID_REMOTE_CC_ENABLED_BOOL
#define CFGID_RETAIN_FORWARD_INFORMATION CFGID_RETAIN_FORWARD_INFORMATION_BOOL
#define CFGID_TIMER_KEEPALIVE_EXPIRES CFGID_TIMER_KEEPALIVE_EXPIRES_INT
#define CFGID_TIMER_SUBSCRIBE_EXPIRES CFGID_TIMER_SUBSCRIBE_EXPIRES_INT
#define CFGID_TIMER_SUBSCRIBE_DELTA CFGID_TIMER_SUBSCRIBE_DELTA_INT
#define CFGID_TRANSPORT_LAYER_PROT CFGID_TRANSPORT_LAYER_PROT_INT
#define CFGID_KPML_ENABLED CFGID_KPML_ENABLED_INT
#define CFGID_NAT_ENABLE CFGID_NAT_ENABLE_BOOL
#define CFGID_NAT_ADDRESS CFGID_NAT_ADDRESS_STRING
#define CFGID_VOIP_CONTROL_PORT CFGID_VOIP_CONTROL_PORT_INT
#define CFGID_MY_IP_ADDR CFGID_MY_IP_ADDR_STRING
#define CFGID_MY_MAC_ADDR CFGID_MY_MAC_ADDR_STRING
#define CFGID_ENABLE_VAD CFGID_ENABLE_VAD_BOOL
#define CFGID_AUTOANSWER_IDLE_ALTERNATE CFGID_AUTOANSWER_IDLE_ALTERNATE_BOOL
#define CFGID_AUTOANSWER_TIMER CFGID_AUTOANSWER_TIMER_INT
#define CFGID_AUTOANSWER_OVERRIDE CFGID_AUTOANSWER_OVERRIDE_BOOL
#define CFGID_OFFHOOK_TO_FIRST_DIGIT_TIMER CFGID_OFFHOOK_TO_FIRST_DIGIT_TIMER_INT
#define CFGID_CALL_WAITING_SILENT_PERIOD CFGID_CALL_WAITING_SILENT_PERIOD_INT
#define CFGID_RING_SETTING_BUSY_POLICY CFGID_RING_SETTING_BUSY_POLICY_INT
#define CFGID_DSCP_FOR_CALL_CONTROL CFGID_DSCP_FOR_CALL_CONTROL_INT
#define CFGID_SPEAKER_ENABLED CFGID_SPEAKER_ENABLED_BOOL
#define CFGID_XFR_ONHOOK_ENABLED CFGID_XFR_ONHOOK_ENABLED_BOOL
#define CFGID_ROLLOVER CFGID_ROLLOVER_INT
#define CFGID_LOAD_FILE CFGID_LOAD_FILE_STRING
#define CFGID_BLF_ALERT_TONE_IDLE CFGID_BLF_ALERT_TONE_IDLE_INT
#define CFGID_BLF_ALERT_TONE_BUSY CFGID_BLF_ALERT_TONE_BUSY_INT
#define CFGID_AUTO_PICKUP_ENABLED CFGID_AUTO_PICKUP_ENABLED_BOOL
#define CFGID_JOIN_ACROSS_LINES CFGID_JOIN_ACROSS_LINES_INT
#define CFGID_MY_ACTIVE_MAC_ADDR CFGID_MY_ACTIVE_MAC_ADDR_STRING
#define CFGID_DSCP_AUDIO CFGID_DSCP_AUDIO_INT
#define CFGID_DEVICE_NAME CFGID_DEVICE_NAME_STRING
#define CFGID_USER_AGENT CFGID_USER_AGENT_STRING
#define CFGID_MODEL_NUMBER CFGID_MODEL_NUMBER_STRING
#define CFGID_DSCP_VIDEO CFGID_DSCP_VIDEO_INT
#define CFGID_IP_ADDR_MODE CFGID_IP_ADDR_MODE_INT
#define CFGID_INTER_DIGIT_TIMER CFGID_INTER_DIGIT_TIMER_INT
// Note - EMCC not currently supported on CIUS
#define CFGID_EMCC_MODE CFGID_EMCC_MODE_BOOL
#define CFGID_VISITING_EM_PORT CFGID_VISITING_EM_PORT_INT
#define CFGID_VISITING_EM_IP CFGID_VISITING_EM_IP_STRING
#define CFGID_CCM_EXTERNAL_NUMBER_MASK CFGID_CCM_EXTERNAL_NUMBER_MASK_STRING
#define CFGID_MEDIA_IP_ADDR CFGID_MEDIA_IP_ADDR_STRING
/* All non Line specific params should be added above */
/* All Line specific params should be added below */
#define CFGID_LINE_FEATURE CFGID_LINE_FEATURE_INT
#define CFGID_LINE_INDEX CFGID_LINE_INDEX_INT
#define CFGID_LINE_MAXNUMCALLS CFGID_LINE_MAXNUMCALLS_INT
#define CFGID_LINE_NAME CFGID_LINE_NAME_STRING
#define CFGID_LINE_AUTHNAME CFGID_LINE_AUTHNAME_STRING
#define CFGID_LINE_PASSWORD CFGID_LINE_PASSWORD_STRING
#define CFGID_LINE_DISPLAYNAME CFGID_LINE_DISPLAYNAME_STRING
#define CFGID_LINE_CONTACT CFGID_LINE_CONTACT_STRING
#define CFGID_PROXY_ADDRESS CFGID_PROXY_ADDRESS_STRING
#define CFGID_PROXY_PORT CFGID_PROXY_PORT_INT
#define CFGID_LINE_AUTOANSWER_ENABLED CFGID_LINE_AUTOANSWER_ENABLED_BYTE
#define CFGID_LINE_AUTOANSWER_MODE CFGID_LINE_AUTOANSWER_MODE_STRING
#define CFGID_LINE_CALL_WAITING CFGID_LINE_CALL_WAITING_BYTE
#define CFGID_LINE_MSG_WAITING_LAMP CFGID_LINE_MSG_WAITING_LAMP_BYTE
#define CFGID_LINE_MESSAGE_WAITING_AMWI CFGID_LINE_MESSAGE_WAITING_AMWI_BYTE
#define CFGID_LINE_RING_SETTING_IDLE CFGID_LINE_RING_SETTING_IDLE_BYTE
#define CFGID_LINE_RING_SETTING_ACTIVE CFGID_LINE_RING_SETTING_ACTIVE_BYTE
#define CFGID_LINE_BUSY_TRIGGER CFGID_LINE_BUSY_TRIGGER_INT
#define CFGID_LINE_CFWDALL CFGID_LINE_CFWDALL_STRING
#define CFGID_LINE_SPEEDDIAL_NUMBER CFGID_LINE_SPEEDDIAL_NUMBER_STRING
#define CFGID_LINE_RETRIEVAL_PREFIX CFGID_LINE_RETRIEVAL_PREFIX_STRING
#define CFGID_LINE_MESSAGES_NUMBER CFGID_LINE_MESSAGES_NUMBER_STRING
#define CFGID_LINE_FWD_CALLER_NAME_DIPLAY CFGID_LINE_FWD_CALLER_NAME_DIPLAY_BOOL
#define CFGID_LINE_FWD_CALLER_NUMBER_DIPLAY CFGID_LINE_FWD_CALLER_NUMBER_DIPLAY_BOOL
#define CFGID_LINE_FWD_REDIRECTED_NUMBER_DIPLAY CFGID_LINE_FWD_REDIRECTED_NUMBER_DIPLAY_BOOL
#define CFGID_LINE_FWD_DIALED_NUMBER_DIPLAY CFGID_LINE_FWD_DIALED_NUMBER_DIPLAY_BOOL
#define CFGID_LINE_FEATURE_OPTION_MASK CFGID_LINE_FEATURE_OPTION_MASK_INT
#define CFGID_P2PSIP CFGID_P2PSIP_BOOL
#define CFGID_VERSION CFGID_VERSION_STRING
#define CFGID_SDPMODE CFGID_SDPMODE_BOOL
#define CFGID_RTCPMUX CFGID_RTCPMUX_BOOL
#define CFGID_RTPSAVPF CFGID_RTPSAVPF_BOOL
#define CFGID_MAXAVBITRATE CFGID_MAXAVBITRATE_BOOL
#define CFGID_MAXCODEDAUDIOBW CFGID_MAXCODEDAUDIOBW_BOOL
#define CFGID_USEDTX CFGID_USEDTX_BOOL
#define CFGID_STEREO CFGID_STEREO_BOOL
#define CFGID_USEINBANDFEC CFGID_USEINBANDFEC_BOOL
#define CFGID_CBR CFGID_CBR_BOOL
#define CFGID_MAXPTIME CFGID_MAXPTIME_BOOL
#define CFGID_SCTP_PORT CFGID_SCTP_PORT_INT
#define CFGID_NUM_DATA_STREAMS CFGID_NUM_DATA_STREAMS_INT
/*********************************************************
*
* Value Definitions
*
*********************************************************/
// Line feature
typedef enum {
cfgLineFeatureNone = CC_LINE_FEATURE_NONE,
cfgLineFeatureRedial = CC_LINE_FEATURE_REDIAL,
cfgLineFeatureSpeedDial = CC_LINE_FEATURE_SPEEDDIAL,
cfgLineFeatureDN = CC_LINE_FEATURE_DN,
cfgLineFeatureService = CC_LINE_FEATURE_SERVICE,
cfgLineFeatureSpeedDialBLF = CC_LINE_FEATURE_SPEEDDIALBLF,
cfgLineFeatureMaliciousCallID = CC_LINE_FEATURE_MALICIOUSCALLID,
cfgLineFeatureAllCalls = CC_LINE_FEATURE_ALLCALLS,
cfgLineFeatureAnswerOldest = CC_LINE_FEATURE_ANSWEROLDEST,
cfgLineFeatureServices = CC_LINE_FEATURE_SERVICES,
cfgLineFeatureBLF = CC_LINE_FEATURE_BLF
} cfgLineFeatureType_e;
/*********************************************************
*
* Function Prototypes
*
*********************************************************/
void protocol_cfg_init(void);
void sip_config_get_net_device_ipaddr(cpr_ip_addr_t *ip_addr);
void sip_config_get_net_ipv6_device_ipaddr(cpr_ip_addr_t *ip_addr);
void sip_config_get_nat_ipaddr(cpr_ip_addr_t *ip_addr);
void sip_config_set_nat_ipaddr(cpr_ip_addr_t *ip_address);
uint16_t sip_config_local_supported_codecs_get(rtp_ptype aSupportedCodecs[],
uint16_t supportedCodecsLen);
uint16_t sip_config_video_supported_codecs_get(rtp_ptype aSupportedCodecs[],
uint16_t supportedCodecsLen, boolean isOffer);
boolean prot_config_check_line_name(char *line_name);
//const key_table_entry_t * sip_config_local_codec_entry_find(const rtp_ptype codec);
line_t sip_config_get_button_from_line(line_t line);
line_t sip_config_get_line_from_button(line_t button);
boolean sip_config_check_line(line_t line);
line_t sip_config_local_line_get(void);
void sip_config_get_display_name(line_t line, char *buffer, int buffer_len);
line_t sip_config_get_line_by_called_number(line_t start_line, const char *called_number);
int sip_minimum_config_check(void);
void config_set_codec_table(int codec_mask);
int sip_config_get_keepalive_expires();
rtp_ptype sip_config_preferred_codec(void);
#endif /* PROT_CONFIGMGR_H_ */

View File

@ -1,300 +0,0 @@
/* 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 "cpr_types.h"
#include "cpr_stdlib.h"
#include "resource_manager.h"
#include "phone_debug.h"
#define RM_NUM_ELEMENTS_PER_MAP 32
#define rm_get_table_index(a) (a / RM_NUM_ELEMENTS_PER_MAP)
#define rm_get_map_offset(a) (a % RM_NUM_ELEMENTS_PER_MAP)
/*
* rm_clear_all_elements
*
* Description:
* This function clears all members of the specified resource manager
*
* Parameters:
* rm_p - pointer to the resource manager to be cleared
*
* Returns:
* None
*/
void
rm_clear_all_elements (resource_manager_t *rm_p)
{
static const char fname[] = "rm_clear_all_elements";
uint16_t i;
if (!rm_p) {
PLAT_ERROR(PLAT_COMMON_F_PREFIX"null resource manager received.\n", fname);
return;
}
for (i = 0; i < rm_p->max_index; i++) {
rm_p->table[i] = 0;
}
}
/*
* rm_clear_element
*
* Description:
* This function clears a single element from the specified resource manager
*
* Parameters:
* rm_p - pointer to the resource manager to be cleared
* element - element id of element to be cleared
*
* Returns:
* None
*/
void
rm_clear_element (resource_manager_t * rm_p, int16_t element)
{
static const char fname[] = "rm_clear_elements";
if (!rm_p) {
PLAT_ERROR(PLAT_COMMON_F_PREFIX"null resource manager received.\n", fname);
return;
}
if (element < 0 || element >= rm_p->max_element) {
PLAT_ERROR(PLAT_COMMON_F_PREFIX"element value %d invalid. Max value is %d.\n",
fname, element, rm_p->max_element - 1);
return;
}
rm_p->table[rm_get_table_index(element)] &=
(~(1 << rm_get_map_offset(element)));
}
/*
* rm_set_element
*
* Description:
* This function sets the bit representing the specified element
* in the specified resource manager.
*
* Parameters:
* rm_p - pointer to the resource manager
* element - element id of element to be set
*
* Returns:
* None
*/
void
rm_set_element (resource_manager_t *rm_p, int16_t element)
{
static const char fname[] = "rm_set_element";
if (!rm_p) {
PLAT_ERROR(PLAT_COMMON_F_PREFIX"null resource manager received.\n", fname);
return;
}
if (element < 0 || element >= rm_p->max_element) {
PLAT_ERROR(PLAT_COMMON_F_PREFIX"element value %d invalid. Max value %d.\n",
fname, element, rm_p->max_element - 1);
return;
}
rm_p->table[rm_get_table_index(element)] |=
(1 << rm_get_map_offset(element));
}
/*
* rm_is_element_set
*
* Description:
* This function checks if the specified element in the specified
* resource manager is set.
*
* Parameters:
* rm_p - pointer to the resource manager.
* element - element id of element to be checked.
*
* Returns:
* TRUE if element is set, else FALSE
*/
boolean
rm_is_element_set (resource_manager_t *rm_p, int16_t element)
{
static const char fname[] = "rm_is_element_set";
if (!rm_p) {
PLAT_ERROR(PLAT_COMMON_F_PREFIX"null resource manager received.\n", fname);
return FALSE;
}
if (element < 0 || element >= rm_p->max_element) {
PLAT_ERROR(PLAT_COMMON_F_PREFIX"element value %d invalid. Max value %d.\n",
fname, element, rm_p->max_element - 1);
return FALSE;
}
if (rm_p->table[rm_get_table_index(element)] &
(1 << rm_get_map_offset(element))) {
return TRUE;
}
return FALSE;
}
/*
* rm_get_free_element
*
* Description:
* This function walks through the members of the resource manager and
* attempts to locate a free element. If a free element is found, the
* element's associated bit is set in the resource manager and the
* element id is returned.
*
* Parameters:
* rm_p - pointer to the resource manager.
*
* Returns:
* If an element is available, a element id (from zero to max element)
* If no element is available, -1 is returned.
*/
int16_t
rm_get_free_element (resource_manager_t *rm_p)
{
static const char fname[] = "rm_get_free_element";
int16_t element = -1;
uint16_t i, j;
uint32_t max_map = 0;
max_map = ~max_map;
if (!rm_p) {
PLAT_ERROR(PLAT_COMMON_F_PREFIX"null resource manager received.\n", fname);
return -1;
}
for (i = 0; i < rm_p->max_index && element == -1; i++) {
if (rm_p->table[i] != max_map) {
for (j = 0; j < RM_NUM_ELEMENTS_PER_MAP && element == -1; j++) {
if (!(rm_p->table[i] & (1 << j))) {
element = i * RM_NUM_ELEMENTS_PER_MAP + j;
if (element < rm_p->max_element) {
rm_set_element(rm_p, element);
}
}
}
}
}
if (element >= rm_p->max_element) {
element = -1;
}
return (element);
}
/*
* rm_show
*
* Description:
* Utility function used to dump the contents of the resource manager.
*
* Parameters:
* rm_p - pointer to the resource manager.
*
* Returns:
* none
*/
void
rm_show (resource_manager_t *rm_p)
{
static const char fname[] = "rm_show";
int16_t element = 0;
uint16_t i, j;
if (!rm_p) {
PLAT_ERROR(PLAT_COMMON_F_PREFIX"null resource manager received.\n", fname);
return;
}
for (i = 0; i < rm_p->max_index; i++) {
for (j = 0; j < RM_NUM_ELEMENTS_PER_MAP; j++) {
if (rm_p->table[i] & (1 << j)) {
element = (i * RM_NUM_ELEMENTS_PER_MAP) + j;
TNP_DEBUG(DEB_F_PREFIX"rm map: %d\n", DEB_F_PREFIX_ARGS(RM, fname), element);
}
}
}
}
/*
* rm_create
*
* Description:
* Allocates and initializes a new resource manager
*
* Parameters:
* max_element - Maximum number of elements the resource manager
* is required to track
*
* Returns:
* If successful, pointer to the newly allocated resource manager
* If not successful, NULL
*/
resource_manager_t *
rm_create (int16_t max_element)
{
static const char fname[] = "rm_create";
resource_manager_t *rm_p;
if (max_element < 0) {
PLAT_ERROR(PLAT_COMMON_F_PREFIX"invalid max element %d received.\n", fname,
max_element);
return NULL;
}
rm_p = (resource_manager_t *) cpr_malloc(sizeof(resource_manager_t));
if (!rm_p) {
PLAT_ERROR(PLAT_COMMON_F_PREFIX"unable to allocate resource manager.\n", fname);
return NULL;
}
rm_p->max_element = max_element;
rm_p->max_index = max_element / RM_NUM_ELEMENTS_PER_MAP + 1;
rm_p->table = (uint32_t *)
cpr_malloc(rm_p->max_index * RM_NUM_ELEMENTS_PER_MAP);
if (!rm_p->table) {
free(rm_p);
return NULL;
}
rm_clear_all_elements(rm_p);
return rm_p;
}
/*
* rm_free
*
* Description:
* This function frees the memory allocated for the specified resource manager.
*
* Parameters:
* rm_p - pointer to the resource manager.
*
* Returns:
* none
*/
void
rm_destroy (resource_manager_t *rm_p)
{
static const char fname[] = "rm_destroy";
if (!rm_p) {
PLAT_ERROR(PLAT_COMMON_F_PREFIX"null resource manager received.\n", fname);
return;
}
cpr_free(rm_p->table);
cpr_free(rm_p);
}

View File

@ -1,23 +0,0 @@
/* 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/. */
#ifndef _RM_MGR_H__
#define _RM_MGR_H_
typedef struct resource_manager {
int16_t max_element;
int16_t max_index;
uint32_t *table;
} resource_manager_t;
void rm_clear_all_elements(resource_manager_t *rm);
void rm_clear_element(resource_manager_t *rm, int16_t element);
void rm_set_element(resource_manager_t *rm, int16_t element);
boolean rm_is_element_set(resource_manager_t *rm, int16_t element);
int16_t rm_get_free_element(resource_manager_t *rm);
void rm_show(resource_manager_t *rm);
resource_manager_t *rm_create(int16_t max_element);
void rm_destroy(resource_manager_t *rm);
#endif

View File

@ -1,100 +0,0 @@
/* 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 "cpr.h"
#include "cpr_socket.h"
#include "errno.h"
#include "plat_api.h"
/**
* sipSocketSend
*
* @brief The sipSocketSend() function is a wrapper used by the sipstack to send
* data over a socket. This function decides to use the secure versus unsecure
* connection based on the "secure" flag.
*
* @note - The implementation of both secure/non-secure is the same in RT/TNP
* products. It is different for the other vendors and hence we need this
* flexibility.
*
* @param[in] soc Specifies the socket created with cprSocket() to send
* @param[in] buf A pointer to the buffer of the message to send.
* @param[in] len Specifies the length in bytes of the message pointed to by the buffer argument.
* @param[in] flags - The options used for the send.
*
*
*/
ssize_t
sipSocketSend (cpr_socket_t soc,
CONST void *buf,
size_t len,
int32_t flags,
boolean secure)
{
// if (secure) {
// return platSecSocSend (soc, buf, len);
// } else {
return cprSend(soc, buf, len, flags);
// }
}
/**
* sipSocketRecv
*
* @brief The sipSocketRecv() function is a wrapper used by the sipstack to send
* data over a socket. This function decides to use the secure versus unsecure
* connection based on the "secure" flag.
*
* @note - The implementation of both secure/non-secure is the same in RT/TNP
* products. It is different for the other vendors and hence we need this
* flexibility.
*
* @param[in] soc Specifies the socket created with cprSocket() to send
* @param[in] buf A pointer to the buffer of the message to send.
* @param[in] len Specifies the length in bytes of the message pointed to by the buffer argument.
* @param[in] flags - The options used for the recv.
*/
ssize_t
sipSocketRecv (cpr_socket_t soc,
void * RESTRICT buf,
size_t len,
int32_t flags,
boolean secure)
{
// if (secure) {
// return platSecSocRecv (soc, buf, len);
// } else {
return cprRecv(soc, buf, len, flags);
// }
}
/**
* sipSocketClose
*
* @brief The sipSocketClose() function is a wrapper used by the sipstack to
* close a socket. This function decides to use the secure versus unsecure
* connection based on the "secure" flag.
*
* @note - The implementation of both secure/non-secure is the same in RT/TNP
* products. It is different for the other vendors and hence we need this
* flexibility.
*
* @param[in] soc - The socket that needs to be destroyed
*
* @return CPR_SUCCESS on success otherwise, CPR_FAILURE. cpr_errno needs to be set in this case.
*
* @note The possible error values this function should return are
* @li [CPR_EBADF] socket is not a valid socket descriptor.
*/
cpr_status_e
sipSocketClose (cpr_socket_t soc,
boolean secure)
{
// if (secure) {
// return platSecSocClose (soc);
// } else {
return cprCloseSocket(soc);
// }
}

View File

@ -1,342 +0,0 @@
/* 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 "cpr_types.h"
#include "cc_types.h"
#include "phone_platform_constants.h"
#include "cc_constants.h"
#include "phone_debug.h"
#include "prot_configmgr.h"
#include "cc_blf.h"
#include "ccapi_snapshot.h"
#define SPEEDDIAL_START_BUTTON_NUMBER 2
static unsigned char transactionIds[MAX_REG_LINES];
static boolean displayBLFState = TRUE;
static cc_blf_state_t blfStates[MAX_REG_LINES];
static boolean isBLFHandlerRunning = FALSE;
static boolean isAvailable = FALSE;
#ifndef INT_MAX
#define INT_MAX 2147483647
#endif
static void ccBLFHandlerInitialized();
/*
* Function: sub_hndlr_isAlertingBLFState
*
* Description: returns if the BLF state is "alerting"
*
* Parameters:
* inst - line button number.
*
* Returns: TRUE/FALSE
*/
boolean sub_hndlr_isAlertingBLFState(int inst)
{
static const char fname[] = "sub_hndlr_isAlertingBLFState";
if ((displayBLFState == TRUE) && (blfStates[inst - 1] == CC_SIP_BLF_ALERTING)) {
CCAPP_DEBUG(DEB_F_PREFIX"inst=%d, isAlerting=TRUE\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),
inst);
return TRUE;
}
CCAPP_DEBUG(DEB_F_PREFIX"inst=%d, isAlerting=FALSE\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),
inst);
return FALSE;
}
/*
* Function: sub_hndlr_isInUseBLFState
*
* Description: returns if the BLF state is "in use"
*
* Parameters:
* inst - line button number.
*
* Returns: TRUE/FALSE
*/
boolean sub_hndlr_isInUseBLFState(int inst)
{
static const char fname[] = "sub_hndlr_isInUseBLFState";
if ((displayBLFState == TRUE) && (blfStates[inst - 1] == CC_SIP_BLF_INUSE)) {
CCAPP_DEBUG(DEB_F_PREFIX"inst=%d, isInUse=TRUE\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),
inst);
return TRUE;
}
CCAPP_DEBUG(DEB_F_PREFIX"inst=%d, isInUse=FALSE\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),
inst);
return FALSE;
}
/*
* Function: sub_hndlr_isAvailable
*
* Description: returns if the subscription handler is available.
*
* Parameters: none.
*
* Returns: TRUE/FALSE
*/
boolean sub_hndlr_isAvailable()
{
static const char fname[] = "sub_hndlr_isAvailable";
CCAPP_DEBUG(DEB_F_PREFIX"isAvailable=%d\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),
isAvailable);
return isAvailable;
}
static unsigned short get_new_trans_id()
{
static unsigned short curr_trans_id = 0;
if (++curr_trans_id == 0) {
curr_trans_id = 1;
}
return curr_trans_id;
}
/*
* Function: sub_hndlr_start
*
* Description: does blf subscriptions upon registration.
*
* Parameters: none.
*
* Returns: void
*/
void sub_hndlr_start()
{
static const char fname[] = "sub_hndlr_start";
int i;
cc_uint32_t lineFeature = 0;
cc_uint32_t featureOptionMask = 0;
char speedDialNumber[MAX_LINE_NAME_SIZE] = {0};
char primaryLine[MAX_LINE_NAME_SIZE] = {0};
int transId;
CCAPP_DEBUG(DEB_F_PREFIX"entering\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
/* let the system know that subscription handler is available. */
isAvailable = TRUE;
/* get primary DN */
config_get_line_string(CFGID_LINE_NAME, primaryLine, 1, sizeof(primaryLine));
/*
* for speeddial/BLF buttons, make presence subscriptions.
*/
for (i = SPEEDDIAL_START_BUTTON_NUMBER; i <= MAX_REG_LINES; i++) {
// first line must always be a calling line.
config_get_line_value(CFGID_LINE_FEATURE, &lineFeature, sizeof(lineFeature), i);
CCAPP_DEBUG(DEB_F_PREFIX"inst=%d, lineFeature=%d\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),
i, lineFeature);
switch (lineFeature) {
case cfgLineFeatureSpeedDialBLF:
config_get_line_string(CFGID_LINE_SPEEDDIAL_NUMBER, speedDialNumber, i, sizeof(speedDialNumber));
if (speedDialNumber[0] == 0) {
break;
}
config_get_line_value(CFGID_LINE_FEATURE, &featureOptionMask, sizeof(featureOptionMask), i);
transId = get_new_trans_id();
transactionIds[i - 1] = transId;
CC_BLF_subscribe(transId,
INT_MAX,
primaryLine,
speedDialNumber,
i,
featureOptionMask );
break;
default:
break;
}
//Initializes native BLF handler
ccBLFHandlerInitialized();
}
}
static void ccBLFHandlerInitialized()
{
if (!isBLFHandlerRunning) {
CC_BLF_init();
isBLFHandlerRunning = TRUE;
}
}
/*
* Function: sub_hndlr_stop
*
* Description: terminates blf subscriptions upon unregistration.
*
* Parameters: none.
*
* Returns: void
*/
void sub_hndlr_stop()
{
static const char fname[] = "sub_hndlr_stop";
int i;
CCAPP_DEBUG(DEB_F_PREFIX"entering\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
isAvailable = FALSE;
isBLFHandlerRunning = FALSE;
// should clean up blf susbcription list.
for (i = SPEEDDIAL_START_BUTTON_NUMBER; i <= MAX_REG_LINES; i++) {
//first, reset the transaction ids
transactionIds[i - 1] = 0;
//reset blf states.
blfStates[i - 1] = CC_SIP_BLF_UNKNOWN;
}
CC_BLF_unsubscribe_All();
}
/*
* Function: hideBLFButtonsDisplay
*
* Description: hides BLF states
*
* Parameters: none.
*
* Returns: void
*/
static void hideBLFButtonsDisplay()
{
static const char fname[] = "hideBLFButtonsDisplay";
int i;
cc_uint32_t lineFeature = 0;
CCAPP_DEBUG(DEB_F_PREFIX"entering\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
displayBLFState = FALSE;
for (i = SPEEDDIAL_START_BUTTON_NUMBER; i <= MAX_REG_LINES; i++) {
// first line must always be a calling line.
config_get_line_value(CFGID_LINE_FEATURE, &lineFeature, sizeof(lineFeature), i);
switch (lineFeature) {
case cfgLineFeatureSpeedDialBLF:
ccsnap_gen_blfFeatureEvent(CC_SIP_BLF_UNKNOWN, i);
break;
default:
break;
}
}
}
/*
* Function: unhideBLFButtonsDisplay
*
* Description: unhides BLF states.
*
* Parameters: none.
*
* Returns: void
*/
static void unhideBLFButtonsDisplay()
{
static const char fname[] = "unhideBLFButtonsDisplay";
int i;
cc_uint32_t lineFeature = 0;
char speedDialNumber[MAX_LINE_NAME_SIZE] = {0};
CCAPP_DEBUG(DEB_F_PREFIX"entering\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
displayBLFState = TRUE;
for (i = SPEEDDIAL_START_BUTTON_NUMBER; i <= MAX_REG_LINES; i++) {
// first line must always be a calling line.
config_get_line_value(CFGID_LINE_FEATURE, &lineFeature, sizeof(lineFeature), i);
config_get_line_string(CFGID_LINE_SPEEDDIAL_NUMBER, speedDialNumber, i, sizeof(speedDialNumber));
switch (lineFeature) {
case cfgLineFeatureSpeedDialBLF:
ccsnap_gen_blfFeatureEvent(blfStates[i - 1], i);
break;
default:
break;
}
}
}
/*
* Function: sub_hndlr_controlBLFButtons
*
* Description: hides/unhides BLF states.
*
* Parameters: none.
*
* Returns: void
*/
void sub_hndlr_controlBLFButtons(boolean state)
{
static const char fname[] = "sub_hndlr_controlBLFButtons";
if (state == TRUE) {
CCAPP_DEBUG(DEB_F_PREFIX"going to hide\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
hideBLFButtonsDisplay();
} else {
CCAPP_DEBUG(DEB_F_PREFIX"going to unhide\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname));
unhideBLFButtonsDisplay();
}
}
/*
* Function: sub_hndlr_NotifyBLFStatus
*
* Description: notifies the app of BLF state.
*
* Parameters:
* requestId - requestId of the subscription
* status - BLF status
* appId - button number of the BLF feature key.
*
* Returns: void
*/
void sub_hndlr_NotifyBLFStatus(int requestId, cc_blf_state_t status, int appId)
{
static const char fname[] = "sub_hndlr_NotifyBLFStatus";
cc_uint32_t lineFeature = 0;
char speedDialNumber[MAX_LINE_NAME_SIZE] = {0};
CCAPP_DEBUG(DEB_F_PREFIX"requestId=%d, status=%d, appId=%d\n",
DEB_F_PREFIX_ARGS(SIP_CC_PROV, fname),
requestId, status, appId);
if (appId == 0) {
// call list BLF.
} else {
config_get_line_value(CFGID_LINE_FEATURE, &lineFeature, sizeof(lineFeature), appId);
config_get_line_string(CFGID_LINE_SPEEDDIAL_NUMBER, speedDialNumber, appId, sizeof(speedDialNumber));
blfStates[appId - 1] = status;
if (displayBLFState == FALSE) {
return; // ignore the notify
}
if (lineFeature == cfgLineFeatureSpeedDialBLF) {
ccsnap_gen_blfFeatureEvent(status, appId);
}
}
}

View File

@ -1,23 +0,0 @@
/* 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/. */
#ifndef __SUB_HANDLER_H__
#define __SUB_HANDLER_H__
boolean sub_hndlr_isAlertingBLFState(int inst);
boolean sub_hndlr_isInUseBLFState(int inst);
boolean sub_hndlr_isAvailable();
void sub_hndlr_start();
void sub_hndlr_stop();
void sub_hndlr_controlBLFButtons(boolean state);
void sub_hndlr_NotifyBLFStatus(int requestId, int status, int appId);
#endif

View File

@ -1,361 +0,0 @@
/* 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 <cpr_string.h>
#include "text_strings.h"
#define dcl_str(x,p) char str_##x[] = p
#define use_str(x) str_##x
/*
* Debug strings. No localization needed. Keep it separate.
*/
dcl_str(DEBUG_START, "SIPCC-START:\0");
dcl_str(DEBUG_SEPARATOR_BAR, "===============\n");
dcl_str(DEBUG_CONSOLE_PASSWORD, "CONSOLE-PWD:cisco");
dcl_str(DEBUG_CONSOLE_KEYWORD_CONSOLE_STALL, "CONSOLE-STALL");
dcl_str(DEBUG_CONSOLE_KEYWORD_MEMORYMAP, "CONSOLE-MEMORYMAP");
dcl_str(DEBUG_CONSOLE_KEYWORD_MALLOCTABLE, "CONSOLE-MALLOCTABLE");
dcl_str(DEBUG_CONSOLE_KEYWORD_MEMORYDUMP, "CONSOLE-DUMP");
dcl_str(DEBUG_CONSOLE_KEYWORD_DNS, "CONSOLE-DNS");
dcl_str(DEBUG_CONSOLE_KEYWORD_DSPSTATE, "CONSOLE-DSPSTATE");
dcl_str(DEBUG_CONSOLE_USAGE_MEMORYDUMP, "CONSOLE-MEMORYDUMP: addr bytes [cnt blk [1/0 char output]]\n");
dcl_str(DEBUG_CONSOLE_BREAK, "CONSOLE-BREAK\r\n");
dcl_str(DEBUG_FUNCTION_ENTRY, "SIPCC-FUNC_ENTRY: LINE %d/%d: %-35s: %s <- %s\n");
dcl_str(DEBUG_FUNCTION_ENTRY2, "SIPCC-FUNC_ENTRY: LINE %d/%d: %-35s: %s <- %s(%d)\n");
dcl_str(DEBUG_SIP_ENTRY, "SIPCC-ENTRY: LINE %d/%d: %-35s: %s\n");
dcl_str(DEBUG_SIP_URL_ERROR, "SIPCC-%s: Error: URL is not SIP.\n");
dcl_str(DEBUG_LINE_NUMBER_INVALID, "SIPCC-LINE_NUM: %s: Error: Line number (%d) is invalid\n");
dcl_str(DEBUG_SIP_SPI_SEND_ERROR, "SIPCC-SPI_SEND_ERR: %s: Error: sipSPISendErrorResponse(%d) failed.\n");
dcl_str(DEBUG_SIP_SDP_CREATE_BUF_ERROR, "SIPCC-SDP_BUF: %s: Error: sipsdp_src_dest_create() returned null\n");
dcl_str(DEBUG_SIP_PARSE_SDP_ERROR, "SIPCC-SDP_PARSE: %s: Error: sdp_parse()\n");
dcl_str(DEBUG_SIP_FEATURE_UNSUPPORTED, "SIPCC-FEATURE: LINE %d/%d: %-35s: This feature is unsupported in the current state.\n");
dcl_str(DEBUG_SIP_DEST_SDP, "SIPCC-SDP_DEST: LINE %d/%d: %-35s: Process SDP: Dest=<%s>:<%d>\n");
dcl_str(DEBUG_SIP_MSG_SENDING_REQUEST, "SIPCC-MSG_SEND_REQ: %s: Sending %s...\n");
dcl_str(DEBUG_SIP_MSG_SENDING_RESPONSE, "SIPCC-MSG_SEND_RESP: %s: Sending response %d...\n");
dcl_str(DEBUG_SIP_MSG_RECV, "SIPCC-MSG_RECV: %s: Received SIP message %s.\n");
dcl_str(DEBUG_SIP_STATE_UNCHANGED, "SIPCC-SIP_STATE: LINE %d/%d: %-35s: State unchanged -> %s\n");
dcl_str(DEBUG_SIP_FUNCTIONCALL_FAILED, "SIPCC-FUNC_CALL: LINE %d/%d: %-35s: Error: %s returned error.\n");
dcl_str(DEBUG_SIP_BUILDFLAG_ERROR, "SIPCC-BUILD_FLAG: %s: Error: Build flag is not successful. Will not send message.\n");
dcl_str(DEBUG_GENERAL_FUNCTIONCALL_FAILED, "SIPCC-FUNC_CALL: %s: Error: %s returned error.\n");
dcl_str(DEBUG_GENERAL_SYSTEMCALL_FAILED, "SIPCC-SYS_CALL: %s: Error: %s failed: errno = %d\n");
dcl_str(DEBUG_GENERAL_FUNCTIONCALL_BADARGUMENT, "SIPCC-FUNC_CALL: %s: Error: invalid argument: %s\n");
dcl_str(DEBUG_FUNCTIONNAME_SIPPMH_PARSE_FROM, "SIPCC-FUNC_NAME: sippmh_parse_from_or_to(FROM)");
dcl_str(DEBUG_FUNCTIONNAME_SIPPMH_PARSE_TO, "SIPCC-FUNC_NAME: sippmh_parse_from_or_to(TO)");
dcl_str(DEBUG_FUNCTIONNAME_SIP_SM_REQUEST_CHECK_AND_STORE, "SIPCC-SM_REQ: sip_sm_request_check_and_store()");
dcl_str(DEBUG_SNTP_LI_ERROR, "SIPCC-SNTP: Leap indicator == 3\n");
dcl_str(DEBUG_SNTP_MODE_ERROR, "SIPCC-SNTP: Mode is not server (4/5) in response\n");
dcl_str(DEBUG_SNTP_STRATUM_ERROR, "SIPCC-SNTP: Invalid stratum > 15\n");
dcl_str(DEBUG_SNTP_TIMESTAMP_ERROR, "SIPCC-SNTP: Server did not echo our transmit timestamp\n");
dcl_str(DEBUG_SNTP_TIMESTAMP1, "SIPCC-SNTP: %-15s: 0x%08x %08x, ");
dcl_str(DEBUG_SNTP_TIMESTAMP2, "SIPCC-SNTP: (%+03d:%02d) %s");
dcl_str(DEBUG_SNTP_TIME_UPDATE, "SIPCC-SNTP: Updating date and time to:\n%s %lu %02lu:%02lu:%02lu "
"%04lu, %s, week %lu and day %lu. "
"Daylight saving is: %d\n\n");
dcl_str(DEBUG_SNTP_TS_HEADER, "SIPCC-SNTP: Settings:\nMode : %lu\nTimezone "
": %d\nServer Addr : %s\nTimeStruct : TZ/Offset: %d/%lu,"
" AutoAdjust: %d\nMo Day DoW WoM Time\n");
dcl_str(DEBUG_SNTP_TS_PRINT, "SIPCC-SNTP: %3lu %3lu %3lu %3lu %4lu\n");
dcl_str(DEBUG_SNTP_SOCKET_REOPEN, "SIPCC-SNTP: Re-opening listening port due to IP change\n");
dcl_str(DEBUG_SNTP_DISABLED, "SIPCC-SNTP: Unicast w/server addr 0.0.0.0, SNTP disabled\n");
dcl_str(DEBUG_SNTP_REQUEST, "SIPCC-SNTP: Sending NTP request packet [%s]\n");
dcl_str(DEBUG_SNTP_RESPONSE, "SIPCC-SNTP: Receiving NTP response packet\n");
dcl_str(DEBUG_SNTP_RETRANSMIT, "SIPCC-SNTP: Waiting %d msec to retransmit\n");
dcl_str(DEBUG_SNTP_UNICAST_MODE, "SIPCC-SNTP: Unicast mode [%s]\n");
dcl_str(DEBUG_SNTP_MULTICAST_MODE, "SIPCC-SNTP: Multicast/Directed broadcast mode [%s]\n");
dcl_str(DEBUG_SNTP_ANYCAST_MODE, "SIPCC-SNTP: Anycast mode [%s]\n");
dcl_str(DEBUG_SNTP_VALIDATION, "SIPCC-SNTP: Dropping unauthorized SNTP response: %s\n");
dcl_str(DEBUG_SNTP_VALIDATION_PACKET, "SIPCC-SNTP: Semantic check failed for NTP packet\n");
dcl_str(DEBUG_SNTP_WRONG_SERVER, "SIPCC-SNTP: Unauthorized server");
dcl_str(DEBUG_SNTP_NO_REQUEST, "SIPCC-SNTP: No request sent");
dcl_str(DEBUG_SNTP_ANYCAST_RESET, "SIPCC-SNTP: Reset to Unicast to server: %s\n");
dcl_str(DEBUG_SOCKET_UDP_RTP, "SIPCC-SOC_TASK: UDP_RTP event received.\n");
dcl_str(DEBUG_MAC_PRINT, "SIPCC-MAC_PRINT: %04x:%04x:%04x");
dcl_str(DEBUG_IP_PRINT, "SIPCC-IP_PRINT: %u.%u.%u.%u");
dcl_str(DEBUG_SYSBUF_UNAVAILABLE, "SIPCC-SYS_BUF: %s: Error: IRXLstGet() failed\n");
dcl_str(DEBUG_MSG_BUFFER_TOO_BIG, "SIPCC-MSG_BUF: %s: Error: Args Check: message buffer length (%d) too big.\n");
dcl_str(DEBUG_UNKNOWN_TIMER_BLOCK, "SIPCC-TIMER: %s: Error: Unknown timer block\n");
dcl_str(DEBUG_CREDENTIALS_BAG_CORRUPTED, "SIPCC-CRED: %-35s: Error: credentials bags corrupted");
dcl_str(DEBUG_INPUT_NULL, "SIPCC-INPUT: %s: Error: Input is null\n");
dcl_str(DEBUG_INPUT_EMPTY, "SIPCC-INPUT: %s: Error: Input is empty\n");
dcl_str(DEBUG_STRING_DUP_FAILED, "SIPCC-STR_DUP: %s: Unable to duplicate string.\n");
dcl_str(DEBUG_PARSER_STRING_TOO_LARGE, "SIPCC-PARSE: Parse error: string too big (%d,%d)\n");
dcl_str(DEBUG_PARSER_NULL_KEY_TABLE, "SIPCC-PARSE: Parse error: NULL key table passed into parser\n");
dcl_str(DEBUG_PARSER_UNKNOWN_KEY, "SIPCC-PARSE: Parse error: Unknown key name: %s\n");
dcl_str(DEBUG_PARSER_UNKNOWN_KEY_ENUM, "SIPCC-PARSE: Print error: Unknown key enum: %d\n");
dcl_str(DEBUG_PARSER_INVALID_START_VAR, "SIPCC-PARSE: Parse error: Invalid start variable ch=0x%02x(%c)\n");
dcl_str(DEBUG_PARSER_INVALID_VAR_CHAR, "SIPCC-PARSE: Parse error: Invalid variable ch=0x%02x(%c)\n");
dcl_str(DEBUG_PARSER_MISSING_COLON, "SIPCC-PARSE: Parse error: Missing colon separator\n");
dcl_str(DEBUG_PARSER_NO_VALUE, "SIPCC-PARSE: Parse error: no value for variable\n");
dcl_str(DEBUG_PARSER_EARLY_EOL, "SIPCC-PARSE: Parse error: early EOL for value\n");
dcl_str(DEBUG_PARSER_INVALID_VAR_NAME, "SIPCC-PARSE: Parse error: parse_var_name failed: %d\n");
dcl_str(DEBUG_PARSER_INVALID_VAR_VALUE, "SIPCC-PARSE: Parse error: var: %s parse_var_value failed: %d\n");
dcl_str(DEBUG_PARSER_UNKNOWN_VAR, "SIPCC-PARSE: Parse error: var: %s not found in table\n");
dcl_str(DEBUG_PARSER_NAME_VALUE, "SIPCC-PARSE: Name: [%s] Value: [%s]\n");
dcl_str(DEBUG_PARSER_UNKNOWN_NAME_VALUE, "SIPCC-PARSE: Parse error: Name: [%s] Value: [%s] rc:%d\n");
dcl_str(DEBUG_PARSER_UNKNOWN_ERROR, "SIPCC-PARSE: Default error: Name: [%s] Value: [%s] rc:%d\n");
dcl_str(DEBUG_PARSER_NUM_ERRORS, "SIPCC-PARSE: Parse error: %d Errors found\n");
dcl_str(DEBUG_PARSER_SET_DEFAULT, "SIPCC-PARSE: Parser Info: Setting var: %s to default value: %s\n\n");
dcl_str(DEBUG_SDP_ERROR_BODY_FIELD, "SIPCC-SDP: \n%s: Error in one of the SDP body fields \n");
dcl_str(DEBUG_UDP_OPEN_FAIL, "SIPCC-UDP: %s: UdpOpen(R IP=%d, R Port=%d, L Port=%d) failed\n");
dcl_str(DEBUG_UDP_PAYLOAD_TOO_LARGE, "SIPCC-UDP: %s: Error: payload size=<%d> > allowed size=<%d>\n");
dcl_str(DEBUG_RTP_TRANSPORT, "SIPCC-RTP: %s: transport= %d\n");
dcl_str(DEBUG_RTP_INVALID_VOIP_TYPE, "SIPCC-RTP: %s: Error: Unexpected voipCodec_t type: <%d>\n");
dcl_str(DEBUG_RTP_INVALID_RTP_TYPE, "SIPCC-RTP: %s: Error: Unexpected rtp_ptype in SDP body: <%d>\n");
dcl_str(DEBUG_MEMORY_ALLOC, "SIPCC-MEM: Malloc Addr:0x%lx, Size:%d\n");
dcl_str(DEBUG_MEMORY_FREE, "SIPCC-MEM: Free Addr:0x%lx, Size:%d\n");
dcl_str(DEBUG_MEMORY_MALLOC_ERROR, "SIPCC-MEM: 0x%lx:Malloc error for size %d\n");
dcl_str(DEBUG_MEMORY_REALLOC_ERROR, "SIPCC-MEM: %s: Error: malloc_tagged() returned null.\n");
dcl_str(DEBUG_MEMORY_OUT_OF_MEM, "SIPCC-MEM: %s: Error: malloc failed\n");
dcl_str(DEBUG_MEMORY_ENTRY, "SIPCC-MEM: >> Used: %1d size: %6d addr:0x%08x\n");
dcl_str(DEBUG_MEMORY_SUMMARY, "===== MEMORY MAP START =====\n"
"free blocks : %6d, free block space:%6d, largest free block: %6d\n"
"used blocks : %6d, used block space:%6d, largest used block: %6d\n"
"wasted block: %6d, str_lib space :%6d\n"
"used space excluding str_lib space :%6d\n \n"
"===== MEMORY MAP END =====\n");
dcl_str(DEBUG_MEMORY_ADDRESS_HEADER, "SIPCC-MEM: 0x%08x: ");
dcl_str(DEBUG_MEMORY_DUMP, "SIPCC-MEM: DUMP: 0x%08x - 0x%08x\n");
dcl_str(DEBUG_DNS_GETHOSTBYNAME, "SIPCC-DNS: gethostbyname('%s',%08x,%d,%d)\n");
dcl_str(DEBUG_PMH_INCORRECT_SYNTAX, "SIPCC-PMH: INCORRECT SYNTAX");
dcl_str(DEBUG_PMH_INVALID_FIELD_VALUE, "SIPCC-PMH: INVALID FIELD VALUE");
dcl_str(DEBUG_PMH_INVALID_SCHEME, "SIPCC-PMH: INVALID SCHEME");
dcl_str(DEBUG_PMH_UNKNOWN_SCHEME, "SIPCC-PMH: UNKNOWN SCHEME");
dcl_str(DEBUG_PMH_NOT_ENOUGH_PARAMETERS, "SIPCC-PMH: NOT ENOUGH PARAMETERS");
dcl_str(DEBUG_REG_DISABLED, "SIPCC-REG: LINE %d/%d: %-35s: registration disabled\n");
dcl_str(DEBUG_REG_PROXY_EXPIRES, "SIPCC-REG: LINE %d/%d: %-35s: Using proxy expires value\n");
dcl_str(DEBUG_REG_SIP_DATE, "SIPCC-REG: LINE %d/%d: %-35s: SIP-date= %s\n");
dcl_str(DEBUG_REG_SIP_RESP_CODE, "SIPCC-REG: LINE %d/%d: %-35s: Error: SIP response code\n");
dcl_str(DEBUG_REG_SIP_RESP_FAILURE, "SIPCC-REG: LINE %d/%d: %-35s: SIP failure %d resp\n");
dcl_str(DEBUG_REG_INVALID_LINE, "SIPCC-REG: %-35s: Line %d: Invalid line\n");
dcl_str(CC_NO_MSG_BUFFER, "SIPCC-MSG_BUF: %s : no msg buffer available\n");
dcl_str(CC_SEND_FAILURE, "SIPCC-MSG_SEND: %s : unable to send msg\n");
dcl_str(GSM_UNDEFINED, "SIPCC-GSM: UNDEFINED");
dcl_str(GSM_DBG_PTR, "SIPCC-GSM_DBG_PTR: %s %-4d: %-35s: %s= %p\n");
dcl_str(GSM_FUNC_ENTER, "SIPCC-GSM_FUNC_ENT: %s %-4d: %-35s\n");
dcl_str(GSM_DBG1, "SIPCC-GSM: %s %-4d: %-35s: %s\n");
dcl_str(FSM_DBG_SM_DEFAULT_EVENT, "SIPCC-FSM: default - ignoring.\n");
dcl_str(FSM_DBG_SM_FTR_ENTRY, "SIPCC-FSM: feature= %s, src= %s\n");
dcl_str(FSM_DBG_FAC_ERR, "SIPCC-FSM_FAC_ERR: %-4d: %-35s:\n %s, rc= %s\n");
dcl_str(FSM_DBG_FAC_FOUND, "SIPCC-FSM: %-4d: %-35s: facility found(%d)\n");
dcl_str(FSM_DBG_IGNORE_FTR, "SIPCC-FSM: %s %-4d: %8d: ignoring feature= %s\n");
dcl_str(FSM_DBG_IGNORE_SRC, "SIPCC-FSM: %s %-4d: %8d: ignoring src= %s\n");
dcl_str(FSM_DBG_CHANGE_STATE, "SIPCC-FSM: %s %-4d: %8d: %s -> %s\n");
dcl_str(FSM_DBG_SDP_BUILD_ERR, "SIPCC-FSM: Unable to build SDP. \n");
dcl_str(FSMDEF_DBG_PTR, "SIPCC-FSM: DEF %-4d/%d: %-35s: dcb= %p\n");
dcl_str(FSMDEF_DBG1, "SIPCC-FSM: DEF %-4d/%d: %-35s: %s\n");
dcl_str(FSMDEF_DBG2, "SIPCC-FSM: DEF %-4d/%d: %-35s: %s %d\n");
dcl_str(FSMDEF_DBG_SDP, "SIPCC-FSM: DEF %-4d/%d: %-35s: addr= %s, port= %d,\n media_type(s)=");
dcl_str(FSMDEF_DBG_CLR_SPOOF_APPLD, "SIPCC-FSM: DEF %-4d/%d: %-35s: clearing spoof_ringout_applied.\n");
dcl_str(FSMDEF_DBG_CLR_SPOOF_RQSTD, "SIPCC-FSM: DEF %-4d/%d: %-35s: clearing spoof_ringout_requested.\n");
dcl_str(FSMDEF_DBG_INVALID_DCB, "SIPCC-FSM: DEF 0 : %-35s: invalid dcb\n");
dcl_str(FSMDEF_DBG_FTR_REQ_ACT, "SIPCC-FSM: DEF %-4d/%d: feature requested %s but %s is active.\n");
dcl_str(FSMDEF_DBG_TMR_CREATE_FAILED, "SIPCC-FSM: DEF %-4d/%d: %-35s: %s:\n cprCreateTimer failed.\n");
dcl_str(FSMDEF_DBG_TMR_START_FAILED, "SIPCC-FSM: DEF %-4d/%d: %-35s: %s:\n cprStartTimer failed, errno= %d.\n");
dcl_str(FSMDEF_DBG_TMR_CANCEL_FAILED, "SIPCC-FSM: DEF %-4d/%d: %-35s: %s:\n cprCancelTimer failed, errno= %d.\n");
dcl_str(FSMXFR_DBG_XFR_INITIATED, "SIPCC-FSM: XFR %-4d/%d/%d: %8d: xfer initiated\n");
dcl_str(FSMXFR_DBG_PTR, "SIPCC-FSM: XFR %-4d/%d/%d: %-35s: xcb= %p\n");
dcl_str(FSMCNF_DBG_CNF_INITIATED, "SIPCC-FSM: CNF %-4d/%d/%d: %8d: conf initiated\n");
dcl_str(FSMCNF_DBG_PTR, "SIPCC-FSM: CNF %-4d/%d/%d: %-35s: ncb= %p\n");
dcl_str(FSMB2BCNF_DBG_CNF_INITIATED, "SIPCC-FSM: B2BCNF %-4d/%d/%d: %8d: b2bconf initiated\n");
dcl_str(FSMB2BCNF_DBG_PTR, "SIPCC-FSM: B2BCNF %-4d/%d/%d: %-35s: ncb= %p\n");
dcl_str(FSMSHR_DBG_BARGE_INITIATED, "SIPCC-FSM: SHR %-4d/%d/%d: %8d: Barge initiated\n");
dcl_str(LSM_DBG_ENTRY, "SIPCC-LSM: %-4d/%d: %-35s\n");
dcl_str(LSM_DBG_INT1, "SIPCC-LSM: %-4d/%d: %-35s: %s= %d\n");
dcl_str(LSM_DBG_CC_ERROR, "SIPCC-LSM: %-4d/%d: %-35s: (%d:%p) failure\n");
dcl_str(VCM_DEBUG_ENTRY, "SIPCC-VCM: %-4d: %-35s\n");
dcl_str(SM_PROCESS_EVENT_ERROR, "SIPCC-SM: %s: Error: sip_sm_process_event() returned error processing %d\n");
dcl_str(REG_SM_PROCESS_EVENT_ERROR, "SIPCC-SM: %s: Error: sip_reg_sm_process_event() returned error processing %d\n");
dcl_str(DEBUG_END, "SIPCC-END: \0");
/*
* Debug string table NOT subject to localization
*/
debug_string_table_entry debug_string_table [] = {
{0}, // DEBUG_START
{use_str(DEBUG_SEPARATOR_BAR)}, // DEBUG_SEPARATOR_BAR
{use_str(DEBUG_CONSOLE_PASSWORD)}, // DEBUG_CONSOLE_PASSWORD
{use_str(DEBUG_CONSOLE_KEYWORD_CONSOLE_STALL)}, // DEBUG_CONSOLE_KEYWORD_CONSOLE_STALL
{use_str(DEBUG_CONSOLE_KEYWORD_MEMORYMAP)}, // DEBUG_CONSOLE_KEYWORD_MEMORYMAP
{use_str(DEBUG_CONSOLE_KEYWORD_MALLOCTABLE)}, // DEBUG_CONSOLE_KEYWORD_MALLOCTABLE
{use_str(DEBUG_CONSOLE_KEYWORD_MEMORYDUMP)}, // DEBUG_CONSOLE_KEYWORD_MEMORYDUMP
{use_str(DEBUG_CONSOLE_KEYWORD_DNS)}, // DEBUG_CONSOLE_KEYWORD_DNS
{use_str(DEBUG_CONSOLE_KEYWORD_DSPSTATE)}, // DEBUG_CONSOLE_KEYWORD_DSPSTATE
{use_str(DEBUG_CONSOLE_USAGE_MEMORYDUMP)}, // DEBUG_CONSOLE_USAGE_MEMORYDUMP
{use_str(DEBUG_CONSOLE_BREAK)}, // DEBUG_CONSOLE_BREAK
{use_str(DEBUG_FUNCTION_ENTRY)}, // DEBUG_FUNCTION_ENTRY
{use_str(DEBUG_FUNCTION_ENTRY2)}, // DEBUG_FUNCTION_ENTRY2
{use_str(DEBUG_SIP_ENTRY)}, // DEBUG_SIP_ENTRY
{use_str(DEBUG_SIP_URL_ERROR)}, // DEBUG_SIP_URL_ERROR
{use_str(DEBUG_LINE_NUMBER_INVALID)}, // DEBUG_LINE_NUMBER_INVALID
{use_str(DEBUG_SIP_SPI_SEND_ERROR)}, // DEBUG_SIP_SPI_SEND_ERROR
{use_str(DEBUG_SIP_SDP_CREATE_BUF_ERROR)}, // DEBUG_SIP_SDP_CREATE_BUF_ERROR
{use_str(DEBUG_SIP_PARSE_SDP_ERROR)}, // DEBUG_SIP_PARSE_SDP_ERROR
{use_str(DEBUG_SIP_FEATURE_UNSUPPORTED)}, // DEBUG_SIP_FEATURE_UNSUPPORTED
{use_str(DEBUG_SIP_DEST_SDP)}, // DEBUG_SIP_DEST_SDP
{use_str(DEBUG_SIP_MSG_SENDING_REQUEST)}, // DEBUG_SIP_MSG_SENDING_REQUEST
{use_str(DEBUG_SIP_MSG_SENDING_RESPONSE)}, // DEBUG_SIP_MSG_SENDING_RESPONSE
{use_str(DEBUG_SIP_MSG_RECV)}, // DEBUG_SIP_MSG_RECV
{use_str(DEBUG_SIP_STATE_UNCHANGED)}, // DEBUG_SIP_STATE_UNCHANGED
{use_str(DEBUG_SIP_FUNCTIONCALL_FAILED)}, // DEBUG_SIP_FUNCTIONCALL_FAILED
{use_str(DEBUG_SIP_BUILDFLAG_ERROR)}, // DEBUG_SIP_BUILDFLAG_ERROR
{use_str(DEBUG_GENERAL_FUNCTIONCALL_FAILED)}, // DEBUG_GENERAL_FUNCTIONCALL_FAILED
{use_str(DEBUG_GENERAL_SYSTEMCALL_FAILED)}, // DEBUG_GENERAL_SYSTEMCALL_FAILED
{use_str(DEBUG_GENERAL_FUNCTIONCALL_BADARGUMENT)}, // DEBUG_GENERAL_FUNCTIONCALL_BADARGUMENT
{use_str(DEBUG_FUNCTIONNAME_SIPPMH_PARSE_FROM)},// DEBUG_FUNCTIONNAME_SIP_PARSE_FROM
{use_str(DEBUG_FUNCTIONNAME_SIPPMH_PARSE_TO)}, // DEBUG_FUNCTIONNAME_SIP_PARSE_TO
{use_str(DEBUG_FUNCTIONNAME_SIP_SM_REQUEST_CHECK_AND_STORE)}, // DEBUG_FUNCTIONNAME_SIP_SM_REQUEST_CHECK_AND_STORE
{use_str(DEBUG_SNTP_LI_ERROR)}, // DEBUG_SNTP_LI_ERROR
{use_str(DEBUG_SNTP_MODE_ERROR)}, // DEBUG_SNTP_MODE_ERROR
{use_str(DEBUG_SNTP_STRATUM_ERROR)}, // DEBUG_SNTP_STRATUM_ERROR
{use_str(DEBUG_SNTP_TIMESTAMP_ERROR)}, // DEBUG_SNTP_TIMESTAMP_ERROR
{use_str(DEBUG_SNTP_TIMESTAMP1)}, // DEBUG_SNTP_TIMESTAMP1
{use_str(DEBUG_SNTP_TIMESTAMP2)}, // DEBUG_SNTP_TIMESTAMP2
{use_str(DEBUG_SNTP_TIME_UPDATE)}, // DEBUG_SNTP_TIME_UPDATE
{use_str(DEBUG_SNTP_TS_HEADER)}, // DEBUG_SNTP_TS_HEADER
{use_str(DEBUG_SNTP_TS_PRINT)}, // DEBUG_SNTP_TS_PRINT
{use_str(DEBUG_SNTP_SOCKET_REOPEN)}, // DEBUG_SNTP_SOCKET_REOPEN
{use_str(DEBUG_SNTP_DISABLED)}, // DEBUG_SNTP_DISABLED
{use_str(DEBUG_SNTP_REQUEST)}, // DEBUG_SNTP_REQUEST
{use_str(DEBUG_SNTP_RESPONSE)}, // DEBUG_SNTP_RESPONSE
{use_str(DEBUG_SNTP_RETRANSMIT)}, // DEBUG_SNTP_RETRANSMIT
{use_str(DEBUG_SNTP_UNICAST_MODE)}, // DEBUG_SNTP_UNICAST_MODE
{use_str(DEBUG_SNTP_MULTICAST_MODE)}, // DEBUG_SNTP_MULTICAST_MODE
{use_str(DEBUG_SNTP_ANYCAST_MODE)}, // DEBUG_SNTP_ANYCAST_MODE
{use_str(DEBUG_SNTP_VALIDATION)}, // DEBUG_SNTP_VALIDATION
{use_str(DEBUG_SNTP_VALIDATION_PACKET)}, // DEBUG_SNTP_VALIDATION_PACKET
{use_str(DEBUG_SNTP_WRONG_SERVER)}, // DEBUG_SNTP_WRONG_SERVER
{use_str(DEBUG_SNTP_NO_REQUEST)}, // DEBUG_SNTP_NO_REQUEST
{use_str(DEBUG_SNTP_ANYCAST_RESET)}, // DEBUG_SNTP_ANYCAST_RESET
{use_str(DEBUG_SOCKET_UDP_RTP)}, // DEBUG_SOCKET_UDP_RTP
{use_str(DEBUG_MAC_PRINT)}, // DEBUG_MAC_PRINT
{use_str(DEBUG_IP_PRINT)}, // DEBUG_IP_PRINT
{use_str(DEBUG_SYSBUF_UNAVAILABLE)}, // DEBUG_SYSBUF_UNAVAILABLE
{use_str(DEBUG_MSG_BUFFER_TOO_BIG)}, // DEBUG_MSG_BUFFER_TOO_BIG
{use_str(DEBUG_UNKNOWN_TIMER_BLOCK)}, // DEBUG_UNKNOWN_TIMER_BLOCK
{use_str(DEBUG_CREDENTIALS_BAG_CORRUPTED)}, // DEBUG_CREDENTIALS_BAG_CORRUPTED
{use_str(DEBUG_INPUT_NULL)}, // DEBUG_INPUT_NULL
{use_str(DEBUG_INPUT_EMPTY)}, // DEBUG_INPUT_EMPTY
{use_str(DEBUG_STRING_DUP_FAILED)}, // DEBUG_STRING_DUP_FAILED
{use_str(DEBUG_PARSER_STRING_TOO_LARGE)}, // DEBUG_PARSER_STRING_TOO_LARGE
{use_str(DEBUG_PARSER_NULL_KEY_TABLE)}, // DEBUG_PARSER_NULL_KEY_TABLE
{use_str(DEBUG_PARSER_UNKNOWN_KEY)}, // DEBUG_PARSER_UNKNOWN_KEY
{use_str(DEBUG_PARSER_UNKNOWN_KEY_ENUM)}, // DEBUG_PARSER_UNKNOWN_KEY_ENUM
{use_str(DEBUG_PARSER_INVALID_START_VAR)}, // DEBUG_PARSER_INVALID_START_VAR
{use_str(DEBUG_PARSER_INVALID_VAR_CHAR)}, // DEBUG_PARSER_INVALID_VAR_CHAR
{use_str(DEBUG_PARSER_MISSING_COLON)}, // DEBUG_PARSER_MISSING_COLON
{use_str(DEBUG_PARSER_NO_VALUE)}, // DEBUG_PARSER_NO_VALUE
{use_str(DEBUG_PARSER_EARLY_EOL)}, // DEBUG_PARSER_EARLY_EOL
{use_str(DEBUG_PARSER_INVALID_VAR_NAME)}, // DEBUG_PARSER_INVALID_VAR_NAME
{use_str(DEBUG_PARSER_INVALID_VAR_VALUE)}, // DEBUG_PARSER_INVALID_VAR_VALUE
{use_str(DEBUG_PARSER_UNKNOWN_VAR)}, // DEBUG_PARSER_UNKNOWN_VAR
{use_str(DEBUG_PARSER_NAME_VALUE)}, // DEBUG_PARSER_NAME_VALUE
{use_str(DEBUG_PARSER_UNKNOWN_NAME_VALUE)}, // DEBUG_PARSER_UNKNOWN_NAME_VALUE
{use_str(DEBUG_PARSER_UNKNOWN_ERROR)}, // DEBUG_PARSER_UNKNOWN_ERROR
{use_str(DEBUG_PARSER_NUM_ERRORS)}, // DEBUG_PARSER_NUM_ERRORS
{use_str(DEBUG_PARSER_SET_DEFAULT)}, // DEBUG_PARSER_SET_DEFAULT
{use_str(DEBUG_SDP_ERROR_BODY_FIELD)}, // DEBUG_SDP_ERROR_BODY_FIELD
{use_str(DEBUG_UDP_OPEN_FAIL)}, // DEBUG_UDP_OPEN_FAIL
{use_str(DEBUG_UDP_PAYLOAD_TOO_LARGE)}, // DEBUG_UDP_PAYLOAD_TOO_LARGE
{use_str(DEBUG_RTP_TRANSPORT)}, // DEBUG_RTP_TRANSPORT
{use_str(DEBUG_RTP_INVALID_VOIP_TYPE)}, // DEBUG_RTP_INVALID_VOIP_TYPE
{use_str(DEBUG_RTP_INVALID_RTP_TYPE)}, // DEBUG_RTP_INVALID_RTP_TYPE
{use_str(DEBUG_MEMORY_ALLOC)}, // DEBUG_MEMORY_ALLOC
{use_str(DEBUG_MEMORY_FREE)}, // DEBUG_MEMORY_FREE
{use_str(DEBUG_MEMORY_MALLOC_ERROR)}, // DEBUG_MEMORY_MALLOC_ERROR
{use_str(DEBUG_MEMORY_REALLOC_ERROR)}, // DEBUG_MEMORY_REALLOC_ERROR
{use_str(DEBUG_MEMORY_OUT_OF_MEM)}, // DEBUG_MEMORY_OUT_OF_MEM
{use_str(DEBUG_MEMORY_ENTRY)}, // DEBUG_MEMORY_ENTRY
{use_str(DEBUG_MEMORY_SUMMARY)}, // DEBUG_MEMORY_SUMMARY
{use_str(DEBUG_MEMORY_ADDRESS_HEADER)}, // DEBUG_MEMORY_ADDRESS_HEADER
{use_str(DEBUG_MEMORY_DUMP)}, // DEBUG_MEMORY_DUMP
{use_str(DEBUG_DNS_GETHOSTBYNAME)}, // DEBUG_DNS_GETHOSTBYNAME
{use_str(DEBUG_PMH_INCORRECT_SYNTAX)}, // DEBUG_PMH_INCORRECT_SYNTAX
{use_str(DEBUG_PMH_INVALID_FIELD_VALUE)}, // DEBUG_PMH_INVALID_FIELD_VALUE
{use_str(DEBUG_PMH_INVALID_SCHEME)}, // DEBUG_PMH_INVALID_SCHEME
{use_str(DEBUG_PMH_UNKNOWN_SCHEME)}, // DEBUG_PMH_UNKNOWN_SCHEME
{use_str(DEBUG_PMH_NOT_ENOUGH_PARAMETERS)}, // DEBUG_PMH_NOT_ENOUGH_PARAMETERS
{use_str(DEBUG_REG_DISABLED)}, // DEBUG_REG_DISABLED
{use_str(DEBUG_REG_PROXY_EXPIRES)}, // DEBUG_REG_PROXY_EXPIRES
{use_str(DEBUG_REG_SIP_DATE)}, // DEBUG_REG_SIP_DATE
{use_str(DEBUG_REG_SIP_RESP_CODE)}, // DEBUG_REG_SIP_RESP_CODE
{use_str(DEBUG_REG_SIP_RESP_FAILURE)}, // DEBUG_REG_SIP_RESP_FAILURE
{use_str(DEBUG_REG_INVALID_LINE)}, // DEBUG_REG_INVALID_LINE
{use_str(CC_NO_MSG_BUFFER)}, // CC_NO_MSG_BUFFER^M
{use_str(CC_SEND_FAILURE)}, // CC_SEND_FAILURE^M
{use_str(GSM_UNDEFINED)}, // GSM_UNDEFINED
{use_str(GSM_DBG_PTR)}, // GSM_DBG_PTR
{use_str(GSM_FUNC_ENTER)}, // GSM_FUNC_ENTER
{use_str(GSM_DBG1)}, // GSM_DBG1
{use_str(FSM_DBG_SM_DEFAULT_EVENT)}, // FSM_DBG_SM_DEFAULT_EVENT
{use_str(FSM_DBG_SM_FTR_ENTRY)}, // FSM_DBG_SM_FTR_ENTRY
{use_str(FSM_DBG_FAC_ERR)}, // FSM_DBG_FAC_ERR
{use_str(FSM_DBG_FAC_FOUND)}, // FSM_DBG_FAC_FOUND
{use_str(FSM_DBG_IGNORE_FTR)}, // FSM_DBG_IGNORE_FTR
{use_str(FSM_DBG_IGNORE_SRC)}, // FSM_DBG_IGNORE_SRC
{use_str(FSM_DBG_CHANGE_STATE)}, // FSM_DBG_CHANGE_STATE
{use_str(FSM_DBG_SDP_BUILD_ERR)}, // FSM_DBG_SDP_BUILD_ERR
{use_str(FSMDEF_DBG_PTR)}, // FSMDEF_DBG_PTR
{use_str(FSMDEF_DBG1)}, // FSMDEF_DBG1
{use_str(FSMDEF_DBG2)}, // FSMDEF_DBG2
{use_str(FSMDEF_DBG_SDP)}, // FSMDEF_DBG_SDP
{use_str(FSMDEF_DBG_CLR_SPOOF_APPLD)}, // FSMDEF_DBG_CLEAR_SPOOF
{use_str(FSMDEF_DBG_CLR_SPOOF_RQSTD)}, // FSMDEF_DBG_CLEAR_SPOOF
{use_str(FSMDEF_DBG_INVALID_DCB)}, // FSMDEF_DBG_INVALID_DCB
{use_str(FSMDEF_DBG_FTR_REQ_ACT)}, // FSMDEF_DBG_FTR_REQ_ACT
{use_str(FSMDEF_DBG_TMR_CREATE_FAILED)}, // FSMDEF_DBG_TMR_CREATE_FAILED
{use_str(FSMDEF_DBG_TMR_START_FAILED)}, // FSMDEF_DBG_TMR_START_FAILED
{use_str(FSMDEF_DBG_TMR_CANCEL_FAILED)}, // FSMDEF_DBG_TMR_CANCEL_FAILED
{use_str(FSMXFR_DBG_XFR_INITIATED)}, // FSMXFR_DBG_XFR_INITIATED
{use_str(FSMXFR_DBG_PTR)}, // FSMXFR_DBG_PTR
{use_str(FSMCNF_DBG_CNF_INITIATED)}, // FSMCNF_DBG_CNF_INITIATED
{use_str(FSMCNF_DBG_PTR)}, // FSMCNF_DBG_PTR
{use_str(FSMB2BCNF_DBG_CNF_INITIATED)}, // FSMB2BCNF_DBG_CNF_INITIATED
{use_str(FSMB2BCNF_DBG_PTR)}, // FSMB2BCNF_DBG_PTR
{use_str(FSMSHR_DBG_BARGE_INITIATED)}, // FSMSHR_DBG_BARGE_INITIATED
{use_str(LSM_DBG_ENTRY)}, // LSM_DBG_ENTRY
{use_str(LSM_DBG_INT1)}, // LSM_DBG_INT1
{use_str(LSM_DBG_CC_ERROR)}, // LSM_DBG_CC_ERROR
{use_str(VCM_DEBUG_ENTRY)}, // VCM_DEBUG_ENTRY
{use_str(SM_PROCESS_EVENT_ERROR)}, // SM_PROCESS_EVENT_ERROR
{use_str(REG_SM_PROCESS_EVENT_ERROR)}, // REG_SM_PROCESS_EVENT_ERROR
{0},
};
//************************************************************************
/*
* Phrase string table subject to localization
*/
tnp_phrase_index_str_table_entry tnp_phrase_index_str_table [] = {
{"\0"}, // LOCALE_START
{"\x80\x13"}, // IDLE_PROMPT sccp 119
{"Anonymous"}, // ANONYMOUS - used for messaging; keep English
{"\x80\x1e"}, // CALL_PROCEEDING_IN
{"\x80\x1e"}, // CALL_PROCEEDING_OUT
{"\x80\x16"}, // CALL_ALERTING sccp 122
{"\x80\x1b"}, // CALL_ALERTING_SECONDARY sccp 127
{"\x80\x16"}, // CALL_ALERTING_LOCAL
{"\x80\x18"}, // CALL_CONNECTED sccp 124
{"\x80\x03"}, // CALL_INITIATE_HOLD sccp 103 or phone 786?
{"\x80\x20"}, // PROMPT_DIAL sccp 132
{"\x80\x19"}, // LINE_BUSY sccp 125
{"\x80\x1b"}, // CALL_WAITING
{"\x80\x52"}, // TRANSFER_FAILED sccp 182
{"\x80\x26"}, // Cannot complete the b2b conf
{"\x80\x34"}, // UI_CONFERENCE
{"\x80\x38"}, // UI_UNKNOWN
{"\x80\x1f"}, // REMOTE_IN_USE
{"\x80\x55"}, // NUM_NOT_CONFIGURED
{"\x80\x17"}, // UI_FROM
{"\x80\x29"}, // INVALID_CONF_PARTICIPANT
{"\x80\x36"}, // UI_PRIVATE
{"\0"} // LOCALE_END
};

View File

@ -1,302 +0,0 @@
/* 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/. */
#ifndef TEXT_STRINGS_H
#define TEXT_STRINGS_H
#include "cpr_types.h"
#include "phone_types.h"
#include "string_lib.h"
#define DEF_NOTIFY_PRI 20
#define HR_NOTIFY_PRI 1
/*
* Define hard coded Anonymous string to be used in From header
* when call id blocking is enabled. This is also used to
* compare to when anonymous call block is enabled. We can
* can not use the localized version of Anonymous for these
* actions.
*/
#define SIP_HEADER_ANONYMOUS_STR "Anonymous"
/*
* Define special strings that are not localized to be used for
* comparing special display names whether the names are special
* and not to display the number associated with the name.
*/
#define CONFERENCE_STR "conference"
#define CONFERENCE_STR_LEN (sizeof(CONFERENCE_STR)-1)
#define CONFERENCE_LOCALE_CODE 964
/*
* Constants for dictionary index
*/
// Hardcoding phrases that need to be dropped on floor for RT to 1
#define STR_INDEX_GRP_CALL_PICKUP 47
#define STR_INDEX_LST_CALL_PICKUP 49
#define STR_INDEX_FEAT_UNAVAIL 148
#define STR_INDEX_CNFR_FAIL_NOCODEC 1054
#define STR_INDEX_REORDER 1055
#define STR_INDEX_ANONYMOUS_SPACE 1056
#define STR_INDEX_NO_FREE_LINES 1057
#define STR_INDEX_REGISTRATION_REJECTED 1058
#define STR_INDEX_REGISTERING 1
#define STR_INDEX_WHISPER 1
#define STR_INDEX_PROXY_UNAVAIL 1
#define STR_INDEX_CALL_REDIRECTED 1
#define STR_INDEX_TRANSFERRING 1
#define STR_INDEX_SESSION_PROGRESS 1
#define STR_INDEX_CALLING 1
#define STR_INDEX_USE_LINE_OR_JOIN_TO_COMPLETE 1
#define STR_INDEX_CONF_LOCAL_MIXED 1
#define STR_INDEX_NO_CALL_FOR_PICKUP 195
#define STR_INDEX_CALL_FORWARD 105
#define STR_INDEX_CALL_PICKUP 117
#define STR_INDEX_NO_LINE_FOR_PICKUP 198
#define STR_INDEX_ERROR_PASS_LIMIT 149
#define STR_INDEX_TRANS_COMPLETE 918
#define STR_INDEX_END_CALL 877
#define STR_INDEX_NO_BAND_WIDTH 1158
#define STR_INDEX_RESP_TIMEOUT 1160
#define CALL_BUBBLE_STR_MAX_LEN 32
#define STATUS_LINE_MAX_LEN 128
/*
* Escape codes definitions
*/
#define OLD_CUCM_DICTIONARY_ESCAPE_TAG '\x80'
#define NEW_CUCM_DICTIONARY_ESCAPE_TAG '\x1E'
#define CALL_CONTROL_PHRASE_OFFSET '\x64' // offset 100
#define MAX_LOCALE_PHRASE_LEN 256
#define MAX_LOCALE_STRING_LEN 1024
/*
* Escaped index string codes for Call Mgr dictionary phrases
*/
#define INDEX_STR_KEY_NOT_ACTIVE (char *) "\x80\x2D"
#define INDEX_STR_BARGE (char *) "\x80\x43"
#define INDEX_STR_PRIVATE (char *) "\x80\x36"
#define INDEX_STR_HOLD_REVERSION (char *) "\x1E\x23"
#define INDEX_STR_MONITORING (char *) "\x1E\x27"
#define INDEX_STR_COACHING (char *) "\x1E\x46"
/*
* Index value for phrase strings subject to localization
*/
enum PHRASE_STRINGS_ENUM {
LOCALE_START,
IDLE_PROMPT,
ANONYMOUS, /* fsmdef.o */
CALL_PROCEEDING_IN,
CALL_PROCEEDING_OUT,
CALL_ALERTING,
CALL_ALERTING_SECONDARY,
CALL_ALERTING_LOCAL,
CALL_CONNECTED,
CALL_INITIATE_HOLD,
PROMPT_DIAL,
LINE_BUSY,
CALL_WAITING,
TRANSFER_FAILED,
CONF_CANNOT_COMPLETE,
UI_CONFERENCE,
UI_UNKNOWN,
REMOTE_IN_USE,
NUM_NOT_CONFIGURED,
UI_FROM,
INVALID_CONF_PARTICIPANT,
UI_PRIVATE,
LOCALE_END
};
/*
* Index value for Debug strings NOT subject to localization
*/
enum DEBUG_STRINGS_ENUM {
DEBUG_START,
DEBUG_SEPARATOR_BAR,
DEBUG_CONSOLE_PASSWORD,
DEBUG_CONSOLE_KEYWORD_CONSOLE_STALL,
DEBUG_CONSOLE_KEYWORD_MEMORYMAP,
DEBUG_CONSOLE_KEYWORD_MALLOCTABLE,
DEBUG_CONSOLE_KEYWORD_MEMORYDUMP,
DEBUG_CONSOLE_KEYWORD_DNS,
DEBUG_CONSOLE_KEYWORD_DSPSTATE,
DEBUG_CONSOLE_USAGE_MEMORYDUMP,
DEBUG_CONSOLE_BREAK,
DEBUG_FUNCTION_ENTRY,
DEBUG_FUNCTION_ENTRY2,
DEBUG_SIP_ENTRY,
DEBUG_SIP_URL_ERROR,
DEBUG_LINE_NUMBER_INVALID,
DEBUG_SIP_SPI_SEND_ERROR,
DEBUG_SIP_SDP_CREATE_BUF_ERROR,
DEBUG_SIP_PARSE_SDP_ERROR,
DEBUG_SIP_FEATURE_UNSUPPORTED,
DEBUG_SIP_DEST_SDP,
DEBUG_SIP_MSG_SENDING_REQUEST,
DEBUG_SIP_MSG_SENDING_RESPONSE,
DEBUG_SIP_MSG_RECV,
DEBUG_SIP_STATE_UNCHANGED,
DEBUG_SIP_FUNCTIONCALL_FAILED,
DEBUG_SIP_BUILDFLAG_ERROR,
DEBUG_GENERAL_FUNCTIONCALL_FAILED,
DEBUG_GENERAL_SYSTEMCALL_FAILED,
DEBUG_GENERAL_FUNCTIONCALL_BADARGUMENT,
DEBUG_FUNCTIONNAME_SIPPMH_PARSE_FROM,
DEBUG_FUNCTIONNAME_SIPPMH_PARSE_TO,
DEBUG_FUNCTIONNAME_SIP_SM_REQUEST_CHECK_AND_STORE,
DEBUG_SNTP_LI_ERROR,
DEBUG_SNTP_MODE_ERROR,
DEBUG_SNTP_STRATUM_ERROR,
DEBUG_SNTP_TIMESTAMP_ERROR,
DEBUG_SNTP_TIMESTAMP1,
DEBUG_SNTP_TIMESTAMP2,
DEBUG_SNTP_TIME_UPDATE,
DEBUG_SNTP_TS_HEADER,
DEBUG_SNTP_TS_PRINT,
DEBUG_SNTP_SOCKET_REOPEN,
DEBUG_SNTP_DISABLED,
DEBUG_SNTP_REQUEST,
DEBUG_SNTP_RESPONSE,
DEBUG_SNTP_RETRANSMIT,
DEBUG_SNTP_UNICAST_MODE,
DEBUG_SNTP_MULTICAST_MODE,
DEBUG_SNTP_ANYCAST_MODE,
DEBUG_SNTP_VALIDATION,
DEBUG_SNTP_VALIDATION_PACKET,
DEBUG_SNTP_WRONG_SERVER,
DEBUG_SNTP_NO_REQUEST,
DEBUG_SNTP_ANYCAST_RESET,
DEBUG_SOCKET_UDP_RTP,
DEBUG_MAC_PRINT,
DEBUG_IP_PRINT,
DEBUG_SYSBUF_UNAVAILABLE,
DEBUG_MSG_BUFFER_TOO_BIG,
DEBUG_UNKNOWN_TIMER_BLOCK,
DEBUG_CREDENTIALS_BAG_CORRUPTED,
DEBUG_INPUT_EMPTY,
DEBUG_INPUT_NULL,
DEBUG_STRING_DUP_FAILED,
DEBUG_PARSER_STRING_TOO_LARGE,
DEBUG_PARSER_NULL_KEY_TABLE,
DEBUG_PARSER_UNKNOWN_KEY,
DEBUG_PARSER_UNKNOWN_KEY_ENUM,
DEBUG_PARSER_INVALID_START_VAR,
DEBUG_PARSER_INVALID_VAR_CHAR,
DEBUG_PARSER_MISSING_COLON,
DEBUG_PARSER_NO_VALUE,
DEBUG_PARSER_EARLY_EOL,
DEBUG_PARSER_INVALID_VAR_NAME,
DEBUG_PARSER_INVALID_VAR_VALUE,
DEBUG_PARSER_UNKNOWN_VAR,
DEBUG_PARSER_NAME_VALUE,
DEBUG_PARSER_UNKNOWN_NAME_VALUE,
DEBUG_PARSER_UNKNOWN_ERROR,
DEBUG_PARSER_NUM_ERRORS,
DEBUG_PARSER_SET_DEFAULT,
DEBUG_SDP_ERROR_BODY_FIELD,
DEBUG_UDP_OPEN_FAIL,
DEBUG_UDP_PAYLOAD_TOO_LARGE,
DEBUG_TCP_PAYLOAD_TOO_LARGE = DEBUG_UDP_PAYLOAD_TOO_LARGE,
DEBUG_RTP_TRANSPORT,
DEBUG_RTP_INVALID_VOIP_TYPE,
DEBUG_RTP_INVALID_RTP_TYPE,
DEBUG_MEMORY_ALLOC,
DEBUG_MEMORY_FREE,
DEBUG_MEMORY_MALLOC_ERROR,
DEBUG_MEMORY_REALLOC_ERROR,
DEBUG_MEMORY_OUT_OF_MEM,
DEBUG_MEMORY_ENTRY,
DEBUG_MEMORY_SUMMARY,
DEBUG_MEMORY_ADDRESS_HEADER,
DEBUG_MEMORY_DUMP,
DEBUG_DNS_GETHOSTBYNAME,
DEBUG_PMH_INCORRECT_SYNTAX,
DEBUG_PMH_INVALID_FIELD_VALUE,
DEBUG_PMH_INVALID_SCHEME,
DEBUG_PMH_UNKNOWN_SCHEME,
DEBUG_PMH_NOT_ENOUGH_PARAMETERS,
DEBUG_REG_DISABLED,
DEBUG_REG_PROXY_EXPIRES,
DEBUG_REG_SIP_DATE,
DEBUG_REG_SIP_RESP_CODE,
DEBUG_REG_SIP_RESP_FAILURE,
DEBUG_REG_INVALID_LINE,
CC_NO_MSG_BUFFER,
CC_SEND_FAILURE,
GSM_UNDEFINED,
GSM_DBG_PTR,
GSM_FUNC_ENTER,
GSM_DBG1,
FSM_DBG_SM_DEFAULT_EVENT,
FSM_DBG_SM_FTR_ENTRY,
FSM_DBG_FAC_ERR,
FSM_DBG_FAC_FOUND,
FSM_DBG_IGNORE_FTR,
FSM_DBG_IGNORE_SRC,
FSM_DBG_CHANGE_STATE,
FSM_DBG_SDP_BUILD_ERR,
FSMDEF_DBG_PTR,
FSMDEF_DBG1,
FSMDEF_DBG2,
FSMDEF_DBG_SDP,
FSMDEF_DBG_CLR_SPOOF_APPLD,
FSMDEF_DBG_CLR_SPOOF_RQSTD,
FSMDEF_DBG_INVALID_DCB,
FSMDEF_DBG_FTR_REQ_ACT,
FSMDEF_DBG_TMR_CREATE_FAILED,
FSMDEF_DBG_TMR_START_FAILED,
FSMDEF_DBG_TMR_CANCEL_FAILED,
FSMXFR_DBG_XFR_INITIATED,
FSMXFR_DBG_PTR,
FSMCNF_DBG_CNF_INITIATED,
FSMCNF_DBG_PTR,
FSMB2BCNF_DBG_CNF_INITIATED,
FSMB2BCNF_DBG_PTR,
FSMSHR_DBG_BARGE_INITIATED,
LSM_DBG_ENTRY,
LSM_DBG_INT1,
LSM_DBG_CC_ERROR,
VCM_DEBUG_ENTRY,
SM_PROCESS_EVENT_ERROR,
REG_SM_PROCESS_EVENT_ERROR,
DEBUG_END
};
typedef struct {
const char *text;
} debug_string_table_entry;
extern debug_string_table_entry debug_string_table[];
#define get_debug_string(index) ((char*)debug_string_table[(index)].text)
typedef struct {
const char *index_str;
} tnp_phrase_index_str_table_entry;
extern tnp_phrase_index_str_table_entry tnp_phrase_index_str_table[];
#define platform_get_phrase_index_str(index) ((char*)tnp_phrase_index_str_table[(index)].index_str)
#define get_info_string(index) "NotImplemented"
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,60 +0,0 @@
/* 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 "cpr_types.h"
#define __CC_FEATURE_STRINGS__ // this is required to include feature strings.
#define __CC_MESSAGES_STRINGS__ // this is required to include message strings.
#define __CC_CAUSE_STRINGS__ // this is required to include cause strings.
#include "text_strings.h"
#include "ccapi.h"
/**
* This function will be invoked by debug print functions.
*
* @param id - feature id
*
* @return feature name string.
*/
const char *cc_feature_name (cc_features_t id)
{
if ((id <= CC_FEATURE_MIN) || (id >= CC_FEATURE_MAX)) {
return get_debug_string(GSM_UNDEFINED);
}
return cc_feature_names[id - CC_FEATURE_NONE];
}
/**
* This function will be invoked by debug print functions.
*
* @param id - cc msg id
*
* @return cc msg name string.
*/
const char *cc_msg_name (cc_msgs_t id)
{
if ((id <= CC_MSG_MIN) || (id >= CC_MSG_MAX)) {
return get_debug_string(GSM_UNDEFINED);
}
return cc_msg_names[id];
}
/**
* This function will be invoked by debug print functions.
*
* @param id - cc cause id
*
* @return cc cause name string.
*/
const char *cc_cause_name (cc_causes_t id)
{
if ((id <= CC_CAUSE_MIN) || (id >= CC_CAUSE_MAX)) {
return get_debug_string(GSM_UNDEFINED);
}
return cc_cause_names[id - CC_CAUSE_OK];
}

View File

@ -1,723 +0,0 @@
/* 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 "cpr_types.h"
#include "cpr_stdlib.h"
#include "cpr_stdio.h"
#include "cpr_string.h"
#include "cpr_errno.h"
#include "phone.h"
#include "phntask.h"
#include "lsm.h"
#include "ccapi.h"
#include "phone_debug.h"
#include "fim.h"
#include "sdp.h"
#include "debug.h"
#include "gsm_sdp.h"
#include "uiapi.h"
#include "gsm.h"
#include "prot_configmgr.h"
#include "singly_link_list.h"
typedef enum dcsm_state {
DCSM_S_MIN = -1,
DCSM_S_READY,
DCSM_S_WAITING,
DCSM_S_MAX
} dcsm_state_e;
#define DCSM_MAX_CALL_IDS (LSM_MAX_CALLS)
static struct dcsm_icb_t {
callid_t call_ids[DCSM_MAX_CALL_IDS];
line_t line;
int gsm_state;
sll_handle_t s_msg_list;
dcsm_state_e state;
} dcsm_cb;
static const char *dcsm_state_names[] = {
"DCSM_READY",
"DCSM_WAITING"
};
extern cc_int32_t g_dcsmDebug;
static sm_rcs_t dcsm_wait_ev_feature_handling(void *event, int event_id);
static sm_rcs_t dcsm_wait_ev_offhook_handling(void *event, int event_id);
static sm_rcs_t dcsm_wait_ev_dialstring_handling(void *event, int event_id);
typedef sm_rcs_t (*pdcsm_sm_evt_handler)(void *event, int event_id);
typedef struct _dcsm_table_t {
int min_state;
int max_state;
int min_event;
int max_event;
pdcsm_sm_evt_handler *table;
} dcsm_table_t;
static pdcsm_sm_evt_handler dcsm_function_table[DCSM_S_MAX][CC_MSG_MAX] =
{
/* DCSM_S_READY ------------------------------------------------------------ */
{
/* DCSM_E_SETUP */ NULL,
/* DCSM_E_SETUP_ACK */ NULL,
/* DCSM_E_PROCEEDING */ NULL,
/* DCSM_E_ALERTING */ NULL,
/* DCSM_E_CONNECTED */ NULL,
/* DCSM_E_CONNECTED_ACK */ NULL,
/* DCSM_E_RELEASE */ NULL,
/* DCSM_E_RELEASE_COMPLETE */ NULL,
/* DCSM_E_FEATURE */ NULL,
/* DCSM_E_FEATURE_ACK */ NULL,
/* DCSM_E_OFFHOOK */ NULL,
/* DCSM_E_ONHOOK */ NULL,
/* DCSM_E_LINE */ NULL,
/* DCSM_E_DIGIT_BEGIN */ NULL,
/* DCSM_E_DIGIT_END */ NULL,
/* DCSM_E_DIALSTRING */ NULL,
/* DCSM_E_MWI */ NULL,
/* DCSM_E_SESSION_AUDIT */ NULL
},
/* DCSM_S_WAITING----------------------------------------------------- */
{
/* DCSM_E_SETUP */ NULL,
/* DCSM_E_SETUP_ACK */ NULL,
/* DCSM_E_PROCEEDING */ NULL,
/* DCSM_E_ALERTING */ NULL,
/* DCSM_E_CONNECTED */ NULL,
/* DCSM_E_CONNECTED_ACK */ NULL,
/* DCSM_E_RELEASE */ NULL,
/* DCSM_E_RELEASE_COMPLETE */ NULL,
/* DCSM_E_FEATURE */ dcsm_wait_ev_feature_handling,
/* DCSM_E_FEATURE_ACK */ NULL,
/* DCSM_E_OFFHOOK */ dcsm_wait_ev_offhook_handling,
/* DCSM_E_ONHOOK */ NULL,
/* DCSM_E_LINE */ NULL,
/* DCSM_E_DIGIT_BEGIN */ NULL,
/* DCSM_E_DIGIT_END */ NULL,
/* DCSM_E_DIALSTRING */ dcsm_wait_ev_dialstring_handling,
/* DCSM_E_MWI */ NULL,
/* DCSM_E_SESSION_AUDIT */ NULL
},
};
static dcsm_table_t dcsm_sm_table;
static dcsm_table_t *pdcsm_sm_table = &dcsm_sm_table;
/*
* Adds event to the dcsm queue.
*
* @param event - Call control event to add
*
* @return TRUE if the event is added.
*
*/
static boolean
dcsm_add_event_to_queue (void *event)
{
(void) sll_append(dcsm_cb.s_msg_list, event);
return TRUE;
}
/*
* Get a event from the queue.
*
* @param none
*
* @return pointer to the event.
*
*/
static void *
dcsm_get_first_event_from_queue (void)
{
void *msg_ptr = NULL;
msg_ptr = sll_next(dcsm_cb.s_msg_list, NULL);
sll_remove(dcsm_cb.s_msg_list, msg_ptr);
return(msg_ptr);
}
/*
* Get dcsm state name.
*
* @param int - state id
*
* @return ponter to the state name either
* DCSM_READY or DCSM_WAITING.
*
*/
const char *dcsm_get_state_name (int state)
{
if ((state <= DCSM_S_MIN) ||
(state >= DCSM_S_MAX)) {
return (get_debug_string(GSM_UNDEFINED));
}
return dcsm_state_names[state];
}
/**
* Feed the event to FIM state machine a direct function call
* to process message retrieved from the queue.
*
* @param void * - pointer to the message to be processed
*
* @return none.
*/
static void dcsm_process_event_to_gsm (void *msg_ptr)
{
if (fim_process_event(msg_ptr, FALSE) == TRUE) {
fim_free_event(msg_ptr);
/* Release buffer too */
cpr_free(msg_ptr);
}
}
/**
* Process ready state events.
*
* @param none
*
* @return none.
*/
static void dcsm_do_ready_state_job (void)
{
static const char fname[] = "dcsm_do_ready_state_job";
void *msg_ptr;
int event_id;
cc_feature_t *feat_msg = NULL;
callid_t call_id = CC_NO_CALL_ID;
if (dcsm_cb.state != DCSM_S_READY) {
DEF_DEBUG(DEB_F_PREFIX": not in ready state.\n",
DEB_F_PREFIX_ARGS("DCSM", fname));
return;
}
msg_ptr = dcsm_get_first_event_from_queue();
/* Check if there is any msg available */
if (msg_ptr != NULL) {
event_id = (int)(((cc_setup_t *)msg_ptr)->msg_id);
if (event_id == CC_MSG_FEATURE) {
feat_msg = (cc_feature_t *) msg_ptr;
if (feat_msg != NULL) {
call_id = feat_msg->call_id;
}
}
DEF_DEBUG(DEB_F_PREFIX"%d: event (%s%s)\n",
DEB_F_PREFIX_ARGS("DCSM", fname), call_id,
cc_msg_name((cc_msgs_t)(event_id)),
feat_msg ? cc_feature_name(feat_msg->feature_id):" ");
dcsm_process_event_to_gsm(msg_ptr);
}
}
/**
* Function process events based on the state of DCSM.
*
* @param none
*
* @return none.
*/
void dcsm_process_jobs (void)
{
dcsm_do_ready_state_job();
}
/**
* Adds call_id to the list of call_id's which made DCSM to move
* to waiting state.
*
* @param callid_t - call id that has to be added to the list
*
* @return none.
*/
static void dcsm_add_call_id_to_list (callid_t call_id)
{
static const char fname[] = "dcsm_add_call_id_to_list";
int i, loc = -1;
for (i=0; i< DCSM_MAX_CALL_IDS; i++) {
if (dcsm_cb.call_ids[i] == CC_NO_CALL_ID) {
loc = i;
} else if (dcsm_cb.call_ids[i] == call_id) {
//Call_id already present so do not try to add again
return;
}
}
if (loc == -1) {
/* Should never happen as there is a space to store call_id
* for each calls
*/
DCSM_ERROR(DCSM_F_PREFIX"DCSM No space to store call_id.\n",
DEB_F_PREFIX_ARGS("DCSM", fname));
return;
}
dcsm_cb.call_ids[loc] = call_id;
}
/**
* Remove call_id from the list and see if the call_ids list is null.
*
* @param callid_t - call id that to be removed from the list.
*
* @return TRUE - if the call_ids list is empty.
* FALSE - call_ids list is not empty.
*/
static boolean dcsm_remove_check_for_empty_list (callid_t call_id)
{
int i;
boolean call_id_present = FALSE;
for (i=0; i< DCSM_MAX_CALL_IDS; i++) {
if (dcsm_cb.call_ids[i] == call_id) {
dcsm_cb.call_ids[i] = CC_NO_CALL_ID;
/* Found out that other call_id exist by setting
* call_id_preset, so return true, don't have to
* continue
*/
if (call_id_present == TRUE) {
return FALSE;
}
} else if (dcsm_cb.call_ids[i] != CC_NO_CALL_ID) {
call_id_present = TRUE;
}
}
if (call_id_present == TRUE) {
return(FALSE);
}
return(TRUE);
}
/*
* The function responsible for setting gsm state machine.
*
* @param callid_t - call id of the call
* state - current GSM state
*
* @return void
*
*/
void
dcsm_update_gsm_state (fsm_fcb_t *fcb, callid_t call_id, int state)
{
int last_state;
static const char fname[] = "dcsm_update_gsm_state";
fsmdef_dcb_t *dcb;
if (fcb->fsm_type != FSM_TYPE_DEF) {
DEF_DEBUG(DEB_F_PREFIX"%d: Not handling for %s\n",
DEB_F_PREFIX_ARGS("DCSM", fname), call_id,
fsm_type_name(fcb->fsm_type));
return;
}
last_state = dcsm_cb.state;
switch (state) {
case FSMDEF_S_RELEASING:
dcb = fsmdef_get_dcb_by_call_id(call_id);
if (dcb && dcb->send_release == FALSE) {
/* This call is already released from SIP persepctive. so no need to wait */
break;
}
case FSMDEF_S_CONNECTING:
case FSMDEF_S_HOLD_PENDING:
case FSMDEF_S_RESUME_PENDING:
dcsm_add_call_id_to_list(call_id);
dcsm_cb.state = DCSM_S_WAITING;
break;
case FSMDEF_S_MIN:
case FSMDEF_S_IDLE:
case FSMDEF_S_COLLECT_INFO:
case FSMDEF_S_CALL_SENT:
case FSMDEF_S_OUTGOING_PROCEEDING:
case FSMDEF_S_KPML_COLLECT_INFO:
case FSMDEF_S_OUTGOING_ALERTING:
case FSMDEF_S_INCOMING_ALERTING:
case FSMDEF_S_JOINING:
case FSMDEF_S_CONNECTED:
case FSMDEF_S_CONNECTED_MEDIA_PEND:
case FSMDEF_S_HOLDING:
case FSMDEF_S_PRESERVED:
case FSMDEF_S_MAX:
/* If there are no other call_id then move it to
* ready state else, it will remain in waiting
* state
*/
if (dcsm_remove_check_for_empty_list(call_id) == TRUE) {
dcsm_cb.state = DCSM_S_READY;
/* Check if there are any pending events in the queue
* if so send a DCSM_EV_READY to the GSM so dcsm will
* get a chance to execute.
*/
if (sll_count(dcsm_cb.s_msg_list) > 0 ) {
if (gsm_send_msg(DCSM_EV_READY, NULL, 0) == CPR_FAILURE) {
DCSM_ERROR(DCSM_F_PREFIX"send DCSM_EV_READY ERROR.\n",
DEB_F_PREFIX_ARGS(DCSM, fname));
}
}
}
break;
default:
break;
}
DEF_DEBUG(DEB_F_PREFIX"%d : %s --> %s\n",
DEB_F_PREFIX_ARGS("DCSM", fname), call_id,
dcsm_get_state_name(last_state),
dcsm_get_state_name(dcsm_cb.state));
return;
}
/**
*
* Feature passed through when state machine is in waiting state
*
* @param sm_event_t
*
* @return sm_rcs_t
*
* @pre (none)
*/
static sm_rcs_t
dcsm_wait_ev_offhook_handling (void *event, int event_id)
{
static const char fname[] = "dcsm_wait_ev_offhook_handling";
DEF_DEBUG(DEB_F_PREFIX": offhook\n",
DEB_F_PREFIX_ARGS("DCSM", fname));
dcsm_add_event_to_queue(event);
return (SM_RC_END);
}
/**
*
* Feature passed through when state machine is in waiting state
*
* @param sm_event_t
*
* @return sm_rcs_t
*
* @pre (none)
*/
static sm_rcs_t
dcsm_wait_ev_feature_handling (void *event, int event_id)
{
static const char fname[] = "dcsm_wait_ev_feature_handling";
cc_feature_t *feat_msg = (cc_feature_t *) event;
sm_rcs_t rc = SM_RC_END;
cc_features_t ftr_id = CC_FEATURE_UNDEFINED;
callid_t call_id = CC_NO_CALL_ID;
if (feat_msg != NULL) {
ftr_id = feat_msg->feature_id;
call_id = feat_msg->call_id;
}
DEF_DEBUG(DEB_F_PREFIX"%d: id= %s%s\n",
DEB_F_PREFIX_ARGS("DCSM", fname), call_id,
cc_msg_name((cc_msgs_t)(event_id)),
feat_msg ? cc_feature_name(feat_msg->feature_id):" ");
switch (ftr_id) {
case CC_FEATURE_ANSWER:
case CC_FEATURE_NEW_CALL:
case CC_FEATURE_REDIAL:
case CC_FEATURE_RESUME:
case CC_FEATURE_JOIN:
dcsm_add_event_to_queue(event);
DEF_DEBUG(DEB_F_PREFIX"%d: Event queued\n",
DEB_F_PREFIX_ARGS("DCSM", fname), call_id);
rc = SM_RC_END;
break;
default:
DEF_DEBUG(DEB_F_PREFIX"%d: Feature msg not handled\n",
DEB_F_PREFIX_ARGS("DCSM", fname), call_id);
rc = SM_RC_CONT;
break;
}
return (rc);
}
/**
*
* Feature passed through when state machine is in waiting state
*
* @param sm_event_t
*
* @return sm_rcs_t
*
* @pre (none)
*/
static sm_rcs_t
dcsm_wait_ev_dialstring_handling (void *event, int event_id)
{
static const char fname[] = "dcsm_wait_ev_dialstring_handling";
DEF_DEBUG(DEB_F_PREFIX": dialstring\n",
DEB_F_PREFIX_ARGS("DCSM", fname));
dcsm_add_event_to_queue(event);
return (SM_RC_END);
}
/**
*
* Feature passed through when state machine is in waiting state
*
* @param sm_event_t
*
* @return sm_rcs_t
*
* @pre (none)
*/
sm_rcs_t
dcsm_process_event (void *event, int event_id)
{
static const char fname[] = "dcsm_process_event";
callid_t call_id;
int state_id;
sm_rcs_t rc = SM_RC_CONT;
fsm_fcb_t *fcb = (fsm_fcb_t *) event;
cc_feature_t *feat_msg = NULL;
pdcsm_sm_evt_handler hdlr; /* cached handler in order to compute its addr once */
call_id = fcb->call_id;
if (event_id == CC_MSG_FEATURE) {
feat_msg = (cc_feature_t *) event;
if (feat_msg != NULL){
call_id = feat_msg->call_id;
}
}
DEF_DEBUG(DEB_F_PREFIX"DCSM %-4d:(%s:%s%s)\n",
DEB_F_PREFIX_ARGS("DCSM", fname), call_id,
dcsm_get_state_name(dcsm_cb.state),
cc_msg_name((cc_msgs_t)(event_id)),
feat_msg ? cc_feature_name(feat_msg->feature_id):" ");
state_id = dcsm_cb.state; // Get current state;
/*
* validate the state and event
* and that there is a valid function for this state-event pair.
*/
if ((state_id > pdcsm_sm_table->min_state) &&
(state_id < pdcsm_sm_table->max_state) &&
(event_id > pdcsm_sm_table->min_event) &&
(event_id < pdcsm_sm_table->max_event)) {
if ((hdlr = pdcsm_sm_table->table[pdcsm_sm_table->max_event * state_id +
event_id]) != NULL) {
DEF_DEBUG(DEB_F_PREFIX"%-4d: dcsm entry: (%s)\n",
DEB_F_PREFIX_ARGS("DCSM", fname), call_id,
cc_msg_name((cc_msgs_t)(event_id)));
rc = hdlr(event, event_id);
}
}
return (rc);
}
/*
* Function responsible for searching the list.
*
* @param cac_data_t *key_p - pointer to the key.
* @param cac_data_t *cac_data - cac data.
*
* @return void
*
*/
static sll_match_e
dcsm_match_event (void *key_p, void *msg_data)
{
return SLL_MATCH_FOUND;
}
/**
*
* Show function for DCSM
*
* @param argc - number of parameter passed
* argv - argument passed
*
* @return 0 - if function successful
*/
cc_int32_t
dcsm_show_cmd (cc_int32_t argc, const char *argv[])
{
void *msg_ptr;
int i;
cc_setup_t *msg;
cc_msgs_t msg_id;
line_t line;
callid_t call_id;
cc_feature_t *feat_msg = NULL;
/*
* check if need help
*/
if ((argc == 2) && (argv[1][0] == '?')) {
debugif_printf("%s", "show dcsm\n");
return (0);
}
if (dcsm_cb.s_msg_list == NULL) {
return(0);
}
debugif_printf("%s", "\n-------------------------- DCSM Data --------------------------");
debugif_printf("\nDCSM State = %s",dcsm_get_state_name(dcsm_cb.state));
debugif_printf("%s", "\nDCSM waiting calls \n");
for (i=0; i< DCSM_MAX_CALL_IDS; i++) {
if (dcsm_cb.call_ids[i] != CC_NO_CALL_ID) {
debugif_printf("%d ", dcsm_cb.call_ids[i]);
}
}
debugif_printf("%s", "\n");
debugif_printf("%s", "\nDCSM waiting events \n");
i = 0;
msg_ptr = sll_next(dcsm_cb.s_msg_list, NULL);
while (msg_ptr) {
msg_ptr = sll_next(dcsm_cb.s_msg_list, msg_ptr);
if (msg_ptr) {
msg = (cc_setup_t *) msg_ptr;
msg_id = msg->msg_id;
call_id = msg->call_id;
line = msg->line;
if ((int)msg_id == CC_MSG_FEATURE) {
feat_msg = (cc_feature_t *) msg_ptr;
}
debugif_printf("Event %d (%d/%d): (%s%s)\n",
i++, line, call_id, cc_msg_name(msg_id),
feat_msg ? cc_feature_name(feat_msg->feature_id):" ");
}
}
debugif_printf("%s", "\n-------------------------- DCSM Data Done-----------------------");
return (0);
}
/**
*
* Initialize dcsm state machine.
*
* @param none
*
* @return none
*
* @pre none
*/
void
dcsm_init (void)
{
static const char fname[] = "dcsm_init";
int i;
/*
* Initialize the state/event table.
*/
dcsm_sm_table.min_state = DCSM_S_MIN;
dcsm_sm_table.max_state = DCSM_S_MAX;
dcsm_sm_table.min_event = CC_MSG_MIN;
dcsm_sm_table.max_event = CC_MSG_MAX;
dcsm_sm_table.table = (&(dcsm_function_table[0][0]));
dcsm_cb.state = DCSM_S_READY;
for (i=0; i< DCSM_MAX_CALL_IDS; i++) {
dcsm_cb.call_ids[i] = CC_NO_CALL_ID;
}
/* allocate and initialize cac list */
dcsm_cb.s_msg_list = sll_create((sll_match_e(*)(void *, void *))
dcsm_match_event);
if (dcsm_cb.s_msg_list == NULL) {
DCSM_ERROR(DCSM_F_PREFIX"DCSM CB creation failed.\n",
DEB_F_PREFIX_ARGS("DCSM", fname));
}
}
/**
*
* Shut down routine for dcsm state machine.
*
* @param none
*
* @return none
*
* @pre none
*/
void
dcsm_shutdown (void)
{
void *msg_ptr;
if (dcsm_cb.s_msg_list == NULL) {
return;
}
msg_ptr = sll_next(dcsm_cb.s_msg_list, NULL);
while (msg_ptr) {
msg_ptr = sll_next(dcsm_cb.s_msg_list, msg_ptr);
if (msg_ptr) {
fim_free_event(msg_ptr);
/* Release buffer too */
cpr_free(msg_ptr);
}
}
sll_destroy(dcsm_cb.s_msg_list);
dcsm_cb.s_msg_list = NULL;
}

View File

@ -1,761 +0,0 @@
/* 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 "mozilla/Assertions.h"
#include "cpr_types.h"
#include "cpr_stdlib.h"
#include "cpr_stdio.h"
#include "phone.h"
#include "fim.h"
#include "lsm.h"
#include "fsm.h"
#include "sm.h"
#include "ccapi.h"
#include "debug.h"
#include "phone_debug.h"
#include "util_string.h"
#include "sdp.h"
#include "gsm_sdp.h"
#include "ccsip_sdp.h"
#include "platform_api.h"
extern void set_next_sess_video_pref(int pref);
extern sm_rcs_t dcsm_process_event(void *event, int event_id);
#define FIM_MAX_CHNS (LSM_MAX_CALLS)
#define FIM_MAX_SCBS (FSM_TYPE_MAX)
#define FIM_MAX_ICBS (FSM_TYPE_MAX * FIM_MAX_CHNS)
static fim_scb_t *fim_scbs;
static fim_icb_t *fim_icbs;
static void
fim_mwi (cc_mwi_t *msg)
{
cc_action_data_t data;
data.mwi.on = msg->msgSummary.on;
data.mwi.type = msg->msgSummary.type;
data.mwi.newCount = msg->msgSummary.newCount;
data.mwi.oldCount = msg->msgSummary.oldCount;
data.mwi.hpNewCount = msg->msgSummary.hpNewCount;
data.mwi.hpOldCount = msg->msgSummary.hpOldCount;
(void)cc_call_action(msg->call_id, msg->line, CC_ACTION_MWI, &data);
}
static void
fim_init_call_chns (void)
{
int chn;
fsm_types_t type;
fim_icb_t *icb = NULL;
static const char fname[] = "fim_init_call_chns";
fim_scbs = (fim_scb_t *) cpr_calloc(FIM_MAX_SCBS, sizeof(fim_scb_t));
if (fim_scbs == NULL) {
GSM_DEBUG_ERROR(GSM_F_PREFIX"Failed to allocate FIM SCBs.\n", fname);
return;
}
fim_icbs = (fim_icb_t *) cpr_calloc(FIM_MAX_ICBS, sizeof(fim_icb_t));
if (fim_icbs == NULL) {
GSM_DEBUG_ERROR(GSM_F_PREFIX"Failed to allocate FIM ICBs.\n", fname);
cpr_free(fim_scbs);
fim_scbs = NULL;
return;
}
/*
* Initialize the icbs (fim control blocks).
*/
icb = fim_icbs;
for (chn = 0; chn < FIM_MAX_CHNS; chn++) {
for (type = FSM_TYPE_HEAD; type < FSM_TYPE_MAX; type++, icb++) {
icb->call_id = CC_NO_CALL_ID;
icb->scb = &(fim_scbs[type]);
icb->cb = NULL;
/*
* Set the next_chn pointers if this is the head of the chain,
* Set non-head icbs and the last head to NULL.
*/
if ((type == FSM_TYPE_HEAD) && (chn < (FIM_MAX_CHNS - 1))) {
icb->next_chn = icb + FSM_TYPE_MAX;
} else {
icb->next_chn = NULL;
}
/*
* Set the next_icb pointers if this icb is not the last
* one on the chain.
*/
if (type < (FSM_TYPE_MAX - 1)) {
icb->next_icb = icb + 1;
} else {
icb->next_icb = NULL;
}
} /* for (jscb = FSM_TYPE_HEAD; i < FSM_TYPE_MAX; i++) { */
} /* for (ichn = 0; ichn < FIM_MAX_CHNS; ichn++) { */
/*
* Initialize the scbs (state machine control blocks).
*/
icb = fim_icbs;
for (type = FSM_TYPE_HEAD; type < FSM_TYPE_MAX; type++, icb++) {
icb->scb->type = type;
fsm_init_scb(icb, CC_NO_CALL_ID);
}
}
static void
fim_free_call_chn (fim_icb_t *call_chn, line_t line, boolean update_call_cnt)
{
static const char fname[] = "fim_free_call_chn";
fim_icb_t *icb = call_chn;
FIM_DEBUG(get_debug_string(GSM_DBG_PTR), "FIM", call_chn->call_id, fname,
"call_chn", call_chn);
/*
* Go through the chain and free each icb.
*/
for (icb = call_chn; icb != NULL; icb = icb->next_icb) {
if (icb->scb->free_cb != NULL) {
icb->scb->free_cb(icb, icb->call_id);
}
icb->call_id = CC_NO_CALL_ID;
icb->cb = NULL;
}
if (update_call_cnt == TRUE) {
lsm_decrement_call_chn_cnt(line);
}
else {
FIM_DEBUG(get_debug_string(GSM_DBG_PTR), "lsm not decremented", call_chn->call_id, fname,
"call_chn", call_chn);
}
}
static fim_icb_t *
fim_get_call_chn_by_call_id (callid_t call_id)
{
static const char fname[] = "fim_get_call_chn_by_call_id";
fim_icb_t *call_chn = NULL;
fim_icb_t *icb = NULL;
for (icb = fim_icbs; icb != NULL; icb = icb->next_chn) {
if (icb->call_id == call_id) {
call_chn = icb;
break;
}
}
FIM_DEBUG(get_debug_string(GSM_DBG_PTR), "FIM", call_id, fname, "chn",
call_chn);
return call_chn;
}
static fim_icb_t *
fim_get_new_call_chn (callid_t call_id)
{
static const char fname[] = "fim_get_new_call_chn";
fim_icb_t *call_chn = NULL;
fim_icb_t *icb = NULL;
/*
* Verify that this call_id is not already used.
*/
call_chn = fim_get_call_chn_by_call_id(call_id);
if (call_chn != NULL) {
FIM_DEBUG(get_debug_string(GSM_DBG1), "FIM", call_id, fname,
"call_id in use");
return NULL;
}
/*
* Construct a new call chain.
*/
call_chn = fim_get_call_chn_by_call_id(CC_NO_CALL_ID);
if (call_chn == NULL) {
/*
* No more free call_chns are available.
*/
FIM_DEBUG(get_debug_string(GSM_DBG1), "FIM", call_id, fname,
"no free call_chns");
return NULL;
}
call_chn->call_id = call_id;
call_chn->ui_locked = FALSE;
/*
* Set the control blocks for the icbs.
*/
for (icb = call_chn; icb != NULL; icb = icb->next_icb) {
FIM_DEBUG(get_debug_string(GSM_DBG1), "FIM", call_id, fname,
fsm_type_name(icb->scb->type));
if (icb->scb->get_cb) {
icb->scb->get_cb(icb, call_id);
icb->call_id = call_id;
icb->ui_locked = FALSE;
}
}
FIM_DEBUG(get_debug_string(GSM_DBG_PTR), "FIM", call_chn->call_id, fname,
"call_chn", call_chn);
return call_chn;
}
void
fim_free_event (void *data)
{
cc_msg_t *msg = (cc_msg_t *) data;
/* Free CCAPI msg. data that are not consumed */
cc_free_msg_data(msg);
}
static void
fim_process_options_msg (void *data)
{
static const char fname[] = "fim_process_options_msg";
cc_sdp_t *local_sdp_p = NULL;
cc_causes_t cause = CC_CAUSE_MIN;
cc_msgbody_info_t msg_body;
cc_options_sdp_req_t *options_msg = (cc_options_sdp_req_t *) data;
gsmsdp_create_options_sdp(&local_sdp_p);
cause = gsmsdp_encode_sdp(local_sdp_p, &msg_body);
if (cause != CC_CAUSE_OK) {
FIM_DEBUG(get_debug_string(GSM_DBG1), "FIM", options_msg->call_id,
fname, "Unable to build SDP\n");
} else {
cc_int_options_sdp_ack(CC_SRC_GSM, CC_SRC_SIP,
options_msg->call_id,
options_msg->line,
options_msg->pMessage, &msg_body);
}
sipsdp_src_dest_free(CCSIP_SRC_SDP_BIT, &local_sdp_p);
}
void
fim_lock_ui (callid_t call_id)
{
fim_icb_t *call_chn = fim_get_call_chn_by_call_id(call_id);
if (call_chn == NULL) {
FIM_DEBUG(DEB_F_PREFIX"unknown call id\n", DEB_F_PREFIX_ARGS(FIM, "fim_lock_ui"));
return;
}
call_chn->ui_locked = TRUE;
}
void
fim_unlock_ui (callid_t call_id)
{
fim_icb_t *call_chn = fim_get_call_chn_by_call_id(call_id);
if (call_chn == NULL) {
FIM_DEBUG(DEB_F_PREFIX"unknown call id\n", DEB_F_PREFIX_ARGS(FIM, "fim_unlock_ui"));
return;
}
call_chn->ui_locked = FALSE;
}
static boolean
fsm_event_filtered_by_ui_lock (int event_id, cc_features_t feature_id)
{
/*
* If UI has been locked by GSM due to pending states, we want
* to filter the events that come in from the UI. We will still
* allow all GSM and SIP stack originated events through to the
* GSM sm.
*/
if (event_id == CC_MSG_ONHOOK) {
return FALSE;
}
if ((event_id == CC_MSG_FEATURE) &&
(feature_id == CC_FEATURE_END_CALL ||
feature_id == CC_FEATURE_REQ_PEND_TIMER_EXP ||
feature_id == CC_FEATURE_RESUME ||
feature_id == CC_FEATURE_HOLD)) {
return FALSE;
}
return TRUE;
}
/**
*
* Check if the feature event is generic feature
*
* @param cc_features_t feature_id
*
* @return TRUE if the feature is generic or else FALSE
*
* @pre None
*/
boolean fim_is_app_generic_features (cc_features_t feat_id)
{
return(FALSE);
}
/**
*
* Check if the message is the feature event that may requires a new
* call chain.
*
* @param msg - pointer to cc_setup_t.
*
* @return TRUE if the feature that may requires a new call chain.
*
* @pre (msg != NULL)
*/
static boolean
fim_check_feature_event (cc_setup_t *msg)
{
if ((((cc_feature_t *)msg)->feature_id == CC_FEATURE_SELECT) ||
(((cc_feature_t *)msg)->feature_id == CC_FEATURE_DIRTRXFR) ||
(((cc_feature_t *)msg)->feature_id == CC_FEATURE_B2BCONF) ||
(((cc_feature_t *)msg)->feature_id == CC_FEATURE_CFWD_ALL)) {
return (TRUE);
}
return (FALSE);
}
/*
* fim_feature_need_outgoing_call_context
*
* Description:
* This function determines whther a new feature invokation needs
* an early outgoing call context created in the FIM main module or not.
*
* Parameters:
msg - pointer to the cc_setup_t.
*
* Returns:
* TRUE - the feature requires outgoing call context to be created.
* FALSE - the feature does not requries outgoing call context to
* be created during initial FIM displacthing.
*/
static boolean
fim_feature_need_outgoing_call_context (cc_setup_t *msg)
{
if (((cc_feature_t *)msg)->feature_id == CC_FEATURE_NOTIFY) {
/*
* these features do not need outgoing context to be created early
*/
return (FALSE);
}
return (TRUE);
}
/**
*
* Process events received for GSM
*
* @param void event data
* cac_passed indicate if the event passed cac request.
* Usually set to true once the cac response is
* received so that it won't do another request.
*
* @return true if message memory has to be released by caller
* false if the message memory is not to be released by
* caller.
*
* @pre (data not_eq NULL)
* @pre (CC_MSG_MIN < msg->msg_id <CC_MSG_MAX)
*/
boolean
fim_process_event (void *data, boolean cac_passed)
{
static const char fname[] = "fim_process_event";
cc_setup_t *msg = (cc_setup_t *) data;
cc_msgs_t msg_id = msg->msg_id;
callid_t call_id = msg->call_id;
line_t line = msg->line;
int event_id = msg_id;
sm_event_t event;
fim_icb_t *call_chn = NULL;
fim_icb_t *icb = NULL;
boolean done = FALSE;
sm_rcs_t rc = SM_RC_ERROR;
fim_cb_hdr_t *cb_hdr = NULL;
fsm_fcb_t *fcb = NULL;
cc_feature_t *feat_msg = (cc_feature_t *) data;
cc_feature_data_t * feat_data = &(feat_msg->data);
boolean update_call_cnt = TRUE;
uint32_t no_of_session = 1;
callid_t bw_call_id;
FIM_DEBUG(DEB_L_C_F_PREFIX"Msg name = %s\n", DEB_L_C_F_PREFIX_ARGS(FIM, line, call_id, fname),
cc_msg_name(msg_id));
/*
* Validate the incoming event.
*/
if ((event_id <= CC_MSG_MIN) || (event_id >= CC_MSG_MAX)) {
cc_call_state(call_id, line, CC_STATE_UNKNOWN, NULL);
return(TRUE);
}
/* Make sure to process the device events
*/
if (dcsm_process_event(data, event_id) == SM_RC_END) {
/* Keep the message in the dcsm state handler */
return(FALSE);
}
/*
* Grab non-call control events and hand them off to other functions that
* are not implemented by the fsms.
*/
if (msg_id == CC_MSG_MWI) {
fim_mwi((cc_mwi_t *) msg);
}
if (event_id == CC_MSG_OPTIONS) {
fim_process_options_msg(data);
return(TRUE);
}
if (platWlanISActive() && cac_passed == FALSE) {
/* The WLAN will request for bandwidth only for the events received from
* UI or other external entity. For internal events there is allocated bandwidth
* and do not need to request again.
*/
if ((msg->src_id != CC_SRC_GSM) &&
((event_id == CC_MSG_SETUP) ||
(event_id == CC_MSG_OFFHOOK) ||
(event_id == CC_MSG_DIALSTRING) ||
(event_id == CC_MSG_LINE) ||
((event_id == CC_MSG_FEATURE) &&
((((cc_feature_t *) msg)->feature_id == CC_FEATURE_NEW_CALL))))) {
bw_call_id = call_id;
if ((event_id == CC_MSG_SETUP) &&
((((cc_setup_t *)msg)->call_info.type == CC_FEAT_MONITOR))) {
no_of_session = 2;
bw_call_id = msg->call_info.data.join.join_call_id;
}
if (fsm_cac_call_bandwidth_req (bw_call_id, no_of_session, msg) != CC_CAUSE_OK) {
return(TRUE);
}
/* Do not release the msg once it returns from the call
*/
return(FALSE);
}
}
if ((event_id == CC_MSG_FEATURE) && ((call_id == CC_NO_CALL_ID) ||
fim_is_app_generic_features(((cc_feature_t *) msg)->feature_id))) {
if (((cc_feature_t *)msg)->feature_id == CC_FEATURE_BLF_ALERT_TONE) {
(void)cc_call_action(0, 0, CC_ACTION_PLAY_BLF_ALERTING_TONE, NULL);
} else if (((cc_feature_t *)msg)->feature_id == CC_FEATURE_UPD_MEDIA_CAP) {
fsmdef_update_media_cap_feature_event(feat_msg);
}
return(TRUE);
}
/*
* Throw away any messages with call_id < 1 (which means they are invalid).
*
* The GSM will send messages back to itself with a call_id < 1 because
* it uses the NULL_DCB. The fsmxfr will use a NULL_DCB that has invalid
* data in it, but the DCB points to a valid DCB. This way, the fsmxfr does
* not have to keep checking for the NULL.
*/
if (call_id < 1) {
return(TRUE);
}
/*
* Get the call chain associated with this call_id.
*/
call_chn = fim_get_call_chn_by_call_id(call_id);
if (call_chn == NULL) {
/*
* No call chain, so get a new call chain,
* but only if the event is a call establishment event.
*/
if ((event_id == CC_MSG_SETUP) ||
(event_id == CC_MSG_OFFHOOK) ||
(event_id == CC_MSG_DIALSTRING) ||
(event_id == CC_MSG_LINE) ||
(event_id == CC_MSG_CREATEOFFER) ||
(event_id == CC_MSG_CREATEANSWER) ||
(event_id == CC_MSG_SETLOCALDESC) ||
(event_id == CC_MSG_SETREMOTEDESC) ||
(event_id == CC_MSG_SETPEERCONNECTION) ||
(event_id == CC_MSG_ADDSTREAM) ||
(event_id == CC_MSG_REMOVESTREAM) ||
(event_id == CC_MSG_ADDCANDIDATE) ||
((event_id == CC_MSG_FEATURE) &&
((((cc_feature_t *) msg)->feature_id == CC_FEATURE_NEW_CALL)))) {
call_chn = fim_get_new_call_chn(call_id);
/*
* Make sure we got a new call chain.
*/
if (call_chn == NULL) {
FIM_DEBUG(get_debug_string(GSM_DBG1), "FIM", call_id, fname,
"no call_chn");
fsm_display_no_free_lines();
cc_call_state(call_id, line, CC_STATE_UNKNOWN, NULL);
return(TRUE);
}
} else if ((event_id == CC_MSG_FEATURE) &&
(fim_check_feature_event(msg))) {
call_chn = fim_get_new_call_chn(call_id);
/*
* Make sure we got a new call chain.
*/
if (call_chn == NULL) {
FIM_DEBUG(get_debug_string(GSM_DBG1), "FIM", call_id, fname,
"no call_chn");
fsm_display_no_free_lines();
cc_call_state(call_id, line, CC_STATE_UNKNOWN, NULL);
return(TRUE);
}
if (fim_feature_need_outgoing_call_context(msg)) {
/* Get new outgoing call context using DEF state m/c fsm */
if (fsm_get_new_outgoing_call_context(call_id, line,
fsm_get_fcb_by_call_id_and_type(call_id, FSM_TYPE_DEF),
FALSE) != CC_CAUSE_OK) {
cc_call_state(call_id, line, CC_STATE_UNKNOWN, NULL);
return(TRUE);
}
}
} else {
FIM_DEBUG(get_debug_string(GSM_DBG1), "FIM", call_id, fname,
"not a call establishment event\n");
if( feat_msg->feature_id == CC_FEATURE_UPD_SESSION_MEDIA_CAP) {
FIM_DEBUG(DEB_L_C_F_PREFIX"set_next_sess_video_pref = %d\n",
DEB_L_C_F_PREFIX_ARGS(FIM, line, call_id, fname),
feat_data->caps.support_direction);
set_next_sess_video_pref(feat_data->caps.support_direction);
}
return(TRUE);
}
if (event_id != CC_MSG_SETUP) {
/*
* Increment the call chain cnt for this line
* For incoming calls, we don't know the line number
* when SETUP msg is received, so it's an exception, it'll be
* added in fsmdef_idle_setup
*/
lsm_increment_call_chn_cnt(line);
}
} /* if (call_chn == NULL) */
/*
* Pass the event to the call chain unless UI lock has been enabled.
*/
if (call_chn->ui_locked && ((cc_feature_t *) msg)->src_id == CC_SRC_UI) {
if (fsm_event_filtered_by_ui_lock(event_id,
((cc_feature_t *)msg)->feature_id)) {
FIM_DEBUG(DEB_L_C_F_PREFIX" %s filtered by UI lock\n",
DEB_L_C_F_PREFIX_ARGS(FIM, line, call_id, fname),
cc_feature_name(((cc_feature_t *)msg)->feature_id));
return(TRUE);
}
}
/*
* Skip the head.
*/
icb = call_chn->next_icb;
PR_ASSERT(icb);
while (icb && !done) {
/*
* Set the required event data so the entity can process the event.
*/
cb_hdr = (fim_cb_hdr_t *) (icb->cb);
PR_ASSERT(cb_hdr);
if (!cb_hdr) {
done = TRUE;
break;
}
event.data = cb_hdr;
event.state = cb_hdr->state;
event.event = event_id;
event.msg = data;
fcb = (fsm_fcb_t *) icb->cb;
/*
* For example, if we receive INVITE and CANCEL messages back to back,
* we may be decrementing the call count of wrong line because SIP stack did
* not get the correct value for line yet.
* so set the line value to correct value from DCB.
* For RIU calls, there will be no DCB. However, line value cames from SIP stack
* correctly.
*/
if ((fcb->fsm_type == FSM_TYPE_DEF) && (event_id == CC_MSG_RELEASE)) {
if (fcb->dcb != NULL) {
line = fcb->dcb->line;
}
}
/*
* This update_call_cnt is only used when RC_CLEANUP is returned.
*/
update_call_cnt = TRUE; // by default, always update call count
if (fcb->dcb != NULL) {
update_call_cnt = (fcb->dcb->call_not_counted_in_mnc_bt) ? FALSE: TRUE;
}
FIM_DEBUG(DEB_L_C_F_PREFIX" %s(%s:%s)\n",
DEB_L_C_F_PREFIX_ARGS(FIM, line, call_id, fname), fsm_type_name(icb->scb->type),
fsm_state_name(fcb->fsm_type, event.state),
cc_msg_name((cc_msgs_t) (event.event)));
rc = sm_process_event(icb->scb->sm, &event);
switch (rc) {
case SM_RC_CONT:
case SM_RC_DEF_CONT:
icb = icb->next_icb;
break;
case SM_RC_END:
done = TRUE;
break;
case SM_RC_ERROR:
FIM_DEBUG(DEB_L_C_F_PREFIX" fsm sm error(%d:%d)\n",
DEB_L_C_F_PREFIX_ARGS(FIM, line, call_id, fname), event.state, event.event);
done = TRUE;
cc_call_state(call_id, line, CC_STATE_UNKNOWN, NULL);
break;
case SM_RC_CLEANUP:
done = TRUE;
cc_call_state(call_id, line, CC_STATE_UNKNOWN, NULL);
break;
default:
done = TRUE;
cc_call_state(call_id, line, CC_STATE_UNKNOWN, NULL);
break;
} /* switch (rc) */
if ((rc == SM_RC_END) && (fcb->fsm_type == FSM_TYPE_DEF) &&
(event_id == CC_MSG_FEATURE))
{
if ( ((cc_feature_t *) msg)->feature_id == CC_FEATURE_CFWD_ALL){
lsm_decrement_call_chn_cnt(line);
}
}
if (icb == NULL) {
done = TRUE;
FIM_DEBUG("icb is null and get here!");
}
} /* while (done != TRUE) { */
if (rc == SM_RC_CLEANUP) {
fim_free_call_chn(call_chn, line, update_call_cnt);
}
return(TRUE);
}
cc_int32_t
fim_show_cmd (cc_int32_t argc, const char *argv[])
{
fim_icb_t *icb = NULL;
fim_scb_t *scb = NULL;
int i = 0;
/*
* Check if need help.
*/
if ((argc == 2) && (argv[1][0] == '?')) {
debugif_printf("%s", "show fim\n");
}
/*
* Print the icbs.
*/
debugif_printf("%s", "\n---------------------------------- FIM icbs -----------------------------------");
debugif_printf("%s", "\ni call_id type icb next_chn next_icb cb scb");
debugif_printf("%s", "\n-------------------------------------------------------------------------------\n");
FSM_FOR_ALL_CBS(icb, fim_icbs, FIM_MAX_ICBS) {
debugif_printf("%-3d %-7d %-6s 0x%8p 0x%8p 0x%8p 0x%8p 0x%8p\n",
i++, icb->call_id, fsm_type_name(icb->scb->type),
icb, icb->next_chn, icb->next_icb, icb->cb, icb->scb);
}
/*
* Print the scbs.
*/
i = 0;
debugif_printf
("%s", "\n------------------------ FIM scbs ------------------------");
debugif_printf("%s", "\ni type scb sm get_cb free_cb");
debugif_printf
("%s", "\n----------------------------------------------------------\n");
FSM_FOR_ALL_CBS(scb, fim_scbs, FIM_MAX_SCBS) {
debugif_printf("%-2d %-6s 0x%8p 0x%8p 0x%8p 0x%8p\n",
i++, fsm_type_name(scb->type), scb,
scb->sm, scb->get_cb, scb->free_cb);
}
return (0);
}
void
fim_init (void)
{
fim_init_call_chns();
}
void
fim_shutdown (void)
{
cpr_free(fim_scbs);
cpr_free(fim_icbs);
fim_scbs = NULL;
fim_icbs = NULL;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,707 +0,0 @@
/* 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 "cpr_types.h"
#include "cpr_stdlib.h"
#include "cpr_stdio.h"
#include "phntask.h"
#include "fsm.h"
#include "fim.h"
#include "lsm.h"
#include "sm.h"
#include "gsm.h"
#include "ccapi.h"
#include "phone_debug.h"
#include "debug.h"
#include "text_strings.h"
#include "sip_interface_regmgr.h"
#include "resource_manager.h"
#include "singly_link_list.h"
#include "platform_api.h"
#define CAC_FAILURE_TIMEOUT 5
cc_int32_t g_cacDebug = 0;
/* CAC key */
typedef struct {
callid_t call_id;
} cac_key_t;
typedef enum {
FSM_CAC_IDLE = 0,
FSM_CAC_REQ_PENDING = 1,
FSM_CAC_REQ_RESP = 2
} fsm_cac_state_e;
/* CAC structure to hold the data
*/
typedef struct cac_data_t {
void *msg_ptr;
callid_t call_id;
void *cac_fail_timer;
fsm_cac_state_e cac_state;
uint32_t sessions;
} cac_data_t;
static sll_handle_t s_cac_list = NULL;
/*
* Function responsible for searching the list waiting for
* bandwidth allocation.
*
* @param cac_data_t *key_p - pointer to the key.
* @param cac_data_t *cac_data - cac data.
*
* @return void
*
*/
static sll_match_e
fsm_cac_match_call_id (cac_data_t *key_p, cac_data_t *cac_data)
{
if (cac_data->call_id == key_p->call_id) {
return SLL_MATCH_FOUND;
}
return SLL_MATCH_NOT_FOUND;
}
/*
* Function responsible to create new data information
* for cac.
*
* @param none.
*
* @return cac_data_t *
*
*/
static cac_data_t *
fsm_get_new_cac_data (void)
{
static const char *fname="fsm_get_new_cac_data";
cac_data_t *cac_mem;
cac_mem = (cac_data_t *) cpr_malloc(sizeof(cac_data_t));
if (cac_mem == NULL) {
CAC_ERROR(CAC_F_PREFIX"No memory for CAC data.\n",
DEB_F_PREFIX_ARGS("CAC", fname));
return (NULL);
}
memset(cac_mem, 0, sizeof(cac_data_t));
return (cac_mem);
}
/**
*
* Release all cac related data. This includes timer, cac_data
* and message buffers
*
* @param cac_data cac data structure
*
* @return none.
*
* @pre (cac_data not_eq NULL)
*/
static void
fsm_clear_cac_data (cac_data_t *cac_data)
{
if (cac_data->cac_fail_timer) {
(void) cprCancelTimer(cac_data->cac_fail_timer);
(void) cprDestroyTimer(cac_data->cac_fail_timer);
}
(void) sll_remove(s_cac_list, cac_data);
fim_free_event(cac_data->msg_ptr);
/* Release buffer too */
cpr_free(cac_data->msg_ptr);
cpr_free(cac_data);
}
/**
*
* Notifies the SIP stack and UI that CAC has failed.
*
* @param cac_data cac data structure
*
* @return none.
*
* @pre (cac_data not_eq NULL)
*/
static void fsm_cac_notify_failure (cac_data_t *cac_data)
{
const char fname[] = "fsm_cac_notify_failure";
cc_setup_t *msg = (cc_setup_t *) cac_data->msg_ptr;
cc_msgs_t msg_id = msg->msg_id;
callid_t call_id = msg->call_id;
line_t line = msg->line;
int event_id = msg_id;
cc_srcs_t src_id = msg->src_id;
/* Notify UI about the failure */
lsm_ui_display_notify_str_index(STR_INDEX_NO_BAND_WIDTH);
/* Send response from network side regarding the failure */
if (event_id == CC_MSG_SETUP &&
src_id == CC_SRC_SIP) {
DEF_DEBUG(DEB_F_PREFIX"Send CAC failure to SIP %d.\n",
DEB_F_PREFIX_ARGS("CAC", fname), cac_data->call_id);
cc_int_release(CC_SRC_GSM, CC_SRC_SIP, call_id, line,
CC_CAUSE_CONGESTION, NULL, NULL);
} else {
/* If the cac failed, GSM is not spinning yet, so just send the
* information to UI in this case. Other case, where GSM receives event
* will send the information from GSM.
* If the UI is not cleaned up, session infomation is not cleared.
*/
ui_call_state(evOnHook, line, call_id, CC_CAUSE_CONGESTION);
}
}
/**
*
* Initialize the cac timer. This timer is responsible for cleanup if the
* cac response is not received from lower layer.
*
* @param cac_data cac data structure
* timeout specify the time out in sec
*
* @return true if the timer is created scuccessfully.
* false if the timer is not created.
*
* @pre (cac_data not_eq NULL)
*/
static boolean
fsm_init_cac_failure_timer(cac_data_t *cac_data, uint32_t timeout)
{
const char fname[] = "fsm_init_cac_failure_timer";
CAC_DEBUG(DEB_F_PREFIX"cac_data call_id=%x\n",
DEB_F_PREFIX_ARGS("CAC", fname),
cac_data->call_id);
cac_data->cac_fail_timer =
cprCreateTimer("CAC failure timer", GSM_CAC_FAILURE_TIMER, TIMER_EXPIRATION,
gsm_msg_queue);
if (cac_data->cac_fail_timer == NULL) {
CAC_ERROR(CAC_F_PREFIX"CAC Timer allocation failed.\n",
DEB_F_PREFIX_ARGS("CAC", fname));
return(FALSE);
}
(void) cprStartTimer(cac_data->cac_fail_timer, timeout * 1000,
(void *)(long)cac_data->call_id);
return(TRUE);
}
/**
*
* Serches through cac link list and returns cac_data
* based on call_id. This search is a singly link list search.
*
* @param call_id call_id of the call
*
* @return cac_data if found in the list
* NULL if there is no cac_data
*
* @pre (call_id not_eq CC_NO_CALL_ID)
*/
static cac_data_t *
fsm_cac_get_data_by_call_id (callid_t call_id)
{
const char fname[] = "fsm_cac_get_data_by_call_id";
cac_data_t *cac_data;
cac_data = (cac_data_t *) sll_next(s_cac_list, NULL);
while (cac_data != NULL) {
if (cac_data->call_id == call_id) {
CAC_DEBUG(DEB_F_PREFIX"cac_data found call_id=%x\n",
DEB_F_PREFIX_ARGS("CAC", fname),
cac_data->call_id);
return(cac_data);
}
cac_data = (cac_data_t *) sll_next(s_cac_list, cac_data);
}
CAC_DEBUG(DEB_F_PREFIX"cac_data NOT found.\n",
DEB_F_PREFIX_ARGS("CAC", fname));
return(NULL);
}
/**
*
* Initialize cac module by enabling debugs and creating a cac list.
*
* @param void
*
* @return void
*
* @pre (NULL)
*/
void fsm_cac_init (void)
{
const char fname[] = "fsm_cac_init";
/* allocate and initialize cac list */
s_cac_list = sll_create((sll_match_e(*)(void *, void *))
fsm_cac_match_call_id);
if (s_cac_list == NULL) {
CAC_ERROR(CAC_F_PREFIX"CAC list creation failed.\n",
DEB_F_PREFIX_ARGS("CAC", fname));
}
}
/**
*
* clears all the entries in the cac list
*
* @param void
*
* @return void
*
* @pre (NULL)
*/
void fsm_cac_clear_list (void)
{
const char fname[] = "fsm_cac_clear_list";
cac_data_t *cac_data;
cac_data_t *prev_cac_data;
DEF_DEBUG(DEB_F_PREFIX"Clear all pending CAC dat.\n",
DEB_F_PREFIX_ARGS("CAC", fname));
cac_data = (cac_data_t *) sll_next(s_cac_list, NULL);
while (cac_data != NULL) {
prev_cac_data = cac_data;
cac_data = (cac_data_t *) sll_next(s_cac_list, cac_data);
fsm_cac_notify_failure(prev_cac_data);
fsm_clear_cac_data(prev_cac_data);
}
}
/**
*
* Shutdown cac module, clears all the pending cac requests
*
* @param void
*
* @return void
*
* @pre (NULL)
*/
void fsm_cac_shutdown (void)
{
fsm_cac_clear_list();
sll_destroy(s_cac_list);
s_cac_list = NULL;
}
/**
*
* Check if there are pending CAC requests
*
* @param none
*
* @return cac_data returns first pending request.
*
* @pre (NULL)
*/
static cac_data_t *
fsm_cac_check_if_pending_req (void)
{
cac_data_t *cac_data;
cac_data = (cac_data_t *) sll_next(s_cac_list, NULL);
while (cac_data != NULL) {
if (cac_data->cac_state == FSM_CAC_REQ_PENDING ||
cac_data->cac_state == FSM_CAC_IDLE) {
return(cac_data);
}
cac_data = (cac_data_t *) sll_next(s_cac_list, cac_data);
}
return(NULL);
}
/**
*
* Check if there are pending CAC requests
*
* @param none
*
* @return cac_data returns first pending request.
*
* @pre (NULL)
*/
static cc_causes_t
fsm_cac_process_bw_allocation (cac_data_t *cac_data)
{
const char fname[] = "fsm_cac_process_bw_allocation";
if (lsm_allocate_call_bandwidth(cac_data->call_id, cac_data->sessions) ==
CC_CAUSE_CONGESTION) {
DEF_DEBUG(DEB_F_PREFIX"CAC Allocation failed.\n",
DEB_F_PREFIX_ARGS("CAC", fname));
fsm_cac_notify_failure(cac_data);
fsm_clear_cac_data(cac_data);
return(CC_CAUSE_CONGESTION);
}
cac_data->cac_state = FSM_CAC_REQ_PENDING;
return(CC_CAUSE_OK);
}
/**
*
* Check if there are pending CAC requests
*
* @param call_id request a cac for this call_id
* sessions number of sessions in the request
* msg ccapi msg, that is held to process
* till cac response is received.
*
* @return CC_CAUSE_BW_OK if the bandwidth is received.
* CC_CAUSE_Ok Call returned successfully, not sure about BW yet
* CC_CAUSE_ERROR: Call returned with failure.
*
* @pre (NULL)
*/
cc_causes_t
fsm_cac_call_bandwidth_req (callid_t call_id, uint32_t sessions,
void *msg)
{
const char fname[] = "fsm_cac_call_bandwidth_req";
cac_data_t *cac_data, *cac_pend_data;
/* If wlan not connected return OK */
cac_data = fsm_get_new_cac_data();
if (cac_data == NULL) {
return(CC_CAUSE_CONGESTION);
}
cac_data->msg_ptr = msg;
cac_data->call_id = call_id;
cac_data->cac_state = FSM_CAC_IDLE;
cac_data->sessions = sessions;
fsm_init_cac_failure_timer(cac_data, CAC_FAILURE_TIMEOUT);
/* Make sure there is no pending requests before submitting
* another one
*/
if ((cac_pend_data = fsm_cac_check_if_pending_req()) == NULL) {
/*
* Make sure sufficient bandwidth available to make a outgoing call. This
* should be done before allocating other resources.
*/
DEF_DEBUG(DEB_F_PREFIX"CAC request for %d sessions %d.\n",
DEB_F_PREFIX_ARGS("CAC", fname), call_id, sessions);
if (fsm_cac_process_bw_allocation(cac_data) == CC_CAUSE_CONGESTION) {
return(CC_CAUSE_CONGESTION);
}
cac_data->cac_state = FSM_CAC_REQ_PENDING;
} else if (cac_pend_data->cac_state == FSM_CAC_IDLE) {
if (fsm_cac_process_bw_allocation(cac_pend_data) ==
CC_CAUSE_CONGESTION) {
/* Clear all remaining data */
fsm_cac_clear_list();
return(CC_CAUSE_CONGESTION);
}
}
(void) sll_append(s_cac_list, cac_data);
return(CC_CAUSE_OK);
}
/**
*
* This is called by gsm to cleanup the cac data. If there are any
* pending CAC requests and far end cancels the call, the pending
* request has to be canceled.
*
* @param call_id - call_id of the request
*
* @return none.
*
* @pre (NULL)
*/
void fsm_cac_call_release_cleanup (callid_t call_id)
{
cac_data_t *cac_data;
cac_data = fsm_cac_get_data_by_call_id(call_id);
if (cac_data) {
sll_remove(s_cac_list, cac_data);
fsm_clear_cac_data(cac_data);
}
}
/**
*
* Called when the bandwidth response with available bw is received. This
* also process held ccapi messages through fim event chain
*
* @param none
*
* @return CC_CAUSE_NO_RESOURCE No bandwidth
* CC_CAUSE_OK if ok
*
*
* @pre (NULL)
*/
cc_causes_t
fsm_cac_process_bw_avail_resp (void)
{
const char fname[] = "fsm_cac_process_bw_avail_resp";
cac_data_t *cac_data = NULL;
cac_data_t *next_cac_data = NULL;
cac_data = (cac_data_t *) sll_next(s_cac_list, NULL);
if (cac_data != NULL) {
switch (cac_data->cac_state) {
default:
case FSM_CAC_IDLE:
DEF_DEBUG(DEB_F_PREFIX"No Pending CAC request.\n",
DEB_F_PREFIX_ARGS("CAC", fname));
/*
* Make sure sufficient bandwidth available to make a outgoing call. This
* should be done before allocating other resources.
*/
if (fsm_cac_process_bw_allocation(cac_data) == CC_CAUSE_CONGESTION) {
sll_remove(s_cac_list, cac_data);
return(CC_CAUSE_NO_RESOURCE);
}
break;
case FSM_CAC_REQ_PENDING:
next_cac_data = (cac_data_t *) sll_next(s_cac_list, cac_data);
sll_remove(s_cac_list, cac_data);
/* Request for the next bandwidth */
DEF_DEBUG(DEB_F_PREFIX"Process pending responses %d.\n",
DEB_F_PREFIX_ARGS("CAC", fname), cac_data->call_id);
/* Let GSM process completed request */
fim_process_event(cac_data->msg_ptr, TRUE);
fsm_clear_cac_data(cac_data);
if (next_cac_data != NULL) {
/*
* Make sure sufficient bandwidth available to make a outgoing call. This
* should be done before allocating other resources.
*/
DEF_DEBUG(DEB_F_PREFIX"Requesting next allocation %d.\n",
DEB_F_PREFIX_ARGS("CAC", fname), next_cac_data->call_id);
if (fsm_cac_process_bw_allocation(next_cac_data) ==
CC_CAUSE_CONGESTION) {
/* If the next data was in idle state and the request fialed
* then clean up the remaining list
*/
if (next_cac_data->cac_state == FSM_CAC_IDLE) {
/* Clear all remaining data */
fsm_cac_clear_list();
} else {
sll_remove(s_cac_list, next_cac_data);
}
return(CC_CAUSE_NO_RESOURCE);
}
}
break;
}
}
return(CC_CAUSE_NO_RESOURCE);
}
/**
*
* Called when the bandwidth response with failed bw is received. This
* also process held ccapi messages through fim event chain
*
* @param none
*
* @return CC_CAUSE_NO_RESOURCE No bandwidth
* CC_CAUSE_OK if ok
*
*
* @pre (NULL)
*/
cc_causes_t
fsm_cac_process_bw_failed_resp (void)
{
const char fname[] = "fsm_cac_process_bw_avail_resp";
cac_data_t *cac_data = NULL;
cac_data_t *next_cac_data = NULL;
cac_data = (cac_data_t *) sll_next(s_cac_list, NULL);
if (cac_data != NULL) {
switch (cac_data->cac_state) {
default:
case FSM_CAC_IDLE:
DEF_DEBUG(DEB_F_PREFIX"No Pending request.\n",
DEB_F_PREFIX_ARGS("CAC", fname));
/*
* Make sure sufficient bandwidth available to make a outgoing call. This
* should be done before allocating other resources.
*/
if (fsm_cac_process_bw_allocation(cac_data) == CC_CAUSE_CONGESTION) {
sll_remove(s_cac_list, cac_data);
return(CC_CAUSE_NO_RESOURCE);
}
break;
case FSM_CAC_REQ_PENDING:
next_cac_data = (cac_data_t *) sll_next(s_cac_list, cac_data);
sll_remove(s_cac_list, cac_data);
/* Request for the next bandwidth */
DEF_DEBUG(DEB_F_PREFIX"Process pending responses even after failure.\n",
DEB_F_PREFIX_ARGS("CAC", fname));
/* Let GSM process completed request */
fsm_cac_notify_failure(cac_data);
fsm_clear_cac_data(cac_data);
if (next_cac_data != NULL) {
/*
* Make sure sufficient bandwidth available to make a outgoing call. This
* should be done before allocating other resources.
*/
if (fsm_cac_process_bw_allocation(next_cac_data) == CC_CAUSE_CONGESTION) {
/* If the next data was in idle state and the request fialed
* then clean up the remaining list
*/
if (next_cac_data->cac_state == FSM_CAC_IDLE) {
/* Clear all remaining data */
fsm_cac_clear_list();
} else {
sll_remove(s_cac_list, next_cac_data);
}
return(CC_CAUSE_NO_RESOURCE);
}
}
break;
}
}
return(CC_CAUSE_NO_RESOURCE);
}
/**
*
* Process time-out event. This cause cac data to send failure notifications.
*
* @param void *tmr_data - timer data
*
* @return none
*
*
* @pre (NULL)
*/
void
fsm_cac_process_bw_fail_timer (void *tmr_data)
{
const char fname[] = "fsm_cac_process_bw_fail_timer";
DEF_DEBUG(DEB_F_PREFIX"CAC request timedout %d.\n",
DEB_F_PREFIX_ARGS("CAC", fname), (callid_t)(long)tmr_data);
/* Time-out causes same set of processing as bw failure
*/
fsm_cac_process_bw_failed_resp();
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,608 +0,0 @@
/* 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 "cpr_types.h"
#include "cpr_memory.h"
#include "cpr_stdio.h"
#include "cpr_stdlib.h"
#include "cpr_ipc.h"
#include "cpr_errno.h"
#include "cpr_time.h"
#include "cpr_rand.h"
#include "cpr_timers.h"
#include "cpr_threads.h"
#include "phone.h"
#include "phntask.h"
#include "gsm.h"
#include "lsm.h"
#include "vcm.h"
#include "fsm.h"
#include "phone_debug.h"
#include "debug.h"
#include "fim.h"
#include "gsm_sdp.h"
#include "ccsip_subsmanager.h"
#include "dialplanint.h"
#include "kpmlmap.h"
#include "subapi.h"
#include "platform_api.h"
static void sub_process_feature_msg(uint32_t cmd, void *msg);
static void sub_process_feature_notify(ccsip_sub_not_data_t *msg, callid_t call_id,
callid_t other_call_id);
static void sub_process_b2bcnf_msg(uint32_t cmd, void *msg);
void fsmb2bcnf_get_sub_call_id_from_ccb(fsmcnf_ccb_t *ccb, callid_t *cnf_call_id,
callid_t *cns_call_id);
cprMsgQueue_t gsm_msg_queue;
void destroy_gsm_thread(void);
void dp_shutdown();
extern void dcsm_process_jobs(void);
extern void dcsm_init(void);
extern void dcsm_shutdown(void);
/* Flag to see whether we can start processing events */
static boolean gsm_initialized = FALSE;
extern cprThread_t gsm_thread;
static media_timer_callback_fp* media_timer_callback = NULL;
/**
* Add media falsh one time timer call back. It's for ROUNDTABLE only.
*/
void
gsm_set_media_callback(media_timer_callback_fp* callback) {
media_timer_callback = callback;
}
void
gsm_set_initialized (void)
{
gsm_initialized = TRUE;
}
boolean
gsm_get_initialize_state (void)
{
return gsm_initialized;
}
cprBuffer_t
gsm_get_buffer (uint16_t size)
{
return cpr_malloc(size);
}
cpr_status_e
gsm_send_msg (uint32_t cmd, cprBuffer_t buf, uint16_t len)
{
phn_syshdr_t *syshdr;
syshdr = (phn_syshdr_t *) cprGetSysHeader(buf);
if (!syshdr) {
return CPR_FAILURE;
}
syshdr->Cmd = cmd;
syshdr->Len = len;
if (cprSendMessage(gsm_msg_queue, buf, (void **) &syshdr) == CPR_FAILURE) {
cprReleaseSysHeader(syshdr);
return CPR_FAILURE;
}
return CPR_SUCCESS;
}
boolean
gsm_process_msg (uint32_t cmd, void *msg)
{
static const char fname[] = "gsm_process_msg";
boolean release_msg = TRUE;
cc_msgs_t msg_id = ((cc_setup_t *)msg)->msg_id;
int event_id = msg_id;
GSM_DEBUG(DEB_F_PREFIX"cmd= 0x%x\n", DEB_F_PREFIX_ARGS(GSM, fname), cmd);
switch (cmd) {
case GSM_GSM:
case GSM_SIP:
if (gsm_initialized) {
if (event_id == CC_MSG_FEATURE &&
(((cc_feature_t *) msg)->feature_id == CC_FEATURE_CAC_RESP_PASS)) {
fsm_cac_process_bw_avail_resp ();
/* Release all memory for CC_FEATURE_CAC_..message */
release_msg = TRUE;
GSM_DEBUG(DEB_F_PREFIX"CAC Message Processed: 0x%x\n", DEB_F_PREFIX_ARGS(GSM, fname), cmd);
} else if (event_id == CC_MSG_FEATURE &&
(((cc_feature_t *) msg)->feature_id == CC_FEATURE_CAC_RESP_FAIL)) {
fsm_cac_process_bw_failed_resp ();
/* Release all memory for CC_FEATURE_CAC_..message */
release_msg = TRUE;
GSM_DEBUG(DEB_F_PREFIX"CAC Message Processed: 0x%x\n", DEB_F_PREFIX_ARGS(GSM, fname), cmd);
} else {
release_msg = fim_process_event(msg, FALSE);
GSM_DEBUG(DEB_F_PREFIX"Message Processed: 0x%x\n", DEB_F_PREFIX_ARGS(GSM, fname), cmd);
}
}
if (release_msg == TRUE) {
fim_free_event(msg);
}
break;
default:
GSM_DEBUG(DEB_F_PREFIX"Unknown Cmd received: 0x%x\n", DEB_F_PREFIX_ARGS(GSM, fname), cmd);
break;
}
return(release_msg);
}
void
gsm_process_timer_expiration (void *msg)
{
static const char fname[] = "gsm_process_timer_expiration";
cprCallBackTimerMsg_t *timerMsg;
void *timeout_msg = NULL;
timerMsg = (cprCallBackTimerMsg_t *) msg;
TMR_DEBUG(DEB_F_PREFIX"Timer %s expired\n", DEB_F_PREFIX_ARGS(GSM, fname), timerMsg->expiredTimerName);
switch (timerMsg->expiredTimerId) {
case GSM_MULTIPART_TONES_TIMER:
case GSM_CONTINUOUS_TONES_TIMER:
lsm_tmr_tones_callback(timerMsg->usrData);
break;
case GSM_ERROR_ONHOOK_TIMER:
fsmdef_error_onhook_timeout(timerMsg->usrData);
break;
case GSM_AUTOANSWER_TIMER:
fsmdef_auto_answer_timeout(timerMsg->usrData);
break;
case GSM_REVERSION_TIMER:
fsmdef_reversion_timeout((callid_t)(long)timerMsg->usrData);
break;
case GSM_CAC_FAILURE_TIMER:
fsm_cac_process_bw_fail_timer(timerMsg->usrData);
break;
case GSM_DIAL_TIMEOUT_TIMER:
dp_dial_timeout(timerMsg->usrData);
break;
case GSM_KPML_INTER_DIGIT_TIMER:
kpml_inter_digit_timer_callback(timerMsg->usrData);
break;
case GSM_KPML_CRITICAL_DIGIT_TIMER:
case GSM_KPML_EXTRA_DIGIT_TIMER:
break;
case GSM_KPML_SUBSCRIPTION_TIMER:
kpml_subscription_timer_callback(timerMsg->usrData);
break;
case GSM_REQ_PENDING_TIMER:
timeout_msg = fsmdef_feature_timer_timeout(
CC_FEATURE_REQ_PEND_TIMER_EXP,
timerMsg->usrData);
break;
case GSM_RINGBACK_DELAY_TIMER:
timeout_msg = fsmdef_feature_timer_timeout(
CC_FEATURE_RINGBACK_DELAY_TIMER_EXP,
timerMsg->usrData);
break;
case GSM_FLASH_ONCE_TIMER:
if (media_timer_callback != NULL) {
(* ((media_timer_callback)))();
}
break;
case GSM_TONE_DURATION_TIMER:
lsm_tone_duration_tmr_callback(timerMsg->usrData);
break;
default:
GSM_ERR_MSG(GSM_F_PREFIX"unknown timer %d\n", fname,
timerMsg->expiredTimerName);
break;
}
/*
* If there is a timer message to be processed by state machine,
* hands it to GSM state machine here.
*/
if (timeout_msg != NULL) {
/* Let state machine handle glare timer expiration */
gsm_process_msg(GSM_GSM, timeout_msg);
cpr_free(timeout_msg);
}
}
static void
gsm_init (void)
{
/* Placeholder for any initialization tasks */
}
void
gsm_shutdown (void)
{
gsm_initialized = FALSE;
lsm_shutdown();
fsm_shutdown();
fim_shutdown();
dcsm_shutdown();
}
void
gsm_reset (void)
{
dp_reset();
lsm_reset();
fsmutil_free_all_shown_calls_ci_map();
}
void
GSMTask (void *arg)
{
static const char fname[] = "GSMTask";
void *msg;
phn_syshdr_t *syshdr;
boolean release_msg = TRUE;
/*
* Get the GSM message queue handle
* A hack until the tasks in irx are
* CPRized.
*/
gsm_msg_queue = (cprMsgQueue_t) arg;
if (!gsm_msg_queue) {
GSM_ERR_MSG(GSM_F_PREFIX"invalid input, exiting\n", fname);
return;
}
if (platThreadInit("GSMTask") != 0) {
return;
}
/*
* Adjust relative priority of GSM thread.
*/
(void) cprAdjustRelativeThreadPriority(GSM_THREAD_RELATIVE_PRIORITY);
/*
* Initialize all the GSM modules
*/
lsm_init();
fsm_init();
fim_init();
gsm_init();
dcsm_init();
cc_init();
fsmutil_init_shown_calls_ci_map();
/*
* On Win32 platform, the random seed is stored per thread; therefore,
* each thread needs to seed the random number. It is recommended by
* MS to do the following to ensure randomness across application
* restarts.
*/
cpr_srand((unsigned int)time(NULL));
/*
* Cache random numbers for SRTP keys
*/
gsmsdp_cache_crypto_keys();
while (1) {
release_msg = TRUE;
msg = cprGetMessage(gsm_msg_queue, TRUE, (void **) &syshdr);
if (msg) {
switch (syshdr->Cmd) {
case TIMER_EXPIRATION:
gsm_process_timer_expiration(msg);
break;
case GSM_SIP:
case GSM_GSM:
release_msg = gsm_process_msg(syshdr->Cmd, msg);
break;
case DP_MSG_INIT_DIALING:
case DP_MSG_DIGIT_STR:
case DP_MSG_STORE_DIGIT:
case DP_MSG_DIGIT:
case DP_MSG_DIAL_IMMEDIATE:
case DP_MSG_REDIAL:
case DP_MSG_ONHOOK:
case DP_MSG_OFFHOOK:
case DP_MSG_UPDATE:
case DP_MSG_DIGIT_TIMER:
case DP_MSG_CANCEL_OFFHOOK_TIMER:
dp_process_msg(syshdr->Cmd, msg);
break;
case SUB_MSG_B2BCNF_SUBSCRIBE_RESP:
case SUB_MSG_B2BCNF_NOTIFY:
case SUB_MSG_B2BCNF_TERMINATE:
sub_process_b2bcnf_msg(syshdr->Cmd, msg);
break;
case SUB_MSG_FEATURE_SUBSCRIBE_RESP:
case SUB_MSG_FEATURE_NOTIFY:
case SUB_MSG_FEATURE_TERMINATE:
sub_process_feature_msg(syshdr->Cmd, msg);
break;
case SUB_MSG_KPML_SUBSCRIBE:
case SUB_MSG_KPML_TERMINATE:
case SUB_MSG_KPML_NOTIFY_ACK:
case SUB_MSG_KPML_SUBSCRIBE_TIMER:
case SUB_MSG_KPML_DIGIT_TIMER:
kpml_process_msg(syshdr->Cmd, msg);
break;
case REG_MGR_STATE_CHANGE:
gsm_reset();
break;
case THREAD_UNLOAD:
destroy_gsm_thread();
break;
default:
GSM_ERR_MSG(GSM_F_PREFIX"Unknown message\n", fname);
break;
}
cprReleaseSysHeader(syshdr);
if (release_msg == TRUE) {
cpr_free(msg);
}
/* Check if there are pending messages for dcsm
* if it in the right state perform its operation
*/
dcsm_process_jobs();
}
}
}
/**
* This function will process SUBSCRIBED feature NOTIFY messages.
*
* @param[in] msg - pointer to ccsip_sub_not_data_t
*
* @return none
*
* @pre (msg != NULL)
*/
static void sub_process_b2bcnf_sub_resp (ccsip_sub_not_data_t *msg)
{
static const char fname[] = "sub_process_b2bcnf_sub_resp";
callid_t call_id = CC_NO_CALL_ID;
callid_t other_call_id = CC_NO_CALL_ID;
cc_causes_t cause;
fsmb2bcnf_get_sub_call_id_from_ccb ((fsmcnf_ccb_t *)(msg->request_id),
&call_id, &other_call_id);
if (msg->u.subs_result_data.status_code == 200 ||
msg->u.subs_result_data.status_code == 202 ) {
cause = CC_CAUSE_OK;
GSM_DEBUG(DEB_F_PREFIX"B2BCNF subs response = OK\n",
DEB_F_PREFIX_ARGS(GSM,fname));
} else {
GSM_DEBUG(DEB_F_PREFIX"B2BCNF subs response = ERROR\n",
DEB_F_PREFIX_ARGS(GSM,fname));
cause = CC_CAUSE_ERROR;
}
cc_feature_ack(CC_SRC_GSM, call_id, msg->line_id, CC_FEATURE_B2BCONF, NULL, cause);
}
/**
* This function will process b2bcnf feature NOTIFY messages.
*
* @param[in] cmd - command
* @param[in] msg - pointer to ccsip_sub_not_data_t
*
* @return none
*
* @pre (msg != NULL)
*/
static void sub_process_b2bcnf_msg (uint32_t cmd, void *msg)
{
static const char fname[] = "sub_process_b2bcnf_msg";
cc_feature_data_t data;
callid_t call_id, other_call_id = CC_NO_CALL_ID;
fsmb2bcnf_get_sub_call_id_from_ccb((fsmcnf_ccb_t *)((ccsip_sub_not_data_t *)msg)->request_id,
&call_id, &other_call_id);
switch (cmd) {
case SUB_MSG_B2BCNF_SUBSCRIBE_RESP:
GSM_DEBUG(DEB_F_PREFIX"B2BCNF subs response\n",
DEB_F_PREFIX_ARGS(GSM,fname));
sub_process_b2bcnf_sub_resp((ccsip_sub_not_data_t *)msg);
break;
case SUB_MSG_B2BCNF_NOTIFY:
GSM_DEBUG(DEB_F_PREFIX"B2BCNF subs notify\n",
DEB_F_PREFIX_ARGS(GSM,fname));
sub_process_feature_notify((ccsip_sub_not_data_t *)msg, call_id, other_call_id);
break;
case SUB_MSG_B2BCNF_TERMINATE:
/*
* This is posted by SIP stack if it is shutting down or rolling over.
* if so, notify b2bcnf to cleanup state machine.
*/
GSM_DEBUG(DEB_F_PREFIX"B2BCNF subs terminate\n",
DEB_F_PREFIX_ARGS(GSM,fname));
data.notify.subscription = CC_SUBSCRIPTIONS_REMOTECC;
data.notify.method = CC_RCC_METHOD_REFER;
data.notify.data.rcc.feature = CC_FEATURE_B2BCONF;
data.notify.cause = CC_CAUSE_ERROR;
cc_feature(CC_SRC_GSM, call_id, 0, CC_FEATURE_NOTIFY, &data);
break;
default:
GSM_DEBUG(DEB_F_PREFIX"B2BCNF subs unknown event\n",
DEB_F_PREFIX_ARGS(GSM,fname));
break;
}
}
/**
* This function will process SUBSCRIBED feature NOTIFY messages.
*
* @param[in] cmd - command
* @param[in] msg - pointer to ccsip_sub_not_data_t
*
* @return none
*
* @pre (msg != NULL)
*/
static void sub_process_feature_msg (uint32_t cmd, void *msg)
{
callid_t call_id;
cc_feature_ack_t temp_msg;
switch (cmd) {
case SUB_MSG_FEATURE_SUBSCRIBE_RESP:
/*
* if the response in non-2xx final, we should reset the active feature.
*/
call_id = (callid_t)(((ccsip_sub_not_data_t *)msg)->request_id);
if (((ccsip_sub_not_data_t *)msg)->u.subs_result_data.status_code > 299) {
memset(&temp_msg, 0, sizeof(temp_msg));
temp_msg.msg_id = CC_MSG_FEATURE_ACK;
temp_msg.src_id = CC_SRC_GSM;
temp_msg.call_id = call_id;
fim_process_event((void *)&temp_msg, FALSE);
}
break;
case SUB_MSG_FEATURE_NOTIFY:
call_id = (callid_t)(((ccsip_sub_not_data_t *)msg)->request_id);
sub_process_feature_notify((ccsip_sub_not_data_t *)msg, call_id,
CC_NO_CALL_ID);
break;
case SUB_MSG_FEATURE_TERMINATE:
/*
* This is posted by SIP stack if it is shutting down or rolling over.
* if so, sip stack already cleaned up the subscription. so do nothing.
*/
break;
}
}
/**
* This function will process SUBSCRIBED feature NOTIFY messages.
*
* @param[in] msg - pointer to ccsip_sub_not_data_t
*
* @return none
*
* @pre (msg != NULL)
*/
static void sub_process_feature_notify (ccsip_sub_not_data_t *msg, callid_t call_id,
callid_t other_call_id)
{
static const char fname[] = "sub_process_feature_notify";
ccsip_event_data_t *ev_data;
cc_feature_ack_t temp_msg;
/*
* send response to NOTIFY.
*/
(void)sub_int_notify_ack(msg->sub_id, SIP_STATUS_SUCCESS, msg->u.notify_ind_data.cseq);
/*
* if the subscription state is terminated, clean up the subscription.
*/
if (msg->u.notify_ind_data.subscription_state == SUBSCRIPTION_STATE_TERMINATED) {
/*
* post SIPSPI_EV_CC_SUBSCRIPTION_TERMINATED.
* do not force SUB/NOT mgr to cleanup SCB immediately, because we may have to handle digest
* challenges to terminating SUBSCRIBE sent.
*/
(void)sub_int_subscribe_term(msg->sub_id, FALSE, msg->request_id, CC_SUBSCRIPTIONS_REMOTECC);
}
ev_data = msg->u.notify_ind_data.eventData;
msg->u.notify_ind_data.eventData = NULL;
if (ev_data == NULL) {
GSM_ERR_MSG(DEB_F_PREFIX"No body in the NOTIFY message\n",
DEB_F_PREFIX_ARGS(GSM, fname));
/*
* if (no content & subscription state is TERMINATED
* then reset active_feature to NONE.
*/
if (msg->u.notify_ind_data.subscription_state == SUBSCRIPTION_STATE_TERMINATED) {
memset(&temp_msg, 0, sizeof(temp_msg));
temp_msg.msg_id = CC_MSG_FEATURE_ACK;
temp_msg.src_id = CC_SRC_GSM;
temp_msg.call_id = call_id;
fim_process_event((void *)&temp_msg, FALSE);
}
return;
}
// other types of event data is not supported as of now.
free_event_data(ev_data);
}
/*
* return TRUE if GSM is considered idle,
* currently this means lsm is idle
* FALSE otherwise.
*/
boolean
gsm_is_idle (void)
{
if (lsm_is_phone_idle()) {
return (TRUE);
}
return (FALSE);
}
/*
* Function: destroy_gsm_thread
* Description: shutdown gsm and kill gsm thread
* Parameters: none
* Returns: none
*/
void destroy_gsm_thread()
{
static const char fname[] = "destroy_gsm_thread";
DEF_DEBUG(DEB_F_PREFIX"Unloading GSM and destroying GSM thread\n",
DEB_F_PREFIX_ARGS(SIP_CC_INIT, fname));
gsm_shutdown();
dp_shutdown();
kpml_shutdown();
(void) cprDestroyThread(gsm_thread);
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,66 +0,0 @@
/* 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/. */
#ifndef _FIM_H_
#define _FIM_H_
#include "sm.h"
#include "fsm.h"
/*
* This is an overlay structure.
* Every entity cb must have these two fields at the start of the cb
*/
typedef struct fim_cb_hdr_ {
callid_t call_id;
int state;
} fim_cb_hdr_t;
#ifndef fim_icb_t__
#define fim_icb_t__
struct fim_icb_t_;
typedef struct fim_icb_t_ fim_icb_t;
#endif
typedef void (*fim_func_t)(fim_icb_t *elem, callid_t call_id);
typedef struct fim_scb_t_ {
fsm_types_t type;
sm_table_t *sm;
fim_func_t get_cb;
fim_func_t free_cb;
} fim_scb_t;
struct fim_icb_t_ {
struct fim_icb_t_ *next_chn;
struct fim_icb_t_ *next_icb;
callid_t call_id;
boolean ui_locked;
void *cb;
fim_scb_t *scb;
};
const char *fim_event_name(int event);
boolean fim_process_event(void *data, boolean cac_passed);
void fim_free_event(void *data);
void fim_init(void);
void fim_shutdown(void);
void fsmcnf_free_cb(fim_icb_t *icb, callid_t call_id);
void fsmxfr_free_cb(fim_icb_t *icb, callid_t call_id);
void fsmdef_free_cb(fim_icb_t *icb, callid_t call_id);
void fsmb2bcnf_free_cb(fim_icb_t *icb, callid_t call_id);
void fim_lock_ui(callid_t call_id);
void fim_unlock_ui(callid_t call_id);
cc_causes_t
fsm_cac_process_bw_avail_resp(void);
cc_causes_t
fsm_cac_process_bw_failed_resp(void);
cc_causes_t
fsm_cac_call_bandwidth_req(callid_t call_id, uint32_t sessions,
void *msg);
#endif /* _FIM_H_ */

View File

@ -1,768 +0,0 @@
/* 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/. */
#ifndef _FSM_H_
#define _FSM_H_
#include "cpr_types.h"
#include "sm.h"
#include "ccapi.h"
#include "vcm.h"
#include "ccsip_core.h"
#include "sll_lite.h"
#include "sessionConstants.h"
#include "ccsdp.h"
/* TODO: BLASBERG
* fsm.h only needs the following from ccsip_core.h
* should put basic sip types into a separate hdr file
typedef enum {
ALERTING_NONE,
ALERTING_OLD,
ALERTING_TONE,
ALERTING_RING
} alertingType;
*/
#define FSMCNF_MAX_CCBS (LSM_MAX_LINES)
#define FSMXFR_MAX_XCBS (LSM_MAX_LINES)
#define FSM_NO_ID (0)
#define FSMDEF_NO_DCB (NULL)
#define FSMDEF_ERR_ONHOOK_TMR_SECS (20)
#define FSMDEF_MAX_DIGEST_ALG_LEN 10
#define FSMDEF_MAX_DIGEST_LEN 32 * 3
// Should match define for SIP stack MAX_SIP_URL_LENGTH
#define FSMDEF_MAX_CALLER_ID_LEN (256)
#ifndef fim_icb_t__
#define fim_icb_t__
struct fim_icb_t_;
typedef struct fim_icb_t_ fim_icb_t;
#endif
typedef enum {
PRIMARY,
MONITOR,
LOCAL_CONF,
WHISPER_COACHING
} fsm_session_t;
typedef enum {
DIAL_MODE_NUMERIC,
DIAL_MODE_URL
} dialMode_t;
typedef enum {
FSMDEF_CALL_TYPE_MIN = -1,
FSMDEF_CALL_TYPE_NONE = CC_CALL_TYPE_NONE,
FSMDEF_CALL_TYPE_INCOMING = CC_CALL_TYPE_INCOMING,
FSMDEF_CALL_TYPE_OUTGOING = CC_CALL_TYPE_OUTGOING,
FSMDEF_CALL_TYPE_FORWARD = CC_CALL_TYPE_FORWARDED,
FSMDEF_CALL_TYPE_MAX
} fsmdef_call_types_t;
typedef enum {
FSMDEF_S_MIN = -1,
FSMDEF_S_IDLE,
FSMDEF_S_COLLECT_INFO,
FSMDEF_S_CALL_SENT,
FSMDEF_S_OUTGOING_PROCEEDING,
FSMDEF_S_KPML_COLLECT_INFO,
FSMDEF_S_OUTGOING_ALERTING,
FSMDEF_S_INCOMING_ALERTING,
FSMDEF_S_CONNECTING,
FSMDEF_S_JOINING,
FSMDEF_S_CONNECTED,
FSMDEF_S_CONNECTED_MEDIA_PEND,
FSMDEF_S_RELEASING,
FSMDEF_S_HOLD_PENDING,
FSMDEF_S_HOLDING,
FSMDEF_S_RESUME_PENDING,
FSMDEF_S_PRESERVED,
FSMDEF_S_MAX
} fsmdef_states_t;
typedef enum {
FSMDEF_MRTONE_NO_ACTION = 0,
FSMDEF_MRTONE_PLAYED_MONITOR_TONE,
FSMDEF_MRTONE_PLAYED_RECORDER_TONE,
FSMDEF_MRTONE_PLAYED_BOTH_TONES,
FSMDEF_MRTONE_RESUME_MONITOR_TONE,
FSMDEF_MRTONE_RESUME_RECORDER_TONE,
FSMDEF_MRTONE_RESUME_BOTH_TONES
} fsmdef_monrec_tone_action_e;
typedef enum {
FSMDEF_PLAYTONE_NO_ACTION = 0,
FSMDEF_PLAYTONE_ZIP
} fsmdef_play_tone_action_e;
/* Local crypto parameter is the local parameters to offer */
typedef struct fsmdef_crypto_param_t_ {
int32_t tag; /* crypto attribute tag */
vcm_crypto_algorithmID algorithmID; /* encryption algorithm. */
vcm_crypto_key_t key; /* local key */
} fsmdef_crypto_param_t;
/* Negotiated crypto parameter */
#define FSMDEF_CRYPTO_TX_CHANGE (1 << 0) /* crypto Tx parms. change */
#define FSMDEF_CRYPTO_RX_CHANGE (1 << 1) /* crypto Tx parms. change */
typedef struct fsmdef_negotiated_crypto_t_ {
int32_t tag; /* crypto attribute tag */
vcm_crypto_algorithmID algorithmID; /* algorithm ID */
vcm_crypto_key_t tx_key; /* tx key */
vcm_crypto_key_t rx_key; /* rx key */
uint32_t flags; /* misc. flags. */
char algorithm[FSMDEF_MAX_DIGEST_ALG_LEN];
char digest[FSMDEF_MAX_DIGEST_LEN];
} fsmdef_negotiated_crypto_t;
/*
* Saved attributes of interest from previously received SDP
*/
typedef struct fsmdef_previous_sdp_ {
uint16_t dest_port;
cpr_ip_addr_t dest_addr;
int32_t avt_payload_type;
/*
* This field contains the number of elements in the payloads field.
*/
int32_t num_payloads;
vcm_payload_info_t* payloads;
uint16_t packetization_period;
uint16_t max_packetization_period;
sdp_direction_e direction;
int32_t tias_bw;
int32_t profile_level;
} fsmdef_previous_sdp_t;
typedef struct fsmdef_media_t_ {
sll_lite_node_t node; /* link node, must be first member of struct */
media_refid_t refid; /* media reference id */
sdp_media_e type; /* audio, video etc. media */
sdp_addrtype_e addr_type;/* ipv4, ipv6 */
int32_t avt_payload_type;
vcm_vad_t vad;
uint16_t packetization_period;
uint16_t max_packetization_period;
uint16_t mode;
uint16_t level;
boolean direction_set;
sdp_direction_e direction; /* current negotiated direction */
sdp_direction_e support_direction; /* supported direction */
sdp_transport_e transport;
uint16_t src_port; /* source port for this media stream */
cpr_ip_addr_t src_addr; /* source addr for this media stream */
uint16_t dest_port; /* destination port for this media stream */
cpr_ip_addr_t dest_addr; /* destination addr for this media straam */
/* Flag to indicate if Multicast */
boolean is_multicast;
uint16_t multicast_port;
/*
* rcv_chan indicates if the receive media stream has been opened
*/
boolean rcv_chan;
/*
* xmit_chan indicates if the transmit media stream has been opened
*/
boolean xmit_chan;
/*
* SRTP support.
*/
fsmdef_negotiated_crypto_t negotiated_crypto;
/*
* Local crypto holds the local offered crypto set, keeps it in the
* dcb for fast access. The alternative to be kept in the
* SDP structure but is slower in retrieving it. In the future,
* it is possible that more than 1 crypto lines are offered but
* for now it is one.
*/
fsmdef_crypto_param_t local_crypto;
/*
* Used to track previously received SDP for comparisons to
* newly received media to determine if RTP port recycling is
* required. Eliminates unnecessary recycling of ports which
* causes breaks in the audio stream.
*/
fsmdef_previous_sdp_t previous_sdp;
/*
* hold tracks the hold state. The flag is a bit map so it is possible that
* the phone may have multiple holding states, ie. local and remote
*/
uint32_t hold;
/*
* Flags fields for various bit flags
*/
#define FSM_MEDIA_F_SUPPORT_SECURITY (1 << 0) /* supported security */
uint32_t flags;
/*
* capability index. The index into the media capbilty table
* that this media entry is coresponding to.
*/
uint8_t cap_index;
/* Values cached from attributes */
int32_t tias_bw;
int32_t profile_level;
void *video;
/* ICE Candidates */
char **candidatesp;
int candidate_ct;
/*
* rtcp-mux indicates media stream is muxed for RTP and RTCP
*/
boolean rtcp_mux;
/*
* port number used in m= data channel line
*/
uint16_t sctp_port;
/*
* Data Channel properties
*/
uint32 streams;
char *protocol;
/*
* This field contains the number of elements in the payloads field.
*/
int32_t num_payloads;
/*
* List of active lists of payloads negotiated
*/
vcm_payload_info_t* payloads;
} fsmdef_media_t;
struct fsm_fcb_t_;
typedef struct {
callid_t call_id;
callid_t join_call_id;
line_t line;
cc_caller_id_t caller_id;
groupid_t group_id;
int digit_cnt;
fsmdef_call_types_t call_type;
fsm_session_t session;
boolean send_release;
int msgs_sent;
int msgs_rcvd;
boolean onhook_received;
/*
* inband indicates if inband alerting is active
*/
boolean inband;
/*
* inband_received indicates if inband alerting has been received.
* Once set, this bool stays set until dcb is reset.
*/
boolean inband_received;
/*
* outofband tracks the payload type for outofband DTMF
*/
int outofband;
/*
* Boolean indication of whether call was originated by phone or
* far end party.
*/
boolean inbound;
/*
* The following data tracks the RTP info
*/
boolean remote_sdp_present;
boolean remote_sdp_in_ack;
uint16_t src_sdp_version;
cc_sdp_t *sdp;
/* media list corresponding to m lines */
sll_lite_list_t media_list;
/*
* dial_mode tracks the state of the dialing mode icon, ie. alphanumeric or
* numeric
*/
dialMode_t dial_mode;
/*
* pd_updated tracks whether or not the personal directory has
* been updated
*/
boolean pd_updated;
/* tracks the ringing pattern to play */
vcm_ring_mode_t alerting_ring;
/* tracks the tone to play */
vcm_tones_t alerting_tone;
/* tracks the direction to play the tone. */
uint16_t tone_direction;
/* Was an alert-info header present, if so what did it contain */
cc_alerting_type alert_info;
/* used to determine when SIP stack releases the call early. */
boolean early_error_release;
/* used to determine when we are played a tone via the dialplan */
boolean dialplan_tone;
/* active tone (i.e. tone currently being played or requested to be played) */
vcm_tones_t active_tone;
/* indicates the action of monitor and recorder tones */
fsmdef_monrec_tone_action_e monrec_tone_action;
/* monitor/recorder tone direction to play out to */
uint16_t monitor_tone_direction;
uint16_t recorder_tone_direction;
/* indicates the action of play tone for a single time */
fsmdef_play_tone_action_e play_tone_action;
struct fsm_fcb_t_ *fcb;
/* Feature that is currently active */
cc_features_t active_feature;
/* Reason for hold */
cc_hold_resume_reason_e hold_reason;
/* Feature invocation state.
* Each feature will correspond to unique bit in variable.
* Bit will be Set if feature is invoked and awaiting feature ACK.
* Bit will be Cleared if feature is ACKed or not yet invoked.
* Each array element will hold invocation state for 32 features.
* The resource manager utility is utilized to maintain the bit settings.
*/
void *feature_invocation_state;
/* TRUE if CCM has requested phone to show ringout UI */
boolean spoof_ringout_requested;
/* TRUE if GSM has applied ringout due to CCMs request to show ringout UI */
boolean spoof_ringout_applied;
/* Timer to go on hook after any call error */
cprTimer_t err_onhook_tmr;
/* Request pending timer */
cprTimer_t req_pending_tmr;
/* Ringback delay timer */
cprTimer_t ringback_delay_tmr;
/*
* save of orientation from callInfo to update UI at any time
* other than during call info. update such as after Tx start in
* order to update security icon.
*/
cc_orientation_e orientation;
/*
* This boolean is used to short circuit sending UI update requests to the platform
* so that requests are only made when one of the call ui components requires
* updating. The same is done for placed call history.
*/
boolean ui_update_required;
boolean placed_call_update_required;
boolean is_conf_call;
cc_security_e security;
cc_policy_e policy;
/* auto answer timer */
cprTimer_t autoAnswerTimer;
int32_t reversionInterval;
cprTimer_t revertTimer;
boolean dsp_out_of_resources;
boolean selected;
boolean select_pending;
boolean call_not_counted_in_mnc_bt;
/*
* The media_cap holds the current media caps of the call
*/
cc_media_cap_table_t *media_cap_tbl;
/*
* Holds the remote stream track information to be passed to UI
*/
cc_media_remote_stream_table_t *remote_media_stream_tbl;
/*
* Holds the local stream track information passed in from the UI
*/
cc_media_local_track_table_t *local_media_track_tbl;
#define FSMDEF_F_HOLD_REQ_PENDING (1 << 0)/* hold feature pending */
#define FSMDEF_F_XFER_COMPLETE (1 << 1)/* hold feature pending */
uint32_t flags; /* misc. flags. */
int log_disp;
uint8_t cur_video_avail;
sdp_direction_e video_pref;
unsigned int callref; /* Callref (CI) from CUCM */
char peerconnection[PC_HANDLE_SIZE]; /* A handle to the peerconnection */
boolean peerconnection_set;
char *ice_ufrag;
char *ice_pwd;
char ice_default_candidate_addr[MAX_IPADDR_STR_LEN];
char digest_alg[FSMDEF_MAX_DIGEST_ALG_LEN];
char digest[FSMDEF_MAX_DIGEST_LEN];
} fsmdef_dcb_t;
typedef enum fsm_types_t_ {
FSM_TYPE_MIN = -1,
FSM_TYPE_NONE = FSM_TYPE_MIN,
FSM_TYPE_HEAD,
FSM_TYPE_CNF,
FSM_TYPE_B2BCNF,
FSM_TYPE_XFR,
FSM_TYPE_DEF,
FSM_TYPE_MAX
} fsm_types_t;
typedef enum fsm_hold_t_ {
FSM_HOLD_MIN = -1,
FSM_HOLD_NONE = 0,
FSM_HOLD_LCL = 1,
FSM_HOLD_MAX = 2
} fsm_hold_t;
typedef struct fsm_data_def_t_ {
int hold;
} fsm_data_def_t;
typedef struct fsm_data_xfr_t_ {
int xfr_id;
} fsm_data_xfr_t;
typedef struct fsm_data_t_ {
union {
fsm_data_def_t def;
fsm_data_xfr_t xfr;
} data;
} fsm_data_t;
typedef struct fsmcnf_ccb_t_ {
cc_srcs_t cnf_orig;
int cnf_id;
callid_t cnf_call_id;
callid_t cns_call_id;
line_t cnf_line;
line_t cns_line;
boolean active;
boolean bridged;
/* The following field encodes flags */
#define JOINED 0x1
#define XFER 0x2
#define LCL_CNF 0x4
uint32_t flags;
boolean cnf_ftr_ack;
} fsmcnf_ccb_t;
typedef enum fsmxfr_types_t_ {
FSMXFR_TYPE_MIN = -1,
FSMXFR_TYPE_NONE,
FSMXFR_TYPE_XFR,
FSMXFR_TYPE_BLND_XFR,
FSMXFR_TYPE_DIR_XFR,
FSMXFR_TYPE_MAX
} fsmxfr_types_t;
typedef enum fsmxfr_modes_t_ {
FSMXFR_MODE_MIN = -1,
FSMXFR_MODE_TRANSFEROR,
FSMXFR_MODE_TRANSFEREE,
FSMXFR_MODE_TARGET
} fsmxfr_modes_t;
struct fsmxfr_xcb_t_;
typedef struct fsmxfr_xcb_t_ {
cc_srcs_t xfr_orig;
int xfr_id;
callid_t xfr_call_id;
callid_t cns_call_id;
line_t xfr_line;
line_t cns_line;
fsmxfr_types_t type;
cc_xfer_methods_t method;
char *dialstring;
char *queued_dialstring;
char *referred_by;
boolean active;
boolean cnf_xfr;
boolean xfer_comp_req;
fsmxfr_modes_t mode;
struct fsmxfr_xcb_t_ *xcb2;
} fsmxfr_xcb_t;
typedef struct fsm_fcb_t_ {
callid_t call_id;
int state;
int old_state;
fsm_types_t fsm_type;
/*
* fsmdef specific data
*/
fsmdef_dcb_t *dcb;
/*
* fsmxfr specific data
*/
fsmxfr_xcb_t *xcb;
/*
* fsmcnf specific data
*/
fsmcnf_ccb_t *ccb;
/*
* fsmb2bcnf specific data
*/
fsmcnf_ccb_t *b2bccb;
} fsm_fcb_t;
typedef enum {
FSMDEF_MSG_MIN = -1,
FSMDEF_MSG_NONE = 0,
FSMDEF_MSG_SETUP = 1,
FSMDEF_MSG_SETUP_ACK = 2,
FSMDEF_MSG_PROCEEDING = 4,
FSMDEF_MSG_ALERTING = 8,
FSMDEF_MSG_CONNECTED = 16,
FSMDEF_MSG_CONNECTED_ACK = 32,
FSMDEF_MSG_RELEASE = 64,
FSMDEF_MSG_RELEASE_COMPLETE = 128,
FSMDEF_MSG_MAX
} fsmdef_msgs_t;
#define FSM_FOR_ALL_CBS(cb, cbs, max_cbs) \
for ((cb) = (cbs); (cb) <= &((cbs)[(max_cbs-1)]); (cb)++)
#define FSM_CHK_FLAGS(flags, flag) ((flags) & (flag))
#define FSM_SET_FLAGS(flags, flag) ((flags) |= (flag))
#define FSM_RESET_FLAGS(flags, flag) ((flags) &= ~(flag))
void *fsmdef_feature_timer_timeout(cc_features_t feature_id, void *);
void fsmdef_end_call(fsmdef_dcb_t *dcb, cc_causes_t cause);
void fsm_sm_ftr(cc_features_t ftr_id, cc_srcs_t src_id);
void fsm_sm_ignore_ftr(fsm_fcb_t *fcb, int fname,
cc_features_t ftr_id);
void fsm_sm_ignore_src(fsm_fcb_t *fcb, int fname, cc_srcs_t src_id);
const char *fsm_state_name(fsm_types_t type, int id);
const char *fsm_type_name(fsm_types_t type);
fsmdef_dcb_t *fsm_get_dcb(callid_t call_id);
void fsm_init_scb(fim_icb_t *icb, callid_t call_id);
fsm_fcb_t *fsm_get_fcb_by_call_id(callid_t call_id);
fsm_fcb_t *fsm_get_fcb_by_call_id_and_type(callid_t call_id, fsm_types_t type);
void
fsm_get_fcb_by_selected_or_connected_call_fcb(callid_t call_id, fsm_fcb_t **con_fcb_found,
fsm_fcb_t **sel_fcb_found);
fsm_fcb_t *fsm_get_new_fcb(callid_t call_id, fsm_types_t fsm_type);
void fsm_init(void);
void fsm_shutdown(void);
void fsm_release(fsm_fcb_t *fcb, int fname, cc_causes_t cause);
void fsm_change_state(fsm_fcb_t *fcb, int fname, int new_state);
void fsm_init_fcb(fsm_fcb_t *fcb, callid_t call_id, fsmdef_dcb_t *dcb,
fsm_types_t type);
void fsm_display_no_free_lines(void);
void fsm_display_use_line_or_join_to_complete(void);
void fsm_display_feature_unavailable(void);
void fsm_set_call_status_feature_unavailable(callid_t call_id, line_t line);
cc_causes_t fsm_get_new_outgoing_call_context(callid_t call_id, line_t line,
fsm_fcb_t *fcb, boolean expline);
cc_causes_t fsm_get_new_incoming_call_context(callid_t call_id, fsm_fcb_t *fcb,
const char *called_number,
boolean expline);
sm_rcs_t fsmdef_release(fsm_fcb_t *fcb, cc_causes_t cause,
boolean send_release);
int fsmdef_get_call_type_by_call_id(callid_t call_id);
fsmdef_call_types_t fsmdef_get_call_id_by_call_ref(int call_ref);
fsmdef_dcb_t *fsmdef_get_dcb_by_call_id(callid_t call_id);
void fsmdef_init_dcb(fsmdef_dcb_t *dcb, callid_t call_id,
fsmdef_call_types_t call_type,
const char *called_number, line_t line,
fsm_fcb_t *fcb);
cc_causes_t fsm_set_fcb_dcbs (fsmdef_dcb_t *dcb);
fsmdef_dcb_t *fsmdef_get_new_dcb(callid_t call_id);
void fsmdef_init(void);
int fsmdef_get_active_call_cnt(callid_t callId);
fsmdef_dcb_t *fsmdef_get_connected_call(void);
boolean fsmdef_are_join_calls_on_same_line(line_t line);
boolean fsmdef_are_there_selected_calls_onotherline(line_t line);
fsmdef_dcb_t *fsmdef_get_other_dcb_by_line(callid_t call_id, line_t line);
int fsmdef_get_dcbs_in_held_state(fsmdef_dcb_t **dcb,
callid_t ignore_call_id);
sm_rcs_t fsmdef_offhook(fsm_fcb_t *fcb, cc_msgs_t msg_id, callid_t call_id,
line_t line, const char *dial_string, sm_event_t *event,
char *global_call_id, callid_t prim_call_id,
cc_hold_resume_reason_e consult_reason,
monitor_mode_t monitor_mode);
sm_rcs_t fsmdef_dialstring(fsm_fcb_t *fcb, const char *dialstring,
cc_redirect_t *redirect, boolean replace,
cc_call_info_t *call_info);
fsmcnf_ccb_t *fsmcnf_get_ccb_by_call_id(callid_t call_id);
callid_t fsmcnf_get_other_call_id(fsmcnf_ccb_t *ccb, callid_t call_id);
void fsmxfr_update_xfr_context(fsmxfr_xcb_t *xcb, callid_t old_call_id,
callid_t new_call_id);
fsmxfr_xcb_t *fsmxfr_get_xcb_by_call_id(callid_t call_id);
callid_t fsmxfr_get_other_call_id(fsmxfr_xcb_t *xcb, callid_t call_id);
fsmxfr_types_t fsmxfr_get_xfr_type(callid_t call_id);
cc_features_t fsmxfr_type_to_feature(fsmxfr_types_t type);
#ifdef _WIN32
extern void NotifyStateChange(callid_t callid, int32_t state);
#define NOTIFY_STATE_CHANGE(fcb,callid,state) NotifyStateChange(callid,state);dcsm_update_gsm_state(fcb,callid,state)
#else
#define NOTIFY_STATE_CHANGE(fcb,callid,state) dcsm_update_gsm_state(fcb,callid,state)
#endif
const char *fsmdef_state_name(int id);
const char *fsmxfr_state_name(int id);
const char *fsmcnf_state_name(int id);
void fsm_cac_init(void);
void fsmcnf_init(void);
void fsmxfr_init(void);
void fsmdef_init(void);
void fsmcnf_shutdown(void);
void fsmxfr_shutdown(void);
void fsmdef_shutdown(void);
void fsm_cac_shutdown(void);
void fsm_cac_call_release_cleanup(callid_t call_id);
void fsmdef_reversion_timeout(callid_t call_id);
void fsm_cac_process_bw_fail_timer(void *tmr_data);
void fsmdef_auto_answer_timeout(void *);
const char *fsmb2bcnf_state_name(int id);
void fsmb2bcnf_init(void);
void fsmb2bcnf_shutdown(void);
int fsmutil_is_b2bcnf_consult_call(callid_t call_id);
callid_t fsmxfr_get_consult_call_id(callid_t call_id);
callid_t fsmb2bcnf_get_consult_call_id(callid_t call_id);
callid_t fsmb2bcnf_get_primary_call_id(callid_t call_id);
boolean fsmdef_check_if_ok_for_dial_call(line_t line);
boolean fsmdef_check_if_ok_to_ans_call(line_t line, callid_t call_id);
boolean fsmdef_check_if_ok_to_resume_call(line_t line, callid_t call_id);
boolean fsmdef_check_if_ok_to_hold_call(line_t line, callid_t call_id);
boolean fsmdef_check_if_ok_to_monitor_update_call(line_t line, callid_t call_id);
boolean fsmdef_check_if_ok_to_run_feature(line_t line, callid_t call_id);
fsmdef_dcb_t *fsmdef_get_dcb_by_call_instance_id(line_t line,
uint16 call_instance_id);
boolean fsmb2bcnf_check_if_ok_to_setup_conf (callid_t call_id);
boolean fsmdef_check_if_chaperone_call_exist (void);
void fsmdef_call_cc_state_dialing(fsmdef_dcb_t *dcb, boolean suppressStutter);
/* This macro is to identify incoming joining call */
#define fsm_is_joining_call(feat_data) \
((feat_data.newcall.join.join_call_id != CC_NO_CALL_ID) && \
((feat_data.newcall.cause == CC_CAUSE_BARGE) || \
(feat_data.newcall.cause == CC_CAUSE_MONITOR)))
/* These macros are for SRTP support */
#define FSM_GET_SECURITY_STATUS(dcb) (dcb->security)
#define FSM_SET_SECURITY_STATUS(dcb, status) (dcb->security = status)
#define FSM_GET_POLICY(dcb) (dcb->policy)
#define FSM_SET_POLICY(dcb, status) (dcb->policy = status)
#define FSM_GET_CACHED_ORIENTATION(dcb) (dcb->orientation)
#define FSM_SET_CACHED_ORIENTATION(dcb, value) (dcb->orientation = value)
#define FSM_NEGOTIATED_CRYPTO_ALGORITHM_ID(media) \
((media->transport == SDP_TRANSPORT_RTPSAVP || \
media->transport == SDP_TRANSPORT_RTPSAVPF) ? \
media->negotiated_crypto.algorithmID : VCM_NO_ENCRYPTION)
#define FSM_NEGOTIATED_CRYPTO_RX_KEY(media) \
&media->negotiated_crypto.rx_key
#define FSM_NEGOTIATED_CRYPTO_TX_KEY(media) \
&media->negotiated_crypto.tx_key
#define FSM_NEGOTIATED_CRYPTO_DIGEST_ALGORITHM(media) \
media->negotiated_crypto.algorithm
#define FSM_NEGOTIATED_CRYPTO_DIGEST(media) \
media->negotiated_crypto.digest
int fsmutil_get_call_attr(fsmdef_dcb_t *dcb, line_t line, callid_t call_id);
uint16_t fsmutil_get_ci_id(line_t line);
void fsmutil_init_ci_map(void);
void fsmdef_platform_dcb_init(fsmdef_dcb_t *dcb);
void fsmutil_free_all_ci_id(void);
void fsmutil_free_ci_id(uint16_t id, line_t line);
void fsmutil_set_ci_id(uint16_t id, line_t line);
void fsmutil_free_ci_map(void);
void fsmutil_show_ci_map(void);
void fsmutil_init_shown_calls_ci_map(void);
void fsmutil_free_all_shown_calls_ci_map(void);
void fsmutil_clear_shown_calls_ci_element(uint16_t id, line_t line);
void fsmutil_set_shown_calls_ci_element(uint16_t id, line_t line);
boolean fsmutil_is_shown_calls_ci_element_set(uint16_t id, line_t line);
callid_t fsmxfr_get_primary_call_id(callid_t call_id);
uint16_t fsmutil_get_num_selected_calls(void);
int fsmutil_is_cnf_consult_call(callid_t call_id);
int fsmutil_is_cnf_consult_leg(callid_t call_id, fsmcnf_ccb_t *fsmcnf_ccbs,
uint16_t max_ccbs);
int fsmutil_is_xfr_consult_call(callid_t call_id);
int fsmutil_is_xfr_consult_leg(callid_t call_id, fsmxfr_xcb_t *fsmxfr_xcbs,
uint16_t max_xcbs);
void fsmutil_init_groupid(fsmdef_dcb_t *dcb, callid_t call_id,
fsmdef_call_types_t call_type);
void fsmutil_process_feature_ack(fsmdef_dcb_t *dcb, cc_features_t feature_id);
void fsmutil_clear_all_feature_invocation_state(fsmdef_dcb_t *dcb);
void fsmutil_init_feature_invocation_state(fsmdef_dcb_t *dcb);
void fsmutil_free_feature_invocation_state(fsmdef_dcb_t *dcb);
void fsmdef_error_onhook_timeout(void *data);
int fsmutil_is_xfr_leg(callid_t call_id, fsmxfr_xcb_t *fsmxfr_xcbs,
unsigned short max_xcbs);
int fsmutil_is_cnf_leg(callid_t call_id, fsmcnf_ccb_t *fsmcnf_ccbs,
unsigned short max_ccbs);
void fsm_display_control_ringin_calls(boolean hide);
void fsmdef_update_media_cap_feature_event(cc_feature_t *msg);
boolean fsmcnd_conf_call_id_valid(fsmcnf_ccb_t *ccb);
boolean fsmdef_check_retain_fwd_info_state(void);
#endif

View File

@ -1,59 +0,0 @@
/* 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/. */
#ifndef _GSM_H_
#define _GSM_H_
#include "cpr_types.h"
#include "cpr_memory.h"
#include "cpr_ipc.h"
#include "cpr_stdio.h"
#define GSM_ERR_MSG err_msg
typedef void(* media_timer_callback_fp) (void);
void gsm_set_media_callback(media_timer_callback_fp* callback);
void gsm_set_initialized(void);
cpr_status_e gsm_send_msg(uint32_t cmd, cprBuffer_t buf, uint16_t len);
cprBuffer_t gsm_get_buffer(uint16_t size);
boolean gsm_is_idle(void);
/*
* List of timers that the GSM task is responsible for.
* CPR will send a msg to the GSM task when these
* timers expire. CPR expects a timer id when the timer
* is created, this enum serves that purpose.
*/
typedef enum {
GSM_ERROR_ONHOOK_TIMER,
GSM_AUTOANSWER_TIMER,
GSM_DIAL_TIMEOUT_TIMER,
GSM_KPML_INTER_DIGIT_TIMER,
GSM_KPML_CRITICAL_DIGIT_TIMER,
GSM_KPML_EXTRA_DIGIT_TIMER,
GSM_KPML_SUBSCRIPTION_TIMER,
GSM_MULTIPART_TONES_TIMER,
GSM_CONTINUOUS_TONES_TIMER,
GSM_REQ_PENDING_TIMER,
GSM_RINGBACK_DELAY_TIMER,
GSM_REVERSION_TIMER,
GSM_FLASH_ONCE_TIMER,
GSM_CAC_FAILURE_TIMER,
GSM_TONE_DURATION_TIMER
} gsmTimerList_t;
/*
* The common code creating the GSM timers needs to have
* access to the gsm_msg_queue variable since CPR
* needs to know where to send the timer expiration
* message.
*/
extern cprMsgQueue_t gsm_msg_queue;
extern void kpml_process_msg(uint32_t cmd, void *msg);
extern void dp_process_msg(uint32_t cmd, void *msg);
extern void kpml_init(void);
extern void kpml_shutdown(void);
#endif

View File

@ -1,139 +0,0 @@
/* 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/. */
#ifndef _GSM_SDP_H_
#define _GSM_SDP_H_
#define GSMSDP_VERSION_STR_LEN (20)
#define GSMSDP_MEDIA_VALID(media) \
((media != NULL) && (media->refid != CC_NO_MEDIA_REF_ID))
#define GSMSDP_MEDIA_ENABLED(media) \
(GSMSDP_MEDIA_VALID(media) && (media->src_port != 0))
#define GSMSDP_MEDIA_COUNT(dcb) \
(SLL_LITE_NODE_COUNT(&dcb->media_list))
#define GSMSDP_FIRST_MEDIA_ENTRY(dcb) \
((fsmdef_media_t *)SLL_LITE_LINK_HEAD(&dcb->media_list))
#define GSMSDP_NEXT_MEDIA_ENTRY(media) \
((fsmdef_media_t *)SLL_LITE_LINK_NEXT_NODE(media))
#define GSMSDP_FOR_MEDIA_LIST(media, start_media, end_media, dcb) \
for (media = start_media; (media != NULL); \
media = (media != end_media ? \
GSMSDP_NEXT_MEDIA_ENTRY(media) : NULL))
#define GSMSDP_FOR_ALL_MEDIA(media, dcb) \
for (media = GSMSDP_FIRST_MEDIA_ENTRY(dcb); (media != NULL); \
media = GSMSDP_NEXT_MEDIA_ENTRY(media))
typedef struct {
const char *name;
int value;
} gsmsdp_key_table_entry_t;
typedef enum constraints_ {
OfferToReceiveAudio = 0,
OfferToReceiveVideo = 1,
VoiceActivityDetection = 2
} constraints;
static const gsmsdp_key_table_entry_t constraints_table[] = {
{"OfferToReceiveAudio", OfferToReceiveAudio},
{"OfferToReceiveVideo", OfferToReceiveVideo},
{"VoiceActivityDetection", VoiceActivityDetection}
};
cc_causes_t gsmsdp_create_local_sdp(fsmdef_dcb_t *dcb_p, boolean force_streams_enabled,
boolean audio, boolean video, boolean data, boolean offer);
void gsmsdp_create_options_sdp(cc_sdp_t **sdp_pp);
void gsmsdp_reset_local_sdp_media(fsmdef_dcb_t *dcb, fsmdef_media_t *media,
boolean hold);
void gsmsdp_set_local_sdp_direction(fsmdef_dcb_t *dcb_p, fsmdef_media_t *media,
sdp_direction_e direction);
void gsmsdp_set_local_hold_sdp(fsmdef_dcb_t *dcb, fsmdef_media_t *media);
void gsmsdp_set_local_resume_sdp(fsmdef_dcb_t *dcb, fsmdef_media_t *media);
cc_causes_t gsmsdp_negotiate_answer_sdp(fsm_fcb_t *fcb,
cc_msgbody_info_t *msg_body);
cc_causes_t gsmsdp_negotiate_offer_sdp(fsm_fcb_t *fcb,
cc_msgbody_info_t *msg_body,
boolean init);
cc_causes_t gsmsdp_process_offer_sdp(fsm_fcb_t *fcb,
cc_msgbody_info_t *msg_body,
boolean init);
cc_causes_t
gsmsdp_negotiate_media_lines (fsm_fcb_t *fcb_p, cc_sdp_t *sdp_p, boolean initial_offer,
boolean offer, boolean notify_stream_added, boolean create_answer);
boolean gsmsdp_sdp_differs_from_previous_sdp(boolean rcv_only,
fsmdef_media_t *media);
cc_causes_t gsmsdp_encode_sdp(cc_sdp_t *sdp_p, cc_msgbody_info_t *msg_body);
cc_causes_t gsmsdp_encode_sdp_and_update_version(fsmdef_dcb_t *dcb_p,
cc_msgbody_info_t *msg_body);
void gsmsdp_free(fsmdef_dcb_t *dcb_p);
fsmdef_media_t *gsmsdp_find_audio_media(fsmdef_dcb_t *dcb_p);
#define gsmsdp_is_srtp_supported() (TRUE)
extern void gsmsdp_init_sdp_media_transport(fsmdef_dcb_t *dcb,
void *sdp,
fsmdef_media_t *media);
extern void gsmsdp_reset_sdp_media_transport(fsmdef_dcb_t *dcb,
void *sdp,
fsmdef_media_t *media,
boolean hold);
extern sdp_transport_e gsmsdp_negotiate_media_transport(fsmdef_dcb_t *dcb_p,
cc_sdp_t *cc_sdp_p,
boolean offer,
fsmdef_media_t *media,
uint16_t *inst_num,
uint16 level);
extern void gsmsdp_update_local_sdp_media_transport(fsmdef_dcb_t *dcb_p,
void *sdp_p,
fsmdef_media_t *media,
sdp_transport_e transport,
boolean all);
extern void gsmsdp_update_negotiated_transport(fsmdef_dcb_t *dcb_p,
cc_sdp_t *cc_sdp_p,
fsmdef_media_t *media,
uint16_t crypto_inst,
sdp_transport_e transport,
uint16 level);
extern void gsmsdp_update_crypto_transmit_key(fsmdef_dcb_t *dcb_p,
fsmdef_media_t *media,
boolean offer,
boolean initial_offer,
sdp_direction_e direction);
extern void gsmsdp_set_media_transport_for_option(void *sdp, uint16 level);
extern boolean gsmsdp_is_crypto_ready(fsmdef_media_t *media, boolean rx);
extern boolean gsmsdp_is_media_encrypted(fsmdef_dcb_t *dcb_p);
extern boolean gsmsdp_crypto_params_change(boolean rcv_only,
fsmdef_media_t *media);
extern void gsmsdp_crypto_reset_params_change(fsmdef_media_t *media);
extern void gsmsdp_cache_crypto_keys(void);
extern boolean gsmsdp_create_free_media_list(void);
extern void gsmsdp_destroy_free_media_list(void);
extern void gsmsdp_init_media_list(fsmdef_dcb_t *dcb_p);
extern void gsmsdp_clean_media_list(fsmdef_dcb_t *dcb);
extern fsmdef_media_t *gsmsdp_find_media_by_refid(fsmdef_dcb_t *dcb_p,
media_refid_t refid);
extern boolean gsmsdp_handle_media_cap_change(fsmdef_dcb_t *dcb_p,
boolean refresh, boolean hold);
extern boolean gsmsdp_update_local_sdp_media_capability(fsmdef_dcb_t *dcb_p,
boolean refresh, boolean hold);
boolean is_gsmsdp_media_ip_updated_to_latest( fsmdef_dcb_t * dcb );
void gsmsdp_add_remote_stream(uint16_t idx, int pc_stream_id, fsmdef_dcb_t * dcb, fsmdef_media_t *media);
cc_causes_t gsmsdp_install_peer_ice_attributes(fsm_fcb_t *fcb_p);
cc_causes_t gsmsdp_configure_dtls_data_attributes(fsm_fcb_t *fcb_p);
cc_causes_t gsmsdp_find_level_from_mid(fsmdef_dcb_t * dcb, const char * mid, uint16_t *level);
void gsmsdp_process_cap_constraints(fsmdef_dcb_t *dcb, const cc_media_constraints_t* constraints);
cc_causes_t
gsmsdp_get_offered_media_types (fsm_fcb_t *fcb_p, cc_sdp_t *sdp_p, boolean *has_audio, boolean *has_video, boolean *has_data);
fsmdef_media_t* gsmsdp_find_media_by_media_type(fsmdef_dcb_t *dcb, sdp_media_e media_type);
#endif

View File

@ -1,180 +0,0 @@
/* 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/. */
#ifndef _LSM_H_
#define _LSM_H_
#include "cpr_types.h"
#include "ccapi.h"
#include "uiapi.h"
#include "fsm.h"
#define LSM_NO_LINE (0)
#define LSM_NO_INSTANCE (0)
#define NO_LINES_AVAILABLE (0)
/* FIXME GS - Breaking my own rule - need to figure out how to do a platform
* specific include file here
*/
#define LSM_MAX_LINES MAX_REG_LINES
#define LSM_MAX_INSTANCES (MAX_CALLS_PER_LINE-1)
#define LSM_MAX_EXP_INSTANCES MAX_CALLS_PER_LINE
#define LSM_MAX_CALLS MAX_CALLS
#define NO_FREE_LINES_TIMEOUT (10)
#define CALL_ALERT_TIMEOUT (10)
/*
* Used to play busy verfication tone
*/
#define BUSY_VERIFICATION_DELAY (10000)
/*
* Temp until added to config
*/
#define TOH_DELAY (10000)
/*
* Used to play msg waiting and stutter dialtones.
* Both tones are 100ms on/off repeating 10 and
* 3 times respectively, followed by steady dialtone.
* Due to DSP limitations we first tell the DSP to
* play the 100ms on/off pairs the correct number of
* times, set a timer, and then tell it to play dialtone.
*/
#define MSG_WAITING_DELAY (2050)
#define STUTTER_DELAY (650)
/*
* Used to play the busy verfication tone which
* is two seconds of dialtone followed by the
* callwaiting tone every ten seconds.
*/
#define BUSY_VERIFY_DELAY (12000)
/* LSM states */
typedef enum {
LSM_S_MIN = -1,
LSM_S_NONE = LSM_S_MIN,
LSM_S_IDLE,
LSM_S_PENDING,
LSM_S_OFFHOOK,
LSM_S_ONHOOK,
LSM_S_PROCEED,
LSM_S_RINGOUT,
LSM_S_RINGIN,
LSM_S_CONNECTED,
LSM_S_BUSY,
LSM_S_CONGESTION,
LSM_S_HOLDING,
LSM_S_CWT,
LSM_S_XFER,
LSM_S_ATTN_XFER,
LSM_S_CONF,
LSM_S_INVALID_NUMBER,
LSM_S_MAX
} lsm_states_t;
boolean lsm_is_phone_idle(void);
int lsm_get_instances_available_cnt(line_t line, boolean expline);
void lsm_increment_call_chn_cnt(line_t line);
void lsm_decrement_call_chn_cnt(line_t line);
line_t lsm_get_newcall_line(line_t line);
callid_t lsm_get_active_call_id(void);
line_t lsm_get_line_by_call_id(callid_t call_id);
/*
* The lsm_get_facility_by_called_number() and the lsm_get_facility_by_line()
* below are defined to allow be used by fsm state mechine to bind the
* LSM to the FSM default state machine only.
*/
cc_causes_t lsm_get_facility_by_called_number(callid_t call_id,
const char *called_number,
line_t *free_line,
boolean expline, void *dcb);
cc_causes_t lsm_get_facility_by_line(callid_t call_id, line_t line,
boolean exp, void *dcb);
char lsm_digit2ch(int digit);
void lsm_set_active_call_id(callid_t call_id);
void lsm_init(void);
void lsm_shutdown(void);
void lsm_reset(void);
void lsm_ui_display_notify(const char *pNotifyStr, unsigned long timeout);
void lsm_ui_display_status(const char *pStatusStr, line_t line,
callid_t call_id);
string_t lsm_parse_displaystr(string_t displaystr);
void lsm_speaker_mode(short mode);
void lsm_add_remote_stream (line_t line, callid_t call_id, fsmdef_media_t *media, int *pc_stream_id);
#ifdef _WIN32
void terminate_active_calls(void);
#endif
const char *lsm_state_name(lsm_states_t id);
void lsm_set_cfwd_all_nonccm(line_t line, char *callfwd_dialstring);
void lsm_set_cfwd_all_ccm(line_t line, char *callfwd_dialstring);
void lsm_clear_cfwd_all_nonccm(line_t line);
void lsm_clear_cfwd_all_ccm(line_t line);
int lsm_check_cfwd_all_nonccm(line_t line);
int lsm_check_cfwd_all_ccm(line_t line);
char *lsm_is_phone_forwarded(line_t line);
void lsm_tmr_tones_callback(void *);
void lsm_update_placed_callinfo(void *dcb);
void lsm_start_multipart_tone_timer(vcm_tones_t tone, uint32_t delay,
callid_t callId);
void lsm_start_continuous_tone_timer(vcm_tones_t tone, uint32_t delay,
callid_t callId);
void lsm_start_tone_duration_timer(vcm_tones_t tone, uint32_t delay,
cc_call_handle_t call_handle);
void lsm_stop_multipart_tone_timer(void);
void lsm_stop_continuous_tone_timer(void);
void lsm_stop_tone_duration_timer(void);
void lsm_tone_duration_tmr_callback(void *data);
void lsm_tone_start_with_duration (vcm_tones_t tone, short alert_info, cc_call_handle_t call_handle, groupid_t group_id,
streamid_t stream_id, uint16_t direction, uint32_t duration);
void lsm_update_active_tone(vcm_tones_t tone, callid_t call_id);
boolean lsm_is_tx_channel_opened(callid_t call_id);
void lsm_update_monrec_tone_action (vcm_tones_t tone, callid_t call_id, uint16_t direction);
void lsm_downgrade_monrec_tone_action(vcm_tones_t tone, callid_t call_id);
char *lsm_get_gdialed_digits();
void lsm_set_hold_ringback_status(callid_t call_id, boolean ringback_status);
extern callid_t lsm_get_ui_id(callid_t call_id);
extern cc_call_handle_t lsm_get_ms_ui_call_handle(line_t line, callid_t call_id, callid_t ui_id);
extern void lsm_set_ui_id(callid_t call_id, callid_t ui_id);
extern lsm_states_t lsm_get_state(callid_t call_id);
extern void lsm_set_lcb_dusting_call(callid_t call_id);
extern void lsm_set_lcb_call_priority(callid_t call_id);
extern boolean lsm_is_it_priority_call(callid_t call_id);
extern void lsm_play_tone(cc_features_t feature_id);
extern boolean lsm_callwaiting(void);
extern void lsm_display_control_ringin_call (callid_t call_id, line_t line, boolean hide);
extern line_t lsm_find_next_available_line(line_t line, boolean same_dn, boolean incoming);
extern line_t lsm_get_available_line (boolean incoming);
extern boolean lsm_is_line_available(line_t line, boolean incoming);
extern void lsm_ui_display_notify_str_index(int str_index);
extern cc_causes_t lsm_allocate_call_bandwidth(callid_t call_id, int sessions);
extern void lsm_update_gcid(callid_t call_id, char * gcid);
extern void lsm_set_lcb_prevent_ringing(callid_t call_id);
extern void lsm_remove_lcb_prevent_ringing(callid_t call_id);
extern void lsm_set_lcb_dialed_str_flag(callid_t call_id);
void lsm_update_video_avail(line_t line, callid_t call_id, int dir);
void lsm_update_video_offered(line_t line, callid_t call_id, int dir);
callid_t lsm_get_callid_from_ui_id (callid_t uid);
void lsm_set_video_mute (callid_t call_id, int mute);
int lsm_get_video_mute (callid_t call_id);
void lsm_set_video_window (callid_t call_id, int flags, int x, int y, int h, int w);
void lsm_get_video_window (callid_t call_id, int *flags, int *x, int *y, int *h, int *w);
boolean lsm_is_kpml_subscribed (callid_t call_id);
void
lsm_util_tone_start_with_speaker_as_backup (vcm_tones_t tone, short alert_info,
cc_call_handle_t call_handle, groupid_t group_id,
streamid_t stream_id, uint16_t direction);
void lsm_data_channel_negotiated (line_t line, callid_t call_id, fsmdef_media_t *media, int *pc_stream_id);
#endif //_LSM_H_

View File

@ -1,58 +0,0 @@
/* 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/. */
#ifndef _LSM_PRIV_H_
#define _LSM_PRIV_H_
#include "phone_types.h"
#include "ccapi.h"
#define LSM_ERR_MSG err_msg
#define LSM_DEFAULT_LINE (1)
#define LSM_DEFAULT_INSTANCE (1)
#define LSM_DEFAULT_PLANE (1)
#define LSM_DEFAULT_SPEAKER (0)
#define LSM_MAX_LCBS (LSM_MAX_CALLS)
#define LSM_FLAGS_SECURE_MEDIA (1 << 0) /* encrypted tx media */
#define LSM_FLAGS_SECURE_MEDIA_UPDATE (1 << 1) /* update secure media icon needed */
#define LSM_FLAGS_ANSWER_PENDING (1 << 2) /* answer is pending */
#define LSM_FLAGS_DIALED_STRING (1 << 3) /* dialed a string */
#define LSM_FLAGS_CALL_PRIORITY_URGENT (1 << 4)
#define LSM_FLAGS_PREVENT_RINGING (1 << 5)
#define LSM_FLAGS_DUSTING (1 << 6) /* the call is a dusting call */
typedef struct lsm_lcb_t_ {
callid_t call_id;
line_t line;
call_events previous_call_event;
lsm_states_t state;
int mru;
boolean enable_ringback;
callid_t ui_id;
uint32_t flags;
fsmdef_dcb_t *dcb; /* the corresponding DCB chain for this lcm */
char *gcid; /*global call identifier */
int vid_mute;
int vid_flags;
int vid_x;
int vid_y;
int vid_h;
int vid_w;
} lsm_lcb_t;
typedef struct lsm_info_t_ {
int call_in_progress;
callid_t active_call_id;
int active_call_plane;
line_t primary_line;
int speaker;
} lsm_info_t;
lsm_lcb_t *lsm_get_lcb_by_call_id(callid_t call_id);
#endif

View File

@ -1,44 +0,0 @@
/* 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/. */
#ifndef _SM_H_
#define _SM_H_
#include "phone_debug.h"
typedef enum {
SM_RC_MIN = -2,
SM_RC_ERROR = -1,
SM_RC_SUCCESS,
SM_RC_CONT,
SM_RC_DEF_CONT,
SM_RC_END,
SM_RC_CLEANUP,
SM_RC_FSM_ERROR,
SM_RC_CSM_ERROR,
SM_RC_MAX
} sm_rcs_t;
typedef struct _sm_event_t {
int state;
int event;
void *data;
void *msg;
} sm_event_t;
typedef sm_rcs_t (*sm_function_t)(sm_event_t *event);
typedef struct _sm_table_t {
int min_state;
int max_state;
int min_event;
int max_event;
sm_function_t *table;
} sm_table_t;
sm_rcs_t sm_process_event(sm_table_t *tbl, sm_event_t *event );
sm_rcs_t sm_process_event2(int state_id, int event_id, sm_table_t *tbl,
void *msg, void *cb);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,158 +0,0 @@
/* 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 <cpr_types.h>
#include "ccapi.h"
#include "phone_debug.h"
#include "cc_debug.h"
#include "CCProvider.h"
#include "ccapi_snapshot.h"
/**
* global media cap table for interaction between what platform
* can do and the GSM-SDP module
* AUDIO_1 is used for audio cannot be turned off
* VIDEO_1 is used for video
*/
cc_media_cap_table_t g_media_table = {
1,
{
{CC_AUDIO_1,SDP_MEDIA_AUDIO,TRUE,TRUE,SDP_DIRECTION_RECVONLY},
{CC_VIDEO_1,SDP_MEDIA_VIDEO,TRUE,TRUE,SDP_DIRECTION_RECVONLY},
{CC_DATACHANNEL_1,SDP_MEDIA_APPLICATION,FALSE,TRUE,SDP_DIRECTION_SENDRECV},
}
};
static boolean g_nativeVidSupported = FALSE;
static boolean g_vidCapEnabled = FALSE;
static boolean g_natve_txCap_enabled = FALSE;
/**
* Simple method to trigger escalation and deescalation
* based on media capability changes
*/
void escalateDeescalate() {
g_media_table.id++;
if ( ccapp_get_state() != CC_INSERVICE ) {
VCM_DEBUG(MED_F_PREFIX"Ignoring video cap update\n", "escalateDeescalate");
return;
}
//post the event
cc_int_feature(CC_SRC_UI, CC_SRC_GSM, CC_NO_CALL_ID,
CC_NO_LINE, CC_FEATURE_UPD_MEDIA_CAP, NULL);
}
cc_boolean cc_media_isTxCapEnabled() {
return g_natve_txCap_enabled;
}
cc_boolean cc_media_isVideoCapEnabled() {
if ( g_nativeVidSupported ) {
return g_vidCapEnabled;
}
return FALSE;
}
/**
* API to update the local video cap in the table
* called when native video support or vidCap cfg changes
*
* This method looks at video cap in cfg & native vid support on platform
*/
static void updateVidCapTbl(){
if ( g_vidCapEnabled ) {
if ( g_media_table.cap[CC_VIDEO_1].enabled == FALSE ) {
// cfg is enabled but cap tbl is not
if ( g_nativeVidSupported ) {
// we can do native now enable cap
g_media_table.cap[CC_VIDEO_1].enabled = TRUE;
g_media_table.cap[CC_VIDEO_1].support_direction =
g_natve_txCap_enabled?SDP_DIRECTION_SENDRECV:SDP_DIRECTION_RECVONLY;
if ( g_natve_txCap_enabled == FALSE ) {
}
escalateDeescalate();
} else {
}
}
} else {
// disable vid cap
DEF_DEBUG(MED_F_PREFIX"video capability disabled \n", "updateVidCapTbl");
if ( g_media_table.cap[CC_VIDEO_1].enabled ) {
g_media_table.cap[CC_VIDEO_1].enabled = FALSE;
escalateDeescalate();
}
}
}
/**
* API to update video capability on the device
* expected to be called once in the beginning only
*/
void cc_media_update_native_video_support(boolean val) {
DEF_DEBUG(MED_F_PREFIX"Setting native video support val=%d\n", "cc_media_update_native_video_support", val);
g_nativeVidSupported = val;
updateVidCapTbl();
}
/**
*
* API to update video capability on the device based on config
*/
void cc_media_update_video_cap(boolean val) {
DEF_DEBUG(MED_F_PREFIX"Setting video cap val=%d\n", "cc_media_update_video_cap", val);
g_vidCapEnabled = val;
updateVidCapTbl();
if ( g_nativeVidSupported ) {
ccsnap_gen_deviceEvent(CCAPI_DEVICE_EV_VIDEO_CAP_ADMIN_CONFIG_CHANGED, CC_DEVICE_ID);
}
}
/**
*
* API to update video tx capability based on camera plugin events
*/
void cc_media_update_native_video_txcap(boolean enable) {
VCM_DEBUG(MED_F_PREFIX"Setting txcap val=%d\n", "cc_media_update_video_txcap", enable);
if ( g_natve_txCap_enabled == enable ) {
// nothing to do
return;
}
g_natve_txCap_enabled = enable;
ccsnap_gen_deviceEvent(CCAPI_DEVICE_EV_CAMERA_ADMIN_CONFIG_CHANGED, CC_DEVICE_ID);
if ( g_nativeVidSupported && g_vidCapEnabled ) {
// act on camera events only iof native video is enabled
if ( g_natve_txCap_enabled ) {
} else if (g_media_table.cap[CC_VIDEO_1].enabled) {
}
g_media_table.cap[CC_VIDEO_1].support_direction =
g_natve_txCap_enabled?SDP_DIRECTION_SENDRECV:SDP_DIRECTION_RECVONLY;
escalateDeescalate();
}
}
static cc_boolean vidAutoTxPref=FALSE;
void cc_media_setVideoAutoTxPref(cc_boolean txPref){
vidAutoTxPref = txPref;
}
cc_boolean cc_media_getVideoAutoTxPref(){
return vidAutoTxPref;
}

View File

@ -1,78 +0,0 @@
/* 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 "cpr_stdio.h"
#include "sm.h"
#include "gsm.h"
#include "fsm.h"
#include "text_strings.h"
#include "ccapi.h"
sm_rcs_t
sm_process_event (sm_table_t *tbl, sm_event_t *event)
{
static const char fname[] = "sm_process_event";
int state_id = event->state;
int event_id = event->event;
sm_rcs_t rc = SM_RC_ERROR;
fsm_fcb_t *fcb = (fsm_fcb_t *) event->data;
cc_feature_t *feat_msg = NULL;
line_t line_id;
fsm_types_t fsm_type;
callid_t call_id;
sm_function_t hdlr; /* cached handler in order to compute its addr once */
/*
* validate the state and event
* and that there is a valid function for this state-event pair.
*/
if ((state_id > tbl->min_state) &&
(state_id < tbl->max_state) &&
(event_id > tbl->min_event) &&
(event_id < tbl->max_event)) {
rc = SM_RC_DEF_CONT;
/*
* Save some paramters for debuging, the event handler may
* free the fcb once returned.
*/
fsm_type = fcb->fsm_type;
call_id = fcb->call_id;
if ((hdlr = tbl->table[tbl->max_event * state_id + event_id]) != NULL) {
FSM_DEBUG_SM(DEB_F_PREFIX"%s %-4d: 0x%08lx: sm entry: (%s:%s)\n",
DEB_F_PREFIX_ARGS(FSM, fname), fsm_type_name(fsm_type), call_id,
tbl->table[tbl->max_event * state_id + event_id],
fsm_state_name(fsm_type, state_id),
cc_msg_name((cc_msgs_t)(event_id)));
rc = hdlr(event);
}
if (rc != SM_RC_DEF_CONT) {
/* For event_id == CC_MSG_FEATURE then display the
* feature associated with it.
*/
if (event_id == CC_MSG_FEATURE) {
feat_msg = (cc_feature_t *) event->msg;
}
line_id = ((cc_feature_t *) event->msg)->line;
DEF_DEBUG(DEB_L_C_F_PREFIX"%-5s :(%s:%s%s)\n",
DEB_L_C_F_PREFIX_ARGS(GSM, line_id, call_id, fname),
fsm_type_name(fsm_type),
fsm_state_name(fsm_type, state_id),
cc_msg_name((cc_msgs_t)(event_id)),
feat_msg ? cc_feature_name(feat_msg->feature_id):" ");
}
}
/*
* Invalid state-event pair.
*/
else {
GSM_ERR_MSG(GSM_F_PREFIX"illegal state-event pair: (%d <-- %d)\n",
fname, state_id, event_id);
rc = SM_RC_ERROR;
}
return rc;
}

View File

@ -1,269 +0,0 @@
/* 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 "cpr_types.h"
#include "cpr_stdio.h"
#include "cpr_string.h"
#include "cpr_memory.h"
#include "cpr_stdlib.h"
#include "ccapi.h"
#include "ccsip_task.h"
#include "debug.h"
#include "phone_debug.h"
#include "phntask.h"
#include "phone.h"
#include "text_strings.h"
#include "string_lib.h"
#include "gsm.h"
#include "vcm.h"
#include "subapi.h"
#include "misc_apps_task.h"
static void
sub_print_msg (char *pData, int len)
{
int ix;
int msg_id = *((int *)pData);
buginf("\nCCAPI: cc_msg= %s, 0x=", cc_msg_name((cc_msgs_t)msg_id));
for (ix = 0; ix < len; ix++) {
if ((ix % 8 == 0) && ix) {
buginf(" ");
}
if (ix % 24 == 0) {
buginf("\n");
}
buginf("%02x ", *pData++);
}
buginf("\n");
}
cc_rcs_t
sub_send_msg (cprBuffer_t buf, uint32_t cmd, uint16_t len, cc_srcs_t dst_id)
{
cpr_status_e rc;
CC_DEBUG_MSG sub_print_msg((char *)buf, len);
switch (dst_id) {
case CC_SRC_GSM:
rc = gsm_send_msg(cmd, buf, len);
if (rc == CPR_FAILURE) {
cpr_free(buf);
}
break;
case CC_SRC_SIP:
rc = SIPTaskSendMsg(cmd, buf, len, NULL);
if (rc == CPR_FAILURE) {
cpr_free(buf);
}
break;
case CC_SRC_MISC_APP:
rc = MiscAppTaskSendMsg(cmd, buf, len);
if (rc == CPR_FAILURE) {
cpr_free(buf);
}
break;
default:
rc = CPR_FAILURE;
break;
}
return (rc == CPR_SUCCESS) ? CC_RC_SUCCESS : CC_RC_ERROR;
}
cc_rcs_t
sub_int_subnot_register (cc_srcs_t src_id, cc_srcs_t dst_id,
cc_subscriptions_t evt_pkg, void *callback_fun,
cc_srcs_t dest_task, int msg_id, void *term_callback,
int term_msg_id, long min_duration, long max_duration)
{
sipspi_msg_t *pmsg;
pmsg = (sipspi_msg_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
pmsg->msg.subs_reg.eventPackage = evt_pkg;
pmsg->msg.subs_reg.max_duration = max_duration;
pmsg->msg.subs_reg.min_duration = min_duration;
pmsg->msg.subs_reg.subsIndCallback = (ccsipSubsIndCallbackFn_t)
callback_fun;
pmsg->msg.subs_reg.subsIndCallbackMsgID = msg_id;
pmsg->msg.subs_reg.subsIndCallbackTask = dest_task;
pmsg->msg.subs_reg.subsTermCallback = (ccsipSubsTerminateCallbackFn_t)
term_callback;
pmsg->msg.subs_reg.subsTermCallbackMsgID = term_msg_id;
return sub_send_msg((cprBuffer_t)pmsg, SIPSPI_EV_CC_SUBSCRIBE_REGISTER,
sizeof(*pmsg), dst_id);
}
/*
* Function: sub_int_subscribe()
*
* Parameters: msg_p - pointer to sipspi_msg_t (input parameter)
*
* Description: posts SIPSPI_EV_CC_SUBSCRIBE to SIP task message queue.
*
* Returns: CC_RC_ERROR - failed to post msg.
* CC_RC_SUCCESS - successful posted msg.
*/
cc_rcs_t
sub_int_subscribe (sipspi_msg_t *msg_p)
{
sipspi_msg_t *pmsg;
pmsg = (sipspi_msg_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
memcpy(pmsg, msg_p, sizeof(sipspi_msg_t));
return sub_send_msg((cprBuffer_t)pmsg, SIPSPI_EV_CC_SUBSCRIBE,
sizeof(*pmsg), CC_SRC_SIP);
}
cc_rcs_t
sub_int_subscribe_ack (cc_srcs_t src_id, cc_srcs_t dst_id, sub_id_t sub_id,
uint16_t response_code, int duration)
{
sipspi_msg_t *pmsg;
pmsg = (sipspi_msg_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
pmsg->msg.subscribe_resp.response_code = response_code;
pmsg->msg.subscribe_resp.sub_id = sub_id;
pmsg->msg.subscribe_resp.duration = duration;
return sub_send_msg((cprBuffer_t)pmsg, SIPSPI_EV_CC_SUBSCRIBE_RESPONSE,
sizeof(*pmsg), dst_id);
}
cc_rcs_t
sub_int_notify (cc_srcs_t src_id, cc_srcs_t dst_id, sub_id_t sub_id,
ccsipNotifyResultCallbackFn_t notifyResultCallback,
int subsNotResCallbackMsgID, ccsip_event_data_t * eventData,
subscriptionState subState)
{
sipspi_msg_t *pmsg;
pmsg = (sipspi_msg_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
pmsg->msg.notify.eventData = eventData;
pmsg->msg.notify.notifyResultCallback = notifyResultCallback;
pmsg->msg.notify.sub_id = sub_id;
pmsg->msg.notify.subsNotResCallbackMsgID = subsNotResCallbackMsgID;
pmsg->msg.notify.subState = subState;
return sub_send_msg((cprBuffer_t) pmsg, SIPSPI_EV_CC_NOTIFY,
sizeof(*pmsg), dst_id);
}
/*
* Function: sub_int_notify_ack()
*
* Parameters: sub_id - subcription id for sip stack to track the subscription.
* response_code - response code to be sent in response to NOTIFY.
* cseq : CSeq for which response is being sent.
*
* Description: posts SIPSPI_EV_CC_NOTIFY_RESPONSE to SIP task message queue.
*
* Returns: CC_RC_ERROR - failed to post msg.
* CC_RC_SUCCESS - successful posted msg.
*/
cc_rcs_t
sub_int_notify_ack (sub_id_t sub_id, uint16_t response_code, uint32_t cseq)
{
sipspi_msg_t *pmsg;
pmsg = (sipspi_msg_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
pmsg->msg.notify_resp.sub_id = sub_id;
pmsg->msg.notify_resp.response_code = response_code;
pmsg->msg.notify_resp.cseq = cseq;
return sub_send_msg((cprBuffer_t)pmsg, SIPSPI_EV_CC_NOTIFY_RESPONSE,
sizeof(*pmsg), CC_SRC_SIP);
}
/*
* Function: sub_int_subscribe_term()
*
* Parameters: sub_id - subcription id for sip stack to track the subscription.
* immediate - boolean flag to indicate if the termination be immediate.
* request_id - request id significant for out going subscriptions
* event_package - event package type
*
* Description: posts SIPSPI_EV_CC_SUBSCRIPTION_TERMINATED to SIP task message queue.
*
* Returns: CC_RC_ERROR - failed to post msg.
* CC_RC_SUCCESS - successful posted msg.
*/
cc_rcs_t
sub_int_subscribe_term (sub_id_t sub_id, boolean immediate, int request_id,
cc_subscriptions_t event_package)
{
sipspi_msg_t *pmsg;
pmsg = (sipspi_msg_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
pmsg->msg.subs_term.immediate = immediate;
pmsg->msg.subs_term.sub_id = sub_id;
pmsg->msg.subs_term.request_id = request_id;
pmsg->msg.subs_term.eventPackage = event_package;
return sub_send_msg((cprBuffer_t)pmsg, SIPSPI_EV_CC_SUBSCRIPTION_TERMINATED,
sizeof(*pmsg), CC_SRC_SIP);
}
cc_rcs_t
sip_send_message (ccsip_sub_not_data_t * msg_data, cc_srcs_t dest_id, int msg_id)
{
ccsip_sub_not_data_t *pmsg;
pmsg = (ccsip_sub_not_data_t *) cc_get_msg_buf(sizeof(*pmsg));
if (!pmsg) {
return CC_RC_ERROR;
}
memcpy(pmsg, msg_data, sizeof(*pmsg));
return sub_send_msg((cprBuffer_t)pmsg, msg_id, sizeof(*pmsg), dest_id);
}
cc_rcs_t
app_send_message (void *msg_data, int msg_len, cc_srcs_t dest_id, int msg_id)
{
void *pmsg;
pmsg = (void *) cc_get_msg_buf(msg_len);
if (!pmsg) {
return CC_RC_ERROR;
}
memcpy(pmsg, msg_data, msg_len);
return sub_send_msg((cprBuffer_t)pmsg, msg_id, (uint16_t)msg_len, dest_id);
}

View File

@ -1,46 +0,0 @@
/* 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/. */
#ifndef CSFLOG_H
#define CSFLOG_H
#include <stdarg.h>
typedef enum{
CSF_LOG_CRITICAL =1,
CSF_LOG_ERROR,
CSF_LOG_WARNING,
CSF_LOG_NOTICE,
CSF_LOG_INFO,
CSF_LOG_DEBUG
} CSFLogLevel;
#define CSFLogError(tag , format, ...) CSFLog( CSF_LOG_ERROR, __FILE__ , __LINE__ , tag , format , ## __VA_ARGS__ )
#define CSFLogErrorV(tag , format, va_list_arg) CSFLogV(CSF_LOG_ERROR, __FILE__ , __LINE__ , tag , format , va_list_arg )
#define CSFLogWarn(tag , format, ...) CSFLog( CSF_LOG_WARNING, __FILE__ , __LINE__ , tag , format , ## __VA_ARGS__ )
#define CSFLogWarnV(tag , format, va_list_arg) CSFLogV(CSF_LOG_WARNING, __FILE__ , __LINE__ , tag , format , va_list_arg )
#define CSFLogInfo(tag , format, ...) CSFLog( CSF_LOG_INFO, __FILE__ , __LINE__ , tag , format , ## __VA_ARGS__ )
#define CSFLogInfoV(tag , format, va_list_arg) CSFLogV(CSF_LOG_INFO, __FILE__ , __LINE__ , tag , format , va_list_arg )
#define CSFLogDebug(tag , format, ...) CSFLog(CSF_LOG_DEBUG, __FILE__ , __LINE__ , tag , format , ## __VA_ARGS__ )
#define CSFLogDebugV(tag , format, va_list_arg) CSFLogV(CSF_LOG_DEBUG, __FILE__ , __LINE__ , tag , format , va_list_arg )
#ifdef __cplusplus
extern "C"
{
#endif
#if 0
void CSFLog( CSFLogLevel priority, const char* sourceFile, int sourceLine, const char* tag , const char* format, ...);
void CSFLogV( CSFLogLevel priority, const char* sourceFile, int sourceLine, const char* tag , const char* format, va_list args);
#else
#endif
#define CSFLog(pri, file, line, tag, format, ...)
#define CSFLogV(pri, file, line, tag, format, args)
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,207 +0,0 @@
/* 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/. */
#ifndef _CCSESSION_H_
#define _CCSESSION_H_
#include "session.h"
#include "sessuri.h"
#define SID_TYPE_SHIFT 28
#define SID_LINE_SHIFT 16
#define GET_SESS_TYPE(x) ( (x & 0xF0000000) >> SID_TYPE_SHIFT )
#define GET_LINEID(x) (line_t)( (x & 0xFFF0000) >> SID_LINE_SHIFT )
#define GET_CALLID(x) (callid_t)(x & 0xFFFF)
/**
* ccSessionProviderCmd
* CallControl Provider Management Interface
* Called by Application to issue cmds to sipStack
*
* @param data - command and data
* data->cmd - see Session Provider Commands in session.h
* data->cmdData.ccData.reason - reason for SHUTDOWN/UNREGISTER_ALL_LINES CMD
CC_CAUSE_NORMAL/CC_CAUSE_NONE
* data->cmdData.ccData.reason_info - Descriptive stringa "notused"
*
* @return none
*
*/
void ccSessionProviderCmd(sessionProvider_cmd_t *data);
/**
* ccSessionProviderState
* Method to report provider state updates to Application
*
* @param state - indicates the Session Provider state CCApp_states_t
* @param data - ccProvider_state_t indicating
* data->stateData.ccData.mode - REGMODE CCM
* data->stateData.ccData.cause - FAILOVER/FALLBACK
*
* @return none
*
*/
void ccSessionProviderState(unsigned int state, ccProvider_state_t *data);
/**
* ccSessionCmd
* Method to Handle session lifecycle command such as realize, start etc.
*
* @param sCmd - session liefcycle command
* sCmd->cmd - REQUEST CMD
* sCmd->sessID - session ID
*
* @return none
*
*/
void ccSessionCmd (sessionCmd_t *sCmd);
/**
* ccCreateSession
*
* Called by Application to create a new session
*
* @param param - uri_t
* param->param.call_session_param.line_id - line on which to create the session
* @return ccSession_id_t - id of the session created
*/
session_id_t ccCreateSession(uri_t *param);
/**
* ccCloseSession
*
* Called by Application to close a session
*
* @param sess_id - ID of the session to be closed
*
* @return 0 success -1 failure
*
*/
int ccCloseSession(session_id_t sess_id);
/* Need to document IDs and data for the following 4 methods */
/**
* ccInvokeFeature
*
* Called by Application to invoke feature on session
*
* @param featData - featID and Additional info if needed for the feature
*
* @return none
*
*/
void ccInvokeFeature(session_feature_t *featData);
/**
* ccInvokeProviderFeature
*
* Called by Application to invoke device specific features
*
* @param featData - Additional info if needed for the feature
*
* @return none
*
*/
void ccInvokeProviderFeature(session_feature_t *featData);
/**
* ccSessionUpdate
*
* Called by sipstack to update session state and data
*
* @param eventID - ID of the event updating the session data
* @param session_data - event specific data
*
* @return none
*
*/
void ccSessionUpdate(session_update_t *session);
/**
* ccFeatureUpdate
*
* Called by sipstack to update feature state and data
*
* @param featureID - ID of the feature updated
* @param session_data - feature specific data
*
* @return none
*
*/
void ccFeatureUpdate(feature_update_t *session);
/***** Internal APIs below this line ***************/
/**
* ccCreateSession
*
* Called to create a CC session
*
* @param param - ccSession_create_param_t
* Contains the type of session and specific data
*
* @return ccSession_id_t - id of the session created
*/
session_id_t createSessionId(line_t line, callid_t call);
void platform_sync_cfg_vers (char *cfg_ver, char *dp_ver, char *softkey_ver);
/********************************************************************************/
/* Misc getter/setter function to get set the following */
#define PROPERTY_ID_MWI 1 // per line
#define PROPERTY_ID_TIME 2 // unsigned long
#define PROPERTY_ID_KPML 3
#define PROPERTY_ID_REGREASON 4
#define PROPERTY_ID_SPKR_HDST 5 1
void setIntProperty(unsigned int id, int val);
int getIntProperty(unsigned int id);
void setStrProperty(unsigned int id, char * val);
char * getStrProperty(unsigned int id);
/* Preserved API's from TNP Platform */
char *ccSetDP(const char *dp_file_name);
// update_label_n_speed_dial method here
void setPropertyCacheBoolean(int cfg_id, int bool_value);
void setPropertyCacheInteger(int cfg_id, int int_value);
void setPropertyCacheString(int cfg_id, const char *string_value);
void setPropertyCacheByte(int cfg_id, char byte_value);
void setPropertyCacheByteArray(int cfg_id, char *byte_value, int length);
/* BLF */
void ccBLFSubscribe(int request_id, int duration, const char *watcher,
const char *presentity, int app_id, int feature_mask);
void ccBLFUnsubscribe(int request_id);
void ccBLFUnsubscribeAll();
void blf_notification(int request_id, int status, int app_id);
/**********************************************************************
MID_JPlatUi_ui_log_status_msg, Ask RCDN team if log is changing?
**********************************************************************/
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,46 +0,0 @@
/* 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/. */
#ifndef CHECK_SYNC_H
#define CHECK_SYNC_H
#include "util_parse.h"
typedef enum {
SYNCS_ANY,
SYNCS_GOT_VERSION,
SYNCS_GOT_VERSION_EQ,
SYNCS_GOT_SYNC,
SYNCS_GOT_SYNC_EQ,
SYNCS_GOT_GENERIC,
SYNCS_GOT_GENERIC_EQ
} sync_states;
typedef enum {
SYNCF_NONE,
SYNCF_MY,
SYNCF_WILD
} SyncVersionFound_t;
typedef struct {
char myVersion[MAX_LOAD_ID_STRING];
char resetSync[MAX_SYNC_LEN];
SyncVersionFound_t versionFound;
} VersionSync_t;
#define SYNCINFO_XML "syncinfo.xml"
#define SYNC_BUF_SIZE 4096
extern int CheckSync;
extern int SyncInfoInProgress;
extern char *SyncBuffer;
int check_sync_get(void);
void add_sync_info(char *version, char *sync, VersionSync_t *versionSync);
int parse_sync_entry(char **parseptr, VersionSync_t *versionSync);
int parse_sync_info(char *parseptr, VersionSync_t *versionSync);
void process_sync_info(char *syncInfo);
short handle_sync_message(short cmd, void *pData);
#endif

View File

@ -1,34 +0,0 @@
/* 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/. */
#ifndef _CI_INCLUDED_H
#define _CI_INCLUDED_H
#include "plat_api.h"
#include "plat_debug.h"
/* return codes for CI command processing */
#define CI_OK (0)
#define CI_ERROR (1)
#define CI_INVALID (2)
#define CI_AMBIGUOUS (3)
/* flags for CI processing */
#define CI_PROMPT (0x0001)
/*
* Prototypes for public functions
*/
void ci_init();
int ci_process_input(const char *str, char *wkspace, int wklen);
int32_t ci_show_cmds(int32_t argc, const char *argv[]);
ci_callback ci_set_interceptor(ci_callback func);
int ci_err_too_few(void); /* "Too few arguments" */
int ci_err_too_many(void); /* "Too many arguments" */
int ci_err_inv_arg(void); /* "Invalid argument" */
uint32_t ci_streval(const char *str);
#endif /* _CI_INCLUDED_H */

View File

@ -1,195 +0,0 @@
/* 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/. */
#ifndef _CONFIG_H_
#define _CONFIG_H_
#include "cpr_types.h"
#include "cpr_timers.h"
#include "cfgfile_utils.h"
#include "configmgr.h"
#include "prot_configmgr.h"
#include "phone.h"
/*
* List of timers that the CFG task is responsible for.
* CPR will send a msg to the CFG task when these
* timers expire. CPR expects a timer id when the timer
* is created, this enum serves that purpose.
*/
typedef enum {
CFG_TFTP_RETRY_TIMER
} cfgTimerList_t;
#define MAX_REQ_FIELDS 20
#define MAX_FIELD_NAME_SIZE 30
#define MAX_FIELD_VALUE_SIZE 30
#define MAX_FIELDDESC_STR (MAX_FIELD_VALUE_SIZE+2)
#define MAX_TFTP_PATH_LEN 64
/*
* Definition of bits used in pDHCPInfo->extFields.ext.appStatus (32bits).
* Please note that some of these flags correspond to status flags
* asserted by Little App. Please see little_app.c, and make sure these
* flags are kept consistent.
*/
#define APPSTATUS_UPGRADE_FAILED 0x80000000L
/* maximum length of config file including comments */
#define MAX_CFG_FILE_LENGTH 0x2000
/* minimum length of a registrion in seconds */
#define MIN_REGISTRATION_PERIOD 20
#define BUF_TEST();
typedef enum {
ERASE_PROGRAM,
ERASE_ONLY,
PROGRAM_ONLY
} flash_mode_t;
extern var_t prot_cfg_table[];
extern cfg_rom_t *const prot_startup_config;
extern cfg_rom_t *const prot_running_config;
extern cfg_rom_t *const prot_temp_config;
extern int config_commit(int);
extern int prot_sanity_check_config_settings(void);
extern boolean prot_option_allowed_in_cfg_file(const char *);
extern void prot_shutdown(void);
extern int prot_config_change_notify(int);
extern void prot_disconnected(int);
extern int FlashaProgram(uint16_t *Source, uint16_t *Dest, uint32_t Size,
flash_mode_t mode);
extern uint16_t g_NewVlan;
extern uint16_t g_NewRelease;
extern uint16_t g_NewErase;
extern char local_media_type_string[];
extern char local_net_dev_type_string[];
void CFGTftpTimeout(int /*cpr_timer_t*/ *tmr);
int CFGProgramFlash(uint8_t *src, uint8_t *dst, uint32_t len);
int CFGEraseFlash(uint8_t *src, uint8_t *dst, uint32_t len);
int CFGEraseProgramFlash(uint8_t *src, uint8_t *dst, uint32_t len);
int CFGChksum(uint8_t *ptr, uint32_t len, uint32_t *csum, int dspmode,
int cmpmode);
int CFGGetUISettings(uint8_t *pData);
int CFGSetUISettings(void);
void CFGSetLockState(boolean);
boolean CFGIsLocked(void);
void cfg_set_running_config(void);
void cfg_get_stored_prot_settings(void);
void LoadTempConfigData(void);
void config_handle_cdp(int);
void cfg_sanity_check_media_range(void);
void cfg_check_la_appStatus(unsigned long appStatus);
void cfg_set_inhibitLoading(int yesno);
int cfg_get_inhibitLoading(void);
/////////////////////////////////////////////////////////////
// Configuration Variables replacing CUCM config file
//
////
//////
static const int gStartMediaPort = 16384;
static const int gStopMediaPort = 32766;
static const boolean gCallerIdBlocking = FALSE;
static const boolean gAnonblock = FALSE;
static const char gPreferredCodec[] = "none";
static const char gDtmfOutOfBand[] = "avt";
static const int gDtmfAvtPayload = 101;
static const int gDtmfDbLevel = 3;
static const int gSipRetx = 10;
static const int gSipInviteRetx = 6;
static const int gTimerT1 = 500;
static const int gTimerT2 = 4000;
static const int gTimerInviteExpires = 180;
static const int gTimerRegisterExpires = 3600;
static const boolean gRegisterWithProxy = TRUE;
static const char gBackupProxy[] = "USECALLMANAGER";
static const int gBackupProxyPort = 5060;
static const char gEmergencyProxy[] = "USECALLMANAGER";
static const int gEmergencyProxyPort = 5060;
static const char gOutboundProxy[] = "USECALLMANAGER";
static const int gOutboundProxyPort = 5060;
static const boolean gNatRecievedProcessing = FALSE;
static const char gUserInfo[] = "None";
static const boolean gRemotePartyID = TRUE;
static const boolean gSemiAttendedTransfer = TRUE;
static const int gCallHoldRingback = 2;
static const boolean gStutterMsgWaiting = FALSE;
static const char gCallForwardURI[] = "x-cisco-serviceuri-cfwdall";
static const boolean gCallStats = TRUE;
static const int gTimerRegisterDelta = 5;
static const int gMaxRedirects = 70;
static const boolean gRfc2543Hold = FALSE;
static const boolean gLocalCfwdEnable = TRUE;
static const int gConnectionMonitorDuration = 120;
static const int gCallLogBlfEnabled = 3 & 0x1;
static const boolean gRetainForwardInformation = FALSE;
static const int gRemoteCcEnable = 1;
static const int gTimerKeepAliveExpires = 120;
static const int gTimerSubscribeExpires = 120;
static const int gTimerSubscribeDelta = 5;
static const int gKpml = 3;
static const boolean gNatEnabled = FALSE;
static const char gNatAddress[] = "";
static const boolean gAnableVad = FALSE;
static const boolean gAutoAnswerAltBehavior = FALSE;
static const int gAutoAnswerTimer = 1;
static const boolean gAutoAnswerOverride = TRUE;
static const int gOffhookToFirstDigitTimer = 15000;
static const int gSilentPeriodBetweenCallWaitingBursts = 10;
static const int gRingSettingBusyStationPolicy = 0;
static const int gBlfAudibleAlertSettingOfIdleStation = 0;
static const int gBlfAudibleAlertSettingOfBusyStation = 0;
static const int gJoinAcrossLines = 0;
static const boolean gCnfJoinEnabled = TRUE;
static const int gRollover = 0;
static const boolean gTransferOnhookEnabled = FALSE;
static const int gDscpForAudio = 184;
static const int gDscpVideo = 136;
static const int gT302Timer = 5000;
static const int gLineIndex = 1;
static const int gFeatureID = 9;
static const char gProxy[] = "USECALLMANAGER";
static const int gPort = 5060;
static const char gDisplayName[] = "";
static const char gMessagesNumber[] = "";
static const boolean gCallerName = TRUE;
static const boolean gCallerNumber = FALSE;
static const boolean gRedirectedNumber = FALSE;
static const boolean gDialedNumber = TRUE;
static const unsigned char gMessageWaitingLampPolicy = 3;
static const unsigned char gMessageWaitingAMWI = 1;
static const unsigned char gRingSettingIdle = 4;
static const unsigned char gRingSettingActive = 5;
static const int gMaxNumCalls = 1;
static const int gBusyTrigger = 1;
static const unsigned char gAutoAnswerEnabled = 2 & 0x1;
static const unsigned char gCallWaiting = 3 & 0x1;
static const int gDeviceSecurityMode = 1;
static const int gCcm2_sip_port = 5060;
static const int gCcm3_sip_port = 5060;
static const boolean gCcm1_isvalid = TRUE;
static const int gDscpCallControl = 1;
static const int gSpeakerEnabled = 1;
static const char gExternalNumberMask[] = "";
static const char gVersion[] = "0.1";
static const boolean gRTCPMUX = FALSE;
static const boolean gMAXAVBITRATE = FALSE; /* Following six are OPUS fmtp options */
static const boolean gMAXCODEDAUDIOBW = FALSE;
static const boolean gUSEDTX = FALSE;
static const boolean gSTEREO = FALSE;
static const boolean gUSEINBANDFEC = FALSE;
static const boolean gCBR = FALSE;
static const boolean gMAXPTIME = FALSE;
static const int gSCTPPort = 5000;
static const int gNumDataStreams = 16;
#endif /* _CONFIG_H_ */

View File

@ -1,13 +0,0 @@
/* 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/. */
#ifndef CONFIGAPP_H
#define CONFIGAPP_H
extern void configapp_init();
extern void configapp_shutdown();
extern void configapp_process_msg(uint32_t cmd, void *msg);
#endif

View File

@ -1,62 +0,0 @@
/* 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/. */
#ifndef _CONFIGMGR_H_
#define _CONFIGMGR_H_
/*
* #defines for maximum length of the image names
* The MAX_LOAD_ID_LENGTH must be larger (or the same as)
* MAX_OLD_LOAD_ID_LENGTH or strange things may
* happen because they are used as indexes into
* arrays.
*/
#include "cpr_types.h"
#define MAX_LOAD_ID_LENGTH 60
#define MAX_LOAD_ID_STRING MAX_LOAD_ID_LENGTH + 1
#define MAX_OLD_LOAD_ID_LENGTH 8
#define MAX_OLD_LOAD_ID_STRING MAX_OLD_LOAD_ID_LENGTH + 1
#define MAX_URL_LENGTH 128
#define MAX_SYNC_LEN 33
#define MAX_PHONE_LABEL 32
/* Start of section for new "protocol-inspecific" calls */
#define MAX_CONFIG_STRING_NAME 64
#define DEFAULT_LINE 1
#define YESSTR "YES"
#define NOSTR "NO"
#define IPOFZEROS "0.0.0.0"
enum ACTIONATTR {
AA_IGNORE = 0,
AA_COMMIT = 1,
AA_RELOAD = 1 << 1,
AA_REGISTER = 1 << 2,
AA_FORCE = 1 << 3,
AA_RESET = 1 << 4,
AA_SETTINGS = 1 << 5,
AA_BU_REG = 1 << 6
};
/*********************************************************
*
* External Function Prototypes
*
*********************************************************/
void config_get_string(int id, char *buffer, int buffer_len);
void config_set_string(int id, char *buffer);
void config_get_value(int id, void *buffer, int length);
void config_set_value(int id, void *buffer, int length);
void config_get_line_string(int id, char *buffer, int line, int buffer_len);
void config_set_line_string(int id, char *buffer, int line);
void config_get_line_value(int id, void *buffer, int length, int line);
void config_set_line_value(int id, void *buffer, int length, int line);
void config_init(void);
#endif /* _CONFIGMGR_H_ */

View File

@ -1,108 +0,0 @@
/* 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/. */
#ifndef _DEBUG_INCLUDED_H /* allows multiple inclusion */
#define _DEBUG_INCLUDED_H
#include "cpr_types.h"
#include "plat_api.h"
#include "phone_debug.h"
#include "CSFLog.h"
#include <assert.h>
typedef cc_int32_t (*debug_callback)(cc_int32_t argc, const char *argv[]);
typedef cc_int32_t (*show_callback)(cc_int32_t argc, const char *argv[]);
typedef cc_int32_t (*clear_callback)(cc_int32_t argc, const char *argv[]);
typedef enum {
TEST_OPEN,
TEST_CLOSE,
TEST_KEY,
TEST_ONHOOK,
TEST_OFFHOOK,
TEST_SHOW,
TEST_HIDE,
TEST_PROFILE,
TEST_C3PO
} test_command_t;
typedef int32_t (*test_callback)(int32_t argc, const char *argv[],
test_command_t command);
extern int32_t TestMode;
extern int32_t TestShow;
typedef enum {
DEBUG_ENTRY_TYPE_FLAG,
DEBUG_ENTRY_TYPE_DEBUG_FUNC,
DEBUG_ENTRY_TYPE_SHOW_FUNC
} debug_entry_type_e;
typedef struct {
const char *keyw;
union {
int32_t *flag;
debug_callback func;
show_callback show_func;
} u;
debug_entry_type_e type;
boolean show_tech;
} debug_entry_t;
typedef struct {
const char *keyw;
union {
int32_t *flag;
clear_callback func;
} u;
} clear_entry_t;
typedef struct {
const char *keyw;
const char *abrv;
const char *help;
boolean hidden;
union {
int32_t *flag;
test_callback func;
} u;
test_command_t command;
} test_entry_t;
typedef struct {
unsigned char flag;
unsigned char hookevent;
unsigned char keyevent; // keyevent and key will double as a timer value internally
unsigned char key;
} testevent_t;
// The next 4 defines are used as flag values to specify the event types in the queue.
// Note that we cannot use the HOOKSCAN and KEYSCAN that are defined in phone.h, because
// HOOKSCAN requires a full integer. In order to minimize space in the test event queue
// we need short numbers.
#define TEST_NONE 0
#define TEST_KEYSCAN 1
#define TEST_HOOKSCAN 2
#define TEST_TIMER 0x80
#define MAX_DEBUG_NAME 50
#define MAX_SHOW_NAME 50
#define MAX_CLEAR_NAME 50
/*
* Prototypes for public functions
*/
void bind_test_keyword(const char *keyword, const char *abrv, boolean hidden,
test_callback func, test_command_t command,
const char *help);
testevent_t TESTGetEvent(void);
// Send debug output to CSFLog
#define debugif_printf(format, ...) CSFLogDebug("debugif", format, ## __VA_ARGS__ )
#define PR_ASSERT( test ) assert( test )
#endif /* _DEBUG_INCLUDED_H */

View File

@ -1,111 +0,0 @@
/* 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/. */
#ifndef DIALPLAN_H
#define DIALPLAN_H
#include <vcm.h>
#include "phone_types.h"
#define DIALPLAN_MAX_SIZE 0x2000
#define MAX_SUBTITUTIONS 5
#define MAX_TONES 3
#define MAX_TEMPLATE_LENGTH 196
#define DIAL_ESCAPE '\\'
#define MAX_DIALSTRING 256
#define DIAL_TIMEOUT 10
#define MAX_DP_VERSION_STAMP_LEN (64+1)
extern char g_dp_version_stamp[MAX_DP_VERSION_STAMP_LEN];
typedef enum {
DIAL_NOMATCH = 0,
DIAL_GIVETONE,
DIAL_WILDPATTERN,
DIAL_FULLPATTERN,
DIAL_FULLMATCH,
DIAL_IMMEDIATELY
} DialMatchAction;
/* Set enum values to match DialMatchAction */
typedef enum {
DIALTONE_NOMATCH = 0,
DIALTONE_WILD = 2,
DIALTONE_FULL,
DIALTONE_EXACT
} DialToneMatch;
typedef enum {
UserUnspec,
UserPhone,
UserIP
} UserMode;
typedef enum {
RouteDefault, // Route using the default proxy
RouteEmergency, // Route using the emergency proxy
RouteFQDN // Route according to the FQDN in the entry
} RouteMode;
struct DialTemplate {
struct DialTemplate *next;
char *pattern;
line_t line;
char *rewrite;
int timeout;
UserMode userMode;
RouteMode routeMode;
int tones_defined;
vcm_tones_t tone[MAX_TONES];
};
struct StoredDialTemplate {
short size; // Size of header part of structure
short nextOffset; // total Number of bytes used in the entry
// A zero here is used as a last entry
int timeout;
line_t line;
UserMode userMode;
short pattern_offset; // Offset to the pattern string
short rewrite_offset; // Offset to the rewrite string
RouteMode routeMode;
int tones_defined;
vcm_tones_t tone[MAX_TONES];
};
typedef enum {
STATE_ANY,
STATE_GOT_MATCH,
STATE_GOT_MATCH_EQ,
STATE_GOT_LINE,
STATE_GOT_LINE_EQ,
STATE_GOT_TIMEOUT,
STATE_GOT_TIMEOUT_EQ,
STATE_GOT_USER,
STATE_GOT_USER_EQ,
STATE_GOT_REWRITE,
STATE_GOT_REWRITE_EQ,
STATE_GOT_ROUTE,
STATE_GOT_ROUTE_EQ,
STATE_GOT_TONE,
STATE_GOT_TONE_EQ,
STATE_START_TAG_COMPLETED, /* start tag parsing is complete when self-terminating (<tag/>) format is not used */
STATE_END_TAG_STARTED, /* end tag started when we see "</" */
STATE_END_TAG_FOUND /* end tag is parsed */
} ParseDialState;
extern DialMatchAction MatchDialTemplate(const char *pattern,
const line_t line,
int *timeout,
char *rewrite, int rewritelen,
RouteMode *pRouteMode,
vcm_tones_t *pTone);
void SaveDialTemplate(void);
void RestoreDialPlan(void);
void InitDialPlan(boolean);
void FreeDialTemplates(void);
extern short handle_dialplan(short, void *);
extern boolean ParseDialTemplate(char *parseptr);
#endif //DIALPLAN_H

View File

@ -1,93 +0,0 @@
/* 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/. */
#ifndef DIALPLANINT_H
#define DIALPLANINT_H
#include "phone_types.h"
#include "dialplan.h"
#define BKSPACE_KEY 90
#define DEFAULT_DIALTIMEOUT 30
#define CISCO_PLAR_STRING "x-cisco-serviceuri-offhook"
typedef struct timer_index_ {
line_t line;
callid_t call_id;
} timer_index_t;
typedef union timer_info_t_ {
void *whole;
timer_index_t index;
} timer_info_t;
/* dialplan interface data structure */
typedef struct dp_int_t_ {
line_t line;
callid_t call_id;
char digit;
char digit_str[MAX_DIALSTRING];
boolean collect_more;
void *tmr_ptr;
char global_call_id[CC_GCID_LEN];
monitor_mode_t monitor_mode;
} dp_int_t;
typedef enum {
DP_NONE_TIMER,
DP_OFFHOOK_TIMER,
DP_INTERDIGIT_TIMER
} dp_timer_type_e;
typedef struct dp_data_t_ {
char gDialed[MAX_DIALSTRING];
char gReDialed[MAX_DIALSTRING];
line_t gRedialLine;
char empty_rewrite[MAX_DIALSTRING];
uint32_t offhook_timeout; /* timeout configured to wait after offhook */
void *dial_timer;
boolean gDialplanDone;
/* Indicates that local dialplan match has been completed */
boolean allow_proceed;
/* under certain conditions proceed has to be passed to
* UI even KPML is enabled. For example redial, which not
* collect more digits so freeze the screen by sending
* proceed to UI
*/
line_t line; /* Line where which dialing is currently active */
callid_t call_id; /* call id of currently dialing call */
boolean url_dialing; /* Indicates dialing is url dialing */
timer_info_t timer_info;
dp_timer_type_e gTimerType;
} dp_data_t;
void dp_dial_timeout(void *);
void dp_int_init_dialing_data(line_t line, callid_t call_id);
void dp_int_update_key_string(line_t line, callid_t call_id, char *digits);
void dp_int_store_digit_string(line_t line, callid_t call_id, char *digit_str);
void dp_int_update_keypress(line_t line, callid_t call_id, unsigned char digit);
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);
void dp_int_do_redial(line_t line, callid_t call_id);
void dp_int_onhook(line_t line, callid_t call_id);
void dp_int_offhook(line_t line, callid_t call_id);
void dp_int_update(line_t line, callid_t call_id, string_t called_num);
int dp_init_template(const char *dp_file_name, int maxSize);
void dp_int_cancel_offhook_timer(line_t line, callid_t call_id);
boolean dp_offhook (line_t line, callid_t call_id);
boolean dp_get_kpml_state(void);
void dp_delete_last_digit(line_t line_id, callid_t call_id);
void dp_store_digits(line_t line, callid_t call_id, unsigned char digit);
char *dp_get_gdialed_digits(void);
line_t dp_get_redial_line(void);
void dp_reset(void);
boolean dp_check_for_plar_line(line_t line);
void dp_cancel_offhook_timer(void);
#endif /* DIALPLANINT_H */

View File

@ -1,42 +0,0 @@
/* 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/. */
#ifndef _DIGCALC_H_
#define _DIGCALC_H_
#define HASHLEN 16
typedef char HASH[HASHLEN];
#define HASHHEXLEN 32
typedef char HASHHEX[HASHHEXLEN + 1];
#define IN
#define OUT
/* calculate H(A1) as per HTTP Digest spec */
void DigestCalcHA1(
IN char *pszAlg,
IN char *pszUserName,
IN char *pszRealm,
IN char *pszPassword,
IN char *pszNonce,
IN char *pszCNonce,
OUT HASHHEX SessionKey
);
/* calculate request-digest/response-digest as per HTTP Digest spec */
void DigestCalcResponse(
IN HASHHEX HA1, /* H(A1) */
IN char *pszNonce, /* nonce from server */
IN char *pszNonceCount, /* 8 hex digits */
IN char *pszCNonce, /* client nonce */
IN char *pszQop, /* qop-value: "", "auth", "auth-int" */
IN char *pszMethod, /* method from the request */
IN char *pszDigestUri, /* requested URL */
IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */
OUT HASHHEX Response /* request-digest or response-digest */
);
void DigestString(char *string, HASHHEX response);
#endif

View File

@ -1,77 +0,0 @@
/* 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/. */
#ifndef _DNS_UTILS_INCLUDED_H
#define _DNS_UTILS_INCLUDED_H
#include "dns_util.h"
#define MAX_DNS_CON 10
#define DNS_TO_CNT 400
#define DNS_RSP_FLG 0x8000
#define DNS_RSP_CODE 0xf
#define DNS_HOST_TYPE 0x01
#define DNS_CNAME_TYPE 0x05
#define DNS_SRV_TYPE 0x21
#define DNS_PTR_TYPE 0xc0
#define DNS_IN_CLASS 1
#define DNS_INUSE_FREE 0
#define DNS_INUSE_WAIT 1
#define DNS_INUSE_CACHED 2
/* per suggestion RFC in about sanity checking */
#define DNS_MIN_TTL (5*60) /* 5 minutes */
#define DNS_MAX_TTL (24*60*60) /* 1 day */
#define KAZOO_DNS_DEBUG 1
#define DNS_OK 0
#define DNS_ERR_NOBUF 1
#define DNS_ERR_INUSE 2
#define DNS_ERR_TIMEOUT 3
#define DNS_ERR_NOHOST 4
#define DNS_ERR_HOST_UNAVAIL 5
#define DNS_ERR_BAD_DATA 6
#define DNS_ERR_LINK_DOWN 7
#define DNS_ENTRY_VALID 8
#define DNS_ENTRY_INVALID 9
#define DNS_ERR_TTL_EXPIRED 10
#define DNS_MAX_SRV_REQ 20
#define DNS_HNAME_PAD 10
#define DOMAIN_NAME_LENGTH 256
typedef struct rr_reply_rec_ {
uint8_t ordered;
uint32_t priority;
uint32_t weight;
uint32_t rweight;
uint32_t ttl;
uint32_t port;
uint32_t rcvd_order;
int8_t *name;
} rr_reply_rec_t;
typedef struct master_rr_list_ {
uint8_t valid;
uint16_t ref_count;
uint8_t num_recs;
int8_t domain_name[DOMAIN_NAME_LENGTH + 1];
rr_reply_rec_t **rr_recs_order;
} master_rr_list_t;
typedef struct call_rr_list_ {
uint8_t current_index;
uint8_t max_index;
uint8_t master_index;
int8_t *domain_name;
rr_reply_rec_t **rr_recs_order;
} call_rr_list_t;
#endif /* _DNS_UTILS_INCLUDED_H */

View File

@ -1,27 +0,0 @@
/* 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/. */
#ifndef _DTMF_H_
#define _DTMF_H_
typedef enum _DTMFState {
DTMF_IDLE,
DTMF_START,
DTMF_CONT,
DTMF_END
} DTMFState;
typedef enum {
DTMF_OUTOFBAND_NONE = 0,
DTMF_OUTOFBAND_AVT,
DTMF_OUTOFBAND_AVT_ALWAYS
} DtmfOutOfBandTransport_t;
boolean RTPDtmfInbandGet(void);
DtmfOutOfBandTransport_t RTPDtmfOutofbandGet(void);
void RTPDtmfInbandSet(boolean val);
void RTPDtmfOutofbandSet(uint16_t channel, DtmfOutOfBandTransport_t transport,
int payload_type);
#endif

View File

@ -1,24 +0,0 @@
/* 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/. */
#ifndef embedded_hpp
#define embedded_hpp
typedef signed char INT8;
typedef signed short INT16;
typedef signed int INT32;
typedef unsigned char UINT8;
typedef unsigned short UINT16;
typedef unsigned int UINT32;
typedef signed char int8;
typedef signed short int16;
typedef signed int int32;
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
#endif

View File

@ -1,19 +0,0 @@
/* 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/. */
#ifndef IntelPentium_hpp
#define IntelPentium_hpp
typedef char INT8;
typedef short INT16;
typedef int INT32;
typedef unsigned char UINT8;
typedef unsigned short UINT16;
typedef unsigned int UINT32;
typedef float FLOAT32;
typedef double FLOAT64;
#endif

View File

@ -1,49 +0,0 @@
/* 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/. */
#ifndef __KPML_COMMON_UTIL_H__
#define __KPML_COMMON_UTIL_H__
/* KPML status code for kpml decoder */
typedef enum {
KPML_STATUS_OK,
KPML_ERROR_ENCODE,
KPML_ERROR_INVALID_ATTR,
KPML_ERROR_INVALID_ELEM,
KPML_ERROR_INVALID_VALUE,
KPML_ERROR_INTERNAL,
KPML_ERROR_MISSING_ATTR,
KPML_ERROR_MISSING_FIELD,
KPML_ERROR_NOMEM,
KPML_ERROR_XML_PARSER
} kpml_status_type_t;
/* single_digit_bitmask */
#define REGEX_0 1
#define REGEX_1 (1<<1)
#define REGEX_2 (1<<2)
#define REGEX_3 (1<<3)
#define REGEX_4 (1<<4)
#define REGEX_5 (1<<5)
#define REGEX_6 (1<<6)
#define REGEX_7 (1<<7)
#define REGEX_8 (1<<8)
#define REGEX_9 (1<<9)
#define REGEX_STAR (1<<10)
#define REGEX_POUND (1<<11)
#define REGEX_A (1<<12)
#define REGEX_B (1<<13)
#define REGEX_C (1<<14)
#define REGEX_D (1<<15)
#define REGEX_PLUS (1<<16)
#define REGEX_0_9 REGEX_0|REGEX_1|REGEX_2|REGEX_3|REGEX_4|REGEX_5|REGEX_6|REGEX_7|REGEX_8|REGEX_9
#define KPML_DEFAULT_DTMF_REGEX "[x*#ABCD]"
kpml_status_type_t kpml_parse_regex_str(char *regex_str,
kpml_regex_match_t *regex_match);
#endif /* __KPML_COMMON_UTIL_H__ */

View File

@ -1,177 +0,0 @@
/* 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/. */
#ifndef KPMLMAP_H
#define KPMLMAP_H
#include "xml_parser_defines.h"
#include "singly_link_list.h"
#include "subapi.h"
#define KPML_ESCAPE '\\'
#define MAX_DIALSTRING 256
#define DIAL_TIMEOUT 10
#define MAX_KPML_TAG_STRING 32
#define MAX_KPML_TEXT_STRING 16
#define KPML_BUFFERS_NUM 100
#define KPML_VER_STR "1.0"
#define KPML_ENTER_STR "#"
#define NUM_OF_REGX 1
typedef enum {
KPML_NOMATCH = 0,
KPML_GIVETONE,
KPML_WILDPATTERN,
KPML_FULLPATTERN,
KPML_FULLMATCH,
KPML_IMMEDIATELY
} kpml_match_action_e;
typedef enum {
KPML_SUCCESS = 200,
KPML_USER_TERM_NOMATCH = 402,
KPML_TIMER_EXPIRE = 423,
KPML_NO_DIALOG = 481,
KPML_SUB_EXPIRE = 487,
KPML_BAD_EVENT = 489,
KPML_BAD_DOC = 501,
KPML_NO_PERSISTENT = 531,
KPML_NO_MULTIPLE = 532,
KPML_NO_MULITPLE_CALL_LEG = 533
} kpml_resp_code_e;
typedef enum {
KPML_NONE = 0x0,
KPML_SIGNAL_ONLY = 0x1,
KPML_DTMF_ONLY = 0x2,
KPML_BOTH = 0x3
} kpml_config_e;
#define KPML_SUCCESS_STR "OK"
#define KPML_USER_TERM_NOMATCH_STR "No Match"
#define KPML_TIMER_EXPIRE_STR "Timer Expired"
#define KPML_SUB_EXPIRE_STR "Subscription Expired"
#define KPML_ATTR_NOT_SUPPORTED_STR "Attribute not supported"
#define KPML_TRYING_STR "Trying"
typedef enum {
KPML_ONE_SHOT = 0,
KPML_PERSISTENT,
KPML_SINGLY_NOTIFY
} kpml_sub_type_e;
typedef enum {
KPML_NO_TIMER,
KPML_INTERDIGIT_TIMER,
KPML_CRITICAL_TIMER,
KPML_EXTRADIGIT_TIMER,
KPML_LONGDIGIT_TIMER
} kpml_timer_e;
typedef enum {
NO_SUB_DATA = 0,
SUB_DATA_FOUND = 1,
NOTIFY_SENT
} kpml_state_e;
typedef struct kpml_Q_digit_t_ {
char digits[MAX_DIALSTRING];
int dig_head;
int dig_tail;
} kpml_Q_dig;
typedef struct {
line_t line;
callid_t call_id;
void *timer;
} kpml_key_t;
typedef struct kpml_regex_match_s {
int num_digits;
union {
unsigned long single_digit_bitmask;
} u;
} kpml_regex_match_t;
typedef struct kpml_data_t_ {
line_t line;
callid_t call_id;
sub_id_t sub_id;
unsigned long sub_duration;
void *sub_timer;
kpml_key_t subtimer_key;
/* Hold regx received by SUB */
struct Regex regex[NUM_OF_REGX];
kpml_regex_match_t regex_match[NUM_OF_REGX];
/* If this is set then send out 402 response after # key */
boolean enterkey;
uint32_t kpml_id;
/* if this persistent */
kpml_sub_type_e persistent;
int flush;
/* timeout duration */
xml_unsigned32 inttimeout;
xml_unsigned32 crittimeout;
xml_unsigned32 extratimeout;
/* timer pointers for digits */
void *inter_digit_timer;
void *critical_timer;
void *extra_digit_timer;
kpml_key_t inttime_key;
kpml_key_t crittime_key;
kpml_key_t extratime_key;
xml_unsigned16 longhold;
xml_unsigned8 longrepeat;
xml_unsigned8 nopartial;
/* Store dialed digits */
char kpmlDialed[MAX_DIALSTRING];
boolean last_dig_bkspace;
char q_digits[MAX_DIALSTRING];
int dig_head;
int dig_tail;
boolean sub_reject; /* If this varilable is set reject
* the subscription. There are cases
* where INV has been sent out premeturaly
* If the B2BUA asks for more digit by
* subsctiption, then reject thoese
*/
boolean pending_sub;
boolean enable_backspace;
/* Setting this variable will enable backspace
*/
} kpml_data_t;
kpml_state_e kpml_update_dialed_digits(line_t line, callid_t call_id,
char digit);
void kpml_flush_quarantine_buffer(line_t line, callid_t call_id);
void kpml_sm_register(void);
void kpml_quarantine_digits(line_t line, callid_t call_id, char digit);
void kpml_init(void);
void kpml_shutdown(void);
void kpml_set_subscription_reject(line_t line, callid_t call_id);
boolean kpml_get_state(void);
void kpml_inter_digit_timer_callback(void *);
void kpml_subscription_timer_callback(void *);
boolean kpml_is_subscribed (callid_t call_id, line_t line);
#endif //KPMLMAP_H

View File

@ -1,57 +0,0 @@
/* 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/. */
/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
* rights reserved.
*
* License to copy and use this software is granted provided that it
* is identified as the "RSA Data Security, Inc. MD5 Message-Digest
* Algorithm" in all material mentioning or referencing this software
* or this function.
*
* License is also granted to make and use derivative works provided
* that such works are identified as "derived from the RSA Data
* Security, Inc. MD5 Message-Digest Algorithm" in all material
* mentioning or referencing the derived work.
*
* RSA Data Security, Inc. makes no representations concerning either
* the merchantability of this software or the suitability of this
* software for any particular purpose. It is provided "as is"
* without express or implied warranty of any kind.
*
* These notices must be retained in any copies of any part of this
* documentation and/or software.
*/
#ifndef _MD5_H
#define _MD5_H
/* delineate the cisco changes to the RSA supplied module */
#define CISCO_MD5_MODS
#if defined(CISCO_MD5_MODS)
#define MD5_LEN 16
#endif /* defined(CISCO_MD5_MODS) */
/* MD5 context. */
typedef struct {
unsigned long int state[4]; /* state (ABCD) */
unsigned long int count[2]; /* number of bits, modulo 2^64 (lsb first) */
unsigned char buffer[64]; /* input buffer */
} MD5_CTX;
void MD5Init(MD5_CTX *);
void MD5Update(MD5_CTX *, unsigned char *, unsigned int);
void MD5Final(unsigned char[16], MD5_CTX *);
//#define MD5TESTSUITE 1
#if defined(MD5TESTSUITE) /* only needed if running MD5 verfication tests */
void MDString(char *string);
void MDPrint(char *digest);
void MDTestSuite(void);
#endif
#endif /* _MD5_H */

View File

@ -1,35 +0,0 @@
/* 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/. */
#ifndef _MEMORY_H_
#define _MEMORY_H_
/*
* DESCRIPTION
* This module contains the functions which implement the dynamic memory
* management routines. The following assumptions/rules apply:
* 1) Packets are allocated a minimum of MIN_BLOCK + BLOCK_OVERHEAD bytes.
* 2) The size of the heap is set at link time, using the -heap flag
* The allocation and sizing of the heap is a cooperative effort
* involving the linker, this file, and "sysmem.c".
* 3) The heap can be reset at any time by calling the function "minit"
*
*/
/*
*--------------------DEPRECATED FILE-------------------------------
*
* As part of Skittles project this file is deprecated.
* DO NOT add anything to this file. use cpr_stdlib.h instead
* If you are doing SYNC merges _DO_ _NOT_ merge anything from parent
* This file is kept here because it comes from parent/grand parent branches
* and will not be removed from clearcase till Skittles collapses.
* [The fAQ on cc tools contains details of why ]
*
* If you have questions send email to skittles-dev
*---------------------------------------------------------------
*/
#endif

View File

@ -1,14 +0,0 @@
/* 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/. */
#ifndef MISC_APP_TASK_H
#define MISC_APP_TASK_H
extern cprMsgQueue_t s_misc_msg_queue;
extern cpr_status_e MiscAppTaskSendMsg(uint32_t cmd, cprBuffer_t buf,
uint16_t len);
extern void MiscAppTask(void *arg);
#endif /* MISC_APP_TASK_H */

Some files were not shown because too many files have changed in this diff Show More