/* * Send a request using data from the dialog structure * ret_index and ret_label will identify the new cell */ int t_uac_with_ids(str* method, str* headers, str* body, dlg_t* dialog, transaction_cb cb, void* cbp, unsigned int *ret_index, unsigned int *ret_label) { struct retr_buf *request; struct cell *cell; int ret; int is_ack; ret = t_uac_prepare(method, headers, body, dialog, cb, cbp, &request, &cell); if (ret < 0) return ret; is_ack = (method->len == 3) && (memcmp("ACK", method->s, 3)==0) ? 1 : 0; send_prepared_request_impl(request, !is_ack /* retransmit */); if (is_ack) { if (cell) free_cell(cell); if (ret_index && ret_label) *ret_index = *ret_label = 0; } else { if (ret_index && ret_label) { *ret_index = cell->hash_index; *ret_label = cell->label; } } return ret; }
/* * Prepare a message within a dialog */ int prepare_req_within(str* method, str* headers, str* body, dlg_t* dialog, transaction_cb completion_cb, void* cbp, struct retr_buf **dst_req) { if (!method || !dialog) { LOG(L_ERR, "req_within: Invalid parameter value\n"); goto err; } if (dialog->state != DLG_CONFIRMED) { LOG(L_ERR, "req_within: Dialog is not confirmed yet\n"); goto err; } if ((method->len == 3) && (!memcmp("ACK", method->s, 3))) goto send; if ((method->len == 6) && (!memcmp("CANCEL", method->s, 6))) goto send; dialog->loc_seq.value++; /* Increment CSeq */ send: return t_uac_prepare(method, headers, body, dialog, completion_cb, cbp, dst_req, 0); err: /* if (cbp) shm_free(cbp); */ /* !! never free cbp here because if t_uac_prepare fails, cbp is not freed * and thus caller has no chance to discover if it is freed or not !! */ return -1; }
/* * Prepare a message within a dialog */ int prepare_req_within(uac_req_t *uac_r, struct retr_buf **dst_req) { if (!uac_r || !uac_r->method || !uac_r->dialog) { LOG(L_ERR, "req_within: Invalid parameter value\n"); goto err; } if (uac_r->dialog->state != DLG_CONFIRMED) { LOG(L_ERR, "req_within: Dialog is not confirmed yet\n"); goto err; } if ((uac_r->method->len == 3) && (!memcmp("ACK", uac_r->method->s, 3))) goto send; if ((uac_r->method->len == 6) && (!memcmp("CANCEL", uac_r->method->s, 6))) goto send; uac_r->dialog->loc_seq.value++; /* Increment CSeq */ send: return t_uac_prepare(uac_r, dst_req, 0); err: /* if (cbp) shm_free(cbp); */ /* !! never free cbp here because if t_uac_prepare fails, cbp is not freed * and thus caller has no chance to discover if it is freed or not !! */ return -1; }
/* * Send a request using data from the dialog structure */ int t_uac(str* method, str* headers, str* body, dlg_t* dialog, transaction_cb cb, void* cbp) { struct retr_buf *request; struct cell *cell; int ret; int is_ack; ret = t_uac_prepare(method, headers, body, dialog, cb, cbp, &request, &cell); if (ret < 0) return ret; is_ack = (method->len == 3) && (memcmp("ACK", method->s, 3)==0) ? 1 : 0; send_prepared_request_impl(request, !is_ack /* retransmit */); if (cell && is_ack) free_cell(cell); return ret; }
/* * Send a request using data from the dialog structure * ret_index and ret_label will identify the new cell */ int t_uac_with_ids(uac_req_t *uac_r, unsigned int *ret_index, unsigned int *ret_label) { struct retr_buf *request; struct cell *cell; int ret; int is_ack; ret = t_uac_prepare(uac_r, &request, &cell); if (ret < 0) return ret; is_ack = (uac_r->method->len == 3) && (memcmp("ACK", uac_r->method->s, 3)==0) ? 1 : 0; send_prepared_request_impl(request, !is_ack /* retransmit */); if (is_ack) { if (cell) free_cell(cell); if (ret_index && ret_label) *ret_index = *ret_label = 0; } else { if (ret_index && ret_label) { *ret_index = cell->hash_index; *ret_label = cell->label; } } return ret; }