/** * Update the current call by sending Re-INVITE or UPDATE * * @param call Call object * * @return 0 if success, otherwise errorcode */ int call_modify(struct call *call) { struct mbuf *desc; int err; if (!call) return EINVAL; err = call_sdp_get(call, &desc, true); if (!err) err = sipsess_modify(call->sess, desc); mem_deref(desc); return err; }
static void handle_options(struct ua *ua, const struct sip_msg *msg) { struct sip_contact contact; struct call *call = NULL; struct mbuf *desc = NULL; int err; err = ua_call_alloc(&call, ua, VIDMODE_ON, NULL, NULL, NULL); if (err) { (void)sip_treply(NULL, uag.sip, msg, 500, "Call Error"); return; } err = call_sdp_get(call, &desc, true); if (err) goto out; sip_contact_set(&contact, ua_cuser(ua), &msg->dst, msg->tp); err = sip_treplyf(NULL, NULL, uag.sip, msg, true, 200, "OK", "Allow: %s\r\n" "%H" "%H" "Content-Type: application/sdp\r\n" "Content-Length: %zu\r\n" "\r\n" "%b", uag_allowed_methods(), ua_print_supported, ua, sip_contact_print, &contact, mbuf_get_left(desc), mbuf_buf(desc), mbuf_get_left(desc)); if (err) { warning("ua: options: sip_treplyf: %m\n", err); } out: mem_deref(desc); mem_deref(call); }
int call_progress(struct call *call) { struct mbuf *desc; int err; if (!call) return EINVAL; err = call_sdp_get(call, &desc, false); if (err) return err; err = sipsess_progress(call->sess, 183, "Session Progress", desc, "Allow: %s\r\n", uag_allowed_methods()); if (!err) call_stream_start(call, false); mem_deref(desc); return 0; }
static int send_invite(struct call *call) { const char *routev[1]; struct mbuf *desc; int err; routev[0] = ua_outbound(call->ua); err = call_sdp_get(call, &desc, true); if (err) return err; err = sipsess_connect(&call->sess, uag_sipsess_sock(), call->peer_uri, call->local_name, call->local_uri, ua_cuser(call->ua), routev[0] ? routev : NULL, routev[0] ? 1 : 0, "application/sdp", desc, auth_handler, call->acc, true, sipsess_offer_handler, sipsess_answer_handler, sipsess_progr_handler, sipsess_estab_handler, sipsess_info_handler, sipsess_refer_handler, sipsess_close_handler, call, "Allow: %s\r\n%H", uag_allowed_methods(), ua_print_supported, call->ua); if (err) { warning("call: sipsess_connect: %m\n", err); } /* save call setup timer */ call->time_conn = time(NULL); mem_deref(desc); return err; }