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
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;
}
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);
}
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) {