Only allow voicemail if substate is OFFHOOK or no channel active (UNSET).
authorDamien Wedhorn <voip@facts.com.au>
Fri, 6 May 2011 23:07:55 +0000 (23:07 +0000)
committerDamien Wedhorn <voip@facts.com.au>
Fri, 6 May 2011 23:07:55 +0000 (23:07 +0000)
(closes issue #17901)
Reported by: salecha

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@318019 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_skinny.c

index 9e1436f..cd3ea48 100644 (file)
@@ -1185,6 +1185,7 @@ static int gendigittimeout = 8000;
 /* How long to wait for an extra digit, if there is an ambiguous match */
 static int matchdigittimeout = 3000;
 
+#define SUBSTATE_UNSET 0
 #define SUBSTATE_OFFHOOK 1
 #define SUBSTATE_ONHOOK 2
 #define SUBSTATE_RINGOUT 3
@@ -4706,6 +4707,8 @@ static void setsubstate_offhook(struct skinny_subchannel *sub)
        transmit_start_tone(d, SKINNY_DIALTONE, l->instance, sub->callid);
        transmit_selectsoftkeys(d, l->instance, sub->callid, KEYDEF_OFFHOOK);
 
+       sub->substate = SUBSTATE_OFFHOOK;
+       
        /* start the switch thread */
        if (ast_pthread_create(&t, NULL, skinny_ss, sub->owner)) {
                ast_log(LOG_WARNING, "Unable to create switch thread: %s\n", strerror(errno));
@@ -5181,23 +5184,26 @@ static int handle_stimulus_message(struct skinny_req *req, struct skinnysession
                /* XXX determine the best way to pull off a conference.  Meetme? */
                break;
        case STIMULUS_VOICEMAIL:
-               if (skinnydebug)
+               if (skinnydebug) {
                        ast_verb(1, "Received Stimulus: Voicemail(%d/%d)\n", instance, callreference);
+               }
 
                if (!sub || !sub->owner) {
                        c = skinny_new(l, AST_STATE_DOWN, NULL, SKINNY_OUTGOING);
                } else {
                        c = sub->owner;
                }
+               
                if (!c) {
                        ast_log(LOG_WARNING, "Unable to create channel for %s@%s\n", l->name, d->name);
-               } else {
-                       sub = c->tech_pvt;
+                       break;
+               }
+               
+               sub = c->tech_pvt;
+               if (sub->substate == SUBSTATE_UNSET || sub->substate == SUBSTATE_OFFHOOK){
                        l = sub->line;
                        l->activesub = sub;
-                       
                        setsubstate_dialing(sub,l->vmexten);
-
                }
                break;
        case STIMULUS_CALLPARK: