[commit] r3323 - in freeswitch/branches/knhor/trunk/src: . include
Author: knhor Date: Sat Nov 11 21:58:45 2006 New Revision: 3323 Modified: freeswitch/branches/knhor/trunk/src/include/switch_ivr.h freeswitch/branches/knhor/trunk/src/switch_ivr.c Log: flesh out the new 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 21:58:45 2006 @@ -403,17 +403,24 @@ 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 { -}; +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 pool the pool to use for the new hash \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); +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_new(switch_memory_pool_t *pool, switch_ivr_digit_stream_parser_t **parser); /*! + \brief Destroy 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_destroy(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 @@ -437,6 +444,20 @@ \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); + +/*! + \brief Reset the collected digit stream to nothing + \param parser a pointer to the parser object created by switch_ivr_digit_stream_parser_new + \return SWITCH_STATUS_SUCCESS if all is well +*/ +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_reset(switch_ivr_digit_stream_parser_t *parser); + +/*! + \brief Set a digit string terminator + \param parser a pointer to the parser object created by switch_ivr_digit_stream_parser_new + \return SWITCH_STATUS_SUCCESS if all is well +*/ +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_set_terminator(switch_ivr_digit_stream_parser_t *parser, char digit); /** @} */ 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 21:58:45 2006 @@ -3237,28 +3237,145 @@ } struct switch_ivr_digit_stream_parser { + int pool_auto_created; + switch_memory_pool_t *pool; + switch_hash_t *hash; + char *digits; + char terminator; }; -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; +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_new(switch_memory_pool_t *pool, switch_ivr_digit_stream_parser_t **parser) +{ switch_status_t status = SWITCH_STATUS_FALSE; + if(parser != NULL) { + int pool_auto_created = 0; + + // if the caller didn't provide a pool, make one + if (pool == NULL) { + switch_core_new_memory_pool(&pool); + if (pool != NULL) { + pool_auto_created = 1; + } + } + + // if we have a pool, make a parser object + if (pool != NULL) { + *parser = (switch_ivr_digit_stream_parser_t *)switch_core_alloc(pool,sizeof(switch_ivr_digit_stream_parser_t)); + } + + // if we have parser object, initialize it for the caller + if (*parser != NULL) { + memset(*parser,0,sizeof(switch_ivr_digit_stream_parser_t)); + (*parser)->pool_auto_created = pool_auto_created; + (*parser)->pool = pool; + switch_core_hash_init(&(*parser)->hash,(*parser)->pool); + + status = SWITCH_STATUS_SUCCESS; + } else { + status = SWITCH_STATUS_MEMERR; + // clean up the pool if we created it + if (pool != NULL && pool_auto_created) { + switch_core_destroy_memory_pool(&pool); + } + } + } + return status; } +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_destroy(switch_ivr_digit_stream_parser_t **parser) +{ switch_status_t status = SWITCH_STATUS_FALSE; + + if (parser != NULL && *parser != NULL) { + if ((*parser)->hash != NULL) { + switch_core_hash_destroy((*parser)->hash); + (*parser)->hash = NULL; + } + // free the memory pool if we created it + if ((*parser)->pool_auto_created && (*parser)->pool != NULL) { + status = switch_core_destroy_memory_pool(&(*parser)->pool); + } + // clean up for the caller + *parser = NULL; + } + + 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; +{ switch_status_t status = SWITCH_STATUS_FALSE; + if (parser != NULL && digits != NULL && *digits && parser->hash != NULL) { + status = switch_core_hash_insert_dup(parser->hash,digits,(void *)action); + } + if (status != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "unable to add hash for '%s' action: %d\n",digits,action); + } + 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; +{ switch_status_t status = SWITCH_STATUS_FALSE; + if (parser != NULL && digits != NULL && *digits) { + status = switch_core_hash_delete(parser->hash,digits); + } + + if (status != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "unable to del hash for '%s'\n",digits); + } + return status; } SWITCH_DECLARE(int) switch_ivr_digit_stream_parser_feed(switch_ivr_digit_stream_parser_t *parser, char digit) { int result = 0; + if (parser != NULL && digit != '\0') { + size_t len = (parser->digits != NULL ? strlen(parser->digits) : 0); + + // if it's not a terminator digit, add it to the collected digits + if (parser->terminator != digit) { + parser->digits = realloc(parser->digits,len+2); + *(parser->digits+(len++)) = digit; + *(parser->digits+len) = '\0'; + } + + // if we have digits to test + if (len) { + result = (int)switch_core_hash_find(parser->hash,parser->digits); + // if we matched the digit string, or this digit is the terminator + // reset the collected digits for next digit string + if (result != 0 || parser->terminator == digit) { + free(parser->digits); + parser->digits = NULL; + } + } + } + return result; +} + +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_reset(switch_ivr_digit_stream_parser_t *parser) +{ switch_status_t status = SWITCH_STATUS_FALSE; + + if (parser != NULL && parser->digits != NULL) { + free(parser->digits); + parser->digits = NULL; + status = SWITCH_STATUS_SUCCESS; + } + + return status; +} + +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_set_terminator(switch_ivr_digit_stream_parser_t *parser, char digit) +{ switch_status_t status = SWITCH_STATUS_FALSE; + + if (parser != NULL) { + parser->terminator = digit; + status = SWITCH_STATUS_SUCCESS; + } + + return status; }
participants (1)
-
Freeswitch SVN