[commit] r3586 - in freeswitch/branches/knhor/trunk/src: . include
Author: knhor Date: Fri Dec 8 20:18:30 2006 New Revision: 3586 Modified: freeswitch/branches/knhor/trunk/src/include/switch_ivr.h freeswitch/branches/knhor/trunk/src/switch_ivr.c Log: separate the stream context from the parser context 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 Fri Dec 8 20:18:30 2006 @@ -406,8 +406,12 @@ 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; +struct switch_ivr_digit_stream; +typedef struct switch_ivr_digit_stream switch_ivr_digit_stream_t; /*! \brief Create a digit stream parser object \param pool the pool to use for the new hash @@ -418,12 +422,27 @@ /*! \brief Destroy a digit stream parser object - \param parser a pointer to the object pointer + \param parser a pointer to the parser object \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); +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_destroy(switch_ivr_digit_stream_parser_t *parser); /*! + \brief Create a new digit stream object + \param parser a pointer to the parser object created by switch_ivr_digit_stream_parser_new + \param stream a pointer to the stream object pointer + \return NULL if no match found or consumer data that was associated with a given digit string when matched +*/ +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_new(switch_ivr_digit_stream_parser_t *parser, switch_ivr_digit_stream_t **stream); + +/*! + \brief Destroys a digit stream object + \param stream a pointer to the stream object + \return NULL if no match found or consumer data that was associated with a given digit string when matched +*/ +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_destroy(switch_ivr_digit_stream_t *stream); + +/*! \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 @@ -446,14 +465,14 @@ \param digit a digit to collect and test against the map of digit strings \return NULL if no match found or consumer data that was associated with a given digit string when matched */ -SWITCH_DECLARE(void *) switch_ivr_digit_stream_parser_feed(switch_ivr_digit_stream_parser_t *parser, char digit); +SWITCH_DECLARE(void *) switch_ivr_digit_stream_parser_feed(switch_ivr_digit_stream_parser_t *parser, switch_ivr_digit_stream_t *stream, 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 + \param stream a pointer to the parser stream object created by switch_ivr_digit_stream_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); +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_reset(switch_ivr_digit_stream_t *stream); /*! \brief Set a digit string terminator @@ -462,6 +481,10 @@ \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 Fri Dec 8 20:18:30 2006 @@ -3487,11 +3487,14 @@ int pool_auto_created; switch_memory_pool_t *pool; switch_hash_t *hash; - char *digits; - char terminator; switch_size_t maxlen; switch_size_t minlen; + char terminator; unsigned int digit_timeout_ms; +}; + +struct switch_ivr_digit_stream { + char *digits; switch_time_t last_digit_time; }; @@ -3536,25 +3539,50 @@ return status; } -SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_destroy(switch_ivr_digit_stream_parser_t **parser) +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; + if (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); + 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_new(switch_ivr_digit_stream_parser_t *parser, switch_ivr_digit_stream_t **stream) +{ switch_status_t status = SWITCH_STATUS_FALSE; + + // if we have a paser object memory pool and a stream object pointer that is null + if (parser != NULL && parser->pool && stream != NULL && *stream == NULL) { + *stream = (switch_ivr_digit_stream_t *)switch_core_alloc(parser->pool,sizeof(switch_ivr_digit_stream_t)); + if (*stream != NULL) { + memset(*stream,0,sizeof(switch_ivr_digit_stream_t)); + status = SWITCH_STATUS_SUCCESS; + } + } + + return status; +} + +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_destroy(switch_ivr_digit_stream_t *stream) +{ switch_status_t status = SWITCH_STATUS_FALSE; + + if (stream == NULL && stream->digits != NULL) { + free(stream->digits); + stream->digits = NULL; + 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, void *data) { switch_status_t status = SWITCH_STATUS_FALSE; @@ -3605,11 +3633,11 @@ return status; } -SWITCH_DECLARE(void *) switch_ivr_digit_stream_parser_feed(switch_ivr_digit_stream_parser_t *parser, char digit) +SWITCH_DECLARE(void *) switch_ivr_digit_stream_parser_feed(switch_ivr_digit_stream_parser_t *parser, switch_ivr_digit_stream_t *stream, char digit) { void *result = NULL; - if (parser != NULL) { - switch_size_t len = (parser->digits != NULL ? strlen(parser->digits) : 0); + if (parser != NULL && stream != NULL) { + switch_size_t len = (stream->digits != NULL ? strlen(stream->digits) : 0); // handle new digit arrivals if(digit != '\0') { @@ -3619,37 +3647,37 @@ // if collected digits length >= the max length of the keys // in the hash table, then left shift the digit string if (len > 0 && parser->maxlen != 0 && len >= parser->maxlen) { - char *src = parser->digits + 1; - char *dst = parser->digits; + char *src = stream->digits + 1; + char *dst = stream->digits; while (*src) { *(dst++) = *(src++); } *dst = digit; } else { - parser->digits = realloc(parser->digits,len+2); - *(parser->digits+(len++)) = digit; - *(parser->digits+len) = '\0'; - parser->last_digit_time = switch_time_now() / 1000; + stream->digits = realloc(stream->digits,len+2); + *(stream->digits+(len++)) = digit; + *(stream->digits+len) = '\0'; + stream->last_digit_time = switch_time_now() / 1000; } } } // don't allow collected digit string testing if there are varying sized keys until timeout if ( parser->maxlen - parser->minlen > 0 - && (switch_time_now() / 1000) - parser->last_digit_time < parser->digit_timeout_ms + && (switch_time_now() / 1000) - stream->last_digit_time < parser->digit_timeout_ms ) { len = 0; } // if we have digits to test if (len) { - result = switch_core_hash_find(parser->hash,parser->digits); + result = switch_core_hash_find(parser->hash, stream->digits); // if we matched the digit string, or this digit is the terminator // reset the collected digits for next digit string if (result != NULL || parser->terminator == digit) { - free(parser->digits); - parser->digits = NULL; + free(stream->digits); + stream->digits = NULL; } } } @@ -3657,12 +3685,13 @@ return result; } -SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_reset(switch_ivr_digit_stream_parser_t *parser) +SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_reset(switch_ivr_digit_stream_t *stream) { switch_status_t status = SWITCH_STATUS_FALSE; - if (parser != NULL && parser->digits != NULL) { - free(parser->digits); - parser->digits = NULL; + if (stream != NULL && stream->digits != NULL) { + free(stream->digits); + stream->digits = NULL; + stream->last_digit_time = 0; status = SWITCH_STATUS_SUCCESS; }
participants (1)
-
Freeswitch SVN