[commit] r3318 - in freeswitch/branches/knhor/trunk: . src src/include src/mod/applications/mod_conference
Author: knhor Date: Sat Nov 11 18:22:17 2006 New Revision: 3318 Modified: freeswitch/branches/knhor/trunk/ (props changed) freeswitch/branches/knhor/trunk/src/include/switch_ivr.h freeswitch/branches/knhor/trunk/src/include/switch_types.h freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c freeswitch/branches/knhor/trunk/src/switch_ivr.c Log: add empty functions for handling dtmf digit string event mapping. change mod_conference to use the new dtmf digit string functions Modified: freeswitch/branches/knhor/trunk/src/include/switch_ivr.h ============================================================================== --- freeswitch/branches/knhor/trunk/src/include/switch_ivr.h (original) +++ freeswitch/branches/knhor/trunk/src/include/switch_ivr.h Sat Nov 11 18:22:17 2006 @@ -402,6 +402,42 @@ */ SWITCH_DECLARE(switch_status_t) switch_ivr_transfer_variable(switch_core_session_t *sessa, switch_core_session_t *sessb, char *var); + +struct switch_ivr_digit_stream_parser { +}; +typedef struct switch_ivr_digit_stream_parser switch_ivr_digit_stream_parser_t; +/*! + \brief Create a digit stream parser object + \param parser a pointer to the object pointer + \return SWITCH_STATUS_SUCCESS if all is well +*/ +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_new(switch_ivr_digit_stream_parser_t **parser); + +/*! + \brief Set a digit string to action mapping + \param parser a pointer to the parser object created by switch_ivr_digit_stream_parser_new + \param digits a string of digits to associate with an action + \param action the action to signal when the digit string is matched + \return SWITCH_STATUS_SUCCESS if all is well +*/ +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_set_event(switch_ivr_digit_stream_parser_t *parser, char *digits, int action); + +/*! + \brief Delete a string to action mapping + \param parser a pointer to the parser object created by switch_ivr_digit_stream_parser_new + \param digits the digit string to be removed from the map + \return SWITCH_STATUS_SUCCESS if all is well +*/ +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_del_event(switch_ivr_digit_stream_parser_t *parser, char *digits); + +/*! + \brief Create a digit stream parser object + \param parser a pointer to the parser object created by switch_ivr_digit_stream_parser_new + \param digit a digit to collect and test against the map of digit strings + \return 0 if no match found or non-zero action that was associated with a given digit string when matched +*/ +SWITCH_DECLARE(int) switch_ivr_digit_stream_parser_feed(switch_ivr_digit_stream_parser_t *parser, char digit); + /** @} */ SWITCH_END_EXTERN_C Modified: freeswitch/branches/knhor/trunk/src/include/switch_types.h ============================================================================== --- freeswitch/branches/knhor/trunk/src/include/switch_types.h (original) +++ freeswitch/branches/knhor/trunk/src/include/switch_types.h Sat Nov 11 18:22:17 2006 @@ -905,6 +905,8 @@ struct switch_core_session; /*! \brief An audio bug */ struct switch_media_bug; +/*! \brief A digit stream parser object */ +struct switch_ivr_digit_stream_parser; SWITCH_END_EXTERN_C Modified: freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c ============================================================================== --- freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c (original) +++ freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c Sat Nov 11 18:22:17 2006 @@ -56,6 +56,22 @@ FILE_STOP_ALL } file_stop_t; +typedef enum { + CALLER_CONTROL_NOEVENT, + CALLER_CONTROL_MUTE, + CALLER_CONTROL_DEAF_MUTE, + CALLER_CONTROL_ENERGY_UP, + CALLER_CONTROL_ENERGY_EQU_CONFERENCE, + CALLER_CONTROL_ENERGEY_DN, + CALLER_CONTROL_VOL_TALK_UP, + CALLER_CONTROL_VOL_TALK_ZERO, + CALLER_CONTROL_VOL_TALK_DN, + CALLER_CONTROL_VOL_LISTEN_UP, + CALLER_CONTROL_VOL_LISTEN_ZERO, + CALLER_CONTROL_VOL_LISTEN_DN, + CALLER_CONTROL_HANGUP, +} caller_control_t; + /* Global Values */ static struct { switch_memory_pool_t *conference_pool; @@ -130,7 +146,7 @@ char *kicked_sound; char *caller_id_name; char *caller_id_number; - char *caller_dtmf_control; + switch_ivr_digit_stream_parser_t *dtmf_parser; char *pin; char *pin_sound; char *bad_pin_sound; @@ -997,56 +1013,50 @@ } if (switch_channel_has_dtmf(channel)) { - char *pcontroldigit; - switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf)); - for (digit = dtmf; *digit; digit++) { - // The position of the dialed digit in the control string - // determines the operation that is being requested - // To disable the function for the user, make the control - // string digit something that can't be dialed... ie. a space - // The control string MUST have 12 characters in it - pcontroldigit = strchr(member->conference->caller_dtmf_control,*digit); - - if(pcontroldigit != NULL) { - switch(pcontroldigit-member->conference->caller_dtmf_control) { - case 0: - conference_loop_fn_mute_toggle(member); + if(member->conference->dtmf_parser != NULL) { + for (digit = dtmf; *digit; digit++) { + switch(switch_ivr_digit_stream_parser_feed(member->conference->dtmf_parser, *digit)) { + case CALLER_CONTROL_NOEVENT: + // the digit string collected so far has not been recognized + break; + case CALLER_CONTROL_MUTE: + conference_loop_fn_mute_toggle(member); + break; + case CALLER_CONTROL_DEAF_MUTE: + conference_loop_fn_deafmute_toggle(member); + break; + case CALLER_CONTROL_ENERGY_UP: + conference_loop_fn_energy_up(member); + break; + case CALLER_CONTROL_ENERGY_EQU_CONFERENCE: + conference_loop_fn_energy_equ_conference(member); + break; + case CALLER_CONTROL_ENERGEY_DN: + conference_loop_fn_energy_dn(member); + break; + case CALLER_CONTROL_VOL_TALK_UP: + conference_loop_fn_volume_talk_up(member); + break; + case CALLER_CONTROL_VOL_TALK_ZERO: + conference_loop_fn_volume_talk_zero(member); + break; + case CALLER_CONTROL_VOL_TALK_DN: + conference_loop_fn_volume_talk_dn(member); + break; + case CALLER_CONTROL_VOL_LISTEN_UP: + conference_loop_fn_volume_listen_up(member); + break; + case CALLER_CONTROL_VOL_LISTEN_ZERO: + conference_loop_fn_volume_listen_zero(member); + break; + case CALLER_CONTROL_VOL_LISTEN_DN: + conference_loop_fn_volume_listen_dn(member); + break; + case CALLER_CONTROL_HANGUP: + conference_loop_fn_hangup(member); break; - case 1: - conference_loop_fn_deafmute_toggle(member); - break; - case 2: - conference_loop_fn_energy_up(member); - break; - case 3: - conference_loop_fn_energy_equ_conference(member); - break; - case 4: - conference_loop_fn_energy_dn(member); - break; - case 5: - conference_loop_fn_volume_talk_up(member); - break; - case 6: - conference_loop_fn_volume_talk_zero(member); - break; - case 7: - conference_loop_fn_volume_talk_dn(member); - break; - case 8: - conference_loop_fn_volume_listen_up(member); - break; - case 9: - conference_loop_fn_volume_listen_zero(member); - break; - case 10: - conference_loop_fn_volume_listen_dn(member); - break; - case 11: - conference_loop_fn_hangup(member); - break; } } } @@ -3222,7 +3232,7 @@ static conference_obj_t *conference_new(char *name, switch_xml_t profile, switch_memory_pool_t *pool) { conference_obj_t *conference; - switch_xml_t param; + switch_xml_t xml_kvp; char *rate_name = NULL; char *interval_name = NULL; char *timer_name = NULL; @@ -3244,7 +3254,6 @@ char *energy_level = NULL; char *caller_id_name = NULL; char *caller_id_number = NULL; - char *caller_dtmf_control = "0*987321654#"; uint32_t rate = 8000, interval = 20; switch_status_t status; @@ -3254,10 +3263,10 @@ return NULL; } - // parse the profile tree for config values - for (param = switch_xml_child(profile, "param"); param; param = param->next) { - char *var = (char *) switch_xml_attr_soft(param, "name"); - char *val = (char *) switch_xml_attr_soft(param, "value"); + // parse the profile tree for param values + for (xml_kvp = switch_xml_child(profile, "param"); xml_kvp; xml_kvp = xml_kvp->next) { + char *var = (char *) switch_xml_attr_soft(xml_kvp, "name"); + char *val = (char *) switch_xml_attr_soft(xml_kvp, "value"); char buf[128] = ""; char *p; @@ -3313,8 +3322,6 @@ caller_id_name = val; } else if (!strcasecmp(var, "caller-id-number")) { caller_id_number = val; - } else if (!strcasecmp(var, "caller-dtmf-control")) { - caller_dtmf_control = val; } } @@ -3376,23 +3383,6 @@ conference->caller_id_name = switch_core_strdup(conference->pool, caller_id_name); conference->caller_id_number = switch_core_strdup(conference->pool, caller_id_number); - // The position of the dialed digit in the control string - // determines the operation that is being requested - // To disable the function for the user, make the control - // string digit something that can't be dialed... ie. a space - // The control string MUST have 12 characters in it - if(strlen(caller_dtmf_control) < 12) { - char dbuf[13]; - - memset(dbuf,' ',sizeof(dbuf)); - dbuf[12] = '\0'; - memcpy(dbuf,caller_dtmf_control,MIN(sizeof(dbuf)-1,strlen(caller_dtmf_control))); - - conference->caller_dtmf_control = switch_core_strdup(conference->pool, dbuf); - } else { - conference->caller_dtmf_control = switch_core_strdup(conference->pool, caller_dtmf_control); - } - if (!switch_strlen_zero(enter_sound)) { conference->enter_sound = switch_core_strdup(conference->pool, enter_sound); } @@ -3454,6 +3444,55 @@ conference->rate = rate; conference->interval = interval; + if(switch_ivr_digit_stream_parser_new(&conference->dtmf_parser) == SWITCH_STATUS_SUCCESS) { + int i; + struct _ccds { + char *key; + char *digits; + caller_control_t action; + } ccds[] = { + {"mute", "0", CALLER_CONTROL_MUTE}, + {"deaf mute", "*", CALLER_CONTROL_DEAF_MUTE}, + {"energy up", "9", CALLER_CONTROL_ENERGY_UP}, + {"energy equ", "8", CALLER_CONTROL_ENERGY_EQU_CONFERENCE}, + {"energy dn", "7", CALLER_CONTROL_ENERGEY_DN}, + {"vol talk up", "3", CALLER_CONTROL_VOL_TALK_UP}, + {"vol talk zero", "2", CALLER_CONTROL_VOL_TALK_ZERO}, + {"vol talk dn", "1", CALLER_CONTROL_VOL_TALK_DN}, + {"vol listen up", "6", CALLER_CONTROL_VOL_LISTEN_UP}, + {"vol listen zero", "5", CALLER_CONTROL_VOL_LISTEN_ZERO}, + {"vol listen dn", "4", CALLER_CONTROL_VOL_LISTEN_DN}, + {"hangup", "#", CALLER_CONTROL_HANGUP}, + }; + int ccds_qty = sizeof(ccds)/sizeof(ccds[0]); + + // set the default control handler strings + for(i=0; status == SWITCH_STATUS_SUCCESS && i<ccds_qty; i++) { + status = switch_ivr_digit_stream_parser_set_event(conference->dtmf_parser,ccds[i].key,ccds[i].action); + } + + // parse the profile tree for caller control digit strings + for (xml_kvp = switch_xml_child(profile, "control"); xml_kvp; xml_kvp = xml_kvp->next) { + char *key = (char *) switch_xml_attr_soft(xml_kvp, "action"); + char *val = (char *) switch_xml_attr_soft(xml_kvp, "digits"); + + if(key != NULL && val != NULL) { + // scan through all of the valid actions, and if found, + // set the new caller control action digit string, then + // stop scanning the table, and go to the next xml kvp. + for(i=0,status=SWITCH_STATUS_NOOP; i<ccds_qty && status == SWITCH_STATUS_NOOP; i++) { + if(strcasecmp(ccds[i].key,key) == 0) { + status = switch_ivr_digit_stream_parser_set_event(conference->dtmf_parser,ccds[i].key,ccds[i].action); + } + } + if(status == SWITCH_STATUS_NOOP) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Invalid caller control action name '%'.\n",key); + } + } + } + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to allocate caller control digit parser.\n"); + } /* Activate the conference mutex for exclusivity */ switch_mutex_init(&conference->mutex, SWITCH_MUTEX_NESTED, conference->pool); Modified: freeswitch/branches/knhor/trunk/src/switch_ivr.c ============================================================================== --- freeswitch/branches/knhor/trunk/src/switch_ivr.c (original) +++ freeswitch/branches/knhor/trunk/src/switch_ivr.c Sat Nov 11 18:22:17 2006 @@ -3235,3 +3235,30 @@ return SWITCH_STATUS_SUCCESS; } + +struct switch_ivr_digit_stream_parser { +}; + +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_new(switch_ivr_digit_stream_parser_t **parser) +{ switch_status_t status = SWITCH_STATUS_SUCCESS; + + return status; +} + +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_set_event(switch_ivr_digit_stream_parser_t *parser, char *digits, int action) +{ switch_status_t status = SWITCH_STATUS_SUCCESS; + + return status; +} + +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_del_event(switch_ivr_digit_stream_parser_t *parser, char *digits) +{ switch_status_t status = SWITCH_STATUS_SUCCESS; + + return status; +} + +SWITCH_DECLARE(int) switch_ivr_digit_stream_parser_feed(switch_ivr_digit_stream_parser_t *parser, char digit) +{ int result = 0; + + return result; +}
participants (1)
-
Freeswitch SVN