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