/** * Transfer the call to a target SIP uri * * @param call Call object * @param uri Target SIP uri * * @return 0 if success, otherwise errorcode */ int call_transfer(struct call *call, const char *uri) { char *nuri; int err; if (!call || !uri) return EINVAL; err = normalize_uri(&nuri, uri, &call->acc->luri); if (err) return err; info("transferring call to %s\n", nuri); call->sub = mem_deref(call->sub); err = sipevent_drefer(&call->sub, uag_sipevent_sock(), sipsess_dialog(call->sess), ua_cuser(call->ua), auth_handler, call->acc, true, sipsub_notify_handler, sipsub_close_handler, call, "Refer-To: %s\r\n", nuri); if (err) { warning("call: sipevent_drefer: %m\n", err); } mem_deref(nuri); return err; }
/* Searches a word to find an email adress or an URI to add as a link. */ static inline struct link * check_link_word(struct document *document, unsigned char *uri, int length, int x, int y) { struct uri test; unsigned char *where = NULL; unsigned char *mailto = memchr(uri, '@', length); int keep = uri[length]; struct link *new_link; assert(document); if_assert_failed return NULL; uri[length] = 0; if (mailto && mailto > uri && mailto - uri < length - 1) { where = straconcat("mailto:", uri, (unsigned char *) NULL); } else if (parse_uri(&test, uri) == URI_ERRNO_OK && test.protocol != PROTOCOL_UNKNOWN && (test.datalen || test.hostlen)) { where = memacpy(uri, length); } uri[length] = keep; if (!where) return NULL; /* We need to reparse the URI and normalize it so that the protocol and * host part are converted to lowercase. */ normalize_uri(NULL, where); new_link = add_document_link(document, where, length, x, y); if (!new_link) mem_free(where); return new_link; }