aboutsummaryrefslogtreecommitdiffstats
path: root/channels/misdn/isdn_lib.c
diff options
context:
space:
mode:
authorrmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b>2009-07-14 18:32:20 +0000
committerrmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b>2009-07-14 18:32:20 +0000
commitf4cc03db385dd3d595799dec8321a1a77270efc5 (patch)
treedb3369c705afab7ba1bb988ab778ecd3b0f9b06d /channels/misdn/isdn_lib.c
parent609650d05646e645d6b8201c18d8e53a4c6bb6f8 (diff)
Merged revisions 206489 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r206489 | rmudgett | 2009-07-14 12:01:48 -0500 (Tue, 14 Jul 2009) | 35 lines Merged revisions 206487 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r206487 | rmudgett | 2009-07-14 11:44:47 -0500 (Tue, 14 Jul 2009) | 28 lines Fixes several call transfer issues with chan_misdn. * issue #14355 - Crash if attempt to transfer a call to an application. Masquerade the other pair of the four asterisk channels involved in the two calls. The held call already must be a bridged call (not an applicaton) or it would have been rejected. * issue #14692 - Held calls are not automatically cleared after transfer. Allow the core to initate disconnect of held calls to the ISDN port. This also fixes a similar case where the party on hold hangs up before being transferred or taken off hold. * JIRA ABE-1903 - Orphaned held calls left in music-on-hold. Do not simply block passing the hangup event on held calls to asterisk core. * Fixed to allow held calls to be transferred to ringing calls. Previously, held calls could only be transferred to connected calls. * Eliminated unused call states to simplify hangup code. * Eliminated most uses of "holded" because it is not a word. (closes issue #14355) (closes issue #14692) Reported by: sodom Patches: misdn_xfer_v14_r205839.patch uploaded by rmudgett (license 664) Tested by: rmudgett ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@206558 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/misdn/isdn_lib.c')
-rw-r--r--channels/misdn/isdn_lib.c81
1 files changed, 36 insertions, 45 deletions
diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c
index de3923bb6..9a89cc923 100644
--- a/channels/misdn/isdn_lib.c
+++ b/channels/misdn/isdn_lib.c
@@ -222,8 +222,6 @@ struct misdn_bchannel *find_bc_by_l3id(struct misdn_stack *stack, unsigned long
struct misdn_bchannel *find_bc_by_confid(unsigned long confid);
-struct misdn_bchannel *stack_holder_find_bychan(struct misdn_stack *stack, int chan);
-
int setup_bc(struct misdn_bchannel *bc);
int manager_isdn_handler(iframe_t *frm ,msg_t *msg);
@@ -3106,13 +3104,6 @@ void te_lib_destroy(int midev)
cb_log(4, 0, "midev closed\n");
}
-
-
-void misdn_lib_transfer(struct misdn_bchannel* holded_bc)
-{
- holded_bc->holded=0;
-}
-
struct misdn_bchannel *manager_find_bc_by_pid(int pid)
{
struct misdn_stack *stack;
@@ -3331,6 +3322,7 @@ int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event )
msg_t *msg;
int retval=0;
struct misdn_stack *stack;
+ struct misdn_bchannel *held_bc;
if (!bc) RETURN(-1,OUT_POST_UNLOCK);
@@ -3417,21 +3409,22 @@ int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event )
break;
case EVENT_HOLD_ACKNOWLEDGE:
- {
- struct misdn_bchannel *holded_bc=malloc(sizeof(struct misdn_bchannel));
- if (!holded_bc) {
- cb_log(0,bc->port, "Could not allocate holded_bc!!!\n");
+ held_bc = malloc(sizeof(struct misdn_bchannel));
+ if (!held_bc) {
+ cb_log(0, bc->port, "Could not allocate held_bc!!!\n");
RETURN(-1,OUT);
}
- /*backup the bc*/
- memcpy(holded_bc,bc,sizeof(struct misdn_bchannel));
- holded_bc->holded=1;
- bc_state_change(holded_bc,BCHAN_CLEANED);
-
- stack_holder_add(stack,holded_bc);
+ /* backup the bc and put it in storage */
+ *held_bc = *bc;
+ held_bc->holded = 1;
+ held_bc->channel = 0;/* A held call does not have a channel anymore. */
+ held_bc->channel_preselected = 0;
+ held_bc->channel_found = 0;
+ bc_state_change(held_bc, BCHAN_CLEANED);
+ stack_holder_add(stack, held_bc);
- /*kill the bridge and clean the bchannel*/
+ /* kill the bridge and clean the real b-channel record */
if (stack->nt) {
int channel;
if (bc->bc_state == BCHAN_BRIDGED) {
@@ -3456,9 +3449,7 @@ int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event )
bc->in_use=0;
}
-
- }
- break;
+ break;
/* finishing the channel eh ? */
case EVENT_DISCONNECT:
@@ -4382,28 +4373,6 @@ void stack_holder_remove(struct misdn_stack *stack, struct misdn_bchannel *holde
}
}
-struct misdn_bchannel *stack_holder_find_bychan(struct misdn_stack *stack, int chan)
-{
- struct misdn_bchannel *help;
-
- cb_log(4,stack?stack->port:0, "*HOLDER: find_bychan %c\n", chan);
-
- if (!stack) return NULL;
-
- for (help=stack->holding;
- help;
- help=help->next) {
- if (help->channel == chan) {
- cb_log(4,stack->port, "*HOLDER: found_bychan bc\n");
- return help;
- }
- }
-
- cb_log(4,stack->port, "*HOLDER: find_bychan nothing\n");
- return NULL;
-
-}
-
struct misdn_bchannel *stack_holder_find(struct misdn_stack *stack, unsigned long l3id)
{
struct misdn_bchannel *help;
@@ -4425,7 +4394,29 @@ struct misdn_bchannel *stack_holder_find(struct misdn_stack *stack, unsigned lon
return NULL;
}
+/*!
+ * \brief Find a held call's B channel record.
+ *
+ * \param port Port the call is on.
+ * \param l3_id mISDN Layer 3 ID of held call.
+ *
+ * \return Found bc-record or NULL.
+ */
+struct misdn_bchannel *misdn_lib_find_held_bc(int port, int l3_id)
+{
+ struct misdn_bchannel *bc;
+ struct misdn_stack *stack;
+
+ bc = NULL;
+ for (stack = get_misdn_stack(); stack; stack = stack->next) {
+ if (stack->port == port) {
+ bc = stack_holder_find(stack, l3_id);
+ break;
+ }
+ }
+ return bc;
+}
void misdn_lib_send_tone(struct misdn_bchannel *bc, enum tone_e tone)
{