134ee09551764b045fdc02df754157473125edf60Kevin Tang/******************************************************************************
234ee09551764b045fdc02df754157473125edf60Kevin Tang  @file  loc_api_rpc_glue.c
334ee09551764b045fdc02df754157473125edf60Kevin Tang  @brief Android Loc API glue code using rpcgen.
434ee09551764b045fdc02df754157473125edf60Kevin Tang
534ee09551764b045fdc02df754157473125edf60Kevin Tang  DESCRIPTION
634ee09551764b045fdc02df754157473125edf60Kevin Tang  Loc API glue code for Android
734ee09551764b045fdc02df754157473125edf60Kevin Tang
834ee09551764b045fdc02df754157473125edf60Kevin Tang  -----------------------------------------------------------------------------
934ee09551764b045fdc02df754157473125edf60Kevin TangCopyright (c) 2009, QUALCOMM USA, INC.
1034ee09551764b045fdc02df754157473125edf60Kevin Tang
1134ee09551764b045fdc02df754157473125edf60Kevin TangAll rights reserved.
1234ee09551764b045fdc02df754157473125edf60Kevin Tang
1334ee09551764b045fdc02df754157473125edf60Kevin TangRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1434ee09551764b045fdc02df754157473125edf60Kevin Tang
1534ee09551764b045fdc02df754157473125edf60Kevin Tang�         Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
1634ee09551764b045fdc02df754157473125edf60Kevin Tang
1734ee09551764b045fdc02df754157473125edf60Kevin Tang�         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.
1834ee09551764b045fdc02df754157473125edf60Kevin Tang
1934ee09551764b045fdc02df754157473125edf60Kevin Tang�         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.
2034ee09551764b045fdc02df754157473125edf60Kevin Tang
2134ee09551764b045fdc02df754157473125edf60Kevin TangTHIS 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.
2234ee09551764b045fdc02df754157473125edf60Kevin Tang  -----------------------------------------------------------------------------
2334ee09551764b045fdc02df754157473125edf60Kevin Tang ******************************************************************************/
2434ee09551764b045fdc02df754157473125edf60Kevin Tang/*=====================================================================
2534ee09551764b045fdc02df754157473125edf60Kevin Tang                        EDIT HISTORY FOR MODULE
2634ee09551764b045fdc02df754157473125edf60Kevin Tang
2734ee09551764b045fdc02df754157473125edf60Kevin Tang  This section contains comments describing changes made to the module.
2834ee09551764b045fdc02df754157473125edf60Kevin Tang  Notice that changes are listed in reverse chronological order.
2934ee09551764b045fdc02df754157473125edf60Kevin Tang
3034ee09551764b045fdc02df754157473125edf60Kevin Tangwhen       who      what, where, why
3134ee09551764b045fdc02df754157473125edf60Kevin Tang--------   ---      -------------------------------------------------------
3234ee09551764b045fdc02df754157473125edf60Kevin Tang03/05/2009   dx       Initial version
3334ee09551764b045fdc02df754157473125edf60Kevin Tang
3434ee09551764b045fdc02df754157473125edf60Kevin Tang======================================================================*/
3534ee09551764b045fdc02df754157473125edf60Kevin Tang/*=====================================================================
3634ee09551764b045fdc02df754157473125edf60Kevin Tang
3734ee09551764b045fdc02df754157473125edf60Kevin Tang                     INCLUDE FILES FOR MODULE
3834ee09551764b045fdc02df754157473125edf60Kevin Tang
3934ee09551764b045fdc02df754157473125edf60Kevin Tang======================================================================*/
4034ee09551764b045fdc02df754157473125edf60Kevin Tang//#define LOG_NDDEBUG 0
4134ee09551764b045fdc02df754157473125edf60Kevin Tang
4234ee09551764b045fdc02df754157473125edf60Kevin Tang#include <stdio.h>
4334ee09551764b045fdc02df754157473125edf60Kevin Tang#include <pthread.h>
4434ee09551764b045fdc02df754157473125edf60Kevin Tang#include <errno.h>
4534ee09551764b045fdc02df754157473125edf60Kevin Tang#include <string.h>
4634ee09551764b045fdc02df754157473125edf60Kevin Tang#include <sys/select.h>
4734ee09551764b045fdc02df754157473125edf60Kevin Tang#include <sys/time.h>
4834ee09551764b045fdc02df754157473125edf60Kevin Tang#include <sys/types.h>
4934ee09551764b045fdc02df754157473125edf60Kevin Tang#include <sys/stat.h>
5034ee09551764b045fdc02df754157473125edf60Kevin Tang#include <fcntl.h>
5134ee09551764b045fdc02df754157473125edf60Kevin Tang#include <sys/mman.h>
5234ee09551764b045fdc02df754157473125edf60Kevin Tang#include <unistd.h>
5334ee09551764b045fdc02df754157473125edf60Kevin Tang#include <stdlib.h>
5434ee09551764b045fdc02df754157473125edf60Kevin Tang#include <assert.h>
5534ee09551764b045fdc02df754157473125edf60Kevin Tang
5634ee09551764b045fdc02df754157473125edf60Kevin Tang#include <rpc/rpc.h>
5734ee09551764b045fdc02df754157473125edf60Kevin Tang#include <rpc/clnt.h>
5834ee09551764b045fdc02df754157473125edf60Kevin Tang
5934ee09551764b045fdc02df754157473125edf60Kevin Tang/* Include RPC headers */
6034ee09551764b045fdc02df754157473125edf60Kevin Tang#include "loc_api_rpc_glue.h"
6134ee09551764b045fdc02df754157473125edf60Kevin Tang
6234ee09551764b045fdc02df754157473125edf60Kevin Tang/* Callback init */
6334ee09551764b045fdc02df754157473125edf60Kevin Tang#include "loc_apicb_appinit.h"
6434ee09551764b045fdc02df754157473125edf60Kevin Tang
6534ee09551764b045fdc02df754157473125edf60Kevin Tang/* Logging */
6634ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOG_TAG "lib_api_rpc_glue"
6734ee09551764b045fdc02df754157473125edf60Kevin Tang#include <utils/Log.h>
6834ee09551764b045fdc02df754157473125edf60Kevin Tang
6934ee09551764b045fdc02df754157473125edf60Kevin Tang/* Comment this out to enable logging */
7034ee09551764b045fdc02df754157473125edf60Kevin Tang#undef LOGD
7134ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOGD(...) {}
7234ee09551764b045fdc02df754157473125edf60Kevin Tang
7334ee09551764b045fdc02df754157473125edf60Kevin Tang/*=====================================================================
7434ee09551764b045fdc02df754157473125edf60Kevin Tang     External declarations
7534ee09551764b045fdc02df754157473125edf60Kevin Tang======================================================================*/
7634ee09551764b045fdc02df754157473125edf60Kevin Tang
7734ee09551764b045fdc02df754157473125edf60Kevin TangCLIENT* loc_api_clnt = NULL;
7834ee09551764b045fdc02df754157473125edf60Kevin Tang
7934ee09551764b045fdc02df754157473125edf60Kevin Tang/* Callback ID and pointer */
8034ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOC_API_CB_ID 1
8134ee09551764b045fdc02df754157473125edf60Kevin Tangloc_event_cb_f_type *loc_api_saved_cb = NULL;  /* the only callback of Loc API client */
8234ee09551764b045fdc02df754157473125edf60Kevin Tang
8334ee09551764b045fdc02df754157473125edf60Kevin Tang#define RPC_FUNC_VERSION_BASE(a,b) a ## b
8434ee09551764b045fdc02df754157473125edf60Kevin Tang#define RPC_FUNC_VERSION(a,b) RPC_FUNC_VERSION_BASE(a,b)
8534ee09551764b045fdc02df754157473125edf60Kevin Tang
8634ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOC_GLUE_CHECK_INIT(ret_type) \
8734ee09551764b045fdc02df754157473125edf60Kevin Tang   if (loc_api_clnt == NULL) { return (ret_type) RPC_LOC_API_RPC_FAILURE; }
8834ee09551764b045fdc02df754157473125edf60Kevin Tang
8934ee09551764b045fdc02df754157473125edf60Kevin Tang#define LOC_GLUE_CHECK_RESULT(stat, ret_type) \
9034ee09551764b045fdc02df754157473125edf60Kevin Tang   if (stat != RPC_SUCCESS) { return (ret_type) RPC_LOC_API_RPC_FAILURE; }
9134ee09551764b045fdc02df754157473125edf60Kevin Tang
9234ee09551764b045fdc02df754157473125edf60Kevin Tang/* Callback functions */
9334ee09551764b045fdc02df754157473125edf60Kevin Tang/* Returns 1 if successful */
9434ee09551764b045fdc02df754157473125edf60Kevin Tangbool_t rpc_loc_event_cb_f_type_0x00040001_svc(
9534ee09551764b045fdc02df754157473125edf60Kevin Tang        rpc_loc_event_cb_f_type_args *argp,
9634ee09551764b045fdc02df754157473125edf60Kevin Tang        rpc_loc_event_cb_f_type_rets *ret,
9734ee09551764b045fdc02df754157473125edf60Kevin Tang        struct svc_req *req)
9834ee09551764b045fdc02df754157473125edf60Kevin Tang{
9934ee09551764b045fdc02df754157473125edf60Kevin Tang    /* Callback not registered, or unexpected ID (shouldn't happen) */
10034ee09551764b045fdc02df754157473125edf60Kevin Tang    if (loc_api_saved_cb == NULL || argp->cb_id != LOC_API_CB_ID)
10134ee09551764b045fdc02df754157473125edf60Kevin Tang    {
10234ee09551764b045fdc02df754157473125edf60Kevin Tang        LOGD("Warning: No callback handler.\n");
10334ee09551764b045fdc02df754157473125edf60Kevin Tang        ret->loc_event_cb_f_type_result = 0;
10434ee09551764b045fdc02df754157473125edf60Kevin Tang        return 1; /* simply return */
10534ee09551764b045fdc02df754157473125edf60Kevin Tang    }
10634ee09551764b045fdc02df754157473125edf60Kevin Tang
10734ee09551764b045fdc02df754157473125edf60Kevin Tang    LOGD("proc: %x  prog: %x  vers: %x\n",
10834ee09551764b045fdc02df754157473125edf60Kevin Tang            (int) req->rq_proc,
10934ee09551764b045fdc02df754157473125edf60Kevin Tang            (int) req->rq_prog,
11034ee09551764b045fdc02df754157473125edf60Kevin Tang            (int) req->rq_vers);
11134ee09551764b045fdc02df754157473125edf60Kevin Tang
11234ee09551764b045fdc02df754157473125edf60Kevin Tang    LOGD("Callback received: %x (handle=%d ret_ptr=%d)\n",
11334ee09551764b045fdc02df754157473125edf60Kevin Tang            (int) argp->loc_event,
11434ee09551764b045fdc02df754157473125edf60Kevin Tang            (int) argp->loc_handle,
11534ee09551764b045fdc02df754157473125edf60Kevin Tang            (int) ret);
11634ee09551764b045fdc02df754157473125edf60Kevin Tang
11734ee09551764b045fdc02df754157473125edf60Kevin Tang    /* Forward callback to real callback procedure */
11834ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_client_handle_type        loc_handle = argp->loc_handle;
11934ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_event_mask_type           loc_event  = argp->loc_event;
12034ee09551764b045fdc02df754157473125edf60Kevin Tang    const rpc_loc_event_payload_u_type*  loc_event_payload =
12134ee09551764b045fdc02df754157473125edf60Kevin Tang        (const rpc_loc_event_payload_u_type*) argp->loc_event_payload;
12234ee09551764b045fdc02df754157473125edf60Kevin Tang
12334ee09551764b045fdc02df754157473125edf60Kevin Tang    int32 rc = loc_api_saved_cb(loc_handle, loc_event, loc_event_payload);
12434ee09551764b045fdc02df754157473125edf60Kevin Tang    ret->loc_event_cb_f_type_result = rc;
12534ee09551764b045fdc02df754157473125edf60Kevin Tang
12634ee09551764b045fdc02df754157473125edf60Kevin Tang    return 1; /* ok */
12734ee09551764b045fdc02df754157473125edf60Kevin Tang}
12834ee09551764b045fdc02df754157473125edf60Kevin Tang
12934ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_apicbprog_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result)
13034ee09551764b045fdc02df754157473125edf60Kevin Tang{
13134ee09551764b045fdc02df754157473125edf60Kevin Tang    xdr_free (xdr_result, result);
13234ee09551764b045fdc02df754157473125edf60Kevin Tang
13334ee09551764b045fdc02df754157473125edf60Kevin Tang    /*
13434ee09551764b045fdc02df754157473125edf60Kevin Tang     * Insert additional freeing code here, if needed
13534ee09551764b045fdc02df754157473125edf60Kevin Tang     */
13634ee09551764b045fdc02df754157473125edf60Kevin Tang    // LOGD("***** loc_apicbprog_freeresult\n");
13734ee09551764b045fdc02df754157473125edf60Kevin Tang
13834ee09551764b045fdc02df754157473125edf60Kevin Tang    return 1;
13934ee09551764b045fdc02df754157473125edf60Kevin Tang}
14034ee09551764b045fdc02df754157473125edf60Kevin Tang
14134ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_apicbprog_0x00040001_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result)
14234ee09551764b045fdc02df754157473125edf60Kevin Tang{
14334ee09551764b045fdc02df754157473125edf60Kevin Tang    return loc_apicbprog_freeresult (transp, xdr_result, result);
14434ee09551764b045fdc02df754157473125edf60Kevin Tang}
14534ee09551764b045fdc02df754157473125edf60Kevin Tang
14634ee09551764b045fdc02df754157473125edf60Kevin Tang/*===========================================================================
14734ee09551764b045fdc02df754157473125edf60Kevin Tang
14834ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION loc_api_glue_init
14934ee09551764b045fdc02df754157473125edf60Kevin Tang
15034ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION
15134ee09551764b045fdc02df754157473125edf60Kevin Tang   Initiates the RPC client
15234ee09551764b045fdc02df754157473125edf60Kevin Tang
15334ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE
15434ee09551764b045fdc02df754157473125edf60Kevin Tang   1 for success
15534ee09551764b045fdc02df754157473125edf60Kevin Tang   0 for failure
15634ee09551764b045fdc02df754157473125edf60Kevin Tang
15734ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/
15834ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_api_glue_init(void)
15934ee09551764b045fdc02df754157473125edf60Kevin Tang{
16034ee09551764b045fdc02df754157473125edf60Kevin Tang    if (loc_api_clnt == NULL)
16134ee09551764b045fdc02df754157473125edf60Kevin Tang    {
16234ee09551764b045fdc02df754157473125edf60Kevin Tang        /* Print msg */
16334ee09551764b045fdc02df754157473125edf60Kevin Tang        LOGD("Trying to create RPC client...\n");
16434ee09551764b045fdc02df754157473125edf60Kevin Tang        loc_api_clnt = clnt_create(NULL, LOC_APIPROG, LOC_APIVERS, NULL);
16534ee09551764b045fdc02df754157473125edf60Kevin Tang        LOGD("Created loc_api_clnt ---- %x\n", (unsigned int)loc_api_clnt);
16634ee09551764b045fdc02df754157473125edf60Kevin Tang
16734ee09551764b045fdc02df754157473125edf60Kevin Tang        if (loc_api_clnt == NULL)
16834ee09551764b045fdc02df754157473125edf60Kevin Tang        {
16934ee09551764b045fdc02df754157473125edf60Kevin Tang            fprintf(stderr, "Error: cannot create RPC client.\n");
17034ee09551764b045fdc02df754157473125edf60Kevin Tang            return 0;
17134ee09551764b045fdc02df754157473125edf60Kevin Tang        }
17234ee09551764b045fdc02df754157473125edf60Kevin Tang
17334ee09551764b045fdc02df754157473125edf60Kevin Tang        /* Init RPC callbacks */
17434ee09551764b045fdc02df754157473125edf60Kevin Tang        int rc = loc_apicb_app_init();
17534ee09551764b045fdc02df754157473125edf60Kevin Tang        if (rc >= 0)
17634ee09551764b045fdc02df754157473125edf60Kevin Tang        {
17734ee09551764b045fdc02df754157473125edf60Kevin Tang            LOGD("Loc API callback initialized.\n");
17834ee09551764b045fdc02df754157473125edf60Kevin Tang        } else {
17934ee09551764b045fdc02df754157473125edf60Kevin Tang            fprintf(stderr, "Loc API callback initialization failed.\n");
18034ee09551764b045fdc02df754157473125edf60Kevin Tang            return 0;
18134ee09551764b045fdc02df754157473125edf60Kevin Tang        }
18234ee09551764b045fdc02df754157473125edf60Kevin Tang    }
18334ee09551764b045fdc02df754157473125edf60Kevin Tang
18434ee09551764b045fdc02df754157473125edf60Kevin Tang    return 1;
18534ee09551764b045fdc02df754157473125edf60Kevin Tang}
18634ee09551764b045fdc02df754157473125edf60Kevin Tang
18734ee09551764b045fdc02df754157473125edf60Kevin Tangrpc_loc_client_handle_type loc_open (
18834ee09551764b045fdc02df754157473125edf60Kevin Tang        rpc_loc_event_mask_type  event_reg_mask,
18934ee09551764b045fdc02df754157473125edf60Kevin Tang        loc_event_cb_f_type      *event_callback
19034ee09551764b045fdc02df754157473125edf60Kevin Tang    )
19134ee09551764b045fdc02df754157473125edf60Kevin Tang{
19234ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_GLUE_CHECK_INIT(rpc_loc_client_handle_type);
19334ee09551764b045fdc02df754157473125edf60Kevin Tang
19434ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_open_args args;
19534ee09551764b045fdc02df754157473125edf60Kevin Tang    args.event_reg_mask = event_reg_mask;
19634ee09551764b045fdc02df754157473125edf60Kevin Tang    args.event_callback = LOC_API_CB_ID;
19734ee09551764b045fdc02df754157473125edf60Kevin Tang    loc_api_saved_cb = event_callback;
19834ee09551764b045fdc02df754157473125edf60Kevin Tang
19934ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_open_rets rets;
20034ee09551764b045fdc02df754157473125edf60Kevin Tang    enum clnt_stat stat = RPC_SUCCESS;
20134ee09551764b045fdc02df754157473125edf60Kevin Tang
20234ee09551764b045fdc02df754157473125edf60Kevin Tang    stat = RPC_FUNC_VERSION(rpc_loc_open_, /* LOC_APIVERS */ 0x00040001)(&args, &rets, loc_api_clnt);
20334ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_GLUE_CHECK_RESULT(stat, int32);
20434ee09551764b045fdc02df754157473125edf60Kevin Tang
20534ee09551764b045fdc02df754157473125edf60Kevin Tang    return (rpc_loc_client_handle_type) rets.loc_open_result;
20634ee09551764b045fdc02df754157473125edf60Kevin Tang}
20734ee09551764b045fdc02df754157473125edf60Kevin Tang
20834ee09551764b045fdc02df754157473125edf60Kevin Tangint32 loc_close(rpc_loc_client_handle_type handle)
20934ee09551764b045fdc02df754157473125edf60Kevin Tang{
21034ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_GLUE_CHECK_INIT(int32);
21134ee09551764b045fdc02df754157473125edf60Kevin Tang
21234ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_close_args args;
21334ee09551764b045fdc02df754157473125edf60Kevin Tang    args.handle = handle;
21434ee09551764b045fdc02df754157473125edf60Kevin Tang
21534ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_close_rets rets;
21634ee09551764b045fdc02df754157473125edf60Kevin Tang    enum clnt_stat stat = RPC_SUCCESS;
21734ee09551764b045fdc02df754157473125edf60Kevin Tang
21834ee09551764b045fdc02df754157473125edf60Kevin Tang    stat = RPC_FUNC_VERSION(rpc_loc_close_, /* LOC_APIVERS */ 0x00040001)(&args, &rets, loc_api_clnt);
21934ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_GLUE_CHECK_RESULT(stat, int32);
22034ee09551764b045fdc02df754157473125edf60Kevin Tang
22134ee09551764b045fdc02df754157473125edf60Kevin Tang    return (int32) rets.loc_close_result;
22234ee09551764b045fdc02df754157473125edf60Kevin Tang}
22334ee09551764b045fdc02df754157473125edf60Kevin Tang
22434ee09551764b045fdc02df754157473125edf60Kevin Tangint32 loc_start_fix(rpc_loc_client_handle_type handle)
22534ee09551764b045fdc02df754157473125edf60Kevin Tang{
22634ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_GLUE_CHECK_INIT(int32);
22734ee09551764b045fdc02df754157473125edf60Kevin Tang
22834ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_start_fix_args args;
22934ee09551764b045fdc02df754157473125edf60Kevin Tang    args.handle = handle;
23034ee09551764b045fdc02df754157473125edf60Kevin Tang
23134ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_start_fix_rets rets;
23234ee09551764b045fdc02df754157473125edf60Kevin Tang    enum clnt_stat stat = RPC_SUCCESS;
23334ee09551764b045fdc02df754157473125edf60Kevin Tang
23434ee09551764b045fdc02df754157473125edf60Kevin Tang    stat = RPC_FUNC_VERSION(rpc_loc_start_fix_, /* LOC_APIVERS */ 0x00040001)(&args, &rets, loc_api_clnt);
23534ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_GLUE_CHECK_RESULT(stat, int32);
23634ee09551764b045fdc02df754157473125edf60Kevin Tang
23734ee09551764b045fdc02df754157473125edf60Kevin Tang    return (int32) rets.loc_start_fix_result;
23834ee09551764b045fdc02df754157473125edf60Kevin Tang}
23934ee09551764b045fdc02df754157473125edf60Kevin Tang
24034ee09551764b045fdc02df754157473125edf60Kevin Tangint32 loc_stop_fix(rpc_loc_client_handle_type handle)
24134ee09551764b045fdc02df754157473125edf60Kevin Tang{
24234ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_GLUE_CHECK_INIT(int32);
24334ee09551764b045fdc02df754157473125edf60Kevin Tang
24434ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_stop_fix_args args;
24534ee09551764b045fdc02df754157473125edf60Kevin Tang    args.handle = handle;
24634ee09551764b045fdc02df754157473125edf60Kevin Tang
24734ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_stop_fix_rets rets;
24834ee09551764b045fdc02df754157473125edf60Kevin Tang    enum clnt_stat stat = RPC_SUCCESS;
24934ee09551764b045fdc02df754157473125edf60Kevin Tang
25034ee09551764b045fdc02df754157473125edf60Kevin Tang    stat = RPC_FUNC_VERSION(rpc_loc_stop_fix_, /* LOC_APIVERS */ 0x00040001)(&args, &rets, loc_api_clnt);
25134ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_GLUE_CHECK_RESULT(stat, int32);
25234ee09551764b045fdc02df754157473125edf60Kevin Tang
25334ee09551764b045fdc02df754157473125edf60Kevin Tang    return (int32) rets.loc_stop_fix_result;
25434ee09551764b045fdc02df754157473125edf60Kevin Tang}
25534ee09551764b045fdc02df754157473125edf60Kevin Tang
25634ee09551764b045fdc02df754157473125edf60Kevin Tangint32 loc_ioctl(
25734ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_client_handle_type           handle,
25834ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_e_type                 ioctl_type,
25934ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_data_u_type*           ioctl_data
26034ee09551764b045fdc02df754157473125edf60Kevin Tang    )
26134ee09551764b045fdc02df754157473125edf60Kevin Tang{
26234ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_GLUE_CHECK_INIT(int32);
26334ee09551764b045fdc02df754157473125edf60Kevin Tang
26434ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_args args;
26534ee09551764b045fdc02df754157473125edf60Kevin Tang    args.handle = handle;
26634ee09551764b045fdc02df754157473125edf60Kevin Tang    args.ioctl_data = ioctl_data;
26734ee09551764b045fdc02df754157473125edf60Kevin Tang    args.ioctl_type = ioctl_type;
26834ee09551764b045fdc02df754157473125edf60Kevin Tang    if (ioctl_data != NULL)
26934ee09551764b045fdc02df754157473125edf60Kevin Tang    {
27034ee09551764b045fdc02df754157473125edf60Kevin Tang        /* Assign ioctl union discriminator */
27134ee09551764b045fdc02df754157473125edf60Kevin Tang        ioctl_data->disc = ioctl_type;
27234ee09551764b045fdc02df754157473125edf60Kevin Tang
27334ee09551764b045fdc02df754157473125edf60Kevin Tang        /* In case the user hasn't filled in other disc fields,
27434ee09551764b045fdc02df754157473125edf60Kevin Tang           automatically fill them in here */
27534ee09551764b045fdc02df754157473125edf60Kevin Tang        switch (ioctl_type)
27634ee09551764b045fdc02df754157473125edf60Kevin Tang        {
27734ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_GET_API_VERSION:
27834ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_SET_FIX_CRITERIA:
27934ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_GET_FIX_CRITERIA:
28034ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE:
28134ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA:
28234ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_VALIDITY:
28334ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE:
28434ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_SET_PREDICTED_ORBITS_DATA_AUTO_DOWNLOAD:
28534ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_INJECT_UTC_TIME:
28634ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_INJECT_RTC_VALUE:
28734ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_INJECT_POSITION:
28834ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_QUERY_ENGINE_STATE:
28934ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS:
29034ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS:
29134ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_SET_ENGINE_LOCK:
29234ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_GET_ENGINE_LOCK:
29334ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_SET_SBAS_CONFIG:
29434ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_GET_SBAS_CONFIG:
29534ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_SET_NMEA_TYPES:
29634ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_GET_NMEA_TYPES:
29734ee09551764b045fdc02df754157473125edf60Kevin Tang                break;
29834ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR:
29934ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR:
30034ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR:
30134ee09551764b045fdc02df754157473125edf60Kevin Tang                args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_info.disc =
30234ee09551764b045fdc02df754157473125edf60Kevin Tang                    args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_type;
30334ee09551764b045fdc02df754157473125edf60Kevin Tang                break;
30434ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_GET_CDMA_PDE_SERVER_ADDR:
30534ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_GET_CDMA_MPC_SERVER_ADDR:
30634ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_GET_UMTS_SLP_SERVER_ADDR:
30734ee09551764b045fdc02df754157473125edf60Kevin Tang                break;
30834ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_SET_ON_DEMAND_LPM:
30934ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_GET_ON_DEMAND_LPM:
31034ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_DELETE_ASSIST_DATA:
31134ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR:
31234ee09551764b045fdc02df754157473125edf60Kevin Tang            case RPC_LOC_IOCTL_GET_CUSTOM_PDE_SERVER_ADDR:
31334ee09551764b045fdc02df754157473125edf60Kevin Tang            default:
31434ee09551764b045fdc02df754157473125edf60Kevin Tang                break;
31534ee09551764b045fdc02df754157473125edf60Kevin Tang        } /* switch */
31634ee09551764b045fdc02df754157473125edf60Kevin Tang    } /* ioctl_data != NULL */
31734ee09551764b045fdc02df754157473125edf60Kevin Tang
31834ee09551764b045fdc02df754157473125edf60Kevin Tang    rpc_loc_ioctl_rets rets;
31934ee09551764b045fdc02df754157473125edf60Kevin Tang    enum clnt_stat stat = RPC_SUCCESS;
32034ee09551764b045fdc02df754157473125edf60Kevin Tang
32134ee09551764b045fdc02df754157473125edf60Kevin Tang    stat = RPC_FUNC_VERSION(rpc_loc_ioctl_, /* LOC_APIVERS */ 0x00040001)(&args, &rets, loc_api_clnt);
32234ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_GLUE_CHECK_RESULT(stat, int32);
32334ee09551764b045fdc02df754157473125edf60Kevin Tang
32434ee09551764b045fdc02df754157473125edf60Kevin Tang    return (int32) rets.loc_ioctl_result;
32534ee09551764b045fdc02df754157473125edf60Kevin Tang}
32634ee09551764b045fdc02df754157473125edf60Kevin Tang
32734ee09551764b045fdc02df754157473125edf60Kevin Tang/* Returns 0 if error */
32834ee09551764b045fdc02df754157473125edf60Kevin Tangint32 loc_api_null(void)
32934ee09551764b045fdc02df754157473125edf60Kevin Tang{
33034ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_GLUE_CHECK_INIT(int32);
33134ee09551764b045fdc02df754157473125edf60Kevin Tang
33234ee09551764b045fdc02df754157473125edf60Kevin Tang    int32 rets;
33334ee09551764b045fdc02df754157473125edf60Kevin Tang    enum clnt_stat stat = RPC_SUCCESS;
33434ee09551764b045fdc02df754157473125edf60Kevin Tang
33534ee09551764b045fdc02df754157473125edf60Kevin Tang    stat = RPC_FUNC_VERSION(rpc_loc_api_null_, LOC_APIVERS)(NULL, &rets, loc_api_clnt);
33634ee09551764b045fdc02df754157473125edf60Kevin Tang    LOC_GLUE_CHECK_RESULT(stat, int32);
33734ee09551764b045fdc02df754157473125edf60Kevin Tang
33834ee09551764b045fdc02df754157473125edf60Kevin Tang    return (int32) rets;
33934ee09551764b045fdc02df754157473125edf60Kevin Tang}
340