Index: addons/ooh323c/src/ooh245.c =================================================================== --- addons/ooh323c/src/ooh245.c (revision 321510) +++ addons/ooh323c/src/ooh245.c (working copy) @@ -2074,6 +2074,8 @@ int ooHandleH245Command(OOH323CallData *call, ooClearAllLogicalChannels(call); } ooSendEndSessionCommand(call); + if (call->callState < OO_CALL_CLEAR) + call->callState = OO_CALL_CLEAR; } Index: addons/ooh323c/src/oochannels.c =================================================================== --- addons/ooh323c/src/oochannels.c (revision 321510) +++ addons/ooh323c/src/oochannels.c (working copy) @@ -671,10 +671,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) @@ -691,20 +692,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; + } } } } @@ -1319,7 +1323,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: addons/chan_ooh323.c =================================================================== --- addons/chan_ooh323.c (revision 321510) +++ addons/chan_ooh323.c (working copy) @@ -1079,6 +1079,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"); @@ -1086,8 +1087,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); @@ -1252,6 +1263,7 @@ static int ooh323_indicate(struct ast_channel *ast } else { ooManualRingback(callToken); } + p->alertsent = 1; } } break;