summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorDamien Wedhorn <voip@facts.com.au>2011-05-13 08:33:35 +0000
committerDamien Wedhorn <voip@facts.com.au>2011-05-13 08:33:35 +0000
commit54bb8a0ca8aa920c1fb1773e917a482019b53bf5 (patch)
tree7eb1ba68be80c1fb889c3a2222e9c9301f698e1d /channels
parent9066db432982e68b8d0290af779f220c0efb1c41 (diff)
Move exten used for dialing from device to subchannel.
There were some issues where if a simple switch was cancelled and a new switch started before the first had timed out where the d->exten would be used for both subchannels. This was bad leading to possible invalid extensions if some digits had been entered in the abandoned simple switch and the second one was completed before the first timed out, or the second would be cancelled because d->exten would be set to nothing on the time out of the first. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@318833 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_skinny.c48
1 files changed, 26 insertions, 22 deletions
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c
index db367b144..a5b39d058 100644
--- a/channels/chan_skinny.c
+++ b/channels/chan_skinny.c
@@ -1332,7 +1332,6 @@ struct skinny_addon {
char name[80]; \
char id[16]; \
char version_id[16]; \
- char exten[AST_MAX_EXTENSION]; \
char vmexten[AST_MAX_EXTENSION]; \
int type; \
int registered; \
@@ -2844,6 +2843,10 @@ static void update_connectedline(struct skinny_subchannel *sub, const void *data
|| ast_strlen_zero(c->connected.id.number.str))
return;
+ if (skinnydebug) {
+ ast_verb(3,"Sub %d - Updating\n", sub->callid);
+ }
+
transmit_callinfo(sub);
if (sub->owner->_state == AST_STATE_UP) {
transmit_callstate(d, l->instance, sub->callid, SKINNY_CONNECTED);
@@ -3949,11 +3952,11 @@ static void *skinny_ss(void *data)
ast_verb(3, "Starting simple switch on '%s@%s'\n", l->name, d->name);
- len = strlen(d->exten);
+ len = strlen(sub->exten);
while (len < AST_MAX_EXTENSION-1) {
res = 1; /* Assume that we will get a digit */
- while (strlen(d->exten) == len){
+ while (strlen(sub->exten) == len){
ast_safe_sleep(c, loop_pause);
timeout -= loop_pause;
if ( (timeout -= loop_pause) <= 0){
@@ -3962,20 +3965,24 @@ static void *skinny_ss(void *data)
}
res = 1;
}
+
+ if (sub != l->activesub) {
+ break;
+ }
timeout = 0;
- len = strlen(d->exten);
+ len = strlen(sub->exten);
- if (!ast_ignore_pattern(c->context, d->exten)) {
+ if (!ast_ignore_pattern(c->context, sub->exten)) {
transmit_stop_tone(d, l->instance, sub->callid);
}
- if (ast_exists_extension(c, c->context, d->exten, 1, l->cid_num)) {
- if (!res || !ast_matchmore_extension(c, c->context, d->exten, 1, l->cid_num)) {
+ if (ast_exists_extension(c, c->context, sub->exten, 1, l->cid_num)) {
+ if (!res || !ast_matchmore_extension(c, c->context, sub->exten, 1, l->cid_num)) {
if (l->getforward) {
/* Record this as the forwarding extension */
- set_callforwards(l, d->exten, l->getforward);
+ set_callforwards(l, sub->exten, l->getforward);
ast_verb(3, "Setting call forward (%d) to '%s' on channel %s\n",
- l->cfwdtype, d->exten, c->name);
+ l->cfwdtype, sub->exten, c->name);
transmit_start_tone(d, SKINNY_DIALTONE, l->instance, sub->callid);
transmit_lamp_indication(d, STIMULUS_FORWARDALL, 1, SKINNY_LAMP_ON);
transmit_displaynotify(d, "CFwd enabled", 10);
@@ -3983,7 +3990,6 @@ static void *skinny_ss(void *data)
ast_safe_sleep(c, 500);
ast_indicate(c, -1);
ast_safe_sleep(c, 1000);
- memset(d->exten, 0, sizeof(d->exten));
len = 0;
l->getforward = 0;
if (sub->owner && sub->owner->_state != AST_STATE_UP) {
@@ -3992,7 +3998,7 @@ static void *skinny_ss(void *data)
}
return NULL;
} else {
- ast_copy_string(sub->exten, d->exten, sizeof(sub->exten));
+ ast_copy_string(sub->exten, sub->exten, sizeof(sub->exten));
setsubstate(c->tech_pvt, SUBSTATE_DIALING);
return NULL;
}
@@ -4002,8 +4008,7 @@ static void *skinny_ss(void *data)
timeout = matchdigittimeout;
}
} else if (res == 0) {
- ast_debug(1, "Not enough digits (%s) (and no ambiguous match)...\n", d->exten);
- memset(d->exten, 0, sizeof(d->exten));
+ ast_debug(1, "Not enough digits (%s) (and no ambiguous match)...\n", sub->exten);
if (d->hookstate == SKINNY_OFFHOOK) {
transmit_start_tone(d, SKINNY_REORDER, l->instance, sub->callid);
}
@@ -4012,13 +4017,12 @@ static void *skinny_ss(void *data)
ast_hangup(c);
}
return NULL;
- } else if (!ast_canmatch_extension(c, c->context, d->exten, 1,
+ } else if (!ast_canmatch_extension(c, c->context, sub->exten, 1,
S_COR(c->caller.id.number.valid, c->caller.id.number.str, NULL))
- && ((d->exten[0] != '*') || (!ast_strlen_zero(d->exten) > 2))) {
- ast_log(LOG_WARNING, "Can't match [%s] from '%s' in context %s\n", d->exten,
+ && ((sub->exten[0] != '*') || (!ast_strlen_zero(sub->exten) > 2))) {
+ ast_log(LOG_WARNING, "Can't match [%s] from '%s' in context %s\n", sub->exten,
S_COR(c->caller.id.number.valid, c->caller.id.number.str, "<Unknown Caller>"),
c->context);
- memset(d->exten, 0, sizeof(d->exten));
if (d->hookstate == SKINNY_OFFHOOK) {
transmit_start_tone(d, SKINNY_REORDER, l->instance, sub->callid);
/* hang out for 3 seconds to let congestion play */
@@ -4029,13 +4033,12 @@ static void *skinny_ss(void *data)
if (!timeout) {
timeout = gendigittimeout;
}
- if (len && !ast_ignore_pattern(c->context, d->exten)) {
+ if (len && !ast_ignore_pattern(c->context, sub->exten)) {
ast_indicate(c, -1);
}
}
if (c)
ast_hangup(c);
- memset(d->exten, 0, sizeof(d->exten));
return NULL;
}
@@ -4660,6 +4663,7 @@ static void setsubstate(struct skinny_subchannel *sub, int state)
transmit_clear_display_message(d, l->instance, sub->callid);
transmit_start_tone(d, SKINNY_DIALTONE, l->instance, sub->callid);
transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_OFFHOOK);
+ transmit_displaypromptstatus(d, "Enter number", 0, l->instance, sub->callid);
sub->substate = SUBSTATE_OFFHOOK;
@@ -4718,10 +4722,10 @@ static void setsubstate(struct skinny_subchannel *sub, int state)
transmit_stop_tone(d, l->instance, sub->callid);
transmit_clear_display_message(d, l->instance, sub->callid);
transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_RINGOUT);
+ transmit_displaypromptstatus(d, "Dialing", 0, l->instance, sub->callid);
ast_copy_string(c->exten, sub->exten, sizeof(c->exten));
ast_copy_string(l->lastnumberdialed, sub->exten, sizeof(l->lastnumberdialed));
- memset(d->exten, 0, sizeof(d->exten));
sub->substate = SUBSTATE_DIALING;
@@ -6123,8 +6127,8 @@ static int handle_message(struct skinny_req *req, struct skinnysession *s)
ast_log(LOG_WARNING, "Unsupported digit %d\n", digit);
}
- d->exten[strlen(d->exten)] = dgt;
- d->exten[strlen(d->exten)+1] = '\0';
+ sub->exten[strlen(sub->exten)] = dgt;
+ sub->exten[strlen(sub->exten)+1] = '\0';
} else
res = handle_keypad_button_message(req, s);
}