/* Outgoing typing indication callback. * (used to reauthenticate request) */ static void typing_callback(void *token, pjsip_event *e) { pjsua_im_data *im_data = (pjsua_im_data*) token; pjsua_inst_id inst_id = im_data->inst_id; if (e->type == PJSIP_EVENT_TSX_STATE) { pjsip_transaction *tsx = e->body.tsx_state.tsx; /* Ignore provisional response, if any */ if (tsx->status_code < 200) return; /* Handle authentication challenges */ if (e->body.tsx_state.type == PJSIP_EVENT_RX_MSG && (tsx->status_code == 401 || tsx->status_code == 407)) { pjsip_rx_data *rdata = e->body.tsx_state.src.rdata; pjsip_tx_data *tdata; pjsip_auth_clt_sess auth; pj_status_t status; PJ_LOG(4,(THIS_FILE, "Resending IM with authentication")); /* Create temporary authentication session */ pjsip_auth_clt_init(&auth,pjsua_var[inst_id].endpt,rdata->tp_info.pool, 0); pjsip_auth_clt_set_credentials(&auth, pjsua_var[inst_id].acc[im_data->acc_id].cred_cnt, pjsua_var[inst_id].acc[im_data->acc_id].cred); pjsip_auth_clt_set_prefs(&auth, &pjsua_var[inst_id].acc[im_data->acc_id].cfg.auth_pref); status = pjsip_auth_clt_reinit_req(&auth, rdata, tsx->last_tx, &tdata); if (status == PJ_SUCCESS) { pjsua_im_data *im_data2; /* Must duplicate im_data */ im_data2 = pjsua_im_data_dup(tdata->pool, im_data); /* Increment CSeq */ PJSIP_MSG_CSEQ_HDR(tdata->msg)->cseq++; /* Re-send request */ status = pjsip_endpt_send_request( pjsua_var[inst_id].endpt, tdata, -1, im_data2, &typing_callback); if (status == PJ_SUCCESS) { /* Done */ return; } } } } }
/* Outgoing IM callback. */ static void im_callback(void *token, pjsip_event *e) { pjsua_im_data *im_data = (pjsua_im_data*) token; if (e->type == PJSIP_EVENT_TSX_STATE) { pjsip_transaction *tsx = e->body.tsx_state.tsx; /* Ignore provisional response, if any */ if (tsx->status_code < 200) return; /* Handle authentication challenges */ if (e->body.tsx_state.type == PJSIP_EVENT_RX_MSG && (tsx->status_code == 401 || tsx->status_code == 407)) { pjsip_rx_data *rdata = e->body.tsx_state.src.rdata; pjsip_tx_data *tdata; pjsip_auth_clt_sess auth; pj_status_t status; PJ_LOG(4,(THIS_FILE, "Resending IM with authentication")); /* Create temporary authentication session */ pjsip_auth_clt_init(&auth,pjsua_var.endpt,rdata->tp_info.pool, 0); pjsip_auth_clt_set_credentials(&auth, pjsua_var.acc[im_data->acc_id].cred_cnt, pjsua_var.acc[im_data->acc_id].cred); pjsip_auth_clt_set_prefs(&auth, &pjsua_var.acc[im_data->acc_id].cfg.auth_pref); status = pjsip_auth_clt_reinit_req(&auth, rdata, tsx->last_tx, &tdata); if (status == PJ_SUCCESS) { pjsua_im_data *im_data2; /* Must duplicate im_data */ im_data2 = pjsua_im_data_dup(tdata->pool, im_data); /* Increment CSeq */ PJSIP_MSG_CSEQ_HDR(tdata->msg)->cseq++; /* Re-send request */ status = pjsip_endpt_send_request( pjsua_var.endpt, tdata, -1, im_data2, &im_callback); if (status == PJ_SUCCESS) { /* Done */ return; } } } if (tsx->status_code/100 == 2) { PJ_LOG(4,(THIS_FILE, "Message \'%s\' delivered successfully", im_data->body.ptr)); } else { PJ_LOG(3,(THIS_FILE, "Failed to deliver message \'%s\': %d/%.*s", im_data->body.ptr, tsx->status_code, (int)tsx->status_text.slen, tsx->status_text.ptr)); } if (pjsua_var.ua_cfg.cb.on_pager_status) { pjsua_var.ua_cfg.cb.on_pager_status(im_data->call_id, &im_data->to, &im_data->body, im_data->user_data, (pjsip_status_code) tsx->status_code, &tsx->status_text); } if (pjsua_var.ua_cfg.cb.on_pager_status2) { pjsip_rx_data *rdata; if (e->body.tsx_state.type == PJSIP_EVENT_RX_MSG) rdata = e->body.tsx_state.src.rdata; else rdata = NULL; pjsua_var.ua_cfg.cb.on_pager_status2(im_data->call_id, &im_data->to, &im_data->body, im_data->user_data, (pjsip_status_code) tsx->status_code, &tsx->status_text, tsx->last_tx, rdata, im_data->acc_id); } } }