[Freeswitch-svn] [commit] r12262 - in freeswitch/trunk/src: . include mod/applications/mod_conference
FreeSWITCH SVN
anthm at freeswitch.org
Tue Feb 24 10:36:45 PST 2009
Author: anthm
Date: Tue Feb 24 12:36:45 2009
New Revision: 12262
Log:
MODAPP-221
Modified:
freeswitch/trunk/src/include/switch_ivr.h
freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c
freeswitch/trunk/src/switch_ivr.c
Modified: freeswitch/trunk/src/include/switch_ivr.h
==============================================================================
--- freeswitch/trunk/src/include/switch_ivr.h (original)
+++ freeswitch/trunk/src/include/switch_ivr.h Tue Feb 24 12:36:45 2009
@@ -582,7 +582,7 @@
\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);
+SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_destroy(switch_ivr_digit_stream_t **stream);
/*!
\brief Set a digit string to action mapping
Modified: freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c Tue Feb 24 12:36:45 2009
@@ -33,7 +33,7 @@
*
*/
#include <switch.h>
-
+//#define INTENSE_DEBUG
SWITCH_MODULE_LOAD_FUNCTION(mod_conference_load);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_conference_shutdown);
SWITCH_MODULE_DEFINITION(mod_conference, mod_conference_load, mod_conference_shutdown, NULL);
@@ -1961,9 +1961,9 @@
#ifdef INTENSE_DEBUG
switch_log_printf(SWITCH_CHANNEL_LOG,
SWITCH_LOG_INFO,
- "executing caller control '%s' param '%s' on call '%u, %s, %s, %s'\n",
+ "executing caller control '%s' param '%s' on call '%u, %s\n",
caller_action->fndesc->key,
- param ? param : "none", member->id, switch_channel_get_name(channel), profile->caller_id_name, profile->caller_id_number);
+ param ? param : "none", member->id, switch_channel_get_name(channel));
#endif
caller_action->fndesc->handler(member, caller_action);
@@ -2110,7 +2110,7 @@
} /* Rinse ... Repeat */
if (member->digit_stream != NULL) {
- switch_ivr_digit_stream_destroy(member->digit_stream);
+ switch_ivr_digit_stream_destroy(&member->digit_stream);
}
switch_clear_flag_locked(member, MFLAG_RUNNING);
Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c (original)
+++ freeswitch/trunk/src/switch_ivr.c Tue Feb 24 12:36:45 2009
@@ -1388,6 +1388,7 @@
switch_memory_pool_t *pool;
switch_hash_t *hash;
switch_size_t maxlen;
+ switch_size_t buflen;
switch_size_t minlen;
char terminator;
unsigned int digit_timeout_ms;
@@ -1461,24 +1462,25 @@
switch_status_t status = SWITCH_STATUS_FALSE;
/* if we have a parser 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;
- }
+ if (parser && stream && *stream == NULL) {
+ *stream = (switch_ivr_digit_stream_t *) malloc(sizeof(**stream));
+ switch_assert(*stream);
+ memset(*stream, 0, sizeof(**stream));
+ switch_zmalloc((*stream)->digits, parser->buflen + 1);
+ status = SWITCH_STATUS_SUCCESS;
}
return status;
}
-SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_destroy(switch_ivr_digit_stream_t *stream)
+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 && stream->digits != NULL) {
- free(stream->digits);
- stream->digits = NULL;
+ if (*stream) {
+ switch_safe_free((*stream)->digits);
+ free(*stream);
+ *stream = NULL;
status = SWITCH_STATUS_SUCCESS;
}
@@ -1499,6 +1501,11 @@
* figure out when a digit set is completed, therefore we
* keep track of the min and max digit lengths
*/
+
+ if (len > parser->buflen) {
+ parser->buflen = len;
+ }
+
if (parser->terminator == '\0') {
if (len > parser->maxlen) {
parser->maxlen = len;
@@ -1541,51 +1548,50 @@
{
void *result = NULL;
- if (parser != NULL && stream != NULL) {
- switch_size_t len = (stream->digits != NULL ? strlen(stream->digits) : 0);
-
- /* handle new digit arrivals */
- if (digit != '\0') {
-
- /* if it's not a terminator digit, add it to the collected digits */
- if (digit != parser->terminator) {
- /* 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 = stream->digits + 1;
- char *dst = stream->digits;
+ switch_assert(parser);
+ switch_assert(stream);
+ switch_assert(stream->digits);
+
+ switch_size_t len = strlen(stream->digits);
+
+ /* handle new digit arrivals */
+ if (digit) {
+ /* if it's not a terminator digit, add it to the collected digits */
+ if (digit != parser->terminator) {
+ /* 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 = stream->digits + 1;
+ char *dst = stream->digits;
- while (*src) {
- *(dst++) = *(src++);
- }
- *dst = digit;
- } else {
- char *tmp = realloc(stream->digits, len + 2);
- switch_assert(tmp);
- stream->digits = tmp;
- *(stream->digits + (len++)) = digit;
- *(stream->digits + len) = '\0';
- stream->last_digit_time = switch_micro_time_now() / 1000;
+ while (*src) {
+ *(dst++) = *(src++);
}
+ *dst = digit;
+ } else {
+ *(stream->digits + (len++)) = digit;
+ *(stream->digits + len) = '\0';
+ stream->last_digit_time = switch_micro_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_micro_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, 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(stream->digits);
- stream->digits = NULL;
- }
+ }
+
+ /* don't allow collected digit string testing if there are varying sized keys until timeout */
+ if (parser->maxlen - parser->minlen > 0 && (switch_micro_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, 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) {
+ *stream->digits = '\0';
}
}
+
return result;
}
@@ -1593,13 +1599,12 @@
SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_reset(switch_ivr_digit_stream_t *stream)
{
switch_status_t status = SWITCH_STATUS_FALSE;
+ switch_assert(stream);
+ switch_assert(stream->digits);
- if (stream != NULL && stream->digits != NULL) {
- free(stream->digits);
- stream->digits = NULL;
- stream->last_digit_time = 0;
- status = SWITCH_STATUS_SUCCESS;
- }
+ *stream->digits = '\0';
+ stream->last_digit_time = 0;
+ status = SWITCH_STATUS_SUCCESS;
return status;
}
More information about the Freeswitch-svn
mailing list