]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 321528 via svnmerge from
authorAlexandr Anikin <may@telecom-service.ru>
Wed, 1 Jun 2011 10:45:12 +0000 (10:45 +0000)
committerAlexandr Anikin <may@telecom-service.ru>
Wed, 1 Jun 2011 10:45:12 +0000 (10:45 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r321528 | may | 2011-06-01 14:40:19 +0400 (Wed, 01 Jun 2011) | 14 lines

  Fix double alerting, add forced alerting before answer

  Fix double alerting (it wasn't fixed here by issue #18542)
  Add forced alerting before connect (if it wasn't before)
  Try to send all packets from outgoing queue rather than one only
  Call goes into clearing state when disconnect command is received

  (closes issue #19361)
  Reported by: vmikhelson
  Patches:
        issue19361-3.patch uploaded by may213 (license 454)
  Tested by: vmikhelson
........

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

addons/chan_ooh323.c
addons/ooh323c/src/oochannels.c
addons/ooh323c/src/ooh245.c

index a795c9f1d7bf91bb67beb7aa22e4090c7edaf893..5c2131c93d712b6df77a23de4123fcd3c2876b05 100644 (file)
@@ -1044,6 +1044,7 @@ static int ooh323_hangup(struct ast_channel *ast)
 static int ooh323_answer(struct ast_channel *ast)
 {
        struct ooh323_pvt *p = ast->tech_pvt;
+       char *callToken = (char *)NULL;
 
        if (gH323Debug)
                ast_verbose("--- ooh323_answer\n");
@@ -1051,8 +1052,18 @@ static int ooh323_answer(struct ast_channel *ast)
        if (p) {
 
                ast_mutex_lock(&p->lock);
+               callToken = (p->callToken ? strdup(p->callToken) : NULL);
                if (ast->_state != AST_STATE_UP) {
                        ast_channel_lock(ast);
+                       if (!p->alertsent) {
+                               if (gH323Debug) {
+                                       ast_debug(1, "Sending forced ringback for %s, res = %d\n", 
+                                               callToken, ooManualRingback(callToken));
+                               } else {
+                                       ooManualRingback(callToken);
+                               }
+                               p->alertsent = 1;
+                       }
                        ast_setstate(ast, AST_STATE_UP);
                        if (option_debug)
                                ast_debug(1, "ooh323_answer(%s)\n", ast->name);
@@ -1220,6 +1231,7 @@ static int ooh323_indicate(struct ast_channel *ast, int condition, const void *d
                                }
                                p->alertsent = 1;
                        }
+                       p->alertsent = 1;
                }
         break;
        case AST_CONTROL_SRCUPDATE:
index 891a12d17998ffcaab0d7dd0fb8ae41f745c5413..e3ac30fbb92844ef8891f36f2c0f081019c9364c 100644 (file)
@@ -682,10 +682,11 @@ int ooProcessCallFDSETsAndTimers
 
     if (0 != call->pH245Channel && 0 != call->pH245Channel->sock)
     {
-     if(call->pH245Channel->outQueue.count>0)
-     {                           
-      if(ooPDWrite(pfds, nfds, call->pH245Channel->sock))
-       ooSendMsg(call, OOH245MSG);
+     if(ooPDWrite(pfds, nfds, call->pH245Channel->sock)) {
+      while (call->pH245Channel->outQueue.count>0) {
+       if (ooSendMsg(call, OOH245MSG) != OO_OK)
+       break;
+      }
      }
     }
     else if(call->h245listener)
@@ -702,20 +703,23 @@ int ooProcessCallFDSETsAndTimers
     {
      if(ooPDWrite(pfds, nfds, call->pH225Channel->sock))
      {
-      if(call->pH225Channel->outQueue.count>0)
+      while (call->pH225Channel->outQueue.count>0)
       {
        OOTRACEDBGC3("Sending H225 message (%s, %s)\n", 
                         call->callType, call->callToken);
-       ooSendMsg(call, OOQ931MSG);
+       if (ooSendMsg(call, OOQ931MSG) != OO_OK)
+       break;
       }
       if(call->pH245Channel && 
          call->pH245Channel->outQueue.count>0 && 
-        OO_TESTFLAG (call->flags, OO_M_TUNNELING))
-      {
+        OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
+       while (call->pH245Channel->outQueue.count>0) {
         OOTRACEDBGC3("H245 message needs to be tunneled. "
                           "(%s, %s)\n", call->callType, 
                                call->callToken);
-        ooSendMsg(call, OOH245MSG);
+        if (ooSendMsg(call, OOH245MSG) != OO_OK)
+        break;
+       }
       }
      }                                
     }
@@ -1330,7 +1334,7 @@ int ooSendMsg(OOH323CallData *call, int type)
    {
       OOTRACEDBGA3("Warning:Call marked for cleanup. Can not send message."
                    "(%s, %s)\n", call->callType, call->callToken);
-      return OO_OK;
+      return OO_FAILED;
    }
 
    if(type == OOQ931MSG)
index 940b8d838c7be4dbf276dd13002aaf1c8c2ffaec..efb0c21f22f1a1504a0bde54db901f94fecf2d85 100644 (file)
@@ -2126,6 +2126,8 @@ int ooHandleH245Command(OOH323CallData *call,
                ooClearAllLogicalChannels(call);
             }
             ooSendEndSessionCommand(call);
+           if (call->callState < OO_CALL_CLEAR)
+               call->callState = OO_CALL_CLEAR;
          }