int call_reset_transp(struct call *call) { if (!call) return EINVAL; sdp_session_set_laddr(call->sdp, net_laddr_af(call->af)); return call_modify(call); }
/** * Put the current call on hold/resume * * @param call Call object * @param hold True to hold, false to resume * * @return 0 if success, otherwise errorcode */ int call_hold(struct call *call, bool hold) { struct le *le; if (!call || !call->sess) return EINVAL; info("call: %s %s\n", hold ? "hold" : "resume", call->peer_uri); FOREACH_STREAM stream_hold(le->data, hold); return call_modify(call); }
/** Called when all media streams are established */ static void mnat_handler(int err, uint16_t scode, const char *reason, void *arg) { struct call *call = arg; MAGIC_CHECK(call); if (err) { warning("call: medianat '%s' failed: %m\n", call->acc->mnatid, err); call_event_handler(call, CALL_EVENT_CLOSED, "%m", err); return; } else if (scode) { warning("call: medianat failed: %u %s\n", scode, reason); call_event_handler(call, CALL_EVENT_CLOSED, "%u %s", scode, reason); return; } /* Re-INVITE */ if (!call->mnat_wait) { info("call: medianat established -- sending Re-INVITE\n"); (void)call_modify(call); return; } call->mnat_wait = false; switch (call->state) { case STATE_OUTGOING: (void)send_invite(call); break; case STATE_INCOMING: call_event_handler(call, CALL_EVENT_INCOMING, call->peer_uri); break; default: break; } }