diff options
author | wedhorn <wedhorn@f38db490-d61c-443f-a65b-d21fe96a405b> | 2011-05-09 07:40:40 +0000 |
---|---|---|
committer | wedhorn <wedhorn@f38db490-d61c-443f-a65b-d21fe96a405b> | 2011-05-09 07:40:40 +0000 |
commit | a71f0300900ab2ab0d166eddf29cd0b9f4ccde2a (patch) | |
tree | 86eb55196d2829d6dfb4b78d4bacdef883188807 /channels | |
parent | caab296fd80bb54a100063484ac304700c9653dd (diff) |
Add setsubstate_callwait.
If a call is made to a line that already has a call and the device is
offhook (ie activeish call), the call is set to CALLWAIT rather than RINGIN.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@318106 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_skinny.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index cd3ea4876..96e21a1cf 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -1194,6 +1194,7 @@ static int matchdigittimeout = 3000; #define SUBSTATE_BUSY 6 #define SUBSTATE_CONGESTION 7 #define SUBSTATE_HOLD 8 +#define SUBSTATE_CALLWAIT 9 #define SUBSTATE_PROGRESS 12 #define SUBSTATE_DIALING 101 @@ -1409,6 +1410,7 @@ static int skinny_reload(void); static void setsubstate_dialing(struct skinny_subchannel *sub, char exten[AST_MAX_EXTENSION]); static void setsubstate_ringin(struct skinny_subchannel *sub); +static void setsubstate_callwait(struct skinny_subchannel *sub); static void setsubstate_ringout(struct skinny_subchannel *sub); static void setsubstate_connected(struct skinny_subchannel *sub); static void setsubstate_busy(struct skinny_subchannel *sub); @@ -4679,6 +4681,8 @@ static char *substate2str(int ind) { return "SUBSTATE_PROGRESS"; case SUBSTATE_HOLD: return "SUBSTATE_HOLD"; + case SUBSTATE_CALLWAIT: + return "SUBSTATE_CALLWAIT"; case SUBSTATE_DIALING: return "SUBSTATE_DIALING"; default: @@ -4776,6 +4780,11 @@ static void setsubstate_ringin(struct skinny_subchannel *sub) struct skinny_device *d = l->device; struct ast_channel *c = sub->owner; + if ((AST_LIST_NEXT(AST_LIST_FIRST(&l->sub), list)) && (d->hookstate == SKINNY_OFFHOOK)) { + setsubstate_callwait(sub); + return; + } + transmit_callstate(d, l->instance, sub->callid, SKINNY_RINGIN); transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_RINGIN); transmit_displaypromptstatus(d, "Ring-In", 0, l->instance, sub->callid); @@ -4787,9 +4796,29 @@ static void setsubstate_ringin(struct skinny_subchannel *sub) l->activesub = sub; } + if (sub->substate != SUBSTATE_RINGIN || sub->substate != SUBSTATE_CALLWAIT) { + ast_setstate(c, AST_STATE_RINGING); + ast_queue_control(c, AST_CONTROL_RINGING); + } + sub->substate = SUBSTATE_RINGIN; +} + +static void setsubstate_callwait(struct skinny_subchannel *sub) +{ + struct skinny_line *l = sub->line; + struct skinny_device *d = l->device; + struct ast_channel *c = sub->owner; + + transmit_callstate(d, l->instance, sub->callid, SKINNY_CALLWAIT); + transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_RINGIN); + transmit_displaypromptstatus(d, "Callwaiting", 0, l->instance, sub->callid); + transmit_callinfo(sub); + transmit_lamp_indication(d, STIMULUS_LINE, l->instance, SKINNY_LAMP_BLINK); + transmit_start_tone(d, SKINNY_CALLWAITTONE, l->instance, sub->callid); + ast_setstate(c, AST_STATE_RINGING); ast_queue_control(c, AST_CONTROL_RINGING); - sub->substate = SUBSTATE_RINGIN; + sub->substate = SUBSTATE_CALLWAIT; } static void setsubstate_connected(struct skinny_subchannel *sub) @@ -4810,7 +4839,7 @@ static void setsubstate_connected(struct skinny_subchannel *sub) if (!sub->rtp) { start_rtp(sub); } - if (sub->substate == SUBSTATE_RINGIN) { + if (sub->substate == SUBSTATE_RINGIN || sub->substate == SUBSTATE_CALLWAIT) { ast_queue_control(sub->owner, AST_CONTROL_ANSWER); } if (sub->substate == SUBSTATE_DIALING || sub->substate == SUBSTATE_RINGOUT) { |