/* * 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(); } }
/* * sip_config_get_proxy_port() * * Get table entry from the table string and option number */ uint16_t sip_config_get_proxy_port (line_t line) { uint32_t port; config_get_line_value(CFGID_PROXY_PORT, &port, sizeof(port), line); if (port == 0) { config_get_line_value(CFGID_PROXY_PORT, &port, sizeof(port), DEFAULT_LINE); } return ((uint16_t) port); }
/* * 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; }
/* * 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", 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; }
/* * Function: dp_update * * Parameters: none * * Description: Function called to indicate alerting. * * Returns: none */ static void dp_update (line_t line, callid_t call_id, string_t called_num) { uint32_t line_feature = 0; config_get_line_value(CFGID_LINE_FEATURE, &line_feature, sizeof(line_feature), line); /* Do not store PLAR redial string. */ if (g_dp_int.gDialed[0] && (strcmp(g_dp_int.gDialed, CISCO_PLAR_STRING) != 0) && (strncmp(g_dp_int.gDialed, CISCO_BLFPICKUP_STRING, (sizeof(CISCO_BLFPICKUP_STRING) - 1)) != 0)) { sstrncpy(g_dp_int.gReDialed, g_dp_int.gDialed, MAX_DIALSTRING); g_dp_int.gRedialLine = line; } // fix bug CSCsm56180 if ((g_dp_int.line == line) && (g_dp_int.call_id == call_id)) { dp_clear_dialing_data(line, call_id); /* Clear kpml data and collected digits */ kpml_flush_quarantine_buffer(line, call_id); } }
/* * 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); } } }
/* * 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; } } }
/* * 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); }
/* * 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; } } }
/* * 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); }
/** * 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; } } }