bool t_subscription_dialog::resend_request_auth(t_response *resp) { t_client_request **current_cr = &(subscription->req_out); if (!*current_cr) return false; t_request *req = (*current_cr)->get_request(); if (phone_user->authorize(req, resp)) { resend_request(*current_cr); return true; } return false; }
bool t_abstract_dialog::resend_request_auth(t_client_request *cr, t_response *resp) { t_user *user_config = phone_user->get_user_profile(); t_request *req = cr->get_request(); // Add authorization header, increment CSeq and create new branch id if (phone->authorize(user_config, req, resp)) { resend_request(cr); return true; } return false; }
bool t_subscription_dialog::failover_request(t_response *resp) { t_client_request **current_cr = &(subscription->req_out); if (!*current_cr) return false; t_request *req = (*current_cr)->get_request(); if (req->next_destination()) { log_file->write_report("Failover to next destination.", "t_subscription_dialog::handle_response_out_of_dialog"); resend_request(*current_cr); return true; } return false; }
bool t_abstract_dialog::failover_request(t_client_request *cr) { log_file->write_report("Failover to next destination.", "t_abstract_dialog::failover_request"); t_request *req = cr->get_request(); // Get next destination if (!req->next_destination()) { log_file->write_report("No next destination for failover.", "t_abstract_dialog::failover_request"); return false; } resend_request(cr); return true; }
bool t_subscription_dialog::redirect_request(t_response *resp) { t_user *user_config = phone_user->get_user_profile(); t_client_request **current_cr = &(subscription->req_out); if (!*current_cr) return false; t_request *req = (*current_cr)->get_request(); // If the response is a 3XX response then add redirection // contacts if (resp->get_class() == R_3XX && resp->hdr_contact.is_populated()) { (*current_cr)->redirector.add_contacts( resp->hdr_contact.contact_list); } // Get next destination t_contact_param contact; if ((*current_cr)->redirector.get_next_contact(contact)) { // Ask user for permission to redirect if indicated // by user config bool permission = true; if (user_config->get_ask_user_to_redirect()) { permission = ui->cb_ask_user_to_redirect_request( user_config, contact.uri, contact.display, resp->hdr_cseq.method); } if (permission) { req->uri = contact.uri; req->calc_destinations(*user_config); ui->cb_redirecting_request(user_config, contact); resend_request(*current_cr); return true; } } return false; }
bool t_abstract_dialog::redirect_request(t_client_request *cr, t_response *resp, t_contact_param &contact) { t_user *user_config = phone_user->get_user_profile(); // If the response is a 3XX response then add redirection contacts if (resp->get_class() == R_3XX && resp->hdr_contact.is_populated()) { cr->redirector.add_contacts( resp->hdr_contact.contact_list); } // Get next destination if (!cr->redirector.get_next_contact(contact)) { // There is no next destination return false; } t_request *req = cr->get_request(); // Ask user for permission to redirect if indicated by user config if (user_config->get_ask_user_to_redirect()) { if(!ui->cb_ask_user_to_redirect_request(user_config, contact.uri, contact.display, resp->hdr_cseq.method)) { // User did not permit to redirect return false; } } // Change the request URI to the new URI. // As the URI changes the destination set must be recalculated req->uri = contact.uri; req->calc_destinations(*user_config); resend_request(cr); return true; }
void t_phone_user::handle_response_out_of_dialog(t_response *r, t_tuid tuid, t_tid tid) { t_client_request **current_cr; t_request *req; bool is_register = false; t_buddy *buddy; if (r_register && r_register->get_tuid() == tuid) { current_cr = &r_register; is_register = true; } else if (r_deregister && r_deregister->get_tuid() == tuid) { current_cr = &r_deregister; is_register = true; } else if (r_query_register && r_query_register->get_tuid() == tuid) { current_cr = &r_query_register; is_register = true; } else if (r_options && r_options->get_tuid() == tuid) { current_cr = &r_options; } else if (r_message && r_message->get_tuid() == tuid) { current_cr = &r_message; } else if (mwi_dialog && mwi_dialog->match_response(r, tuid)) { mwi_dialog->recvd_response(r, tuid, tid); cleanup_mwi_dialog(); return; } else if (presence_epa && presence_epa->match_response(r, tuid)) { presence_epa->recv_response(r, tuid, tid); return; } else if (buddy_list->match_response(r, tuid, &buddy)) { buddy->recvd_response(r, tuid, tid); if (buddy->must_delete_now()) buddy_list->del_buddy(*buddy); return; } else { // Response does not match any pending request. log_file->write_report("Response does not match any pending request.", "t_phone_user::handle_response_out_of_dialog", LOG_NORMAL, LOG_WARNING); return; } req = (*current_cr)->get_request(); // Authentication if (r->must_authenticate()) { if (authorize(req, r)) { resend_request(req, is_register, *current_cr); return; } // Authentication failed // Handle the 401/407 as a normal failure response } // RFC 3263 4.3 // Failover if (r->code == R_503_SERVICE_UNAVAILABLE) { if (req->next_destination()) { log_file->write_report("Failover to next destination.", "t_phone_user::handle_response_out_of_dialog"); resend_request(req, is_register, *current_cr); return; } } // Redirect failed request if there is another destination if (r->get_class() > R_2XX && user_config->get_allow_redirection()) { // If the response is a 3XX response then add redirection // contacts if (r->get_class() == R_3XX && r->hdr_contact.is_populated()) { (*current_cr)->redirector.add_contacts( r->hdr_contact.contact_list); } // Get next destination t_contact_param contact; if ((*current_cr)->redirector.get_next_contact(contact)) { // Ask user for permission to redirect if indicated // by user config bool permission = true; if (user_config->get_ask_user_to_redirect()) { permission = ui->cb_ask_user_to_redirect_request( user_config, contact.uri, contact.display, r->hdr_cseq.method); } if (permission) { req->uri = contact.uri; req->calc_destinations(*user_config); ui->cb_redirecting_request(user_config, contact); resend_request(req, is_register, *current_cr); return; } } } // REGISTER (register) if (r_register && r_register->get_tuid() == tuid) { bool re_register; handle_response_register(r, re_register); MEMMAN_DELETE(r_register); delete r_register; r_register = NULL; if (re_register) registration(REG_REGISTER, authorizor.get_re_register(), registration_time); return; } // REGISTER (de-register) if (r_deregister && r_deregister->get_tuid() == tuid) { handle_response_deregister(r); MEMMAN_DELETE(r_deregister); delete r_deregister; r_deregister = NULL; return; } // REGISTER (query) if (r_query_register && r_query_register->get_tuid() == tuid) { handle_response_query_register(r); MEMMAN_DELETE(r_query_register); delete r_query_register; r_query_register = NULL; return; } // OPTIONS if (r_options && r_options->get_tuid() == tuid) { handle_response_options(r); MEMMAN_DELETE(r_options); delete r_options; r_options = NULL; return; } // MESSAGE if (r_message && r_message->get_tuid() == tuid) { handle_response_message(r); MEMMAN_DELETE(r_message); delete r_message; r_message = NULL; // Send next pending MESSAGE if (!pending_messages.empty()) { t_request *req = pending_messages.front(); pending_messages.pop_front(); r_message = new t_client_request(user_config, req, 0); MEMMAN_NEW(r_message); phone->send_request(user_config, req, r_message->get_tuid()); MEMMAN_DELETE(req); delete req; } return; } // Response does not match any pending request. Do nothing. }
void t_phone_user::resend_request(t_request *req, t_client_request *cr) { return resend_request(req, false, cr); }