Changeset 180

Show
Ignore:
Timestamp:
11/05/07 12:10:29 (10 months ago)
Author:
sip
Message:

Check for disconnect on pseudo channel dial (Issue #6).

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • app_h324m/app_h324m.c

    r178 r180  
    651651                goto clean_pseudo; 
    652652 
     653        /* Set up array */ 
     654        channels[0] = chan; 
     655        channels[1] = pseudo; 
     656 
     657        /* No timeout */ 
     658        ms = -1; 
     659 
    653660        /* while not setup */ 
    654661        while (pseudo->_state!=AST_STATE_UP)  
    655662        { 
    656663                /* Wait for data */ 
    657                 if (ast_waitfor(pseudo, 0)<0) 
     664                if ((where = ast_waitfor_n(channels, 2, &ms))<0) 
    658665                        /* error, timeout, or done */ 
    659666                        break; 
    660667                /* Read frame */ 
    661                 f = ast_read(pseudo); 
     668                f = ast_read(where); 
    662669                /* If not frame */ 
    663670                if (!f) 
    664671                        /* done */  
    665672                        break; 
    666                 /* If it's a control frame */ 
    667                 if (f->frametype == AST_FRAME_CONTROL)  
     673                /* Check channel */ 
     674                if (where==pseudo) 
    668675                { 
    669                         /* Dependinf on the event */ 
    670                         switch (f->subclass)  
    671                         { 
    672                                 case AST_CONTROL_RINGING:        
    673                                         break; 
    674                                 case AST_CONTROL_BUSY: 
    675                                 case AST_CONTROL_CONGESTION: 
    676                                         /* Save cause */ 
    677                                         reason = pseudo->hangupcause; 
    678                                         /* exit */ 
    679                                         goto hangup_pseudo; 
    680                                         break; 
    681                                 case AST_CONTROL_ANSWER: 
    682                                         /* Set UP*/ 
    683                                         reason = 0;      
    684                                         break; 
     676                        /* If it's a control frame */ 
     677                        if (f->frametype == AST_FRAME_CONTROL)  
     678                        { 
     679                                /* Dependinf on the event */ 
     680                                switch (f->subclass)  
     681                                { 
     682                                        case AST_CONTROL_RINGING:        
     683                                                break; 
     684                                        case AST_CONTROL_BUSY: 
     685                                        case AST_CONTROL_CONGESTION: 
     686                                                /* Delete frame */ 
     687                                                ast_frfree(f); 
     688                                                /* Save cause */ 
     689                                                reason = pseudo->hangupcause; 
     690                                                /* exit */ 
     691                                                goto hangup_pseudo; 
     692                                                break; 
     693                                        case AST_CONTROL_ANSWER: 
     694                                                /* Set UP*/ 
     695                                                reason = 0;      
     696                                                break; 
     697                                } 
     698                        } 
     699                } else { 
     700                        /* If it's a control frame */ 
     701                        if (f->frametype == AST_FRAME_CONTROL)  
     702                        { 
     703                                /* Depending on the event */ 
     704                                switch (f->subclass)  
     705                                { 
     706                                        case AST_CONTROL_HANGUP: 
     707                                                /* Delete frame */ 
     708                                                ast_frfree(f); 
     709                                                /* exit */ 
     710                                                goto hangup_pseudo; 
     711                                                break; 
     712                                } 
    685713                        } 
    686714                } 
     
    703731        ast_answer(chan); 
    704732 
    705         /* Set up array */ 
    706         channels[0] = chan; 
    707         channels[1] = pseudo; 
    708  
    709         /* No timeout */ 
    710         ms = -1; 
    711  
    712733        /* Wait for data avaiable on any channel */ 
    713         while (!reason && (where = ast_waitfor_n(channels, 2, &ms)) != NULL) { 
     734        while (!reason && (where = ast_waitfor_n(channels, 2, &ms)) != NULL)  
     735        { 
    714736                /* Read frame from channel */ 
    715737                f = ast_read(where); 
     
    929951                goto clean_pseudo; 
    930952 
     953        /* Set up array */ 
     954        channels[0] = chan; 
     955        channels[1] = pseudo; 
     956 
     957        /* No timeout */ 
     958        ms = -1; 
     959 
    931960        /* while not setup */ 
    932961        while (pseudo->_state!=AST_STATE_UP)  
    933962        { 
    934963                /* Wait for data */ 
    935                 if (ast_waitfor(pseudo, 0)<0) 
     964                if ((where = ast_waitfor_n(channels, 2, &ms))<0) 
    936965                        /* error, timeout, or done */ 
    937966                        break; 
     
    942971                        /* done */  
    943972                        break; 
    944                 /* If it's a control frame */ 
    945                 if (f->frametype == AST_FRAME_CONTROL)  
     973                /* Check channel */ 
     974                if (where==pseudo) 
    946975                { 
    947                         /* Depending on the event */ 
    948                         switch (f->subclass)  
    949                         { 
    950                                 case AST_CONTROL_RINGING:        
    951                                         break; 
    952                                 case AST_CONTROL_BUSY: 
    953                                 case AST_CONTROL_CONGESTION: 
    954                                         /* Save cause */ 
    955                                         reason = pseudo->hangupcause; 
    956                                         /* exit */ 
    957                                         goto hangup_pseudo; 
    958                                         break; 
    959                                 case AST_CONTROL_ANSWER: 
    960                                         /* Set UP*/ 
    961                                         reason = 0;      
    962                                         break; 
     976                        /* If it's a control frame */ 
     977                        if (f->frametype == AST_FRAME_CONTROL)  
     978                        { 
     979                                /* Depending on the event */ 
     980                                switch (f->subclass)  
     981                                { 
     982                                        case AST_CONTROL_RINGING:        
     983                                                break; 
     984                                        case AST_CONTROL_BUSY: 
     985                                        case AST_CONTROL_CONGESTION: 
     986                                                /* Delete frame */ 
     987                                                ast_frfree(f); 
     988                                                /* Save cause */ 
     989                                                reason = pseudo->hangupcause; 
     990                                                /* exit */ 
     991                                                goto hangup_pseudo; 
     992                                                break; 
     993                                        case AST_CONTROL_ANSWER: 
     994                                                /* Set UP*/ 
     995                                                reason = 0;      
     996                                                break; 
     997                                } 
     998                        } 
     999                } else { 
     1000                        /* If it's a control frame */ 
     1001                        if (f->frametype == AST_FRAME_CONTROL)  
     1002                        { 
     1003                                /* Depending on the event */ 
     1004                                switch (f->subclass)  
     1005                                { 
     1006                                        case AST_CONTROL_HANGUP: 
     1007                                                /* Delete frame */ 
     1008                                                ast_frfree(f); 
     1009                                                /* exit */ 
     1010                                                goto hangup_pseudo; 
     1011                                                break; 
     1012                                } 
    9631013                        } 
    9641014                } 
     
    9801030        /* Answer call */ 
    9811031        ast_answer(chan); 
    982  
    983         /* Set up array */ 
    984         channels[0] = chan; 
    985         channels[1] = pseudo; 
    986  
    987         /* No timeout */ 
    988         ms = -1; 
    9891032 
    9901033        /* Create enpty packet */ 
Copyright 2006 - Sergio García Murillo
Powered by Trac - Edgewall Software