1bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/****************************************************************************** 2bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo @file loc_api_rpc_glue.c 3bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo @brief Android Loc API glue code using rpcgen. 4bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 5bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo DESCRIPTION 6bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo Loc API glue code for Android 7bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 8bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ----------------------------------------------------------------------------- 9bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoCopyright (c) 2009, QUALCOMM USA, INC. 10bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 11bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoAll rights reserved. 12bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 13bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 14bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 15bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo� Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 16bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 17bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo� Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 18bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 19bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo� Neither the name of the QUALCOMM USA, INC. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 20bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 21bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 22bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ----------------------------------------------------------------------------- 23bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ******************************************************************************/ 24bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===================================================================== 25bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo EDIT HISTORY FOR MODULE 26bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 27bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo This section contains comments describing changes made to the module. 28bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo Notice that changes are listed in reverse chronological order. 29bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 30bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russowhen who what, where, why 31bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo-------- --- ------------------------------------------------------- 32bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo03/05/2009 dx Initial version 33bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 34bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo======================================================================*/ 35bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===================================================================== 36bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 37bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo INCLUDE FILES FOR MODULE 38bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 39bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo======================================================================*/ 40bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo//#define LOG_NDDEBUG 0 41bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 42bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <stdio.h> 43bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <pthread.h> 44bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <errno.h> 45bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <string.h> 46bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/select.h> 47bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/time.h> 48bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/types.h> 49bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/stat.h> 50bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <fcntl.h> 51bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <sys/mman.h> 52bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <unistd.h> 53bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <stdlib.h> 54bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <assert.h> 55bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 56bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <rpc/rpc.h> 57bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <rpc/clnt.h> 58bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 59bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Include RPC headers */ 60bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "loc_api_rpc_glue.h" 61bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 62bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Callback init */ 63bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "loc_apicb_appinit.h" 64bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 65bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Logging */ 66bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOG_TAG "lib_api_rpc_glue" 67bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <utils/Log.h> 68bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 69bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Comment this out to enable logging */ 70bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#undef LOGD 71bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOGD(...) {} 72bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 73bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*===================================================================== 74bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo External declarations 75bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo======================================================================*/ 76bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 77bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoCLIENT* loc_api_clnt = NULL; 78bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 79bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Callback ID and pointer */ 80bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOC_API_CB_ID 1 81bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoloc_event_cb_f_type *loc_api_saved_cb = NULL; /* the only callback of Loc API client */ 82bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 83bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_FUNC_VERSION_BASE(a,b) a ## b 84bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define RPC_FUNC_VERSION(a,b) RPC_FUNC_VERSION_BASE(a,b) 85bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 86bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOC_GLUE_CHECK_INIT(ret_type) \ 87bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (loc_api_clnt == NULL) { return (ret_type) RPC_LOC_API_RPC_FAILURE; } 88bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 89bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#define LOC_GLUE_CHECK_RESULT(stat, ret_type) \ 90bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (stat != RPC_SUCCESS) { return (ret_type) RPC_LOC_API_RPC_FAILURE; } 91bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 92bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Callback functions */ 93bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Returns 1 if successful */ 94bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russobool_t rpc_loc_event_cb_f_type_0x00010001_svc( 95bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_event_cb_f_type_args *argp, 96bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_event_cb_f_type_rets *ret, 97bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo struct svc_req *req) 98bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 99bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Callback not registered, or unexpected ID (shouldn't happen) */ 100bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (loc_api_saved_cb == NULL || argp->cb_id != LOC_API_CB_ID) 101bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 102bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOGD("Warning: No callback handler.\n"); 103bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ret->loc_event_cb_f_type_result = 0; 104bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 1; /* simply return */ 105bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 106bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 107bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOGD("proc: %x prog: %x vers: %x\n", 108bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (int) req->rq_proc, 109bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (int) req->rq_prog, 110bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (int) req->rq_vers); 111bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 112bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOGD("Callback received: %x (handle=%d ret_ptr=%d)\n", 113bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (int) argp->loc_event, 114bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (int) argp->loc_handle, 115bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (int) ret); 116bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 117bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Forward callback to real callback procedure */ 118bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_client_handle_type loc_handle = argp->loc_handle; 119bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_event_mask_type loc_event = argp->loc_event; 120bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo const rpc_loc_event_payload_u_type* loc_event_payload = 121bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo (const rpc_loc_event_payload_u_type*) argp->loc_event_payload; 122bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 123bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int32 rc = loc_api_saved_cb(loc_handle, loc_event, loc_event_payload); 124bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ret->loc_event_cb_f_type_result = rc; 125bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 126bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 1; /* ok */ 127bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 128bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 129bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_apicbprog_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) 130bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 131bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo xdr_free (xdr_result, result); 132bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 133bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* 134bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * Insert additional freeing code here, if needed 135bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo */ 136bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo // LOGD("***** loc_apicbprog_freeresult\n"); 137bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 138bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 1; 139bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 140bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 141bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_apicbprog_0x00010001_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) 142bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 143bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return loc_apicbprog_freeresult (transp, xdr_result, result); 144bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 145bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 146bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 147bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 148bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_api_glue_init 149bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 150bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 151bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo Initiates the RPC client 152bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 153bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 154bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 1 for success 155bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 0 for failure 156bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 157bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 158bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_api_glue_init(void) 159bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 160bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (loc_api_clnt == NULL) 161bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 162bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Print msg */ 163bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOGD("Trying to create RPC client...\n"); 164bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_api_clnt = clnt_create(NULL, LOC_APIPROG, /*LOC_APIVERS*/ 0x00010000, NULL); 165bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOGD("Created loc_api_clnt ---- %x\n", (unsigned int)loc_api_clnt); 166bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 167bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (loc_api_clnt == NULL) 168bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 169bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo fprintf(stderr, "Error: cannot create RPC client.\n"); 170bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 0; 171bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 172bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 173bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Init RPC callbacks */ 174bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int rc = loc_apicb_app_init(); 175bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (rc >= 0) 176bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 177bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOGD("Loc API callback initialized.\n"); 178bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } else { 179bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo fprintf(stderr, "Loc API callback initialization failed.\n"); 180bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 0; 181bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 182bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 183bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 184bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 1; 185bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 186bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 187bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russorpc_loc_client_handle_type loc_open ( 188bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_event_mask_type event_reg_mask, 189bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_event_cb_f_type *event_callback 190bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ) 191bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 192bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_INIT(rpc_loc_client_handle_type); 193bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 194bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_open_args args; 195bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.event_reg_mask = event_reg_mask; 196bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.event_callback = LOC_API_CB_ID; 197bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo loc_api_saved_cb = event_callback; 198bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 199bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_open_rets rets; 200bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo enum clnt_stat stat = RPC_SUCCESS; 201bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 202bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo stat = RPC_FUNC_VERSION(rpc_loc_open_, LOC_APIVERS)(&args, &rets, loc_api_clnt); 203bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_RESULT(stat, int32); 204bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 205bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return (rpc_loc_client_handle_type) rets.loc_open_result; 206bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 207bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 208bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_close(rpc_loc_client_handle_type handle) 209bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 210bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_INIT(int32); 211bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 212bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_close_args args; 213bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.handle = handle; 214bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 215bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_close_rets rets; 216bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo enum clnt_stat stat = RPC_SUCCESS; 217bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 218bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo stat = RPC_FUNC_VERSION(rpc_loc_close_, LOC_APIVERS)(&args, &rets, loc_api_clnt); 219bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_RESULT(stat, int32); 220bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 221bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return (int32) rets.loc_close_result; 222bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 223bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 224bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_start_fix(rpc_loc_client_handle_type handle) 225bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 226bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_INIT(int32); 227bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 228bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_start_fix_args args; 229bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.handle = handle; 230bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 231bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_start_fix_rets rets; 232bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo enum clnt_stat stat = RPC_SUCCESS; 233bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 234bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo stat = RPC_FUNC_VERSION(rpc_loc_start_fix_, LOC_APIVERS)(&args, &rets, loc_api_clnt); 235bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_RESULT(stat, int32); 236bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 237bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return (int32) rets.loc_start_fix_result; 238bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 239bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 240bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_stop_fix(rpc_loc_client_handle_type handle) 241bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 242bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_INIT(int32); 243bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 244bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_stop_fix_args args; 245bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.handle = handle; 246bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 247bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_stop_fix_rets rets; 248bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo enum clnt_stat stat = RPC_SUCCESS; 249bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 250bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo stat = RPC_FUNC_VERSION(rpc_loc_stop_fix_, LOC_APIVERS)(&args, &rets, loc_api_clnt); 251bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_RESULT(stat, int32); 252bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 253bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return (int32) rets.loc_stop_fix_result; 254bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 255bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 256bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_ioctl( 257bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_client_handle_type handle, 258bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_ioctl_e_type ioctl_type, 259bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_ioctl_data_u_type* ioctl_data 260bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ) 261bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 262bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_INIT(int32); 263bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 264bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_ioctl_args args; 265bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.handle = handle; 266bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.ioctl_data = ioctl_data; 267bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.ioctl_type = ioctl_type; 268bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (ioctl_data != NULL) 269bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 270bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* Assign ioctl union discriminator */ 271bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ioctl_data->disc = ioctl_type; 272bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 273bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo /* In case the user hasn't filled in other disc fields, 274bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo automatically fill them in here */ 275bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo switch (ioctl_type) 276bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo { 277bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_API_VERSION: 278bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_FIX_CRITERIA: 279bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_FIX_CRITERIA: 280bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE: 281bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA: 282bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_VALIDITY: 283bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE: 284bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_PREDICTED_ORBITS_DATA_AUTO_DOWNLOAD: 285bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INJECT_UTC_TIME: 286bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INJECT_RTC_VALUE: 287bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INJECT_POSITION: 288bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_QUERY_ENGINE_STATE: 289bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS: 290bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS: 291bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_ENGINE_LOCK: 292bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_ENGINE_LOCK: 293bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_SBAS_CONFIG: 294bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_SBAS_CONFIG: 295bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_NMEA_TYPES: 296bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_NMEA_TYPES: 297bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 298bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR: 299bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR: 300bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR: 301bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_info.disc = 302bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_type; 303bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 304bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_CDMA_PDE_SERVER_ADDR: 305bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_CDMA_MPC_SERVER_ADDR: 306bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_UMTS_SLP_SERVER_ADDR: 307bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 308bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_ON_DEMAND_LPM: 309bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_ON_DEMAND_LPM: 310bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_DELETE_ASSIST_DATA: 311bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR: 312bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo case RPC_LOC_IOCTL_GET_CUSTOM_PDE_SERVER_ADDR: 313bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo default: 314bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo break; 315bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } /* switch */ 316bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } /* ioctl_data != NULL */ 317bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 318bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo rpc_loc_ioctl_rets rets; 319bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo enum clnt_stat stat = RPC_SUCCESS; 320bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 321bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo stat = RPC_FUNC_VERSION(rpc_loc_ioctl_, LOC_APIVERS)(&args, &rets, loc_api_clnt); 322bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_RESULT(stat, int32); 323bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 324bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return (int32) rets.loc_ioctl_result; 325bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 326bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 327bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Returns 0 if error */ 328bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint32 loc_api_null(void) 329bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 330bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_INIT(int32); 331bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 332bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int32 rets; 333bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo enum clnt_stat stat = RPC_SUCCESS; 334bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 335bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo stat = RPC_FUNC_VERSION(rpc_loc_api_null_, LOC_APIVERS)(NULL, &rets, loc_api_clnt); 336bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_GLUE_CHECK_RESULT(stat, int32); 337bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 338bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return (int32) rets; 339bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 340