static void set_redirecting_reason(pjsip_fromto_hdr *hdr,
				   struct ast_party_redirecting_reason *data)
{
	static const pj_str_t reason_name = { "reason", 6 };
	pjsip_param *reason = pjsip_param_find(&hdr->other_param, &reason_name);
	char *reason_str;

	if (!reason) {
		return;
	}

	set_redirecting_value(&data->str, &reason->value);
	if (!data->str) {
		/* Oops, allocation failure */
		return;
	}
	reason_str = ast_strdupa(data->str);

	/* Remove any enclosing double-quotes */
	if (*reason_str == '"') {
		reason_str = ast_strip_quoted(reason_str, "\"", "\"");
	}

	data->code = ast_redirecting_reason_parse(reason_str);
	if (data->code < 0) {
		data->code = AST_REDIRECTING_REASON_UNKNOWN;
	} else {
		ast_free(data->str);
		data->str = ast_strdup("");
	}
}
static void set_redirecting_id(pjsip_name_addr *name_addr, struct ast_party_id *data,
			       struct ast_set_party_id *update)
{
	pjsip_sip_uri *uri = pjsip_uri_get_uri(name_addr->uri);

	if (pj_strlen(&uri->user)) {
		update->number = 1;
		data->number.valid = 1;
		set_redirecting_value(&data->number.str, &uri->user);
	}

	if (pj_strlen(&name_addr->display)) {
		update->name = 1;
		data->name.valid = 1;
		set_redirecting_value(&data->name.str, &name_addr->display);
	}
}
static void set_redirecting_reason(pjsip_fromto_hdr *hdr,
				   struct ast_party_redirecting_reason *data)
{
	static const pj_str_t reason_name = { "reason", 6 };
	pjsip_param *reason = pjsip_param_find(&hdr->other_param, &reason_name);

	if (!reason) {
		return;
	}

	set_redirecting_value(&data->str, &reason->value);
	data->code = reason_str_to_code(data->str);
}
static void set_redirecting_id(pjsip_name_addr *name_addr, struct ast_party_id *data,
			       struct ast_set_party_id *update)
{
	pjsip_sip_uri *uri = pjsip_uri_get_uri(name_addr->uri);
	char *semi;
	pj_str_t uri_user;

	uri_user = uri->user;

	/* Always truncate redirecting number at a semicolon. */
	semi = pj_strchr(&uri_user, ';');
	if (semi) {
		/*
		 * We need to be able to handle URI's looking like
		 * "sip:1235557890;[email protected];user=phone"
		 *
		 * Where the uri->user field will result in:
		 * "1235557890;phone-context=national"
		 *
		 * People don't care about anything after the semicolon
		 * showing up on their displays even though the RFC
		 * allows the semicolon.
		 */
		pj_strset(&uri_user, (char *) pj_strbuf(&uri_user), semi - pj_strbuf(&uri_user));
	}

	if (pj_strlen(&uri_user)) {
		update->number = 1;
		data->number.valid = 1;
		set_redirecting_value(&data->number.str, &uri_user);
	}

	if (pj_strlen(&name_addr->display)) {
		update->name = 1;
		data->name.valid = 1;
		set_redirecting_value(&data->name.str, &name_addr->display);
	}
}