aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_skinny.c
diff options
context:
space:
mode:
authorwedhorn <wedhorn@f38db490-d61c-443f-a65b-d21fe96a405b>2011-05-13 08:33:35 +0000
committerwedhorn <wedhorn@f38db490-d61c-443f-a65b-d21fe96a405b>2011-05-13 08:33:35 +0000
commit2650cd67deb272c0a69815fcc73536820ac12775 (patch)
tree7eb1ba68be80c1fb889c3a2222e9c9301f698e1d /channels/chan_skinny.c
parent01670733d4bec6ff48530bedbbb6327d9fd38240 (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: http://svn.digium.com/svn/asterisk/trunk@318833 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_skinny.c')
-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);
}