X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=joinpbx.cpp;h=71e7e1cbfe2ebda134c07b57d434a3d1bf213308;hp=6e995f3d2bb17a4cac6c248ade5b25a5416d20c9;hb=refs%2Fheads%2Fbackup1;hpb=04fc928a2c5f0262e85c09cced1ef20a9fd15f3d diff --git a/joinpbx.cpp b/joinpbx.cpp index 6e995f3..71e7e1c 100644 --- a/joinpbx.cpp +++ b/joinpbx.cpp @@ -300,6 +300,8 @@ void JoinPBX::bridge(void) struct port_list *portlist; class Port *port; unsigned int bridge_id; + class Join *join_3pty; + class JoinPBX *joinpbx_3pty; #ifdef DEBUG_COREBRIDGE int allmISDN = 0; // never set for debug purpose #else @@ -356,10 +358,87 @@ void JoinPBX::bridge(void) relation = relation->next; continue; } - +#ifdef WITH_VOOTP + if (port->p_vootp) { + PDEBUG(DEBUG_JOIN, "join%d ignoring relation ep%d because it's port uses VoOTP.\n", j_serial, epoint->ep_serial); + if (allmISDN) { + PDEBUG(DEBUG_JOIN, "join%d not all endpoints can support mISDN bridging.\n", j_serial); + allmISDN = 0; + } + relation = relation->next; + continue; + } +#endif + relation = relation->next; } + /* check if 3pty members have no mISDN, so bridging via mISDN/lcr will be selected correctly */ + join_3pty = find_join_id(j_3pty); + if (join_3pty && join_3pty->j_type == JOIN_TYPE_PBX) { + joinpbx_3pty = (class JoinPBX *)join_3pty; + relation = joinpbx_3pty->j_relation; + while(relation) { + +#if 0 +no need to count, because j_3pty is taken into account below when checking relations + /* count all relations */ + relations++; +#endif + + /* check for relation's objects */ + epoint = find_epoint_id(relation->epoint_id); + if (!epoint) { + PERROR("software error: relation without existing endpoints.\n"); + relation = relation->next; + continue; + } + portlist = epoint->ep_portlist; + if (!portlist) { + PDEBUG(DEBUG_JOIN, "other 3pty join %d: ignoring relation without port object.\n", joinpbx_3pty->j_serial); +//#warning testing: keep on hold until single audio stream available + relation->channel_state = 0; + relation = relation->next; + continue; + } + if (portlist->next) { + PDEBUG(DEBUG_JOIN, "other 3pty join %d: ignoring relation with ep%d due to port_list.\n", joinpbx_3pty->j_serial, epoint->ep_serial); +//#warning testing: keep on hold until single audio stream available + relation->channel_state = 0; + relation = relation->next; + continue; + } + port = find_port_id(portlist->port_id); + if (!port) { + PDEBUG(DEBUG_JOIN, "other 3pty join %d: ignoring relation without existing port object.\n", joinpbx_3pty->j_serial); + relation = relation->next; + continue; + } + if ((port->p_type&PORT_CLASS_MASK)!=PORT_CLASS_mISDN) { + PDEBUG(DEBUG_JOIN, "other 3pty join %d: ignoring relation ep%d because it's port is not mISDN.\n", joinpbx_3pty->j_serial, epoint->ep_serial); + if (allmISDN) { + PDEBUG(DEBUG_JOIN, "other 3pty join %d: not all endpoints are mISDN.\n", joinpbx_3pty->j_serial); + allmISDN = 0; + } + relation = relation->next; + continue; + } +#ifdef WITH_VOOTP + if (port->p_vootp) { + PDEBUG(DEBUG_JOIN, "join%d ignoring relation ep%d because it's port uses VoOTP.\n", joinpbx_3pty->j_serial, epoint->ep_serial); + if (allmISDN) { + PDEBUG(DEBUG_JOIN, "join%d not all endpoints can support mISDN bridging.\n", joinpbx_3pty->j_serial); + allmISDN = 0; + } + relation = relation->next; + continue; + } +#endif + + relation = relation->next; + } + } + PDEBUG(DEBUG_JOIN, "join%d members=%d %s\n", j_serial, relations, (allmISDN)?"(all are mISDN-members)":"(not all are mISDN-members)"); /* we notify all relations about rxdata. */ relation = j_relation; @@ -695,6 +774,26 @@ void JoinPBX::message_epoint(unsigned int epoint_id, int message_type, union par } break; + /* track notify */ + case MESSAGE_NOTIFY: + switch(param->notifyinfo.notify) { + case INFO_NOTIFY_USER_SUSPENDED: + case INFO_NOTIFY_USER_RESUMED: + case INFO_NOTIFY_REMOTE_HOLD: + case INFO_NOTIFY_REMOTE_RETRIEVAL: + case INFO_NOTIFY_CONFERENCE_ESTABLISHED: + case INFO_NOTIFY_CONFERENCE_DISCONNECTED: + new_state = track_notify(relation->rx_state, param->notifyinfo.notify); + if (new_state != relation->rx_state) { + relation->rx_state = new_state; + trigger_work(&j_updatebridge); + if (options.deb & DEBUG_JOIN) + joinpbx_debug(this, "Join::message_epoint{after setting new rx state}"); + } + break; + } + break; + case MESSAGE_DISCONNECT: PDEBUG(DEBUG_JOIN, "releasing after receiving disconnect, because join in partyline mode.\n"); message = message_create(j_serial, epoint_id, JOIN_TO_EPOINT, MESSAGE_RELEASE); @@ -730,6 +829,11 @@ void JoinPBX::message_epoint(unsigned int epoint_id, int message_type, union par } return; + case MESSAGE_UPDATEBRIDGE: + trigger_work(&j_updatebridge); + joinpbx_debug(this, "Join::message_epoint{bridge is updated due to request from mISDN port}"); + break; + /* track notify */ case MESSAGE_NOTIFY: switch(param->notifyinfo.notify) {