Changeset 180
- 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
| r178 |
r180 |
|
| 651 | 651 | goto clean_pseudo; |
|---|
| 652 | 652 | |
|---|
| | 653 | /* Set up array */ |
|---|
| | 654 | channels[0] = chan; |
|---|
| | 655 | channels[1] = pseudo; |
|---|
| | 656 | |
|---|
| | 657 | /* No timeout */ |
|---|
| | 658 | ms = -1; |
|---|
| | 659 | |
|---|
| 653 | 660 | /* while not setup */ |
|---|
| 654 | 661 | while (pseudo->_state!=AST_STATE_UP) |
|---|
| 655 | 662 | { |
|---|
| 656 | 663 | /* Wait for data */ |
|---|
| 657 | | if (ast_waitfor(pseudo, 0)<0) |
|---|
| | 664 | if ((where = ast_waitfor_n(channels, 2, &ms))<0) |
|---|
| 658 | 665 | /* error, timeout, or done */ |
|---|
| 659 | 666 | break; |
|---|
| 660 | 667 | /* Read frame */ |
|---|
| 661 | | f = ast_read(pseudo); |
|---|
| | 668 | f = ast_read(where); |
|---|
| 662 | 669 | /* If not frame */ |
|---|
| 663 | 670 | if (!f) |
|---|
| 664 | 671 | /* done */ |
|---|
| 665 | 672 | break; |
|---|
| 666 | | /* If it's a control frame */ |
|---|
| 667 | | if (f->frametype == AST_FRAME_CONTROL) |
|---|
| | 673 | /* Check channel */ |
|---|
| | 674 | if (where==pseudo) |
|---|
| 668 | 675 | { |
|---|
| 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 | } |
|---|
| 685 | 713 | } |
|---|
| 686 | 714 | } |
|---|
| … | … | |
| 703 | 731 | ast_answer(chan); |
|---|
| 704 | 732 | |
|---|
| 705 | | /* Set up array */ |
|---|
| 706 | | channels[0] = chan; |
|---|
| 707 | | channels[1] = pseudo; |
|---|
| 708 | | |
|---|
| 709 | | /* No timeout */ |
|---|
| 710 | | ms = -1; |
|---|
| 711 | | |
|---|
| 712 | 733 | /* 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 | { |
|---|
| 714 | 736 | /* Read frame from channel */ |
|---|
| 715 | 737 | f = ast_read(where); |
|---|
| … | … | |
| 929 | 951 | goto clean_pseudo; |
|---|
| 930 | 952 | |
|---|
| | 953 | /* Set up array */ |
|---|
| | 954 | channels[0] = chan; |
|---|
| | 955 | channels[1] = pseudo; |
|---|
| | 956 | |
|---|
| | 957 | /* No timeout */ |
|---|
| | 958 | ms = -1; |
|---|
| | 959 | |
|---|
| 931 | 960 | /* while not setup */ |
|---|
| 932 | 961 | while (pseudo->_state!=AST_STATE_UP) |
|---|
| 933 | 962 | { |
|---|
| 934 | 963 | /* Wait for data */ |
|---|
| 935 | | if (ast_waitfor(pseudo, 0)<0) |
|---|
| | 964 | if ((where = ast_waitfor_n(channels, 2, &ms))<0) |
|---|
| 936 | 965 | /* error, timeout, or done */ |
|---|
| 937 | 966 | break; |
|---|
| … | … | |
| 942 | 971 | /* done */ |
|---|
| 943 | 972 | break; |
|---|
| 944 | | /* If it's a control frame */ |
|---|
| 945 | | if (f->frametype == AST_FRAME_CONTROL) |
|---|
| | 973 | /* Check channel */ |
|---|
| | 974 | if (where==pseudo) |
|---|
| 946 | 975 | { |
|---|
| 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 | } |
|---|
| 963 | 1013 | } |
|---|
| 964 | 1014 | } |
|---|
| … | … | |
| 980 | 1030 | /* Answer call */ |
|---|
| 981 | 1031 | ast_answer(chan); |
|---|
| 982 | | |
|---|
| 983 | | /* Set up array */ |
|---|
| 984 | | channels[0] = chan; |
|---|
| 985 | | channels[1] = pseudo; |
|---|
| 986 | | |
|---|
| 987 | | /* No timeout */ |
|---|
| 988 | | ms = -1; |
|---|
| 989 | 1032 | |
|---|
| 990 | 1033 | /* Create enpty packet */ |
|---|
Download in other formats:
|
|