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;
}
Example #7
0
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.
}
Example #8
0
void t_phone_user::resend_request(t_request *req, t_client_request *cr) {
	return resend_request(req, false, cr);
}