/*
 * Please do not edit this file.
 * It was generated using rpcgen.
 */

#include "loc_api_common.h"

bool_t
xdr_rpc_boolean (XDR *xdrs, rpc_boolean *objp)
{
	register int32_t *buf;

	 if (!xdr_bool (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_uint32 (XDR *xdrs, rpc_uint32 *objp)
{
	register int32_t *buf;

	 if (!xdr_u_long (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_uint16 (XDR *xdrs, rpc_uint16 *objp)
{
	register int32_t *buf;

	 if (!xdr_u_short (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_uint8 (XDR *xdrs, rpc_uint8 *objp)
{
	register int32_t *buf;

	 if (!xdr_u_char (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_int32 (XDR *xdrs, rpc_int32 *objp)
{
	register int32_t *buf;

	 if (!xdr_long (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_byte (XDR *xdrs, rpc_byte *objp)
{
	register int32_t *buf;

	 if (!xdr_u_char (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_uint64 (XDR *xdrs, rpc_uint64 *objp)
{
	register int32_t *buf;

	 if (!xdr_u_quad_t (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_client_handle_type (XDR *xdrs, rpc_loc_client_handle_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_int32 (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_event_mask_type (XDR *xdrs, rpc_loc_event_mask_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint64 (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_position_valid_mask_type (XDR *xdrs, rpc_loc_position_valid_mask_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint64 (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_pos_technology_mask_type (XDR *xdrs, rpc_loc_pos_technology_mask_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint32 (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_session_status_e_type (XDR *xdrs, rpc_loc_session_status_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_calendar_time_s_type (XDR *xdrs, rpc_loc_calendar_time_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint16 (xdrs, &objp->year))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->month))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->day_of_week))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->day))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->hour))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->minute))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->second))
		 return FALSE;
	 if (!xdr_rpc_uint16 (xdrs, &objp->millisecond))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_parsed_position_s_type (XDR *xdrs, rpc_loc_parsed_position_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_position_valid_mask_type (xdrs, &objp->valid_mask))
		 return FALSE;
	 if (!xdr_rpc_loc_session_status_e_type (xdrs, &objp->session_status))
		 return FALSE;
	 if (!xdr_rpc_loc_calendar_time_s_type (xdrs, &objp->timestamp_calendar))
		 return FALSE;
	 if (!xdr_rpc_uint64 (xdrs, &objp->timestamp_utc))
		 return FALSE;
	 if (!xdr_rpc_uint8 (xdrs, &objp->leap_seconds))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->time_unc))
		 return FALSE;
	 if (!xdr_double (xdrs, &objp->latitude))
		 return FALSE;
	 if (!xdr_double (xdrs, &objp->longitude))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->altitude_wrt_ellipsoid))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->altitude_wrt_mean_sea_level))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->speed_horizontal))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->speed_vertical))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->heading))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->hor_unc_circular))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->hor_unc_ellipse_semi_major))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->hor_unc_ellipse_semi_minor))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->hor_unc_ellipse_orient_azimuth))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->vert_unc))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->speed_unc))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->heading_unc))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->confidence_horizontal))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->confidence_vertical))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->magnetic_deviation))
		 return FALSE;
	 if (!xdr_rpc_loc_pos_technology_mask_type (xdrs, &objp->technology_mask))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_sv_system_e_type (XDR *xdrs, rpc_loc_sv_system_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_sv_status_e_type (XDR *xdrs, rpc_loc_sv_status_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_sv_info_valid_mask_type (XDR *xdrs, rpc_loc_sv_info_valid_mask_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint32 (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_sv_info_s_type (XDR *xdrs, rpc_loc_sv_info_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_sv_info_valid_mask_type (xdrs, &objp->valid_mask))
		 return FALSE;
	 if (!xdr_rpc_loc_sv_system_e_type (xdrs, &objp->system))
		 return FALSE;
	 if (!xdr_rpc_uint8 (xdrs, &objp->prn))
		 return FALSE;
	 if (!xdr_rpc_uint8 (xdrs, &objp->health_status))
		 return FALSE;
	 if (!xdr_rpc_loc_sv_status_e_type (xdrs, &objp->process_status))
		 return FALSE;
	 if (!xdr_rpc_boolean (xdrs, &objp->has_eph))
		 return FALSE;
	 if (!xdr_rpc_boolean (xdrs, &objp->has_alm))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->elevation))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->azimuth))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->snr))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_gnss_info_valid_mask_type (XDR *xdrs, rpc_loc_gnss_info_valid_mask_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint32 (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_gnss_info_s_type (XDR *xdrs, rpc_loc_gnss_info_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_gnss_info_valid_mask_type (xdrs, &objp->valid_mask))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->position_dop))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->horizontal_dop))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->vertical_dop))
		 return FALSE;
	 if (!xdr_rpc_boolean (xdrs, &objp->altitude_assumed))
		 return FALSE;
	 if (!xdr_rpc_uint16 (xdrs, &objp->sv_count))
		 return FALSE;
	 if (!xdr_array (xdrs, (char **)&objp->sv_list.sv_list_val, (u_int *) &objp->sv_list.sv_list_len, RPC_LOC_API_MAX_SV_COUNT,
		sizeof (rpc_loc_sv_info_s_type), (xdrproc_t) xdr_rpc_loc_sv_info_s_type))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_nmea_report_s_type (XDR *xdrs, rpc_loc_nmea_report_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint16 (xdrs, &objp->length))
		 return FALSE;
	 if (!xdr_bytes (xdrs, (char **)&objp->nmea_sentences.nmea_sentences_val, (u_int *) &objp->nmea_sentences.nmea_sentences_len, RPC_LOC_API_MAX_NMEA_STRING_LENGTH))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_status_event_e_type (XDR *xdrs, rpc_loc_status_event_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_engine_state_e_type (XDR *xdrs, rpc_loc_engine_state_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_status_event_payload_u_type (XDR *xdrs, rpc_loc_status_event_payload_u_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_status_event_e_type (xdrs, &objp->disc))
		 return FALSE;
	switch (objp->disc) {
	case RPC_LOC_STATUS_EVENT_ENGINE_STATE:
		 if (!xdr_rpc_loc_engine_state_e_type (xdrs, &objp->rpc_loc_status_event_payload_u_type_u.engine_state))
			 return FALSE;
		break;
	default:
		break;
	}
	return TRUE;
}

bool_t
xdr_rpc_loc_status_event_s_type (XDR *xdrs, rpc_loc_status_event_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_status_event_e_type (xdrs, &objp->event))
		 return FALSE;
	 if (!xdr_rpc_loc_status_event_payload_u_type (xdrs, &objp->payload))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_addr_e_type (XDR *xdrs, rpc_loc_server_addr_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_addr_ipv4_type (XDR *xdrs, rpc_loc_server_addr_ipv4_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint32 (xdrs, &objp->addr))
		 return FALSE;
	 if (!xdr_rpc_uint16 (xdrs, &objp->port))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_addr_url_type (XDR *xdrs, rpc_loc_server_addr_url_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint16 (xdrs, &objp->length))
		 return FALSE;
	 if (!xdr_bytes (xdrs, (char **)&objp->addr.addr_val, (u_int *) &objp->addr.addr_len, RPC_LOC_API_MAX_SERVER_ADDR_LENGTH))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_addr_u_type (XDR *xdrs, rpc_loc_server_addr_u_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_server_addr_e_type (xdrs, &objp->disc))
		 return FALSE;
	switch (objp->disc) {
	case RPC_LOC_SERVER_ADDR_IPV4:
		 if (!xdr_rpc_loc_server_addr_ipv4_type (xdrs, &objp->rpc_loc_server_addr_u_type_u.ipv4))
			 return FALSE;
		break;
	case RPC_LOC_SERVER_ADDR_URL:
		 if (!xdr_rpc_loc_server_addr_url_type (xdrs, &objp->rpc_loc_server_addr_u_type_u.url))
			 return FALSE;
		break;
	default:
		break;
	}
	return TRUE;
}

bool_t
xdr_rpc_loc_server_info_s_type (XDR *xdrs, rpc_loc_server_info_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_server_addr_e_type (xdrs, &objp->addr_type))
		 return FALSE;
	 if (!xdr_rpc_loc_server_addr_u_type (xdrs, &objp->addr_info))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_notify_verify_e_type (XDR *xdrs, rpc_loc_ni_notify_verify_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_event_e_type (XDR *xdrs, rpc_loc_ni_event_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_datacoding_scheme_e_type (XDR *xdrs, rpc_loc_ni_datacoding_scheme_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_vx_requester_id_encoding_scheme_e_type (XDR *xdrs, rpc_loc_ni_vx_requester_id_encoding_scheme_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_vx_pos_mode_e_type (XDR *xdrs, rpc_loc_ni_vx_pos_mode_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_vx_requester_id_s_type (XDR *xdrs, rpc_loc_ni_vx_requester_id_s_type *objp)
{
	register int32_t *buf;

	int i;
	 if (!xdr_u_char (xdrs, &objp->requester_id_length))
		 return FALSE;
	 if (!xdr_opaque (xdrs, objp->requester_id, 200))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_vx_notify_verify_req_s_type (XDR *xdrs, rpc_loc_ni_vx_notify_verify_req_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_ni_notify_verify_e_type (xdrs, &objp->notification_priv_type))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->pos_qos_incl))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->pos_qos))
		 return FALSE;
	 if (!xdr_rpc_uint32 (xdrs, &objp->num_fixes))
		 return FALSE;
	 if (!xdr_rpc_uint32 (xdrs, &objp->tbf))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_vx_pos_mode_e_type (xdrs, &objp->pos_mode))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_vx_requester_id_encoding_scheme_e_type (xdrs, &objp->encoding_scheme))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_vx_requester_id_s_type (xdrs, &objp->requester_id))
		 return FALSE;
	 if (!xdr_rpc_uint16 (xdrs, &objp->user_resp_timer_val))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_supl_pos_method_e_type (XDR *xdrs, rpc_loc_ni_supl_pos_method_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_supl_slp_session_id_s_type (XDR *xdrs, rpc_loc_ni_supl_slp_session_id_s_type *objp)
{
	register int32_t *buf;

	int i;
	 if (!xdr_u_char (xdrs, &objp->presence))
		 return FALSE;
	 if (!xdr_opaque (xdrs, objp->session_id, 4))
		 return FALSE;
	 if (!xdr_rpc_loc_server_info_s_type (xdrs, &objp->slp_address))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_requestor_id_s_type (XDR *xdrs, rpc_loc_ni_requestor_id_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_u_char (xdrs, &objp->data_coding_scheme))
		 return FALSE;
	 if (!xdr_bytes (xdrs, (char **)&objp->requestor_id_string.requestor_id_string_val, (u_int *) &objp->requestor_id_string.requestor_id_string_len, RPC_LOC_NI_MAX_REQUESTOR_ID_LENGTH))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->string_len))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_supl_client_name_s_type (XDR *xdrs, rpc_loc_ni_supl_client_name_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_u_char (xdrs, &objp->data_coding_scheme))
		 return FALSE;
	 if (!xdr_bytes (xdrs, (char **)&objp->client_name_string.client_name_string_val, (u_int *) &objp->client_name_string.client_name_string_len, RPC_LOC_NI_MAX_CLIENT_NAME_LENGTH))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->string_len))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_supl_qop_s_type (XDR *xdrs, rpc_loc_ni_supl_qop_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_u_char (xdrs, &objp->bit_mask))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->horacc))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->veracc))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->maxLocAge))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->delay))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_supl_notify_verify_req_s_type (XDR *xdrs, rpc_loc_ni_supl_notify_verify_req_s_type *objp)
{
	register int32_t *buf;

	int i;
	 if (!xdr_rpc_loc_ni_notify_verify_e_type (xdrs, &objp->notification_priv_type))
		 return FALSE;
	 if (!xdr_rpc_uint16 (xdrs, &objp->flags))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_supl_slp_session_id_s_type (xdrs, &objp->supl_slp_session_id))
		 return FALSE;
	 if (!xdr_opaque (xdrs, objp->supl_hash, 8))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_datacoding_scheme_e_type (xdrs, &objp->datacoding_scheme))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_supl_pos_method_e_type (xdrs, &objp->pos_method))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_requestor_id_s_type (xdrs, &objp->requestor_id))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_supl_client_name_s_type (xdrs, &objp->client_name))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_supl_qop_s_type (xdrs, &objp->supl_qop))
		 return FALSE;
	 if (!xdr_rpc_uint16 (xdrs, &objp->user_response_timer))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_ext_client_address_s_type (XDR *xdrs, rpc_loc_ni_ext_client_address_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_u_char (xdrs, &objp->ext_client_address_len))
		 return FALSE;
	 if (!xdr_bytes (xdrs, (char **)&objp->ext_client_address.ext_client_address_val, (u_int *) &objp->ext_client_address.ext_client_address_len, RPC_LOC_NI_MAX_EXT_CLIENT_ADDRESS))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_location_type_e_type (XDR *xdrs, rpc_loc_ni_location_type_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_deferred_location_s_type (XDR *xdrs, rpc_loc_ni_deferred_location_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_u_char (xdrs, &objp->unused_bits))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->ms_available))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_codeword_string_s_type (XDR *xdrs, rpc_loc_ni_codeword_string_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_u_char (xdrs, &objp->data_coding_scheme))
		 return FALSE;
	 if (!xdr_bytes (xdrs, (char **)&objp->lcs_codeword_string.lcs_codeword_string_val, (u_int *) &objp->lcs_codeword_string.lcs_codeword_string_len, RPC_LOC_NI_CODEWORD_LENGTH))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->string_len))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_service_type_id_s_type (XDR *xdrs, rpc_loc_ni_service_type_id_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_u_char (xdrs, &objp->lcs_service_type_id))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_umts_cp_notify_verify_req_s_type (XDR *xdrs, rpc_loc_ni_umts_cp_notify_verify_req_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_ni_notify_verify_e_type (xdrs, &objp->notification_priv_type))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->invoke_id))
		 return FALSE;
	 if (!xdr_rpc_uint16 (xdrs, &objp->flags))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->notification_length))
		 return FALSE;
	 if (!xdr_bytes (xdrs, (char **)&objp->notification_text.notification_text_val, (u_int *) &objp->notification_text.notification_text_len, RPC_LOC_NI_MAX_CLIENT_NAME_LENGTH))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_datacoding_scheme_e_type (xdrs, &objp->datacoding_scheme))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_ext_client_address_s_type (xdrs, &objp->ext_client_address_data))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_location_type_e_type (xdrs, &objp->location_type))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_deferred_location_s_type (xdrs, &objp->deferred_location))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_requestor_id_s_type (xdrs, &objp->requestor_id))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_codeword_string_s_type (xdrs, &objp->codeword_string))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_service_type_id_s_type (xdrs, &objp->service_type_id))
		 return FALSE;
	 if (!xdr_rpc_uint16 (xdrs, &objp->user_response_timer))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_event_payload_u_type (XDR *xdrs, rpc_loc_ni_event_payload_u_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_ni_event_e_type (xdrs, &objp->disc))
		 return FALSE;
	switch (objp->disc) {
	case RPC_LOC_NI_EVENT_VX_NOTIFY_VERIFY_REQ:
		 if (!xdr_rpc_loc_ni_vx_notify_verify_req_s_type (xdrs, &objp->rpc_loc_ni_event_payload_u_type_u.vx_req))
			 return FALSE;
		break;
	case RPC_LOC_NI_EVENT_SUPL_NOTIFY_VERIFY_REQ:
		 if (!xdr_rpc_loc_ni_supl_notify_verify_req_s_type (xdrs, &objp->rpc_loc_ni_event_payload_u_type_u.supl_req))
			 return FALSE;
		break;
	case RPC_LOC_NI_EVENT_UMTS_CP_NOTIFY_VERIFY_REQ:
		 if (!xdr_rpc_loc_ni_umts_cp_notify_verify_req_s_type (xdrs, &objp->rpc_loc_ni_event_payload_u_type_u.umts_cp_req))
			 return FALSE;
		break;
	default:
		break;
	}
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_event_s_type (XDR *xdrs, rpc_loc_ni_event_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_ni_event_e_type (xdrs, &objp->event))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_event_payload_u_type (xdrs, &objp->payload))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_assist_data_request_e_type (XDR *xdrs, rpc_loc_assist_data_request_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_struct_loc_time_download_source_s_type_servers_ptr (XDR *xdrs, rpc_struct_loc_time_download_source_s_type_servers_ptr *objp)
{
	register int32_t *buf;

	 if (!xdr_string (xdrs, objp, RPC_LOC_API_MAX_SERVER_ADDR_LENGTH))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_struct_loc_time_download_source_s_type_servers (XDR *xdrs, rpc_struct_loc_time_download_source_s_type_servers objp)
{
	register int32_t *buf;

	 if (!xdr_vector (xdrs, (char *)objp, 3,
		sizeof (rpc_struct_loc_time_download_source_s_type_servers_ptr), (xdrproc_t) xdr_rpc_struct_loc_time_download_source_s_type_servers_ptr))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_time_download_source_s_type (XDR *xdrs, rpc_loc_time_download_source_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint32 (xdrs, &objp->delay_threshold))
		 return FALSE;
	 if (!xdr_rpc_struct_loc_time_download_source_s_type_servers (xdrs, objp->servers))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_struct_loc_predicted_orbits_data_source_s_type_servers_ptr (XDR *xdrs, rpc_struct_loc_predicted_orbits_data_source_s_type_servers_ptr *objp)
{
	register int32_t *buf;

	 if (!xdr_string (xdrs, objp, RPC_LOC_API_MAX_SERVER_ADDR_LENGTH))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_struct_loc_predicted_orbits_data_source_s_type_servers (XDR *xdrs, rpc_struct_loc_predicted_orbits_data_source_s_type_servers objp)
{
	register int32_t *buf;

	 if (!xdr_vector (xdrs, (char *)objp, 3,
		sizeof (rpc_struct_loc_predicted_orbits_data_source_s_type_servers_ptr), (xdrproc_t) xdr_rpc_struct_loc_predicted_orbits_data_source_s_type_servers_ptr))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_predicted_orbits_data_source_s_type (XDR *xdrs, rpc_loc_predicted_orbits_data_source_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint32 (xdrs, &objp->max_file_size))
		 return FALSE;
	 if (!xdr_rpc_uint32 (xdrs, &objp->max_part_size))
		 return FALSE;
	 if (!xdr_rpc_struct_loc_predicted_orbits_data_source_s_type_servers (xdrs, objp->servers))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_assist_data_request_payload_u_type (XDR *xdrs, rpc_loc_assist_data_request_payload_u_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_assist_data_request_e_type (xdrs, &objp->disc))
		 return FALSE;
	switch (objp->disc) {
	case RPC_LOC_ASSIST_DATA_TIME_REQ:
		 if (!xdr_rpc_loc_time_download_source_s_type (xdrs, &objp->rpc_loc_assist_data_request_payload_u_type_u.time_download))
			 return FALSE;
		break;
	case RPC_LOC_ASSIST_DATA_PREDICTED_ORBITS_REQ:
		 if (!xdr_rpc_loc_predicted_orbits_data_source_s_type (xdrs, &objp->rpc_loc_assist_data_request_payload_u_type_u.data_download))
			 return FALSE;
		break;
	default:
		break;
	}
	return TRUE;
}

bool_t
xdr_rpc_loc_assist_data_request_s_type (XDR *xdrs, rpc_loc_assist_data_request_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_assist_data_request_e_type (xdrs, &objp->event))
		 return FALSE;
	 if (!xdr_rpc_loc_assist_data_request_payload_u_type (xdrs, &objp->payload))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_connection_handle (XDR *xdrs, rpc_loc_server_connection_handle *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint32 (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_protocol_e_type (XDR *xdrs, rpc_loc_server_protocol_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_request_e_type (XDR *xdrs, rpc_loc_server_request_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_open_req_s_type (XDR *xdrs, rpc_loc_server_open_req_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_server_connection_handle (xdrs, &objp->conn_handle))
		 return FALSE;
	 if (!xdr_rpc_loc_server_protocol_e_type (xdrs, &objp->protocol))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_close_req_s_type (XDR *xdrs, rpc_loc_server_close_req_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_server_connection_handle (xdrs, &objp->conn_handle))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_request_u_type (XDR *xdrs, rpc_loc_server_request_u_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_server_request_e_type (xdrs, &objp->disc))
		 return FALSE;
	switch (objp->disc) {
	case RPC_LOC_SERVER_REQUEST_OPEN:
		 if (!xdr_rpc_loc_server_open_req_s_type (xdrs, &objp->rpc_loc_server_request_u_type_u.open_req))
			 return FALSE;
		break;
	case RPC_LOC_SERVER_REQUEST_CLOSE:
		 if (!xdr_rpc_loc_server_close_req_s_type (xdrs, &objp->rpc_loc_server_request_u_type_u.close_req))
			 return FALSE;
		break;
	default:
		break;
	}
	return TRUE;
}

bool_t
xdr_rpc_loc_server_request_s_type (XDR *xdrs, rpc_loc_server_request_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_server_request_e_type (xdrs, &objp->event))
		 return FALSE;
	 if (!xdr_rpc_loc_server_request_u_type (xdrs, &objp->payload))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_reserved_payload_s_type (XDR *xdrs, rpc_loc_reserved_payload_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint16 (xdrs, &objp->data_size))
		 return FALSE;
	 if (!xdr_bytes (xdrs, (char **)&objp->data.data_val, (u_int *) &objp->data.data_len, ~0))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ioctl_e_type (XDR *xdrs, rpc_loc_ioctl_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_api_version_s_type (XDR *xdrs, rpc_loc_api_version_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_u_char (xdrs, &objp->major))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->minor))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_fix_recurrence_e_type (XDR *xdrs, rpc_loc_fix_recurrence_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_operation_mode_e_type (XDR *xdrs, rpc_loc_operation_mode_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_notify_e_type (XDR *xdrs, rpc_loc_notify_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_fix_criteria_s_type (XDR *xdrs, rpc_loc_fix_criteria_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint32 (xdrs, &objp->valid_mask))
		 return FALSE;
	 if (!xdr_rpc_loc_fix_recurrence_e_type (xdrs, &objp->recurrence_type))
		 return FALSE;
	 if (!xdr_rpc_loc_operation_mode_e_type (xdrs, &objp->preferred_operation_mode))
		 return FALSE;
	 if (!xdr_rpc_uint32 (xdrs, &objp->preferred_accuracy))
		 return FALSE;
	 if (!xdr_rpc_uint32 (xdrs, &objp->preferred_response_time))
		 return FALSE;
	 if (!xdr_rpc_boolean (xdrs, &objp->intermediate_pos_report_enabled))
		 return FALSE;
	 if (!xdr_rpc_loc_notify_e_type (xdrs, &objp->notify_type))
		 return FALSE;
	 if (!xdr_rpc_uint32 (xdrs, &objp->min_interval))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->min_distance))
		 return FALSE;
	 if (!xdr_rpc_uint32 (xdrs, &objp->min_dist_sample_interval))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ni_user_resp_e_type (XDR *xdrs, rpc_loc_ni_user_resp_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_user_verify_s_type (XDR *xdrs, rpc_loc_user_verify_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_ni_user_resp_e_type (xdrs, &objp->user_resp))
		 return FALSE;
	 if (!xdr_rpc_loc_ni_event_s_type (xdrs, &objp->ni_event_pass_back))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_predicted_orbits_data_format_e_type (XDR *xdrs, rpc_loc_predicted_orbits_data_format_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_predicted_orbits_data_s_type (XDR *xdrs, rpc_loc_predicted_orbits_data_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_predicted_orbits_data_format_e_type (xdrs, &objp->format_type))
		 return FALSE;
	 if (!xdr_rpc_uint32 (xdrs, &objp->total_size))
		 return FALSE;
	 if (!xdr_rpc_uint8 (xdrs, &objp->total_parts))
		 return FALSE;
	 if (!xdr_rpc_uint8 (xdrs, &objp->part))
		 return FALSE;
	 if (!xdr_rpc_uint16 (xdrs, &objp->part_len))
		 return FALSE;
	 if (!xdr_bytes (xdrs, (char **)&objp->data_ptr.data_ptr_val, (u_int *) &objp->data_ptr.data_ptr_len, ~0))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_predicted_orbits_data_validity_report_s_type (XDR *xdrs, rpc_loc_predicted_orbits_data_validity_report_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint64 (xdrs, &objp->start_time_utc))
		 return FALSE;
	 if (!xdr_rpc_uint16 (xdrs, &objp->valid_duration_hrs))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_predicted_orbits_auto_download_config_s_type (XDR *xdrs, rpc_loc_predicted_orbits_auto_download_config_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_boolean (xdrs, &objp->enable))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->auto_check_every_hrs))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_assist_data_time_s_type (XDR *xdrs, rpc_loc_assist_data_time_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint64 (xdrs, &objp->time_utc))
		 return FALSE;
	 if (!xdr_rpc_uint32 (xdrs, &objp->uncertainty))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_assist_pos_valid_mask_type (XDR *xdrs, rpc_loc_assist_pos_valid_mask_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint64 (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_assist_data_pos_s_type (XDR *xdrs, rpc_loc_assist_data_pos_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_assist_pos_valid_mask_type (xdrs, &objp->valid_mask))
		 return FALSE;
	 if (!xdr_rpc_uint64 (xdrs, &objp->timestamp_utc))
		 return FALSE;
	 if (!xdr_double (xdrs, &objp->latitude))
		 return FALSE;
	 if (!xdr_double (xdrs, &objp->longitude))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->altitude_wrt_ellipsoid))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->altitude_wrt_mean_sea_level))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->hor_unc_circular))
		 return FALSE;
	 if (!xdr_float (xdrs, &objp->vert_unc))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->confidence_horizontal))
		 return FALSE;
	 if (!xdr_u_char (xdrs, &objp->confidence_vertical))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_open_status_e_type (XDR *xdrs, rpc_loc_server_open_status_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_open_status_s_type (XDR *xdrs, rpc_loc_server_open_status_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_server_connection_handle (xdrs, &objp->conn_handle))
		 return FALSE;
	 if (!xdr_rpc_loc_server_open_status_e_type (xdrs, &objp->open_status))
		 return FALSE;
	 if (!xdr_string (xdrs, &objp->apn_name, ~0))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_close_status_e_type (XDR *xdrs, rpc_loc_server_close_status_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_server_close_status_s_type (XDR *xdrs, rpc_loc_server_close_status_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_server_connection_handle (xdrs, &objp->conn_handle))
		 return FALSE;
	 if (!xdr_rpc_loc_server_close_status_e_type (xdrs, &objp->close_status))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_lock_e_type (XDR *xdrs, rpc_loc_lock_e_type *objp)
{
	register int32_t *buf;

	 if (!xdr_enum (xdrs, (enum_t *) objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_nmea_sentence_type (XDR *xdrs, rpc_loc_nmea_sentence_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint32 (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_assist_data_type (XDR *xdrs, rpc_loc_assist_data_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_uint32 (xdrs, objp))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_assist_data_delete_s_type (XDR *xdrs, rpc_loc_assist_data_delete_s_type *objp)
{
	register int32_t *buf;

	int i;
	 if (!xdr_rpc_loc_assist_data_type (xdrs, &objp->type))
		 return FALSE;
	 if (!xdr_vector (xdrs, (char *)objp->reserved, 8,
		sizeof (rpc_uint32), (xdrproc_t) xdr_rpc_uint32))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_ioctl_data_u_type (XDR *xdrs, rpc_loc_ioctl_data_u_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_ioctl_e_type (xdrs, &objp->disc))
		 return FALSE;
	switch (objp->disc) {
	case RPC_LOC_IOCTL_SET_FIX_CRITERIA:
		 if (!xdr_rpc_loc_fix_criteria_s_type (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.fix_criteria))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE:
		 if (!xdr_rpc_loc_user_verify_s_type (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.user_verify_resp))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA:
		 if (!xdr_rpc_loc_predicted_orbits_data_s_type (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.predicted_orbits_data))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_SET_PREDICTED_ORBITS_DATA_AUTO_DOWNLOAD:
		 if (!xdr_rpc_loc_predicted_orbits_auto_download_config_s_type (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.predicted_orbits_auto_download))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_INJECT_UTC_TIME:
		 if (!xdr_rpc_loc_assist_data_time_s_type (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.assistance_data_time))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_INJECT_POSITION:
		 if (!xdr_rpc_loc_assist_data_pos_s_type (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.assistance_data_position))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS:
		 if (!xdr_rpc_loc_server_open_status_s_type (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.conn_open_status))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS:
		 if (!xdr_rpc_loc_server_close_status_s_type (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.conn_close_status))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_SET_ENGINE_LOCK:
		 if (!xdr_rpc_loc_lock_e_type (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.engine_lock))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_SET_SBAS_CONFIG:
		 if (!xdr_rpc_boolean (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.sbas_mode))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_SET_NMEA_TYPES:
		 if (!xdr_rpc_loc_nmea_sentence_type (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.nmea_types))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_SET_ON_DEMAND_LPM:
		 if (!xdr_rpc_boolean (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.on_demand_lpm))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR:
	case RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR:
	case RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR:
	case RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR:
		 if (!xdr_rpc_loc_server_info_s_type (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.server_addr))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_DELETE_ASSIST_DATA:
		 if (!xdr_rpc_loc_assist_data_delete_s_type (xdrs, &objp->rpc_loc_ioctl_data_u_type_u.assist_data_delete))
			 return FALSE;
		break;
	default:
		break;
	}
	return TRUE;
}

bool_t
xdr_rpc_loc_ioctl_callback_data_u_type (XDR *xdrs, rpc_loc_ioctl_callback_data_u_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_ioctl_e_type (xdrs, &objp->disc))
		 return FALSE;
	switch (objp->disc) {
	case RPC_LOC_IOCTL_GET_API_VERSION:
		 if (!xdr_rpc_loc_api_version_s_type (xdrs, &objp->rpc_loc_ioctl_callback_data_u_type_u.api_version))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_GET_FIX_CRITERIA:
		 if (!xdr_rpc_loc_fix_criteria_s_type (xdrs, &objp->rpc_loc_ioctl_callback_data_u_type_u.fix_criteria))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_GET_ENGINE_LOCK:
		 if (!xdr_rpc_loc_lock_e_type (xdrs, &objp->rpc_loc_ioctl_callback_data_u_type_u.engine_lock))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_GET_SBAS_CONFIG:
		 if (!xdr_rpc_boolean (xdrs, &objp->rpc_loc_ioctl_callback_data_u_type_u.sbas_mode))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_GET_NMEA_TYPES:
		 if (!xdr_rpc_loc_nmea_sentence_type (xdrs, &objp->rpc_loc_ioctl_callback_data_u_type_u.nmea_types))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_GET_ON_DEMAND_LPM:
		 if (!xdr_rpc_boolean (xdrs, &objp->rpc_loc_ioctl_callback_data_u_type_u.on_demand_lpm))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_GET_CDMA_PDE_SERVER_ADDR:
	case RPC_LOC_IOCTL_GET_CDMA_MPC_SERVER_ADDR:
	case RPC_LOC_IOCTL_GET_UMTS_SLP_SERVER_ADDR:
		 if (!xdr_rpc_loc_server_info_s_type (xdrs, &objp->rpc_loc_ioctl_callback_data_u_type_u.server_addr))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE:
		 if (!xdr_rpc_loc_predicted_orbits_data_source_s_type (xdrs, &objp->rpc_loc_ioctl_callback_data_u_type_u.predicted_orbits_data_source))
			 return FALSE;
		break;
	case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_VALIDITY:
		 if (!xdr_rpc_loc_predicted_orbits_data_validity_report_s_type (xdrs, &objp->rpc_loc_ioctl_callback_data_u_type_u.predicted_orbits_data_validity))
			 return FALSE;
		break;
	default:
		break;
	}
	return TRUE;
}

bool_t
xdr_rpc_loc_ioctl_callback_s_type (XDR *xdrs, rpc_loc_ioctl_callback_s_type *objp)
{
	register int32_t *buf;

	 if (!xdr_rpc_loc_ioctl_e_type (xdrs, &objp->type))
		 return FALSE;
	 if (!xdr_rpc_int32 (xdrs, &objp->status))
		 return FALSE;
	 if (!xdr_rpc_loc_ioctl_callback_data_u_type (xdrs, &objp->data))
		 return FALSE;
	return TRUE;
}

bool_t
xdr_rpc_loc_event_payload_u_type (XDR *xdrs, rpc_loc_event_payload_u_type *objp)
{
	register int32_t *buf;

	 if (!xdr_u_quad_t (xdrs, &objp->disc))
		 return FALSE;
	switch (objp->disc) {
	case RPC_LOC_EVENT_PARSED_POSITION_REPORT:
		 if (!xdr_rpc_loc_parsed_position_s_type (xdrs, &objp->rpc_loc_event_payload_u_type_u.parsed_location_report))
			 return FALSE;
		break;
	case RPC_LOC_EVENT_SATELLITE_REPORT:
		 if (!xdr_rpc_loc_gnss_info_s_type (xdrs, &objp->rpc_loc_event_payload_u_type_u.gnss_report))
			 return FALSE;
		break;
	case RPC_LOC_EVENT_NMEA_POSITION_REPORT:
		 if (!xdr_rpc_loc_nmea_report_s_type (xdrs, &objp->rpc_loc_event_payload_u_type_u.nmea_report))
			 return FALSE;
		break;
	case RPC_LOC_EVENT_NI_NOTIFY_VERIFY_REQUEST:
		 if (!xdr_rpc_loc_ni_event_s_type (xdrs, &objp->rpc_loc_event_payload_u_type_u.ni_request))
			 return FALSE;
		break;
	case RPC_LOC_EVENT_ASSISTANCE_DATA_REQUEST:
		 if (!xdr_rpc_loc_assist_data_request_s_type (xdrs, &objp->rpc_loc_event_payload_u_type_u.assist_data_request))
			 return FALSE;
		break;
	case RPC_LOC_EVENT_LOCATION_SERVER_REQUEST:
		 if (!xdr_rpc_loc_server_request_s_type (xdrs, &objp->rpc_loc_event_payload_u_type_u.loc_server_request))
			 return FALSE;
		break;
	case RPC_LOC_EVENT_IOCTL_REPORT:
		 if (!xdr_rpc_loc_ioctl_callback_s_type (xdrs, &objp->rpc_loc_event_payload_u_type_u.ioctl_report))
			 return FALSE;
		break;
	case RPC_LOC_EVENT_STATUS_REPORT:
		 if (!xdr_rpc_loc_status_event_s_type (xdrs, &objp->rpc_loc_event_payload_u_type_u.status_report))
			 return FALSE;
		break;
	case RPC_LOC_EVENT_RESERVED:
		 if (!xdr_rpc_loc_reserved_payload_s_type (xdrs, &objp->rpc_loc_event_payload_u_type_u.reserved))
			 return FALSE;
		break;
	default:
		break;
	}
	return TRUE;
}
