18c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
28c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *
38c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * Redistribution and use in source and binary forms, with or without
48c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * modification, are permitted provided that the following conditions are
58c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * met:
68c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *     * Redistributions of source code must retain the above copyright
78c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       notice, this list of conditions and the following disclaimer.
88c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *     * Redistributions in binary form must reproduce the above
98c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       copyright notice, this list of conditions and the following
108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       disclaimer in the documentation and/or other materials provided
118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       with the distribution.
128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *     * Neither the name of The Linux Foundation, nor the names of its
138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       contributors may be used to endorse or promote products derived
148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *       from this software without specific prior written permission.
158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam *
168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam */
288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=====================================================================
308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                     INCLUDE FILES FOR MODULE
328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam======================================================================*/
348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <stdio.h>
358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <pthread.h>
368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <errno.h>
378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <string.h>
388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <sys/select.h>
398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <sys/time.h>
408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <sys/types.h>
418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <sys/stat.h>
428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <fcntl.h>
438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <sys/mman.h>
448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <unistd.h>
458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <stdlib.h>
468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <assert.h>
478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <loc_api_log.h>
488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <rpc/rpc.h>
508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Include RPC headers */
528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "rpc_inc/loc_api_rpc_glue.h"
538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Callback init */
558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "rpc_inc/loc_apicb_appinit.h"
568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Logging */
588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOG_TAG "LocSvc_api_rpc_glue"
598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOG_NDDEBUG 0
608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#ifndef USE_GLIB
618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include <utils/Log.h>
628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#endif /* USE_GLIB */
638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Logging Improvement */
658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "log_util.h"
668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#include "platform_lib_includes.h"
678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*Maximum number of Modem init*/
688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define RPC_TRY_NUM 10
698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*Maximum number of Modem init*/
718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define RPC_TRY_NUM 10
728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Uncomment to force ALOGD messages */
748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam// #define ALOGD ALOGI
758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*=====================================================================
778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam     External declarations
788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam======================================================================*/
798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
808c2d3d5afc51d3f35150f748f263870367771b6fEd TamCLIENT* loc_api_clnt = NULL;
818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Callback ID and pointer */
838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOC_API_CB_MAX_CLIENTS 16
848c2d3d5afc51d3f35150f748f263870367771b6fEd Tamtypedef struct
858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    uint32 cb_id;                        /* same as rpc/types.h */
878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_event_cb_f_type *cb_func;      /* callback func */
888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_reset_notif_cb_f_type *rpc_cb; /* callback from RPC */
898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_client_handle_type handle; /* stores handle for client closing */
908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    void* user;                        /* user's own data handle */
918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam} loc_glue_cb_entry_s_type;
928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
938c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_glue_cb_entry_s_type loc_glue_callback_table[LOC_API_CB_MAX_CLIENTS];
948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define RPC_FUNC_VERSION_BASE(a,b) a ## b
968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define RPC_FUNC_VERSION(a,b) RPC_FUNC_VERSION_BASE(a,b)
978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define RPC_CALLBACK_FUNC_VERSION_BASE(a,v,b) a ## v ## b
998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define RPC_CALLBACK_FUNC_VERSION(a,v,b) RPC_CALLBACK_FUNC_VERSION_BASE(a,v,b)
1008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOC_GLUE_CHECK_INIT(ret_type) \
1028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   if (loc_api_clnt == NULL) { EXIT_LOG_CALLFLOW(%d, RPC_LOC_API_RPC_FAILURE); return (ret_type) RPC_LOC_API_RPC_FAILURE; }
1038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define LOC_GLUE_CHECK_RESULT(stat, ret_type) \
1058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam  if (stat != RPC_SUCCESS) { \
1068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      LOC_LOGE("%s:%d] failure code %d", __func__, __LINE__, stat); \
1078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      return (ret_type)((stat == RPC_SUBSYSTEM_RESTART) ? \
1088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                        RPC_LOC_API_RPC_MODEM_RESTART : RPC_LOC_API_RPC_FAILURE); \
1098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam  }
1108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Callback functions */
1128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Returns 1 if successful */
1138c2d3d5afc51d3f35150f748f263870367771b6fEd Tambool_t rpc_loc_event_cb_f_type_svc(
1148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_event_cb_f_type_args *argp,
1158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_event_cb_f_type_rets *ret,
1168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      struct svc_req *req)
1178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
1188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    // The lower word of cd_id is the index
1198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int index = argp->cb_id & 0xFFFF;
1208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    /* Callback not registered, or unexpected ID (shouldn't happen) */
1228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (index >= LOC_API_CB_MAX_CLIENTS || loc_glue_callback_table[index].cb_func == NULL)
1238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
1248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGE("Warning: No callback handler %d.\n", index);
1258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        ret->loc_event_cb_f_type_result = 0;
1268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        return 1; /* simply return */
1278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
1288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGV("proc: %x  prog: %x  vers: %x\n",
1308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         (int) req->rq_proc,
1318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         (int) req->rq_prog,
1328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         (int) req->rq_vers);
1338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGV("Callback received: %x (cb_id=%p handle=%d ret_ptr=%d)\n",
1358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         (int) argp->loc_event,
1368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam               argp->cb_id,
1378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         (int) argp->loc_handle,
1388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         (int) ret);
1398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    /* Forward callback to real callback procedure */
1418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_client_handle_type        loc_handle = argp->loc_handle;
1428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_event_mask_type           loc_event  = argp->loc_event;
1438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    const rpc_loc_event_payload_u_type*  loc_event_payload =
1448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        (const rpc_loc_event_payload_u_type*) argp->loc_event_payload;
1458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    /* Gives control to synchronous call handler */
1478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_api_callback_process_sync_call(loc_handle, loc_event, loc_event_payload);
1488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int32 rc = (loc_glue_callback_table[index].cb_func)(loc_glue_callback_table[index].user,
1508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                                                        loc_handle, loc_event, loc_event_payload);
1518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGV("cb_func=%p", loc_glue_callback_table[index].cb_func);
1538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ret->loc_event_cb_f_type_result = rc;
1558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return 1; /* ok */
1578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
1588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1598c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_apicbprog_freeresult (SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result)
1608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
1618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   xdr_free (xdr_result, result);
1628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   /*
1648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    * Insert additional freeing code here, if needed
1658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    */
1668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   // LOC_LOGD("***** loc_apicbprog_freeresult\n");
1678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   return 1;
1698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
1708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
1728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1738c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION rpc_loc_event_cb_f_type_<version>_svc (MACRO)
1748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1758c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION
1768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   Callback function for Loc API
1778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1788c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE
1798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   1 for success
1808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   0 for failure
1818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
1838c2d3d5afc51d3f35150f748f263870367771b6fEd Tambool_t RPC_CALLBACK_FUNC_VERSION(rpc_loc_event_cb_f_type_, RPC_LOC_EVENT_CB_F_TYPE_VERSION, _svc) (
1848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_event_cb_f_type_args *argp,
1858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_event_cb_f_type_rets *ret,
1868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      struct svc_req *req)
1878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
1888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   return rpc_loc_event_cb_f_type_svc(argp, ret, req);
1898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
1908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
1928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1938c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_apicbprog_<version>_freeresult (MACRO)
1948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1958c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION
1968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   Free up RPC data structure
1978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
1988c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE
1998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   1 for success
2008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   0 for failure
2018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
2038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define VERSION_CONCAT(MAJOR,MINOR) MAJOR##MINOR
2048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define loc_apicb_prog_VER_freeresult(M,N) \
2058c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint RPC_CALLBACK_FUNC_VERSION(loc_apicbprog_, VERSION_CONCAT(M,N), _freeresult) \
2068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam(SVCXPRT *transp, xdrproc_t xdr_result, caddr_t result) \
2078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ \
2088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   return loc_apicbprog_freeresult(transp, xdr_result, result); \
2098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
2108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Define all of the possible minors */
2128c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0001);
2138c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0002);
2148c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0003);
2158c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0004);
2168c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0005);
2178c2d3d5afc51d3f35150f748f263870367771b6fEd Tamloc_apicb_prog_VER_freeresult(RPC_LOC_API_API_MAJOR_NUM, 0006);
2188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
2208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2218c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION rpc_loc_api_cb_null_<version>_svc (MACRO) [Patch for wrong RPCGEN stubs]
2228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2238c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION
2248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   Null callback function for Loc API
2258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2268c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE
2278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   1 for success
2288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
2308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam#define rpc_loc_api_cb_null_VER_svc(M,N) \
2318c2d3d5afc51d3f35150f748f263870367771b6fEd Tambool_t RPC_CALLBACK_FUNC_VERSION(rpc_loc_api_cb_null_, VERSION_CONCAT(M,N), _svc) ( \
2328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      void *a, int *b, struct svc_req *req) \
2338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{ \
2348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   return 1; \
2358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
2368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Define all of the possible minors */
2388c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0001);
2398c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0002);
2408c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0003);
2418c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0004);
2428c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0005);
2438c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_api_cb_null_VER_svc(RPC_LOC_API_API_MAJOR_NUM, 0006);
2448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2458c2d3d5afc51d3f35150f748f263870367771b6fEd Tamstatic void loc_api_glue_rpc_cb(CLIENT* client, enum rpc_reset_event event)
2468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
2478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int i;
2488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++) {
2498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (NULL != loc_glue_callback_table[i].rpc_cb) {
2508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            loc_glue_callback_table[i].rpc_cb(loc_glue_callback_table[i].user, client, event);
2518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
2528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
2538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
2548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
2568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2578c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION loc_api_glue_init
2588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2598c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION
2608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   Initiates the RPC client
2618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2628c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE
2638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   1 for success
2648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   0 for failure
2658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
2678c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_api_glue_init(void)
2688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
2698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   if (loc_api_clnt == NULL)
2708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   {
2718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      /* Initialize data */
2728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      int i;
2738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      int pid = getpid();
2748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++)
2758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      {
2768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam          loc_glue_callback_table[i].cb_id = i | (pid << 16);
2778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam          loc_glue_callback_table[i].cb_func = NULL;
2788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam          loc_glue_callback_table[i].handle = -1;
2798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam          loc_glue_callback_table[i].rpc_cb = NULL;
2808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam          loc_glue_callback_table[i].user = NULL;
2818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      }
2828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      /* Print msg */
2848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      LOC_LOGV("Trying to create RPC client...\n");
2858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      loc_api_clnt = clnt_create(NULL, LOC_APIPROG, LOC_APIVERS, NULL);
2868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      LOC_LOGV("Created loc_api_clnt ---- %x\n", (unsigned int)loc_api_clnt);
2878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      if (loc_api_clnt == NULL)
2898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      {
2908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         LOC_LOGE("Error: cannot create RPC client.\n");
2918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         return 0;
2928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      }
2938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      /* Init RPC callbacks */
2958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      loc_api_sync_call_init();
2968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
2978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      int rc = loc_apicb_app_init();
2988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      if (rc >= 0)
2998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      {
3008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         LOC_LOGD("Loc API RPC client initialized.\n");
3018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         clnt_register_reset_notification_cb(loc_api_clnt, loc_api_glue_rpc_cb);
3028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      }
3038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      else {
3048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         LOC_LOGE("Loc API callback initialization failed.\n");
3058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam         return 0;
3068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      }
3078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   }
3088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   return 1;
3108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
3118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3128c2d3d5afc51d3f35150f748f263870367771b6fEd Tamrpc_loc_client_handle_type loc_open (
3138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_event_mask_type       event_reg_mask,
3148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_event_cb_f_type           *event_callback,
3158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_reset_notif_cb_f_type     *rpc_cb,
3168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    void*                         userData
3178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam)
3188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
3198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int try_num = RPC_TRY_NUM;
3208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ENTRY_LOG();
3218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_GLUE_CHECK_INIT(rpc_loc_client_handle_type);
3228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_client_handle_type ret_val;
3248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_open_args args;
3268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    args.event_reg_mask = event_reg_mask;
3278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int i, j = LOC_API_CB_MAX_CLIENTS;
3298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++)
3308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
3318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (loc_glue_callback_table[i].user == userData)
3328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        {
3338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            LOC_LOGW("Client already opened service (callback=%p)...\n",
3348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                  event_callback);
3358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
3368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        } else if (j == LOC_API_CB_MAX_CLIENTS &&
3378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                   loc_glue_callback_table[i].user == NULL) {
3388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            j = i;
3398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
3408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
3418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (i == LOC_API_CB_MAX_CLIENTS)
3438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
3448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        i = j;
3458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
3468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (i == LOC_API_CB_MAX_CLIENTS)
3488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
3498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGE("Too many clients opened at once...\n");
3508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        return RPC_LOC_CLIENT_HANDLE_INVALID;
3518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
3528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_glue_callback_table[i].cb_func = event_callback;
3548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_glue_callback_table[i].rpc_cb = rpc_cb;
3558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_glue_callback_table[i].user = userData;
3568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    args.event_callback = loc_glue_callback_table[i].cb_id;
3588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGV("cb_id=%d, func=0x%x", i, (unsigned int) event_callback);
3598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_open_rets rets;
3618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    enum clnt_stat stat = RPC_SUCCESS;
3628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    EXIT_LOG_CALLFLOW(%s, "loc client open");
3648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam     /*try more for rpc_loc_open_xx()*/
3668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    do
3688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
3698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        stat = RPC_FUNC_VERSION(rpc_loc_open_, RPC_LOC_OPEN_VERSION)(&args, &rets, loc_api_clnt);
3708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        ret_val = (rpc_loc_client_handle_type) rets.loc_open_result;
3718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        try_num--;
3728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }while( (RPC_SUCCESS != stat||0 > ret_val) && 0 != try_num );
3748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_GLUE_CHECK_RESULT(stat, int32);
3768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    /* save the handle in the table */
3788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_glue_callback_table[i].handle = (rpc_loc_client_handle_type) rets.loc_open_result;
3798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return ret_val;
3818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
3838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3848c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint32 loc_close
3858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam(
3868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_client_handle_type handle
3878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam)
3888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
3898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ENTRY_LOG();
3908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_GLUE_CHECK_INIT(int32);
3918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int32 ret_val;
3938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_close_args args;
3958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    args.handle = handle;
3968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
3978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_close_rets rets;
3988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    enum clnt_stat stat = RPC_SUCCESS;
3998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    EXIT_LOG_CALLFLOW(%s, "loc client close");
4018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    stat = RPC_FUNC_VERSION(rpc_loc_close_, RPC_LOC_CLOSE_VERSION)(&args, &rets, loc_api_clnt);
4028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    loc_clear(handle);
4048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_GLUE_CHECK_RESULT(stat, int32);
4068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ret_val = (int32) rets.loc_close_result;
4078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return ret_val;
4098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
4108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4118c2d3d5afc51d3f35150f748f263870367771b6fEd Tamvoid loc_clear(rpc_loc_client_handle_type handle) {
4128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    /* Clean the client's callback function in callback table */
4138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int i;
4148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    for (i = 0; i < LOC_API_CB_MAX_CLIENTS; i++)
4158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
4168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        if (loc_glue_callback_table[i].handle == handle)
4178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        {
4188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            /* Found the client */
4198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            loc_glue_callback_table[i].cb_func = NULL;
4208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            loc_glue_callback_table[i].rpc_cb = NULL;
4218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            loc_glue_callback_table[i].handle = -1;
4228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            loc_glue_callback_table[i].user = NULL;
4238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
4248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        }
4258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
4268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (i == LOC_API_CB_MAX_CLIENTS)
4288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
4298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        LOC_LOGW("Handle not found (handle=%d)...\n", (int) handle);
4308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    }
4318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
4328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4338c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint32 loc_start_fix
4348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam(
4358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_client_handle_type handle
4368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam)
4378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
4388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ENTRY_LOG();
4398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_GLUE_CHECK_INIT(int32);
4408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int32 ret_val;
4428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_start_fix_args args;
4448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    args.handle = handle;
4458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_start_fix_rets rets;
4478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    enum clnt_stat stat = RPC_SUCCESS;
4488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    EXIT_LOG_CALLFLOW(%s, "loc start fix");
4508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    stat = RPC_FUNC_VERSION(rpc_loc_start_fix_, RPC_LOC_START_FIX_VERSION)(&args, &rets, loc_api_clnt);
4518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_GLUE_CHECK_RESULT(stat, int32);
4528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ret_val = (int32) rets.loc_start_fix_result;
4548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return ret_val;
4568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
4578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4588c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint32 loc_stop_fix
4598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam(
4608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_client_handle_type handle
4618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam)
4628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
4638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ENTRY_LOG();
4648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_GLUE_CHECK_INIT(int32);
4658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int32 ret_val;
4678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_stop_fix_args args;
4698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    args.handle = handle;
4708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_stop_fix_rets rets;
4728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    enum clnt_stat stat = RPC_SUCCESS;
4738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    EXIT_LOG_CALLFLOW(%s, "loc stop fix");
4758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    stat = RPC_FUNC_VERSION(rpc_loc_stop_fix_, RPC_LOC_STOP_FIX_VERSION)(&args, &rets, loc_api_clnt);
4768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_GLUE_CHECK_RESULT(stat, int32);
4778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ret_val = (int32) rets.loc_stop_fix_result;
4798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return ret_val;
4818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
4828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4838c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint32 loc_ioctl
4848c2d3d5afc51d3f35150f748f263870367771b6fEd Tam(
4858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_client_handle_type           handle,
4868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_ioctl_e_type                 ioctl_type,
4878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_ioctl_data_u_type*           ioctl_data
4888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam)
4898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
4908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ENTRY_LOG();
4918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_GLUE_CHECK_INIT(int32);
4928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int32 ret_val;
4948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
4958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_ioctl_args args;
4968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    args.handle = handle;
4978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    args.ioctl_data = ioctl_data;
4988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    args.ioctl_type = ioctl_type;
4998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    if (ioctl_data != NULL)
5008c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    {
5018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        /* Assign ioctl union discriminator */
5028c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        ioctl_data->disc = ioctl_type;
5038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
5048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        /* In case the user hasn't filled in other disc fields,
5058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam           automatically fill them in here */
5068c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        switch (ioctl_type)
5078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        {
5088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_GET_API_VERSION:
5098c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_SET_FIX_CRITERIA:
5118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_GET_FIX_CRITERIA:
5138c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_INFORM_NI_USER_RESPONSE:
5158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_INJECT_PREDICTED_ORBITS_DATA:
5178c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_VALIDITY:
5198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_QUERY_PREDICTED_ORBITS_DATA_SOURCE:
5218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_SET_PREDICTED_ORBITS_DATA_AUTO_DOWNLOAD:
5238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_INJECT_UTC_TIME:
5258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_INJECT_RTC_VALUE:
5278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_INJECT_POSITION:
5298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_QUERY_ENGINE_STATE:
5318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_INFORM_SERVER_OPEN_STATUS:
5338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_INFORM_SERVER_CLOSE_STATUS:
5358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_SET_ENGINE_LOCK:
5378c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5388c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_GET_ENGINE_LOCK:
5398c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5408c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_SET_SBAS_CONFIG:
5418c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5428c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_GET_SBAS_CONFIG:
5438c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5448c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_SET_NMEA_TYPES:
5458c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5468c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_GET_NMEA_TYPES:
5478c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5488c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_SET_CDMA_PDE_SERVER_ADDR:
5498c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_SET_CDMA_MPC_SERVER_ADDR:
5508c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_SET_UMTS_SLP_SERVER_ADDR:
5518c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_SET_CUSTOM_PDE_SERVER_ADDR:
5528c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_info.disc =
5538c2d3d5afc51d3f35150f748f263870367771b6fEd Tam                args.ioctl_data->rpc_loc_ioctl_data_u_type_u.server_addr.addr_type;
5548c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5558c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_GET_CDMA_PDE_SERVER_ADDR:
5568c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_GET_CDMA_MPC_SERVER_ADDR:
5578c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_GET_UMTS_SLP_SERVER_ADDR:
5588c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_GET_CUSTOM_PDE_SERVER_ADDR:
5598c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5608c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_SET_ON_DEMAND_LPM:
5618c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5628c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_GET_ON_DEMAND_LPM:
5638c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5648c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        case RPC_LOC_IOCTL_DELETE_ASSIST_DATA:
5658c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5668c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        default:
5678c2d3d5afc51d3f35150f748f263870367771b6fEd Tam            break;
5688c2d3d5afc51d3f35150f748f263870367771b6fEd Tam        } /* switch */
5698c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    } /* ioctl_data != NULL */
5708c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
5718c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    rpc_loc_ioctl_rets rets;
5728c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    enum clnt_stat stat = RPC_SUCCESS;
5738c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
5748c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    EXIT_LOG_CALLFLOW(%s, loc_get_ioctl_type_name(ioctl_type));
5758c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    stat = RPC_FUNC_VERSION(rpc_loc_ioctl_, RPC_LOC_IOCTL_VERSION)(&args, &rets, loc_api_clnt);
5768c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_GLUE_CHECK_RESULT(stat, int32);
5778c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
5788c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ret_val = (int32) rets.loc_ioctl_result;
5798c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
5808c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return ret_val;
5818c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
5828c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
5838c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/* Returns 0 if error */
5848c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint32 loc_api_null(void)
5858c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
5868c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_GLUE_CHECK_INIT(int32);
5878c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
5888c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int32 rets;
5898c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    enum clnt_stat stat = RPC_SUCCESS;
5908c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
5918c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    clnt_unregister_reset_notification_cb(loc_api_clnt);
5928c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    stat = RPC_FUNC_VERSION(rpc_loc_api_null_, RPC_LOC_API_NULL_VERSION)(NULL, &rets, loc_api_clnt);
5938c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_GLUE_CHECK_RESULT(stat, int32);
5948c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
5958c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return (int32) rets;
5968c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
5978c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
5988c2d3d5afc51d3f35150f748f263870367771b6fEd Tam/*===========================================================================
5998c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
6008c2d3d5afc51d3f35150f748f263870367771b6fEd TamFUNCTION    loc_eng_ioctl
6018c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
6028c2d3d5afc51d3f35150f748f263870367771b6fEd TamDESCRIPTION
6038c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   This function calls loc_ioctl and waits for the callback result before
6048c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   returning back to the user.
6058c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
6068c2d3d5afc51d3f35150f748f263870367771b6fEd TamDEPENDENCIES
6078c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   N/A
6088c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
6098c2d3d5afc51d3f35150f748f263870367771b6fEd TamRETURN VALUE
6108c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   TRUE                 if successful
6118c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   FALSE                if failed
6128c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
6138c2d3d5afc51d3f35150f748f263870367771b6fEd TamSIDE EFFECTS
6148c2d3d5afc51d3f35150f748f263870367771b6fEd Tam   N/A
6158c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
6168c2d3d5afc51d3f35150f748f263870367771b6fEd Tam===========================================================================*/
6178c2d3d5afc51d3f35150f748f263870367771b6fEd Tamint loc_eng_ioctl
6188c2d3d5afc51d3f35150f748f263870367771b6fEd Tam(
6198c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_client_handle_type           handle,
6208c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_ioctl_e_type                 ioctl_type,
6218c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_ioctl_data_u_type*           ioctl_data_ptr,
6228c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      uint32                               timeout_msec,
6238c2d3d5afc51d3f35150f748f263870367771b6fEd Tam      rpc_loc_ioctl_callback_s_type       *cb_data_ptr
6248c2d3d5afc51d3f35150f748f263870367771b6fEd Tam)
6258c2d3d5afc51d3f35150f748f263870367771b6fEd Tam{
6268c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    int ret_val = RPC_LOC_API_SUCCESS;
6278c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
6288c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    ret_val = loc_api_sync_ioctl(handle, ioctl_type, ioctl_data_ptr, timeout_msec, cb_data_ptr);
6298c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
6308c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    LOC_LOGD("loc_eng_ioctl result: client = %d, ioctl_type = %s, returt %s\n",
6318c2d3d5afc51d3f35150f748f263870367771b6fEd Tam             (int32) handle,
6328c2d3d5afc51d3f35150f748f263870367771b6fEd Tam             loc_get_ioctl_type_name(ioctl_type),
6338c2d3d5afc51d3f35150f748f263870367771b6fEd Tam             loc_get_ioctl_status_name(ret_val) );
6348c2d3d5afc51d3f35150f748f263870367771b6fEd Tam
6358c2d3d5afc51d3f35150f748f263870367771b6fEd Tam    return ret_val;
6368c2d3d5afc51d3f35150f748f263870367771b6fEd Tam}
637